Ignore:
Timestamp:
12/15/14 13:35:23 (10 years ago)
Author:
funger
Message:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/autoquest-androidmonitor/src/main/java/de/ugoe/cs/autoquest/androidmonitor/AndroidMonitor.java

    r1833 r1842  
    1919import de.ugoe.cs.autoquest.androidmonitor.AndroidMonitorCompositeOnClickListener; 
    2020import 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; 
    2521import android.os.Build; 
    2622import android.text.Editable; 
     
    4844     * </p> 
    4945     */ 
    50     String activityName; 
     46    private String activityName; 
    5147 
    5248    /** 
     
    5551     * </p> 
    5652     */ 
    57     private AndroidMonitorLogFile logFile; 
     53    private static AndroidMonitorLogFile logFile = null; 
    5854 
    5955    /** 
     
    6662        return monitor; 
    6763    } 
     64    
    6865 
    6966    /** 
     
    7370     */ 
    7471    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();   
    7978        addLogListenerToView(getRootView(activity)); 
     79         
    8080 
    8181        // TODO 
    8282        // listen to changes and update own listener 
    83         // find out if it is possible to directly call addLogListenerToView 
    84         // again 
    85         // activity.onContentChanged(); 
    8683 
    8784        // write backPresss as event to xml file 
     
    9390        // http://developer.android.com/training/basics/activity-lifecycle/stopping.html 
    9491    } 
    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. 
    9898     *  
    9999     * @param activity 
    100100     * @return 
    101101     */ 
    102     public View getRootView(Activity activity) { 
     102    private View getRootView(Activity activity) { 
    103103        // get root view of the activity as start point 
    104104        View view = activity.getWindow().getDecorView().getRootView(); 
     
    111111 
    112112    /** 
    113      * returns first view element of the tree 
     113     * Returns first view element of the tree. 
    114114     *  
    115115     * @param view 
     
    127127    /** 
    128128     * 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. 
    130130     *  
    131131     * @param view 
    132132     *            to be monitored 
    133133     */ 
    134     public void addLogListenerToView(View view) { 
     134    private void addLogListenerToView(View view) { 
    135135        addLogListenerToView(view, 0); 
    136136    } 
     
    147147    private void addLogListenerToView(View view, int parentHash) { 
    148148 
    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            } 
    151194        } 
    152195 
    153196        // hash code of the actual view element. Problem in using 
    154197        // view.getParent().hashCode() is described in 
    155         // de.ugoe.cs.autoquest.androidmonitor#addComponent() 
     198        // de.ugoe.cs.autoquest.androidmonitor.AndroidMonitorLogFile#addComponent() 
    156199        parentHash = view.hashCode(); 
    157200        // traverse all views of the activity 
     
    164207        } 
    165208 
    166         // save original listener to add it later on to the groupLisatener 
    167         View.OnClickListener onClickListener = getOnClickListener(view); 
    168  
    169         if (onClickListener != null) { 
    170             // create new compositeOnClickListener to handle multiple listeners 
    171             // for one view 
    172             AndroidMonitorCompositeOnClickListener groupListener = 
    173                 new AndroidMonitorCompositeOnClickListener(); 
    174             // replace the original onClickListener with the 
    175             // compositeOnClickListener 
    176             view.setOnClickListener(groupListener); 
    177             // add the tracking part as a several listener 
    178             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 view 
    188         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 nothing 
    194                 } 
    195  
    196                 public void onTextChanged(CharSequence s, int start, int before, int count) { 
    197                     // do nothing 
    198                 } 
    199  
    200                 public void afterTextChanged(Editable s) { 
    201                     logFile.addEvent(hashOfView, "text", s.toString()); 
    202                 } 
    203  
    204             }); 
    205         } 
    206209    } 
    207210 
     
    212215     * @return the listener of the view or null if no listener exists 
    213216     */ 
    214     public View.OnClickListener getOnClickListener(View view) { 
     217    private View.OnClickListener getOnClickListener(View view) { 
    215218        // http://stackoverflow.com/questions/11186960/getonclicklistener-in-android-views 
    216219        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
     
    280283    } 
    281284 
    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;         
    301298    } 
    302299} 
Note: See TracChangeset for help on using the changeset viewer.