User Tools

Site Tools


script_app_drawer

====== About the script ====== * Purpose : This script will fill any container with all of your apps, like an App Drawer * Author : [[https://plus.google.com/+LukasMorawietz|LM13]] * Current Version : 3.2 * Link: https://plus.google.com/115366157037831519359/posts/4F9TpMfz2fv * Video: https://plus.google.com/+LukasMorawietz/posts/L8r6qKajirq * Download available! (Check repository) ====== Changelog ====== * 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 ====== * load the apk ====== Issues and Hints ====== * 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!// ====== Scripts ====== <spoiler|Setup> <sxh javascript;>var MY_PKG="net.pierrox.lightning_launcher.llscript.appdrawer"; 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 c=e.getContainer(); var data=JSON.parse(c.getTag(TAG)); if(data == null)return; var db=data.db || []; var columns=data.columns; var rows=data.rows; var showHidden = (e.getData() == "showHidden"); sort(); var initialize = (db.length == 0 || e.getData() == "reload"); if(initialize){ db = []; LL.bindClass("android.app.ProgressDialog"); var progress = new ProgressDialog(LL.getContext()); progress.setTitle("Initializing App Drawer") progress.setMessage("Please wait..."); progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); progress.show(); } setTimeout(function(){ if(initialize){ var i=c.getItems(); for(var a = 0; a < i.length; a++) c.removeItem(i.getAt(a)); } for(var a = 0; a < db.length; a++) db[a][2] = false; var intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); var pm = LL.getContext().getPackageManager(); var apps = pm.queryIntentActivities(intent,0); var x = 0; var f = function(){ var app = apps.get(x); var name = app.activityInfo.name; var pkg = app.activityInfo.packageName; for(var b = 0; b < db.length && db[b][1] != name; b++); if(b == db.length) { var i = new Intent(intent); i.setClassName(pkg, name); var item = c.addShortcut(app.loadLabel(pm),i,0,0); item.setName(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 noCaseSort(a,b) { if(a.toLowerCase()>b.toLowerCase())return 1; if(a.toLowerCase()<b.toLowerCase())return -1; return 0; } </sxh> </spoiler>

script_app_drawer.txt · Last modified: 2015/04/23 14:49 by lm13