User Tools

Site Tools


script_app_drawer

====== 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
script_app_drawer [2014/07/18 14:35]
lm13 [Issues and Hints]
script_app_drawer [2015/04/23 14:49] (current)
lm13
Line 2: Line 2:
   * Purpose : This script will fill any container with all of your apps, like an App Drawer   * Purpose : This script will fill any container with all of your apps, like an App Drawer
   * Author : [[https://​plus.google.com/​+LukasMorawietz|LM13]]   * Author : [[https://​plus.google.com/​+LukasMorawietz|LM13]]
-  * Current Version : 1.0 +  * Current Version : 3.2 
-  * Link: +  * Link: https://​plus.google.com/​115366157037831519359/​posts/​4F9TpMfz2fv 
 +  * Video: https://​plus.google.com/​+LukasMorawietz/​posts/​L8r6qKajirq 
 +  * Download available! (Check repository)
  
 ====== Changelog ====== ====== Changelog ======
   * Version 1.0 (18/​7/​2014):​ initial release in wiki   * Version 1.0 (18/​7/​2014):​ initial release in wiki
 +  * Version 1.1 (20/​7/​2014):​ added optional horizontal sorting
 +  * Version 2.0 (23/​7/​2014):​ Removed autovalues, due to an unfixable bug, added item remove and add again
 +  * Version 2.1 (28/​8/​2014):​ Sorting ignores Case
 +  * Version 3.0 (21/​3/​2015):​ Doesn'​t rely on LLs drawer anymore, hiding items improved
 +  * Version 3.1 (21/​3/​2015):​ Fix crash on pre-lollipop devices, added reload
 +  * Version 3.2 (23/​4/​2015):​ Fix compatibility with latest Lightning Versions
  
  
  
 ====== How to use the script ====== ====== How to use the script ======
-  * Set the script in the resumed event of the container +  * load the apk
-  * configure what you want at the beginning of the script ​+
  
 ====== Issues and Hints ====== ====== Issues and Hints ======
-  * As the script is based on the original app drawer, you may have to load the original app drawer once to detect installed or uninstalled apps 
   * first load may take some time    * first load may take some time 
 +  * if you delete items in the normal way, it will cause an error
 +  * Note: The setup script won't work outside of the APK
  
 //please report all bugs in the g+ community!//​ //please report all bugs in the g+ community!//​
  
-====== ​Script ​====== +====== ​Scripts ​====== 
-<code>//config +<spoiler|Setup
-var columns=3;//has to be an Integer ​>=1 +<sxh javascript;>var MY_PKG="​net.pierrox.lightning_launcher.llscript.appdrawer";​ 
-//endconfig;+var TAG = "​appdrawer_lukas"​;
  
 +// install (or update) a script given its id in the package, and its clear name in the launcher data
 +function installScript(id,​name){
 + // load the script (if any) among the existing ones
 + var script=LL.getScriptByName(name);​
 +
 + var script_text=LL.loadRawResource(MY_PKG,​id);​
 +
 + if(script==null){
 + // script not found: install it
 + script=LL.createScript(name,​script_text,​0);​
 + }else{
 + // the script already exists: update its text
 + script.setText(script_text);​
 + }
 +
 + return script;
 +}
 +
 +
 +var script=installScript("​appdrawer","​AppDrawer_main"​);​
 +var menu= installScript("​menu","​AppDrawer_menu"​);​
 +if(!confirm("​Do you want to use this container as App Drawer?"​))return;​
 +var data={};
 +data.columns=prompt("​How many columns do you want?","​5"​);​
 +if(data.columns == null) return;
 +data.rows=prompt("​How many rows do you want? (0 for infinite)","​0"​);​
 +if(data.rows == null) return;
 +var c=LL.getEvent().getContainer();​
 +c.setTag(TAG,​JSON.stringify(data));​
 +c.getProperties().edit().setEventHandler("​resumed",​EventHandler.RUN_SCRIPT,​script.getId()).setEventHandler("​bgLongTap",​EventHandler.RUN_SCRIPT,​menu.getId()).commit();​
 +Android.makeNewToast("​Enjoy your new Appdrawer!",​true).show();​
 +</​sxh>​
 +</​spoiler>​
 +<​spoiler|Menu>​
 +<sxh javascript;>​LL.bindClass("​android.R"​);​
 +LL.bindClass("​java.util.ArrayList"​);​
 +LL.bindClass("​android.view.ViewTreeObserver"​);​
 +LL.bindClass("​android.widget.Button"​);​
 +LL.bindClass("​android.view.View"​);​
 +LL.bindClass("​android.os.Build"​);​
 +
 +var sourceItem = LL.getEvent().getItem();​
 +var context = LL.getContext();​
 +var pkg = context.getPackageName();​
 +var rsrc = context.getResources();​
 +var id = rsrc.getIdentifier("​bubble_content",​ "​id", ​ pkg);
 +var menu =context.getWindow().getDecorView().findViewById(id);​
 +var menuRoot = menu.getParent();​
 +var version = Build.VERSION.SDK_INT;​
 +
 +var obs=menuRoot.getViewTreeObserver();​
 +var l=new ViewTreeObserver.OnGlobalLayoutListener(){
 +    onGlobalLayout:​function(){
 +        var list=menu;
 +        var first=list.getChildAt(0);​
 +        list.removeAllViews();​
 +        var v = !(typeof invisible === '​undefined'​ || invisible);
 +        add(v?"​Hide Hidden":"​Show Hidden",​function(){
 +            LL.runAction(EventHandler.LAUNCHER_MENU);​
 +            invisible = v;
 +            LL.runScript("​AppDrawer_main",​v?"":"​showHidden"​);​
 +        },​first,​list);​
 +        if(sourceItem!=null){
 +            v = !JSON.parse(sourceItem.getTag("​hide"​));​
 +            add(v?"​Hide":"​Unhide",​function(){
 +                LL.runAction(EventHandler.LAUNCHER_MENU);​
 +                if(v)LL.getEvent().getContainer().setItemZIndex(sourceItem.getId(),​0);​
 +                sourceItem.setVisibility(!v);​
 +                sourceItem.setTag("​hide",​v);​
 +                LL.runScript("​AppDrawer_main",""​);​
 +            },​first,​list);​
 +        }
 +        add("​Reload",​function(){
 +            LL.runAction(EventHandler.LAUNCHER_MENU);​
 +            LL.runScript("​AppDrawer_main","​reload"​);​
 +        },​first,​list);​
 +        add("​Lightning Menu",​function(){
 +            LL.runAction(EventHandler.LAUNCHER_MENU);​
 +            if(sourceItem==null) LL.runAction(EventHandler.LAUNCHER_MENU)
 +            else LL.runAction(EventHandler.ITEM_MENU,​sourceItem,​null);​
 +        },​first,​list);​
 +        obs.removeOnGlobalLayoutListener(l);​
 +        return true;
 +    }
 +};
 +
 +obs.addOnGlobalLayoutListener(l);​
 +LL.runAction(EventHandler.LAUNCHER_MENU);​
 +
 +function add(text,​onClickFunction,​first,​list){
 +    var t=new Button(LL.getContext());​
 +    if(version >= 16) t.setBackground(first.getBackground().mutate().getConstantState().newDrawable());​
 +    else t.setBackgroundDrawable(first.getBackground().mutate().newDrawable());​
 +    t.setTypeface(first.getTypeface());​
 +    if(version >= 14) t.setAllCaps(false);​
 +    t.setTextSize(0,​first.getTextSize());​
 +    if(version >= 21) t.setFontFeatureSettings(first.getFontFeatureSettings());​
 +    t.setGravity(first.getGravity());​
 +    t.setText(text);​
 +    t.setOnClickListener(new View.OnClickListener(){
 +    onClick:​onClickFunction
 +    });
 +    list.addView(t);​
 +}
 +</​sxh>​
 +</​spoiler>​
 +<​spoiler|Main>​
 +<sxh javascript;>​var TAG = "​appdrawer_lukas";​
  
 var e=LL.getEvent();​ var e=LL.getEvent();​
 var c=e.getContainer();​ var c=e.getContainer();​
-var d=LL.getContainerById(99);​ +var data=JSON.parse(c.getTag(TAG)); 
-var ditems=d.getItems();​ +if(data == null)return; 
-var db=JSON.parse(c.getTag());​ +var db=data.db || []; 
-if(db==null) +var columns=data.columns;​ 
-+var rows=data.rows
-db=[]; +var showHidden = (e.getData() == "​showHidden"​); 
-} + 
-for(a0=0;​a0<​ditems.length;a0++) +sort()
-resetTag(ditems.getAt(a0)); + 
-for(a1=0;a1<​db.length;​a1++) +var initialize = (db.length == 0 || e.getData() == "​reload"​); 
-{ +if(initialize)
-if(LL.getItemById(db[a1][0])==null+    db []; 
-+    LL.bindClass("​android.app.ProgressDialog"​);​ 
-if(LL.getItemById(db[a1][1])!=null) +    var progress = new ProgressDialog(LL.getContext()); 
-c.removeItem(LL.getItemById(db[a1][1])); +    ​progress.setTitle("​Initializing App Drawer"​) 
-if(a1==db.length-1)db.pop(); +    progress.setMessage("​Please wait..."​); 
-else  +    ​progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
-+    ​progress.show();
-db[a1]=db.pop(); +
-a--; +
-+
-+
-else { +
-LL.getItemById(db[a1][0]).setTag("​saved"​); +
-}+
 } }
-for(a2=0;​a2<​ditems.length;​a2++) +setTimeout(function(){ 
-check(ditems.getAt(a2)); +    if(initialize){ 
-c.setTag(JSON.stringify(db)); +        var i=c.getItems();​ 
-var citems=c.getItems();​ +     ​for(var a = 0; i.length; ​a++) c.removeItem(i.getAt(a)); 
-var labels=[];​ +    } 
-for(a4=0;a4<db.length;a4++) +    for(var a = 0; db.length; ​a++) db[a][2] = false;
-labels[labels.length]=LL.getItemById(db[a4][1]).getLabel()+
-labels.sort(); +
-LL.writeToLogFile(db+"​\n\n"​+labels,​false);​ +
-for(a5=0;a5<labels.length;a5++) +
-c.getItemByLabel(labels[a5]).setCell(a5%columns,​Math.floor(a5/​columns),​a5%columns+1,​Math.floor(a5/​columns)+1);+
  
-function check(item+    var intent = new Intent(Intent.ACTION_MAIN); 
-{ +    ​intent.addCategory(Intent.CATEGORY_LAUNCHER);​ 
-if(item.getType()=="​Folder"​+    var pm = LL.getContext().getPackageManager()
-{ +    var apps pm.queryIntentActivities(intent,​0); 
-var fitemsitem.getContainer().getItems(); +    var x = 0; 
-for(a3=0;a3<fitems.length;a3++) +    var function()
-check(fitems.getAt(a3)); +        var app = apps.get(x); 
-} +        var name = app.activityInfo.name;​ 
-else if(item.getTag()!="saved") +        var pkg = app.activityInfo.packageName;​ 
-{ +        ​for(var b = 0; db.length ​&& db[b][1] != nameb++); 
-db[db.length]=[]; +        if(b == db.length) { 
-db[db.length-1][0]=item.getId();​  +            var i = new Intent(intent)
-var newItemc.addShortcut(item.getLabel(),item.getIntent(),0,0); +            i.setClassName(pkg,​ name); 
-newItem.setDefaultIcon(item.getDefaultIcon()); +            var item = c.addShortcut(app.loadLabel(pm),​i,​0,​0);​ 
-db[db.length-1][1]=newItem.getId(); +            ​item.setName(item.getLabel()); 
-db[db.length-1][2]=item.getLabel(); +            item.setTag("hide",false); 
-}+            var bmp = pm.getActivityIcon(i).getBitmap();​ 
 +            var img = LL.createImage(bmp.getWidth(),​bmp.getHeight());​ 
 +            img.draw().drawBitmap(bmp,​0,​0,​null);​ 
 +            item.setDefaultIcon(img);​ 
 +            item.getProperties().edit().setEventHandler("​i.longTap",​EventHandler.RUN_SCRIPT,​LL.getScriptByName("​AppDrawer_menu"​).getId()).commit();​ 
 +            db[b] = []; 
 +            db[b][0] = item.getId();​ 
 +            ​db[b][1] ​name; 
 +        } 
 +        db[b][2] = true; 
 +        x++; 
 +        if(x<apps.size()) setTimeout(f,0); 
 +        else{ 
 +            sort(); 
 +            if(typeof progress !== '​undefined'​)progress.dismiss()
 +        } 
 +    }; 
 +    setTimeout(f,0); 
 +},100); 
 + 
 +function sort(){ 
 +    var labels=[];​ 
 +    for(var a = 0; a < db.length; a++){ 
 +        var item=LL.getItemById(db[a][0]); 
 +        if(db[a][2]){ 
 +            if(showHidden||!JSON.parse(item.getTag("​hide"​)))labels.push(item.getName()); 
 +            else item.setVisibility(false);​ 
 +        } 
 +        else{ 
 +            c.removeItem(item);​ 
 +            ​db.splice(a,​1);​ 
 +            a--; 
 +        } 
 +    } 
 +    data.db = db; 
 +    c.setTag(TAG,​JSON.stringify(data));​ 
 +    labels.sort(noCaseSort);​ 
 +    for(var a = 0; a < labels.length; a++){ 
 +        var item = c.getItemByName(labels[a]); 
 +        item.setVisibility(true);​ 
 +        if(rows==0)item.setCell(a%columns,​Math.floor(a/​columns),​a%columns+1,​Math.floor(a/​columns)+1); 
 +        else item.setCell(a%columns+columns*Math.floor(a/​(rows*columns)),​Math.floor(a/​columns)-rows*Math.floor(a/​(rows*columns)),​a%columns+columns*Math.floor(a/​(rows*columns))+1,​Math.floor(a/​columns)-rows*Math.floor(a/​(rows*columns))+1);​ 
 +    ​} 
 +    c.getItemByName(labels[a]) 
 +    LL.save();
 } }
  
-function ​resetTag(item)+function ​noCaseSort(a,b)
 { {
-if(item.getType()=="​Folder"​) + if(a.toLowerCase()>b.toLowerCase())return 1
-+ if(a.toLowerCase()<b.toLowerCase())return -1; 
-var fitems= item.getContainer().getItems(); + return 0;
-for(a5=0;​a5<​fitems.length;a5++) +
-resetTag(fitems.getAt(a5));+
 } }
-else +</​sxh>​ 
-+</spoiler>
-item.setTag(null);​ +
-+
-} +
-</code> +
script_app_drawer.1405694120.txt.gz · Last modified: 2014/07/18 14:35 by lm13