User Tools

Site Tools


sample_code:introspector

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
sample_code:introspector [2014/10/10 09:29]
95.237.10.124 [The code]
sample_code:introspector [2014/12/06 21:02]
stevegarman
Line 4: Line 4:
 It is incomplete as it does not drill down far enough but it is much better than nothing. It is incomplete as it does not drill down far enough but it is much better than nothing.
 ===== Warnings ===== ===== Warnings =====
-Please be aware that using undocumented functions is not recommended by the AndroidScript developers and you do so at your own risk.\\+Please be aware that using undocumented functions is not recommended by the DroidScript developers and you do so at your own risk.\\
 Please also be aware that the **"Manually entered code"** option can be very dangerous. Please also be aware that the **"Manually entered code"** option can be very dangerous.
 ===== Acknowledgements ===== ===== Acknowledgements =====
-Andreas Rozek would recognize much oif the code as the heart of it is stolen from his post at [[https://groups.google.com/forum/#!topic/androidscript/o_RCNR5ozAE]]+Andreas Rozek would recognize much of the code as the heart of it is stolen from his post at [[https://groups.google.com/forum/#!topic/androidscript/o_RCNR5ozAE]]
  
 Thanks also to Salvatore Fusto for finding a bug in the app. Thanks also to Salvatore Fusto for finding a bug in the app.
 ===== The code ===== ===== The code =====
 <code javascript introspector.js> <code javascript introspector.js>
-// Introspection lite tool for home use by Steve Garman +// Introspection lite tool for home use by Steve Garman 
-// Main code stolen from AppInspector by Andreas Rozek +// Main code stolen from AppInspector by Andreas Rozek  
 +//Global variables 
 +var  myobj  =  app; 
 +var  ListView,  menuView,  FunctionView 
 +var  main_header_txt,  edtFilter,  dlg,  edtDlg; 
 +var  lastMenu  =  "app"; 
 +var  pasteable  =  "null"; 
 +var  vers  =  Math.floor((app.GetVersion()       + .0005)  *  100); 
 +var  docfold  =  "/sdcard/sjgDocs/androidscript/" + vers; 
 +var  docfile  =  docfold  +  "/null.txt";
  
-//Global variables +//Called when application is started
-var myobj = app; +function  OnStart() 
-var ListView, menuView, FunctionView +      
-var main_header_txt, edtFilter, dlg, edtDlg; +    app.EnableBackKey( false );         //Create a layout with objects vertically centered. 
-var lastMenu = "app"; +         
-var pasteable = "null"; +    var  lay   app.CreateLayout( "linear",  "Vertical,FillXY" );       
-var vers = Math.floor((app.GetVersion() +    add_top_bar( lay );  
-      +.0005) * 100); +    /**** prepare page area ****/ 
-var docfold = "/sdcard/sjgDocs/androidscript/"+vers; +         
-var docfile = docfold + "/null.txt"; +    var  PageArea   app.CreateLayout('frame', 'fillxy');    
- +
-//Called when application is started. +
-function OnStart(){ +
-    app.EnableBackKey( false ); +
-     +
-    //Create a layout with objects vertically centered+
-    var lay = app.CreateLayout( "linear", "Vertical,FillXY" );   +
-    add_top_bar( lay ); +
-  +
-/**** prepare page area ****/ +
-    var PageArea = app.CreateLayout('frame','fillxy');+
     lay.AddChild(PageArea);     lay.AddChild(PageArea);
  
-    var control_list = "app,layout,Manually entered code,Button,CameraView,CheckBox" +         
-      +",Crypt,Dialog,Email,Image,List,Locator,Notification,SeekBar" +    var  control_list   "app,layout,Manually entered code,Button,CameraView,CheckBox"       + ",Crypt,Dialog,Email,Image,List,Locator,Notification,SeekBar"       + ",Sensor,SMS,Spinner,Text,TextEdit,ToggleButton"       + ",WebServer,WebView,YesNoDialog"     
-      +",Sensor,SMS,Spinner,Text,TextEdit,ToggleButton" +    menuView   app.CreateList( control_list,  -1, -1,  'fillxy');     
-      +",WebServer,WebView,YesNoDialog" +    menuView.SetOnTouch(menuView_OnTouch);     
-    menuView = app.CreateList( control_list, -1,-1, 'fillxy'); +    PageArea.AddChild(menuView);    
-    menuView.SetOnTouch(menuView_OnTouch); +
-    PageArea.AddChild(menuView);+
     menuView.SetVisibility('Hide');     menuView.SetVisibility('Hide');
  
-    ListView = app.CreateList("", -1,-1, 'fillxy');+         
 +    ListView   app.CreateList("",  -1, -1,  'fillxy');    
     prepareFunctionList();     prepareFunctionList();
  
-    ListView.SetOnTouch(showAppFunction);+         
 +    ListView.SetOnTouch(showAppFunction);    
     PageArea.AddChild(ListView);     PageArea.AddChild(ListView);
  
-  /**** prepare detail view ****/+       /**** prepare detail view ****/
  
-    FunctionView = app.CreateTextEdit(''); +         
-    PageArea.AddChild(FunctionView); +    FunctionView   app.CreateTextEdit('');     
-    FunctionView.SetVisibility('Hide'); +    PageArea.AddChild(FunctionView);     
-     +    FunctionView.SetVisibility('Hide');         //Add layout to app    
-    //Add layout to app    +         
-    app.AddLayout( lay );+    app.AddLayout( lay );    
     showMenuView();     showMenuView();
-}//OnStart+  } //OnStart
  
-function add_top_bar (lyout, opts){ +function  add_top_bar (lyout,  opts) 
-  //basic top bar layout +  {   //basic top bar layout 
-  var lay_bar = app.CreateLayout( "Linear", "Horizontal,Left, FillX" ); +       
-  lay_bar.SetBackGradient( "#444444", "#888888" );+    var  lay_bar   app.CreateLayout( "Linear",  "Horizontal,Left, FillX" );   
 +    lay_bar.SetBackGradient( "#444444",  "#888888" );
  
-  //add app name if required stolen for object/function name in this app +       //add app name if required stolen for object/function name in this app 
-  main_header_txt = app.CreateText( lastMenu , -1, -); +       
-  main_header_txt.SetTextSize( 24 ); +    main_header_txt   app.CreateText( lastMenu  -1,  -);   
-  main_header_txt.SetPadding( 0.01, 0, 0.01, ); +    main_header_txt.SetTextSize( 24 );   
-  lay_bar.AddChild( main_header_txt );+    main_header_txt.SetPadding( 0.01,  0,  0.01,  0 );   
 +    lay_bar.AddChild( main_header_txt );
  
-  var filterlabel = app.CreateText("Func filter:"); +       
-  filterlabel.SetTextSize(18); +    var  filterlabel   app.CreateText("Func filter:");   
-  filterlabel.SetTextColor("#ff222222"); +    filterlabel.SetTextSize(18);   
-  lay_bar.AddChild( filterlabel ); +    filterlabel.SetTextColor("#ff222222");   
-  edtFilter = app.CreateTextEdit("",0.3); +    lay_bar.AddChild( filterlabel );   
-  edtFilter.SetBackColor("#ff222222"); +    edtFilter   app.CreateTextEdit("", 0.3);   
-  edtFilter.SetTextSize(18); +    edtFilter.SetBackColor("#ff222222");   
-  edtFilter.SetPadding( 0.01, 0, 0, 0.001 ); +    edtFilter.SetTextSize(18);   
-  edtFilter.SetOnChange(edtFilterOnChange); +    edtFilter.SetPadding( 0.01,  0,  0,  0.001 );   
-  lay_bar.AddChild(edtFilter);+    edtFilter.SetOnChange(edtFilterOnChange);   
 +    lay_bar.AddChild(edtFilter);
  
-  lyout.AddChild( lay_bar ); +       
-}//add_top_bar+    lyout.AddChild( lay_bar ); 
 +  } //add_top_bar
  
-function menuView_OnTouch(name){ +function  menuView_OnTouch(name) 
-  lastMenu = name; +  {   
-  switch(name) { +    lastMenu   name;   
-    case "layout": +    switch (name)  
-        myobj = app.CreateLayout( "linear" ) ; +        
-        break; +      case  "layout": 
-    case "Button": +                myobj   app.CreateLayout( "linear" ) ;         
-        myobj = app.CreateButton("x"); +        break;     
-        break; +      case  "Button": 
-    case "Text": +                myobj   app.CreateButton("x");         
-        myobj = main_header_txt; +        break;     
-        break; +      case  "Text": 
-    case "Image": +                myobj   main_header_txt;         
-        myobj = app.CreateImage( "/Sys/Img/Hello.png" ); +        break;     
-        break; +      case  "Image": 
-    case "Notification": +                myobj   app.CreateImage( "/Sys/Img/Hello.png" );         
-        myobj = app.CreateNotification() ; +        break;     
-        break; +      case  "Notification": 
-    case "CheckBox": +                myobj   app.CreateNotification() ;         
-        myobj = app.CreateCheckBox( "x" ); +        break;     
-        break; +      case  "CheckBox": 
-    case "Crypt": +                myobj   app.CreateCheckBox( "x" );         
-        myobj = app.CreateCrypt(); +        break;     
-        break; +      case  "Crypt": 
-    case "Dialog": +                myobj   app.CreateCrypt();         
-        myobj = app.CreateDialog(""); +        break;     
-        break; +      case  "Dialog": 
-    case "ToggleButton": +                myobj   app.CreateDialog("");         
-        myobj = app.CreateToggle( "x" ); +        break;     
-        break; +      case  "ToggleButton": 
-    case "SeekBar": +                myobj   app.CreateToggle( "x" );         
-        myobj = app.CreateSeekBar( "x" ); +        break;     
-        break; +      case  "SeekBar": 
-    case "List": +                myobj   app.CreateSeekBar( "x" );         
-        myobj = ListView; +        break;     
-        break; +      case  "List": 
-    case "TextEdit": +                myobj   ListView;         
-        myobj = FunctionView; +        break;     
-        break; +      case  "TextEdit": 
-    case "WebView": +                myobj   FunctionView;         
-        myobj = app.CreateWebView( 0.8,0.); +        break;     
-        break; +      case  "WebView": 
-    case "WebServer": +                myobj   app.CreateWebView( 0.8, 0.);         
-        myobj = app.CreateWebServer( 8080, "Upload,ListDir" ); +        break;     
-        break; +      case  "WebServer": 
-    case "CameraView": +                myobj   app.CreateWebServer( 8080,  "Upload,ListDir" );         
-        myobj = app.CreateCameraView( 0.8,0.); +        break;     
-        break; +      case  "CameraView": 
-    case "Sensor": +                myobj   app.CreateCameraView( 0.8, 0.);         
-       myobj = app.CreateSensor( "Accelerometer" ); +        break;     
-       break; +      case  "Sensor": 
-    case "Email": +               myobj   app.CreateSensor( "Accelerometer" );        
-      myobj = app.CreateEmail( "mymail@gmail.com", "MyPass" ); +        break;     
-      break; +      case  "Email": 
-    case "Locator": +              myobj   app.CreateEmail( "mymail@gmail.com",  "MyPass" );       
-       myobj = app.CreateLocator( "GPS,Network" ); +        break;     
-       break; +      case  "Locator": 
-    case "Spinner": +               myobj   app.CreateLocator( "GPS,Network" );        
-       myobj= app.CreateSpinner("1,2"); +        break;     
-       break; +      case  "Spinner": 
-    case "SMS": +               myobj =  app.CreateSpinner("1,2");        
-       myobj = app.CreateSMS(); +        break;     
-       break; +      case  "SMS": 
-    case "YesNoDialog": +               myobj   app.CreateSMS();        
-        myobj = app.CreateYesNoDialog(""); +        break;     
-        break; +      case  "YesNoDialog": 
-    case("Manually entered code"): +                myobj   app.CreateYesNoDialog("");         
-        showEval(); +        break;     
-        return; +      case ("Manually entered code"): 
-    default: +                showEval();         
-        myobj=app; +        return;     
-        lastMenu = "app"; +      default: 
-    }    +                myobj = app;         
-  prepareFunctionList(); +        lastMenu   "app";     
-  showOverview(); +    }      
-  main_header_txt.SetText( lastMenu ); +    prepareFunctionList();   
-}//menuView_OnTouch+    showOverview();   
 +    main_header_txt.SetText( lastMenu ); 
 +  } //menuView_OnTouch
  
-  function prepareFunctionList(){ +   
-/**** prepare list view ****/+function  prepareFunctionList() 
 +  
 +    /**** prepare list view ****/
  
-    var objFunctionList; +         
-    objFunctionList = []; +    var  objFunctionList;     
-    var filter = edtFilter.GetText().trim().toLowerCase() +    objFunctionList    [];     
-    for (var Key in myobj) { +    var  filter   edtFilter.GetText().trim().toLowerCase()     for  (var  Key  in  myobj)  
-      var keyword= Key.toLowerCase() +          
-      if ((filter == "") || (keyword.indexOf(filter) > -1)){ +      var  keyword =  Key.toLowerCase()       if  ((filter  ==  "" ||  (keyword.indexOf(filter)   -1)) 
-        if (myobj.hasOwnProperty(Key) && (typeof myobj[Key] === 'function')) { +              
-          objFunctionList.push(Key); +        if  (myobj.hasOwnProperty(Key)  &&  (typeof  myobj[Key]  ===  'function'))  
-        }; +                  
-      } +          objFunctionList.push(Key);         
-    }; +        };       
-    objFunctionList.sort(); +      }     
-    ListView.SetList( objFunctionList.join(','), ",") +    };     
-    if(filter != ""filter = "Filtered [" + filter + "]\n"; +    objFunctionList.sort();     
-    pasteable filter lastMenu + "."; +    ListView.SetList( objFunctionList.join(','),  ","    if (filter  !=  "" )  filter   "Filtered ["   filter   "]\n";     
-    var copyDelim = "\n"lastMenu + "."; +    pasteable   filter   lastMenu   ".";     
-    pasteable += objFunctionList.join( copyDelim ) +    var  copyDelim   "\n"   lastMenu   ".";     
-    docfile docfold + "/"lastMenu + ".txt"; +    pasteable  +=  objFunctionList.join( copyDelim     docfile   docfold   "/"   lastMenu   ".txt";   
-  }//prepareFunctionList +  } //prepareFunctionList 
-  function showMenuView(){ +     
-    ListView.SetVisibility('hide'); +function  showMenuView() 
-    FunctionView.SetVisibility('hide'); +      
-    menuView.SetVisibility('show'); +    ListView.SetVisibility('hide');     
-    main_header_txt.SetText( "Choose Control" ); +    FunctionView.SetVisibility('hide');     
-  }//showMenuView+    menuView.SetVisibility('show');     
 +    main_header_txt.SetText( "Choose Control" );   
 +  } //showMenuView
  
-  function showAppFunction (Name) { +   
-    FunctionView.SetText(String(myobj[Name])); +function  showAppFunction (Name)  
-    main_header_txt.SetText( lastMenu + "."Name ); +      
-    ListView.SetVisibility('hide'); +    FunctionView.SetText(String(myobj[Name]));     
-    menuView.SetVisibility('hide'); +    main_header_txt.SetText( lastMenu   "."   Name );     
-    FunctionView.SetVisibility('show'); +    ListView.SetVisibility('hide');     
-  }//showAppFunction+    menuView.SetVisibility('hide');     
 +    FunctionView.SetVisibility('show');   
 +  } //showAppFunction
  
-  function showOverview () { +   
-    ListView.SetVisibility('show'); +function  showOverview ()  
-    FunctionView.SetVisibility('hide'); +      
-    menuView.SetVisibility('hide'); +    ListView.SetVisibility('show');     
-    main_header_txt.SetText( lastMenu ); +    FunctionView.SetVisibility('hide');     
-  }//showOverview +    menuView.SetVisibility('hide');     
-  function edtFilterOnChange(){ +    main_header_txt.SetText( lastMenu );   
-    if( ListView.GetVisibility() == "Show" ){ +  } //showOverview 
-      prepareFunctionList();  +     
-    } +function  edtFilterOnChange() 
-  }//edtFilterOnChange+      
 +    if ( ListView.GetVisibility()  ==  "Show" ) 
 +          
 +      prepareFunctionList();      
 +    }   
 +  } //edtFilterOnChange
  
-  function OnBack(){ +   
-    if (menuView.GetVisibility() == "Show") { +function  OnBack() 
-      var pasteOnExit = app.CreateYesNoDialog( "Copy to clipboard and create text file?" ); +      
-      pasteOnExit.SetOnTouch( pasteOnExit_OnTouch ); +    if  (menuView.GetVisibility()  ==  "Show" 
-    } +          
-    else if( ListView.GetVisibility() == "Show" ) showMenuView(); +      var  pasteOnExit   app.CreateYesNoDialog( "Copy to clipboard and create text file?" );       
-    else showOverview(); +      pasteOnExit.SetOnTouch( pasteOnExit_OnTouch );     
-  }//OnBack+    }     
 +    else  if ( ListView.GetVisibility()  ==  "Show" )  showMenuView();     
 +    else  showOverview();   
 +  } //OnBack
  
-  function pasteOnExit_OnTouch( result ){ +   
-    if( result=="Yes" ){ +function  pasteOnExit_OnTouch( result ) 
-      app.SetClipboardText( pasteable ); +      
-      if( ! app.FolderExists( docfold ) ) +    if ( result == "Yes" ) 
-        app.MakeFolder docfold ); +          
-      app.WriteFile( docfile, pasteable ); +      app.SetClipboardText( pasteable );       
-    } +      if ( ! app.FolderExists( docfold ) )         app.MakeFolder docfold );       
-    app.Exit();  +      app.WriteFile( docfile,  pasteable );     
-  }//pasteOnExit +    }     
-function showEval(){ +    app.Exit();    
-    dlg = app.CreateDialog("eval use with care"); +  } //pasteOnExit 
-    var layDlg = app.CreateLayout( "linear", "vertical,fillxy,left" ); +function  showEval() 
-    layDlg.SetPadding( 0.02, 0, 0.02, 0.02 ); +      
-    edtDlg = app.CreateTextEdit('app.CreateText( "Hello" )'); +    dlg   app.CreateDialog("eval use with care");     
-    edtDlg.SetCursorPos(edtDlg.GetText().length); +    var  layDlg   app.CreateLayout( "linear",  "vertical,fillxy,left" );     
-    layDlg.AddChild(edtDlg); +    layDlg.SetPadding( 0.02,  0,  0.02,  0.02 );     
-    dlg.AddLayout( layDlg ); +    edtDlg   app.CreateTextEdit('app.CreateText( "Hello" )');     
-    var horiz = app.CreateLayout("linear", "horizontal,fillxy"); +    edtDlg.SetCursorPos(edtDlg.GetText().length);     
-    horiz.SetPadding( 0.02, 0.02, 0.02, ); +    layDlg.AddChild(edtDlg);     
-    var btn = app.CreateButton("Ok", 0.2); +    dlg.AddLayout( layDlg );     
-    btn.SetOnTouch(dlg_ok); +    var  horiz   app.CreateLayout("linear",  "horizontal,fillxy");     
-    horiz.AddChild(btn); +    horiz.SetPadding( 0.02,  0.02,  0.02,  0 );     
-    btn = app.CreateButton("Cancel",0.2); +    var  btn   app.CreateButton("Ok",  0.2);     
-    btn.SetOnTouch(dlg_canc); +    btn.SetOnTouch(dlg_ok);     
-    horiz.AddChild(btn); +    horiz.AddChild(btn);     
-    layDlg.AddChild(horiz);+    btn   app.CreateButton("Cancel", 0.2);     
 +    btn.SetOnTouch(dlg_canc);     
 +    horiz.AddChild(btn);     
 +    layDlg.AddChild(horiz);    
     dlg.Show();     dlg.Show();
-}//showEval +  } //showEval 
-function dlg_ok(){ +function  dlg_ok() 
-    app.HideKeyboard(); +      
-    dlg.Dismiss(); +    app.HideKeyboard();     
-    myobj = eval(edtDlg.GetText()); +    dlg.Dismiss();     
-    prepareFunctionList(); +    myobj   eval(edtDlg.GetText());     
-    showOverview(); +    prepareFunctionList();     
-    if ((myobj != null) && (myobj.hasOwnProperty("GetType"))) +    showOverview();     
-      lastMenu = myobj.GetType(); +    if  ((myobj  !=  null)  &&  (myobj.hasOwnProperty("GetType")))       lastMenu   myobj.GetType();     
-    else +    else       lastMenu   "Eval";     
-      lastMenu = "Eval"; +    main_header_txt.SetText( lastMenu ); 
-    main_header_txt.SetText( lastMenu ); +  } //dlg_ok 
-}//dlg_ok +function  dlg_canc() 
-function dlg_canc(){ +      
-    app.HideKeyboard();+    app.HideKeyboard();    
     dlg.Dismiss();     dlg.Dismiss();
-}//dlg_canc+  } //dlg_canc 
 +  
 </code> </code>
  
-I have placed an spk of this app at [[http://hudl.sgarman.net/public/spk/SJGinspect.spk]] which should create a project in the AndroidScript IDE for you.+I have placed an spk of this app at [[http://hudl.sgarman.net/public/spk/SJGinspect.spk]] which should create a project in the DroidScript IDE for you.
  
 And for the sake of completeness, there is an apk at [[http://androidscript.sgarman.net/apk/SJGinspect.apk]] which you could download and install if your device is set up to allow apks that don't come from Google Play. And for the sake of completeness, there is an apk at [[http://androidscript.sgarman.net/apk/SJGinspect.apk]] which you could download and install if your device is set up to allow apks that don't come from Google Play.
sample_code/introspector.txt · Last modified: 2015/03/29 05:06 (external edit)