Changeset 1842 for trunk/autoquest-androidmonitor/src/main/java/de/ugoe/cs/autoquest/androidmonitor/AndroidMonitor.java
- Timestamp:
- 12/15/14 13:35:23 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/autoquest-androidmonitor/src/main/java/de/ugoe/cs/autoquest/androidmonitor/AndroidMonitor.java
r1833 r1842 19 19 import de.ugoe.cs.autoquest.androidmonitor.AndroidMonitorCompositeOnClickListener; 20 20 import android.app.Activity; 21 import android.content.Context;22 import android.content.pm.ApplicationInfo;23 import android.content.pm.PackageManager;24 import android.content.pm.PackageManager.NameNotFoundException;25 21 import android.os.Build; 26 22 import android.text.Editable; … … 48 44 * </p> 49 45 */ 50 String activityName;46 private String activityName; 51 47 52 48 /** … … 55 51 * </p> 56 52 */ 57 private AndroidMonitorLogFile logFile;53 private static AndroidMonitorLogFile logFile = null; 58 54 59 55 /** … … 66 62 return monitor; 67 63 } 64 68 65 69 66 /** … … 73 70 */ 74 71 public void startMonitor(Activity activity) { 75 activityName = activity.getClass().getSimpleName(); 76 77 logFile = new AndroidMonitorLogFile(getAppLable(activity), activity.getFilesDir()); 78 72 //create logFile only once 73 if(AndroidMonitor.logFile == null){ 74 AndroidMonitor.logFile = new AndroidMonitorLogFile(activity); 75 Log.i("logfile", "file created"); 76 } 77 activityName = activity.getClass().getSimpleName(); 79 78 addLogListenerToView(getRootView(activity)); 79 80 80 81 81 // TODO 82 82 // listen to changes and update own listener 83 // find out if it is possible to directly call addLogListenerToView84 // again85 // activity.onContentChanged();86 83 87 84 // write backPresss as event to xml file … … 93 90 // http://developer.android.com/training/basics/activity-lifecycle/stopping.html 94 91 } 95 96 /** 97 * get the root view of an activity 92 public void startMonitor(View view){ 93 addLogListenerToView(findFirstView(view)); 94 } 95 96 /** 97 * Get the root view of an activity. 98 98 * 99 99 * @param activity 100 100 * @return 101 101 */ 102 p ublicView getRootView(Activity activity) {102 private View getRootView(Activity activity) { 103 103 // get root view of the activity as start point 104 104 View view = activity.getWindow().getDecorView().getRootView(); … … 111 111 112 112 /** 113 * returns first view element of the tree113 * Returns first view element of the tree. 114 114 * 115 115 * @param view … … 127 127 /** 128 128 * Replace the listener of each view with a composite listener which collects several listeners 129 * for one view. 129 * for one view. Add a TextWatcher to all TexView views. 130 130 * 131 131 * @param view 132 132 * to be monitored 133 133 */ 134 p ublicvoid addLogListenerToView(View view) {134 private void addLogListenerToView(View view) { 135 135 addLogListenerToView(view, 0); 136 136 } … … 147 147 private void addLogListenerToView(View view, int parentHash) { 148 148 149 if (!logFile.isComponentLogged(view.hashCode())) { 150 logFile.addComponent(view, parentHash, activityName); 149 if (!AndroidMonitorLogFile.isComponentLogged(view.hashCode())) { 150 AndroidMonitor.logFile.addComponent(view, parentHash, activityName); 151 152 // save original listener to add it later on to the groupLisatener 153 View.OnClickListener onClickListener = getOnClickListener(view); 154 155 if (onClickListener != null) { 156 // create new compositeOnClickListener to handle multiple listeners 157 // for one view 158 AndroidMonitorCompositeOnClickListener groupListener = 159 new AndroidMonitorCompositeOnClickListener(); 160 // replace the original onClickListener with the 161 // compositeOnClickListener 162 view.setOnClickListener(groupListener); 163 // add the tracking part as a several listener 164 groupListener.addOnClickListener(new View.OnClickListener() { 165 public void onClick(View v) { 166 167 AndroidMonitor.logFile.addEvent(v, "onClick"); 168 // check if something changed in the activity 169 startMonitor(v); 170 } 171 }); 172 173 groupListener.addOnClickListener(onClickListener); 174 } 175 // if view is a TextView add a addTextChangedListener to this view 176 if (view instanceof TextView) { 177 final int hashOfView = view.hashCode(); 178 TextView textView = (TextView) view; 179 textView.addTextChangedListener(new TextWatcher() { 180 public void beforeTextChanged(CharSequence s, int start, int count, int after) { 181 // do nothing 182 } 183 184 public void onTextChanged(CharSequence s, int start, int before, int count) { 185 // do nothing 186 } 187 188 public void afterTextChanged(Editable s) { 189 AndroidMonitor.logFile.addEvent(hashOfView, "text", s.toString()); 190 } 191 192 }); 193 } 151 194 } 152 195 153 196 // hash code of the actual view element. Problem in using 154 197 // view.getParent().hashCode() is described in 155 // de.ugoe.cs.autoquest.androidmonitor #addComponent()198 // de.ugoe.cs.autoquest.androidmonitor.AndroidMonitorLogFile#addComponent() 156 199 parentHash = view.hashCode(); 157 200 // traverse all views of the activity … … 164 207 } 165 208 166 // save original listener to add it later on to the groupLisatener167 View.OnClickListener onClickListener = getOnClickListener(view);168 169 if (onClickListener != null) {170 // create new compositeOnClickListener to handle multiple listeners171 // for one view172 AndroidMonitorCompositeOnClickListener groupListener =173 new AndroidMonitorCompositeOnClickListener();174 // replace the original onClickListener with the175 // compositeOnClickListener176 view.setOnClickListener(groupListener);177 // add the tracking part as a several listener178 groupListener.addOnClickListener(new View.OnClickListener() {179 public void onClick(View v) {180 181 logFile.addEvent(v, "onClick");182 }183 });184 185 groupListener.addOnClickListener(onClickListener);186 }187 // if view is a TextView add a addTextChangedListener to this view188 if (view instanceof TextView) {189 final int hashOfView = view.hashCode();190 TextView textView = (TextView) view;191 textView.addTextChangedListener(new TextWatcher() {192 public void beforeTextChanged(CharSequence s, int start, int count, int after) {193 // do nothing194 }195 196 public void onTextChanged(CharSequence s, int start, int before, int count) {197 // do nothing198 }199 200 public void afterTextChanged(Editable s) {201 logFile.addEvent(hashOfView, "text", s.toString());202 }203 204 });205 }206 209 } 207 210 … … 212 215 * @return the listener of the view or null if no listener exists 213 216 */ 214 p ublicView.OnClickListener getOnClickListener(View view) {217 private View.OnClickListener getOnClickListener(View view) { 215 218 // http://stackoverflow.com/questions/11186960/getonclicklistener-in-android-views 216 219 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { … … 280 283 } 281 284 282 /** 283 * get application name as defined in Package Name 284 * 285 * @param pContext 286 * package context; could also be an activity 287 * @return app name 288 */ 289 public String getAppLable(Context pContext) { 290 // source (2014-09-04): 291 // http://stackoverflow.com/questions/11229219/android-get-application-name-not-package-name 292 PackageManager lPackageManager = pContext.getPackageManager(); 293 ApplicationInfo lApplicationInfo = null; 294 try { 295 lApplicationInfo = 296 lPackageManager.getApplicationInfo(pContext.getApplicationInfo().packageName, 0); 297 } 298 catch (final NameNotFoundException e) {} 299 return (String) (lApplicationInfo != null ? lPackageManager 300 .getApplicationLabel(lApplicationInfo) : "Unknown"); 285 286 287 /** 288 * 289 * <p> 290 * Return the AndroidMonitorLogFile that is used in the AndroidMonitor. 291 * </p> 292 * 293 * @return AndroidMonitorLogFile 294 * that is used in the AndroidMonitor. 295 */ 296 public AndroidMonitorLogFile getLogFile(){ 297 return logFile; 301 298 } 302 299 }
Note: See TracChangeset
for help on using the changeset viewer.