# HG changeset patch # User Fiore Martin # Date 1360683108 0 # Node ID 66b3a838feca69f949bc1a771aa0c2bfcd91fc4b # Parent e0ee6ac3a45fe4d26eef12ac375a8681ab3dcd5e Added logging of user interaction diff -r e0ee6ac3a45f -r 66b3a838feca res/raw/cancel.mp3 Binary file res/raw/cancel.mp3 has changed diff -r e0ee6ac3a45f -r 66b3a838feca src/uk/ac/qmul/eecs/ccmi/accessibility/AccessibleCheckbox.java --- a/src/uk/ac/qmul/eecs/ccmi/accessibility/AccessibleCheckbox.java Thu Dec 13 20:00:21 2012 +0000 +++ b/src/uk/ac/qmul/eecs/ccmi/accessibility/AccessibleCheckbox.java Tue Feb 12 15:31:48 2013 +0000 @@ -19,6 +19,7 @@ package uk.ac.qmul.eecs.ccmi.accessibility; import uk.ac.qmul.eecs.ccmi.activities.R; +import uk.ac.qmul.eecs.ccmi.utilities.ILogger; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; @@ -100,6 +101,7 @@ @Override public void onClick(View view) { spinner.setSelection((spinner.getSelectedItemPosition()+1) % spinner.getCount()); + ILogger.logTap("checkbox (new value="+spinner.getSelectedItem().toString()+')'); if(service != null){ service.speak(spinner.getSelectedItem().toString()+(checks[spinner.getSelectedItemPosition()] ? " " : " un")+"checked"); } @@ -118,7 +120,8 @@ } if(service != null) service.speak(spinner.getSelectedItem().toString()+(checks[spinner.getSelectedItemPosition()] ? "" : "un")+"checked"); - + ILogger.log("user long tap: spinner"); + ILogger.log(spinner.getSelectedItem().toString()+' '+(checks[spinner.getSelectedItemPosition()] ? "" : "un")+"checked"); spinner.setAdapter(new ArrayAdapter(getContext(),R.layout.list_item_1,markedValues)); spinner.setSelection(itemPosition); return true; diff -r e0ee6ac3a45f -r 66b3a838feca src/uk/ac/qmul/eecs/ccmi/accessibility/AccessibleDialogBuilder.java --- a/src/uk/ac/qmul/eecs/ccmi/accessibility/AccessibleDialogBuilder.java Thu Dec 13 20:00:21 2012 +0000 +++ b/src/uk/ac/qmul/eecs/ccmi/accessibility/AccessibleDialogBuilder.java Tue Feb 12 15:31:48 2013 +0000 @@ -20,6 +20,7 @@ import uk.ac.qmul.eecs.ccmi.accessibility.AccessibilityService.SoundEvent; import uk.ac.qmul.eecs.ccmi.activities.R; +import uk.ac.qmul.eecs.ccmi.utilities.ILogger; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; @@ -83,6 +84,8 @@ args.putInt("dialogType", type); args.putString("tag", tag); accessibleDialogFragment.setArguments(args); + + ILogger.logDialog(tag); /* show the dialog */ accessibleDialogFragment.show(fragmentManager,tag); } @@ -110,6 +113,8 @@ if(text != null) args.putString("text", text); accessibleDialogFragment.setArguments(args); + + ILogger.logDialog(tag); /* show the dialog */ accessibleDialogFragment.show(fragmentManager,tag); } @@ -136,6 +141,8 @@ args.putInt("dialogType", R.layout.selection_dialog); args.putString("tag", tag); accessibleDialogFragment.setArguments(args); + + ILogger.logDialog(tag); /* show the dialog */ accessibleDialogFragment.show(fragmentManager,tag); } @@ -165,6 +172,8 @@ args.putInt("dialogType", R.layout.checkbox_dialog); args.putString("tag", tag); accessibleDialogFragment.setArguments(args); + + ILogger.logDialog(tag); /* show the dialog */ accessibleDialogFragment.show(fragmentManager,tag); } @@ -261,6 +270,12 @@ LayoutSonifier.getInstance().onTouch(layout, evt, accessibilityService); return super.dispatchTouchEvent(evt); } + + @Override + public void onBackPressed(){ + super.onBackPressed(); + ILogger.logTap("back (cancel)"); + } } } diff -r e0ee6ac3a45f -r 66b3a838feca src/uk/ac/qmul/eecs/ccmi/accessibility/AccessibleSpinner.java --- a/src/uk/ac/qmul/eecs/ccmi/accessibility/AccessibleSpinner.java Thu Dec 13 20:00:21 2012 +0000 +++ b/src/uk/ac/qmul/eecs/ccmi/accessibility/AccessibleSpinner.java Tue Feb 12 15:31:48 2013 +0000 @@ -18,6 +18,7 @@ */ package uk.ac.qmul.eecs.ccmi.accessibility; +import uk.ac.qmul.eecs.ccmi.utilities.ILogger; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; @@ -66,6 +67,7 @@ if(service != null){ service.speak(getSelectedItem().toString()); } + ILogger.logTap("spinner (new value=("+getSelectedItem().toString()+')'); } return true; diff -r e0ee6ac3a45f -r 66b3a838feca src/uk/ac/qmul/eecs/ccmi/accessibility/LayoutSonifier.java --- a/src/uk/ac/qmul/eecs/ccmi/accessibility/LayoutSonifier.java Thu Dec 13 20:00:21 2012 +0000 +++ b/src/uk/ac/qmul/eecs/ccmi/accessibility/LayoutSonifier.java Tue Feb 12 15:31:48 2013 +0000 @@ -18,6 +18,7 @@ */ package uk.ac.qmul.eecs.ccmi.accessibility; +import uk.ac.qmul.eecs.ccmi.utilities.ILogger; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -104,19 +105,24 @@ accessibilityService.vibrate(); CharSequence contentDescription = v.getContentDescription(); /* if the view has accessibility content description set, use it */ - if(contentDescription != null ) + if(contentDescription != null ){ accessibilityService.speak(contentDescription.toString() + ((v instanceof TextView) ? ((TextView)v).getText() : "") ); - else + ILogger.logHover(contentDescription.toString()); + }else{ accessibilityService.speak(((TextView)v).getText().toString()); + ILogger.logHover(((TextView)v).getText().toString()); + } }else if(v instanceof AccessibleCheckbox){ AccessibleCheckbox ab = (AccessibleCheckbox)v; boolean isChecked = ab.getChecks()[ab.getSelectedValuePosition()]; accessibilityService.vibrate(); accessibilityService.speak(ab.getSelectedValue()+ (isChecked ? ", checked" : ", unchecked")); + ILogger.logHover("check box"); }else if (v instanceof Spinner){ accessibilityService.vibrate(); accessibilityService.speak(v.getContentDescription()+" "+((Spinner)v).getSelectedItem()); + ILogger.logHover("spinner"); } } diff -r e0ee6ac3a45f -r 66b3a838feca src/uk/ac/qmul/eecs/ccmi/activities/AccessibleActivity.java --- a/src/uk/ac/qmul/eecs/ccmi/activities/AccessibleActivity.java Thu Dec 13 20:00:21 2012 +0000 +++ b/src/uk/ac/qmul/eecs/ccmi/activities/AccessibleActivity.java Tue Feb 12 15:31:48 2013 +0000 @@ -22,6 +22,7 @@ import uk.ac.qmul.eecs.ccmi.accessibility.AccessibilityService.SoundEvent; import uk.ac.qmul.eecs.ccmi.accessibility.AccessibleDialogBuilder; import uk.ac.qmul.eecs.ccmi.accessibility.LayoutSonifier; +import uk.ac.qmul.eecs.ccmi.utilities.ILogger; import android.content.pm.PackageManager; import android.media.AudioManager; import android.os.Bundle; @@ -31,6 +32,7 @@ import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.WindowManager; +import android.widget.AbsListView; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ListAdapter; @@ -102,6 +104,26 @@ } }; list.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); + list.setOnScrollListener(new AbsListView.OnScrollListener(){ + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {} + + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + switch(scrollState){ + case AbsListView.OnScrollListener.SCROLL_STATE_FLING : + ILogger.log("user scroll: fling"); + break; + case AbsListView.OnScrollListener.SCROLL_STATE_IDLE : + ILogger.log("user scroll: "+ view.getItemAtPosition(list.getFirstVisiblePosition())); + break; + case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL : + ILogger.log("user scroll: started scrolling"); + break; + } + } + }); listLayout.addView(list); /* init header with a button to scroll down an up the list */ diff -r e0ee6ac3a45f -r 66b3a838feca src/uk/ac/qmul/eecs/ccmi/activities/CcmiEditorAppActivity.java --- a/src/uk/ac/qmul/eecs/ccmi/activities/CcmiEditorAppActivity.java Thu Dec 13 20:00:21 2012 +0000 +++ b/src/uk/ac/qmul/eecs/ccmi/activities/CcmiEditorAppActivity.java Tue Feb 12 15:31:48 2013 +0000 @@ -30,6 +30,7 @@ import uk.ac.qmul.eecs.ccmi.accessibility.AccessibilityService; import uk.ac.qmul.eecs.ccmi.accessibility.AccessibilityService.SoundEvent; import uk.ac.qmul.eecs.ccmi.accessibility.AccessibleDialogBuilder; +import uk.ac.qmul.eecs.ccmi.utilities.ILogger; import uk.ac.qmul.eecs.ccmi.xmlparser.Diagram; import android.content.Intent; import android.content.res.AssetManager; @@ -40,6 +41,7 @@ import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ArrayAdapter; +import android.widget.TextView; /** * @@ -71,6 +73,10 @@ list.setOnItemClickListener(this); list.setOnItemLongClickListener(this); + + ILogger.log("--- APPLICATION STARTED ---"); + + /* init assets */ AssetManager assetManager = getAssets(); try { @@ -96,12 +102,15 @@ /*----- listeners to implement the navigation ----*/ @Override public void onItemClick(AdapterView av, View v, int pos, long id) { + ILogger.logTap(((TextView)v).getText()); if(!navigation.goNext(pos)){ accessibilityService.playSound(AccessibilityService.SoundEvent.V_ERROR); + ILogger.logError("end of tree"); return; } accessibilityService.playSound(AccessibilityService.SoundEvent.V_EXPAND); - accessibilityService.speak("Displaying " + getHeaderText()); + accessibilityService.speak("displaying " + getHeaderText()); + ILogger.logActivity(getHeaderText()); } /** @@ -112,9 +121,12 @@ */ @Override public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + ILogger.logLongTap(((TextView)view).getText()); boolean doneSomething = navigation.getController().performEditAction(parent, view, position, id, this); - if(!doneSomething) + if(!doneSomething){ accessibilityService.playSound(AccessibilityService.SoundEvent.V_ERROR); + ILogger.logError("no action available on this item"); + } return doneSomething; } @@ -125,9 +137,11 @@ */ @Override public void onBackPressed() { + ILogger.logTap("back"); if(navigation.goPrevious()){ accessibilityService.playSound(SoundEvent.V_COLLAPSE); accessibilityService.speak("Displaying "+getHeaderText()); + ILogger.logActivity(getHeaderText()); update(); }else{ accessibilityService.playSound(SoundEvent.V_EDITING_MODE, true); @@ -135,19 +149,26 @@ @Override public void onClick(View v, DialogFragment dialogFragment, String tag) { if("EXIT".equals(v.getTag())){ + ILogger.logButton("exit"); accessibilityService.speak(getResources().getString(R.string.exitMessage)); + ILogger.log("--- EXIT ---"); + ILogger.dispose(); finish(); }else if("CANCEL".equals(v.getTag())){ + ILogger.logButton("cancel"); + accessibilityService.playSound(SoundEvent.V_CANCEL); accessibilityService.speak("Cancel"); accessibilityService.stopSound(); dialogFragment.dismiss(); }else if("OPEN".equals(v.getTag())){ + ILogger.logButton("open"); /* start the activity to open a file */ Intent intent = new Intent(CcmiEditorAppActivity.this, FileSelectorActivity.Open.class); intent.putExtra("extension", CCMI_EXTENSION); startActivityForResult(intent,OPEN_REQUEST); dialogFragment.dismiss(); }else if("SAVE".equals(v.getTag())){ + ILogger.logButton("save"); Intent intent = new Intent(CcmiEditorAppActivity.this, FileSelectorActivity.Save.class); intent.putExtra("extension", CCMI_EXTENSION); startActivityForResult(intent,SAVE_REQUEST); @@ -165,6 +186,7 @@ try { InputStream in = new FileInputStream(new File(data.getData().getPath())); readXML(in); + ILogger.logActivity(navigation.getCurrentPath()); } catch (Exception e) { accessibilityService.playSound(SoundEvent.V_ERROR); accessibilityService.speak("File could not be open"); diff -r e0ee6ac3a45f -r 66b3a838feca src/uk/ac/qmul/eecs/ccmi/activities/TreeNavigation.java --- a/src/uk/ac/qmul/eecs/ccmi/activities/TreeNavigation.java Thu Dec 13 20:00:21 2012 +0000 +++ b/src/uk/ac/qmul/eecs/ccmi/activities/TreeNavigation.java Tue Feb 12 15:31:48 2013 +0000 @@ -30,6 +30,7 @@ import uk.ac.qmul.eecs.ccmi.accessibility.AccessibilityService.SoundEvent; import uk.ac.qmul.eecs.ccmi.accessibility.AccessibleCheckbox; import uk.ac.qmul.eecs.ccmi.accessibility.AccessibleDialogBuilder; +import uk.ac.qmul.eecs.ccmi.utilities.ILogger; import uk.ac.qmul.eecs.ccmi.utilities.Stack; import uk.ac.qmul.eecs.ccmi.xmlparser.Diagram; import uk.ac.qmul.eecs.ccmi.xmlparser.DiagramUpdater; @@ -501,7 +502,7 @@ }; /* - * Responds to the long cick of the user. It acts according to the list item clicked + * Responds to the long click of the user. It acts according to the list item clicked * by the user (and therefore according to the hierarchy level currently displayed). * When a dialog needs to be shown, it used dialogBuilder.displayDialog() and register itself * as buttoClickListener to handle the click of the user in the same class. @@ -522,19 +523,25 @@ /* construct the node and add it to the diagram */ Node node = new Node(((NodeType)clickedItem).getType(),properties); diagramUpdater.addNode(node); + dialogBuilder.getAccessibilityService().playSound(SoundEvent.V_OK); dialogBuilder.getAccessibilityService().speak("Node "+ node +" created"); + ILogger.log("Node "+ node +" created"); }else{ // user clicked on edge List edgeTypes = diagram.getPrototypes().getEdgeTypes(); clickedItem = edgeTypes.get(position - nodeTypes.size()); /* respect min and max attached nodes */ if(selectedNodes.size() < ((EdgeType)clickedItem).getMinAttachedNodes()){ + dialogBuilder.getAccessibilityService().playSound(SoundEvent.V_ERROR); dialogBuilder.getAccessibilityService().speak("you must select at least "+ ((EdgeType)clickedItem).getMinAttachedNodes()+" nodes"); + ILogger.logError("selected nodes < "+((EdgeType)clickedItem).getMinAttachedNodes()); return true; } if(selectedNodes.size() > ((EdgeType)clickedItem).getMaxAttachedNodes()){ + dialogBuilder.getAccessibilityService().playSound(SoundEvent.V_ERROR); dialogBuilder.getAccessibilityService().speak("you must select at most "+ ((EdgeType)clickedItem).getMaxAttachedNodes()+" nodes"); + ILogger.logError("selected nodes > "+((EdgeType)clickedItem).getMaxAttachedNodes()); return true; } @@ -547,6 +554,7 @@ edge.getAttachedNodes().add(new EdgeNode(n.getId())); } diagramUpdater.addEdge(edge); + dialogBuilder.getAccessibilityService().playSound(SoundEvent.V_OK); StringBuilder builder = new StringBuilder(); builder.append(edge).append(" created between "); for(int i=0; i modifiers = new ArrayList(checks.length); + StringBuilder modifiersString = new StringBuilder(); for(int i=0; i