====== Differences ====== This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
script_multitool [2014/11/04 19:35] lm13 |
script_multitool [2016/02/09 08:08] (current) st1d |
||
---|---|---|---|
Line 2: | Line 2: | ||
* Purpose : This script is a multifunctional tool to do or show a lot of stuff | * Purpose : This script is a multifunctional tool to do or show a lot of stuff | ||
* Author : [[https://plus.google.com/+LukasMorawietz|LM13]] | * Author : [[https://plus.google.com/+LukasMorawietz|LM13]] | ||
- | * Current Version : 2.2 | ||
* Link : https://plus.google.com/115366157037831519359/posts/fQwfu5AUj5m | * Link : https://plus.google.com/115366157037831519359/posts/fQwfu5AUj5m | ||
- | * Download avialable! (Check repository) | + | * Download available! (Check repository) |
- | + | ||
- | ====== Changelog ====== | + | |
- | * Version 1.0 (20/7/2014): initial release in wiki | + | |
- | * Version 1.1 (21/7/2014): replaced move item script with trianguloY's solution. | + | |
- | * Version 1.2 (25/7/2014): replaced change home page with move pages to extend functionality, sorted choices on script-side | + | |
- | * Version 1.2.1 (26/7/2014): added Intent to Item details | + | |
- | * Version 1.3 (28/7/2014): fix: no touch data in swipe event, add resize, add save, add containers ID | + | |
- | * Version 1.3.1 (31/8/2014): fix: Intent also for folders | + | |
- | * Version 2.0 (14/9/2014): new UI, added comments, removed the easteregg, because it's not reachable through the new UI | + | |
- | * Version 2.1 (24/9/2014): UI updated again, now selection is sorted into categorys, added import, export and autoformat scripts | + | |
- | * Version 2.2 (4/10/2014): Abilility to View and Reset all tags, not only the default one. | + | |
- | * Version 2.3 (4/11/2014): Added Icon and Background image view, added progress to autoformat to show the user what gets done | + | |
====== How to use the script ====== | ====== How to use the script ====== | ||
- | * enable the script in any menu or event you want to run it | + | * see App |
====== Current functionality ====== | ====== Current functionality ====== | ||
Line 26: | Line 13: | ||
* Show Item related parameters | * Show Item related parameters | ||
* Show Icons and images for an item | * Show Icons and images for an item | ||
- | * Show play store page of an shortcut | ||
* Attach/Detach all Items | * Attach/Detach all Items | ||
* Resize all detached items | * Resize all detached items | ||
Line 34: | Line 20: | ||
* Import Script | * Import Script | ||
* Autoformat Script | * Autoformat Script | ||
+ | * Search in Scripts | ||
* Reset Tags | * Reset Tags | ||
* Reset Tool © by trianguloY | * Reset Tool © by trianguloY | ||
* save all Layout changes | * save all Layout changes | ||
+ | * Reset the recent apps list | ||
//please report all bugs in the g+ community// | //please report all bugs in the g+ community// | ||
- | ====== Script ====== | + | <spoiler|Script (won't work without the apk)> |
- | <sxh javascript;> | + | <sxh javascript;>//Created by Lukas Morawietz in collaboration with TrianguloY |
- | </sxh> | + | |
+ | //import java classes | ||
+ | LL.bindClass("android.app.AlertDialog"); | ||
+ | LL.bindClass("android.app.ProgressDialog"); | ||
+ | LL.bindClass("android.content.DialogInterface"); | ||
+ | LL.bindClass("android.os.Environment"); | ||
+ | LL.bindClass("android.R"); | ||
+ | LL.bindClass("android.widget.ExpandableListView"); | ||
+ | LL.bindClass("android.widget.ImageView"); | ||
+ | LL.bindClass("android.widget.LinearLayout"); | ||
+ | LL.bindClass("android.widget.ListView"); | ||
+ | LL.bindClass("android.widget.NumberPicker"); | ||
+ | LL.bindClass("android.widget.SimpleAdapter"); | ||
+ | LL.bindClass("android.widget.SimpleExpandableListAdapter"); | ||
+ | LL.bindClass("android.widget.ScrollView"); | ||
+ | LL.bindClass("android.widget.TextView"); | ||
+ | LL.bindClass("java.io.File"); | ||
+ | LL.bindClass("java.io.BufferedReader"); | ||
+ | LL.bindClass("java.io.FileReader"); | ||
+ | LL.bindClass("java.io.FileWriter"); | ||
+ | LL.bindClass("java.util.HashMap"); | ||
+ | LL.bindClass("java.util.ArrayList"); | ||
+ | |||
+ | |||
+ | var hasItem=(LL.getEvent().getItem()!=null); | ||
+ | |||
+ | //define Strings to display | ||
+ | var title="What do you want to do?"; | ||
+ | var items=[] | ||
+ | var info=["Information",[]]; | ||
+ | info[1].push("Event"); | ||
+ | info[1].push("Container") | ||
+ | if(hasItem){ | ||
+ | info[1].push("Item"); | ||
+ | info[1].push("Intent"); | ||
+ | info[1].push("Icon"); | ||
+ | } | ||
+ | var itemUtils=["Item Utilities",[]]; | ||
+ | itemUtils[1].push("Attach/Detach all Items"); | ||
+ | itemUtils[1].push("Resize all detached Items"); | ||
+ | itemUtils[1].push("Delete all Items"); | ||
+ | itemUtils[1].push("Move Pages"); | ||
+ | var scriptUtils=["Script Tools",[]]; | ||
+ | scriptUtils[1].push("Export Scripts (Backup)"); | ||
+ | scriptUtils[1].push("Import Script"); | ||
+ | scriptUtils[1].push("Autoformat Scripts"); | ||
+ | scriptUtils[1].push("Search in Scripts"); | ||
+ | var other = ["Other",[]]; | ||
+ | other[1].push("Reset Tag"); | ||
+ | other[1].push("Reset Tool"); | ||
+ | other[1].push("Save changes"); | ||
+ | other[1].push("Delete recent app history"); | ||
+ | items.push(info); | ||
+ | items.push(itemUtils); | ||
+ | items.push(scriptUtils); | ||
+ | items.push(other); | ||
+ | |||
+ | |||
+ | //normal run | ||
+ | if(typeof resultCode==='undefined') expandableList(items,mainOnClick,title); | ||
+ | //user has selected a file to import | ||
+ | else import_handleInput(); | ||
+ | |||
+ | //handle user selection | ||
+ | function mainOnClick(groupPosition,childPosition){ | ||
+ | switch(groupPosition){ | ||
+ | case 0://Information | ||
+ | switch(childPosition){ | ||
+ | case 0://Event related | ||
+ | eventData(); | ||
+ | break; | ||
+ | case 1://container related | ||
+ | containerData() | ||
+ | break; | ||
+ | case 2://item related | ||
+ | itemData(); | ||
+ | break; | ||
+ | case 3://intent | ||
+ | intentData(); | ||
+ | break; | ||
+ | case 4://icon | ||
+ | iconData(); | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | case 1://item utilities | ||
+ | switch(childPosition){ | ||
+ | case 0://Attach/Detach all items | ||
+ | attachDetachAll(); | ||
+ | break; | ||
+ | case 1://resize detached items | ||
+ | resizeAllDetached(); | ||
+ | break; | ||
+ | case 2://delete items | ||
+ | deleteAll(); | ||
+ | break; | ||
+ | case 3://move pages | ||
+ | movePages(); | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | case 2://Script Tools | ||
+ | switch(childPosition){ | ||
+ | case 0://export | ||
+ | exportScripts(); | ||
+ | break; | ||
+ | case 1://import | ||
+ | import_askForInput(); | ||
+ | break; | ||
+ | case 2://autoformat | ||
+ | autoFormat(); | ||
+ | break; | ||
+ | case 3://serach in scripts | ||
+ | searchScripts(); | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | case 3://other | ||
+ | switch(childPosition){ | ||
+ | case 0://reset Tag | ||
+ | resetTags(); | ||
+ | break; | ||
+ | case 1://reset tool by trianguloY, ask him how it works :D | ||
+ | resetTool(); | ||
+ | break; | ||
+ | case 2: | ||
+ | saveLayout(); | ||
+ | break; | ||
+ | case 3: | ||
+ | resetRecents(); | ||
+ | break; | ||
+ | } | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | function eventData(){ | ||
+ | var e=LL.getEvent(); | ||
+ | try{ //test if event contains touch data | ||
+ | e.getTouchScreenX(); | ||
+ | var ok=true; | ||
+ | } | ||
+ | catch(Exception){ | ||
+ | var ok=false; | ||
+ | } | ||
+ | text("Source: "+e.getSource()+"\nDate: "+e.getDate()+"\nContainer: "+e.getContainer()+"\nItem: "+e.getItem()+(ok?("\nTouch: "+e.getTouchX()+","+e.getTouchY()+"\nTouch (Screen): "+e.getTouchScreenX()+","+e.getTouchScreenY()):""),"Event Information"); | ||
+ | } | ||
+ | |||
+ | function containerData(){ | ||
+ | var c=LL.getEvent().getContainer(); | ||
+ | var t=c.getType();//Differentiate between Desktop and other containers | ||
+ | |||
+ | //read Tags from launcher file | ||
+ | var s=read(LL.getContext().getFilesDir().getPath()+"/pages/"+c.getId()+"/conf"); | ||
+ | var data=JSON.parse(s); | ||
+ | var tags="Default: "+c.getTag(); | ||
+ | for(property in data.tags) | ||
+ | tags+="\n"+property+": "+data.tags[property]; | ||
+ | text("Type: "+t+"\nName/Label: "+(t=="Desktop"?c.getName():c.getOpener().getLabel())+"\nID: "+c.getId()+"\nSize: "+c.getWidth()+","+c.getHeight()+"\nBoundingbox: "+c.getBoundingBox()+"\nCell Size: "+c.getCellWidth()+","+c.getCellHeight()+"\nCurrent Position: "+c.getPositionX()+","+c.getPositionY()+"\nCurrent Scale: "+c.getPositionScale()+"\nTags: "+tags+"\nItems: "+c.getItems(),"Container Information"); | ||
+ | } | ||
+ | |||
+ | function itemData(){ | ||
+ | var i=LL.getEvent().getItem();if(i==null)//check if event contains item | ||
+ | text("no item found","Error 5"); | ||
+ | |||
+ | //read tags from launcher file | ||
+ | var s=read(LL.getContext().getFilesDir().getPath()+"/pages/"+LL.getEvent().getContainer().getId()+"/items"); | ||
+ | var all=JSON.parse(s).i; | ||
+ | var x; | ||
+ | var item; | ||
+ | for(x=0;x<all.length;x++){ | ||
+ | item=all[x]; | ||
+ | if(item.b==i.getId())break; | ||
+ | } | ||
+ | if(x==all.length){ | ||
+ | text("Can't find Tags","Error 6"); | ||
+ | return; | ||
+ | } | ||
+ | var tags="Default: "+i.getTag(); | ||
+ | for(property in item.an){ | ||
+ | if(property=="_")continue; | ||
+ | tags+="\n"+property+": "+item.an[property]; | ||
+ | } | ||
+ | text("Label: "+i.getLabel()+"\nType: "+i.getType()+"\nID: "+i.getId()+"\nSize: "+i.getWidth()+","+i.getHeight()+"\nPosition: "+i.getPositionX()+","+i.getPositionY()+"\nScale: "+i.getScaleX()+","+i.getScaleY()+"\nAngle: "+i.getRotation()+"\nCenter: "+center(i)+((i.getType()=="Shortcut"||i.getType()=="Folder")?"\nIntent:"+i.getIntent():"")+"\nTags: "+tags,"Item Information"); | ||
+ | } | ||
+ | |||
+ | function intentData(){ | ||
+ | it=LL.getEvent().getItem(); | ||
+ | if(it==null)text("No Intent found.","Error 1"); | ||
+ | else text("Intent: "+it.getIntent()+"\nExtras: "+it.getIntent().getExtras(),"Intent Information"); | ||
+ | } | ||
+ | |||
+ | function iconData(){ | ||
+ | it=LL.getEvent().getItem(); | ||
+ | //create view structure | ||
+ | var root=new LinearLayout(LL.getContext()); | ||
+ | root.setOrientation(LinearLayout.VERTICAL); | ||
+ | |||
+ | //check for all kinds of images in this item and add them to the view if there are any | ||
+ | addImageIfNotNull(root,it.getBoxBackground("n"),"Normal Box Background"); | ||
+ | addImageIfNotNull(root,it.getBoxBackground("s"),"Selected Box Background"); | ||
+ | addImageIfNotNull(root,it.getBoxBackground("f"),"Focused Box Background"); | ||
+ | if(it.getType()=="Shortcut"){ | ||
+ | addImageIfNotNull(root,image=it.getDefaultIcon(),"Default Icon"); | ||
+ | addImageIfNotNull(root,image=it.getCustomIcon(),"Custom Icon"); | ||
+ | } | ||
+ | if(root.getChildCount()>0){ //at least one image found | ||
+ | var scroll=new ScrollView(LL.getContext()); | ||
+ | scroll.addView(root); | ||
+ | customDialog(scroll,"Icon"); | ||
+ | } | ||
+ | else Android.makeNewToast("No Image Data available",true).show(); //no image found | ||
+ | } | ||
+ | |||
+ | function attachDetachAll(){ | ||
+ | var items=LL.getEvent().getContainer().getItems(); | ||
+ | var attachDetach = function(toGrid){ | ||
+ | for(x=0;x<items.length;x++) | ||
+ | { | ||
+ | var i=items.getAt(x); | ||
+ | i.getProperties().edit().setBoolean("i.onGrid",toGrid).commit(); | ||
+ | } | ||
+ | Android.makeNewToast("Done!",true).show(); | ||
+ | } | ||
+ | var attach = function(){attachDetach(true);} | ||
+ | var detach = function(){attachDetach(false);} | ||
+ | chooser([function(){},attach,detach],["Cancel","Attach","Detach"],"Do you want to attach or detach all items?","MultiTool"); | ||
+ | } | ||
+ | |||
+ | function resizeAllDetached(){ | ||
+ | var linearLayout = new LinearLayout(LL.getContext()); | ||
+ | var c = LL.getEvent().getContainer(); | ||
+ | linearLayout.setOrientation(LinearLayout.VERTICAL); | ||
+ | var widthText = new TextView(LL.getContext()); | ||
+ | widthText.setText("Width: "); | ||
+ | linearLayout.addView(widthText); | ||
+ | var widthPicker = new NumberPicker(LL.getContext()); | ||
+ | widthPicker.setMinValue(1); | ||
+ | widthPicker.setMaxValue(9999); | ||
+ | widthPicker.setValue(c.getCellWidth()); | ||
+ | linearLayout.addView(widthPicker); | ||
+ | var heightText = new TextView(LL.getContext()); | ||
+ | heightText.setText("Height: "); | ||
+ | linearLayout.addView(heightText); | ||
+ | var heightPicker = new NumberPicker(LL.getContext()); | ||
+ | heightPicker.setMinValue(1); | ||
+ | heightPicker.setMaxValue(9999); | ||
+ | heightPicker.setValue(c.getCellHeight()); | ||
+ | linearLayout.addView(heightPicker); | ||
+ | var onClick = function(){ | ||
+ | var s=[widthPicker.getValue(),heightPicker.getValue()]; | ||
+ | var items=c.getItems(); | ||
+ | for(var a=0;a<items.length;a++) | ||
+ | items.getAt(a).setSize(s[0],s[1]); | ||
+ | } | ||
+ | customConfirmDialog(linearLayout,"To which size?",onClick); | ||
+ | } | ||
+ | |||
+ | function deleteAll(){ | ||
+ | var f = function(){ | ||
+ | var c=LL.getEvent().getContainer(); | ||
+ | var i=c.getItems(); | ||
+ | for(a=0;a<i.length;a++) | ||
+ | c.removeItem(i.getAt(a)); | ||
+ | } | ||
+ | chooser([function(){},f],["No","Yes"],"Are you sure?","Delete all items"); | ||
+ | } | ||
+ | |||
+ | function movePages(){ | ||
+ | var cont=LL.getEvent().getContainer(); | ||
+ | var items=cont.getItems(); | ||
+ | var cWidth=cont.getWidth(); | ||
+ | var cHeight=cont.getHeight(); | ||
+ | var cellsFloatX=cWidth/cont.getCellWidth(); | ||
+ | var cellsFloatY=cHeight/cont.getCellHeight(); | ||
+ | var cellsX=Math.round(cellsFloatX); | ||
+ | var cellsY=Math.round(cellsFloatY); | ||
+ | var f=function(){ | ||
+ | try{ | ||
+ | //page(s) selection | ||
+ | var s=prompt("Which page do you want to move? (* for all) input has to be x,y (e.g. *,* for all pages)","").split(","); | ||
+ | var move=JSON.parse("[\""+s[0]+"\",\""+s[1]+"\"]"); | ||
+ | var done=true; | ||
+ | } | ||
+ | catch(Exception){ | ||
+ | var done=false; | ||
+ | } | ||
+ | //check for valid input | ||
+ | if(!done||move==null||move[0]==null||(move[0]!="*"&&isNaN(parseInt(move[0])))||move[1]==null||(move[1]!= |