====== Differences ====== This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
script_app_drawer [2015/03/20 23:49] lm13 |
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 : 3.0 | + | * Current Version : 3.2 |
* Link: https://plus.google.com/115366157037831519359/posts/4F9TpMfz2fv | * Link: https://plus.google.com/115366157037831519359/posts/4F9TpMfz2fv | ||
+ | * Video: https://plus.google.com/+LukasMorawietz/posts/L8r6qKajirq | ||
* Download available! (Check repository) | * Download available! (Check repository) | ||
Line 12: | Line 13: | ||
* Version 2.1 (28/8/2014): Sorting ignores Case | * 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.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 | ||
Line 25: | Line 28: | ||
//please report all bugs in the g+ community!// | //please report all bugs in the g+ community!// | ||
+ | ====== Scripts ====== | ||
<spoiler|Setup> | <spoiler|Setup> | ||
<sxh javascript;>var MY_PKG="net.pierrox.lightning_launcher.llscript.appdrawer"; | <sxh javascript;>var MY_PKG="net.pierrox.lightning_launcher.llscript.appdrawer"; | ||
Line 62: | Line 66: | ||
</sxh> | </sxh> | ||
</spoiler> | </spoiler> | ||
- | |||
<spoiler|Menu> | <spoiler|Menu> | ||
<sxh javascript;>LL.bindClass("android.R"); | <sxh javascript;>LL.bindClass("android.R"); | ||
Line 69: | Line 72: | ||
LL.bindClass("android.widget.Button"); | LL.bindClass("android.widget.Button"); | ||
LL.bindClass("android.view.View"); | LL.bindClass("android.view.View"); | ||
+ | LL.bindClass("android.os.Build"); | ||
var sourceItem = LL.getEvent().getItem(); | var sourceItem = LL.getEvent().getItem(); | ||
- | var menuRoot=LL.getContext().getWindow().getDecorView().findViewById(R.id.content).getChildAt(0).getChildAt(2).getChildAt(2); | + | var context = LL.getContext(); |
- | var menu = menuRoot.getChildAt(0); | + | 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 obs=menuRoot.getViewTreeObserver(); | ||
var l=new ViewTreeObserver.OnGlobalLayoutListener(){ | var l=new ViewTreeObserver.OnGlobalLayoutListener(){ | ||
- | onGlobalLayout:function() | + | onGlobalLayout:function(){ |
- | { | + | var list=menu; |
- | var list=menu.getChildAt(0); | + | var first=list.getChildAt(0); |
- | var first=list.getChildAt(0); | + | list.removeAllViews(); |
- | list.removeAllViews(); | + | var v = !(typeof invisible === 'undefined' || invisible); |
- | var v = !(typeof invisible === 'undefined' || invisible); | + | add(v?"Hide Hidden":"Show Hidden",function(){ |
- | add(v?"Hide Hidden":"Show Hidden",function(){ | + | LL.runAction(EventHandler.LAUNCHER_MENU); |
- | LL.runAction(EventHandler.LAUNCHER_MENU); | + | invisible = v; |
- | invisible = v; | + | LL.runScript("AppDrawer_main",v?"":"showHidden"); |
- | LL.runScript("AppDrawer_main",v?"":"showHidden"); | + | },first,list); |
- | },first,list); | + | if(sourceItem!=null){ |
- | if(sourceItem!=null){ | + | v = !JSON.parse(sourceItem.getTag("hide")); |
- | v = !JSON.parse(sourceItem.getTag("hide")); | + | add(v?"Hide":"Unhide",function(){ |
- | add(v?"Hide":"Unhide",function(){ | + | LL.runAction(EventHandler.LAUNCHER_MENU); |
- | LL.runAction(EventHandler.LAUNCHER_MENU); | + | if(v)LL.getEvent().getContainer().setItemZIndex(sourceItem.getId(),0); |
- | if(v)LL.getEvent().getContainer().setItemZIndex(sourceItem.getId(),0); | + | sourceItem.setVisibility(!v); |
- | sourceItem.setVisibility(!v); | + | sourceItem.setTag("hide",v); |
- | sourceItem.setTag("hide",v); | + | LL.runScript("AppDrawer_main",""); |
- | LL.runScript("AppDrawer_main",""); | + | },first,list); |
- | },first,list); | + | } |
- | } | + | add("Reload",function(){ |
- | add("Lightning Menu",function(){ | + | LL.runAction(EventHandler.LAUNCHER_MENU); |
- | LL.runAction(EventHandler.LAUNCHER_MENU); | + | LL.runScript("AppDrawer_main","reload"); |
- | if(sourceItem==null) LL.runAction(EventHandler.LAUNCHER_MENU) | + | },first,list); |
- | else LL.runAction(EventHandler.ITEM_MENU,sourceItem,null); | + | add("Lightning Menu",function(){ |
- | },first,list); | + | LL.runAction(EventHandler.LAUNCHER_MENU); |
- | obs.removeOnGlobalLayoutListener(l); | + | if(sourceItem==null) LL.runAction(EventHandler.LAUNCHER_MENU) |
- | return true; | + | else LL.runAction(EventHandler.ITEM_MENU,sourceItem,null); |
- | } | + | },first,list); |
+ | obs.removeOnGlobalLayoutListener(l); | ||
+ | return true; | ||
+ | } | ||
}; | }; | ||
Line 111: | Line 123: | ||
function add(text,onClickFunction,first,list){ | function add(text,onClickFunction,first,list){ | ||
- | var t=new Button(LL.getContext()); | + | var t=new Button(LL.getContext()); |
- | t.setBackground(first.getBackground().mutate().getConstantState().newDrawable()); | + | if(version >= 16) t.setBackground(first.getBackground().mutate().getConstantState().newDrawable()); |
- | t.setTypeface(first.getTypeface()); | + | else t.setBackgroundDrawable(first.getBackground().mutate().newDrawable()); |
- | t.setAllCaps(false); | + | t.setTypeface(first.getTypeface()); |
- | t.setTextSize(0,first.getTextSize()); | + | if(version >= 14) t.setAllCaps(false); |
- | t.setFontFeatureSettings(first.getFontFeatureSettings()); | + | t.setTextSize(0,first.getTextSize()); |
- | t.setGravity(first.getGravity()); | + | if(version >= 21) t.setFontFeatureSettings(first.getFontFeatureSettings()); |
- | t.setText(text); | + | t.setGravity(first.getGravity()); |
- | t.setOnClickListener(new View.OnClickListener(){ | + | t.setText(text); |
- | onClick:onClickFunction | + | t.setOnClickListener(new View.OnClickListener(){ |
- | }); | + | onClick:onClickFunction |
- | list.addView(t); | + | }); |
+ | list.addView(t); | ||
} | } | ||
</sxh> | </sxh> | ||
</spoiler> | </spoiler> | ||
- | + | <spoiler|Main> | |
- | + | ||
- | + | ||
- | <spoiler|Appdrawer> | + | |
<sxh javascript;>var TAG = "appdrawer_lukas"; | <sxh javascript;>var TAG = "appdrawer_lukas"; | ||
Line 136: | Line 146: | ||
var data=JSON.parse(c.getTag(TAG)); | var data=JSON.parse(c.getTag(TAG)); | ||
if(data == null)return; | if(data == null)return; | ||
- | var db=data.db||[]; | + | var db=data.db || []; |
var columns=data.columns; | var columns=data.columns; | ||
var rows=data.rows; | var rows=data.rows; | ||
Line 143: | Line 153: | ||
sort(); | sort(); | ||
- | if(db.length == 0){ | + | var initialize = (db.length == 0 || e.getData() == "reload"); |
- | LL.bindClass("android.app.ProgressDialog"); | + | if(initialize){ |
- | var progress = new ProgressDialog(LL.getContext()); | + | db = []; |
- | progress.setTitle("Initializing App Drawer") | + | LL.bindClass("android.app.ProgressDialog"); |
- | progress.setMessage("Please wait..."); | + | var progress = new ProgressDialog(LL.getContext()); |
- | progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); | + | progress.setTitle("Initializing App Drawer") |
- | progress.show(); | + | progress.setMessage("Please wait..."); |
+ | progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); | ||
+ | progress.show(); | ||
} | } | ||
setTimeout(function(){ | setTimeout(function(){ | ||
- | for(var a = 0; a < db.length; a++){ | + | if(initialize){ |
- | db[a][2] = false; | + | 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); | + | var intent = new Intent(Intent.ACTION_MAIN); |
- | intent.addCategory(Intent.CATEGORY_LAUNCHER); | + | intent.addCategory(Intent.CATEGORY_LAUNCHER); |
- | var pm = LL.getContext().getPackageManager(); | + | var pm = LL.getContext().getPackageManager(); |
- | var apps = pm.queryIntentActivities(intent,0); | + | var apps = pm.queryIntentActivities(intent,0); |
- | for(var a = 0; a < apps.size(); a++){ | + | var x = 0; |
- | var app = apps.get(a); | + | var f = function(){ |
- | for(var b = 0; b < db.length && db[b][1] != app.activityInfo.name; b++); | + | var app = apps.get(x); |
- | if(b == db.length) { | + | var name = app.activityInfo.name; |
- | var i = new Intent(intent); | + | var pkg = app.activityInfo.packageName; |
- | i.setClassName(app.activityInfo.packageName,app.activityInfo.name); | + | for(var b = 0; b < db.length && db[b][1] != name; b++); |
- | var item = c.addShortcut(app.loadLabel(pm),i,0,0); | + | if(b == db.length) { |
- | item.setName(item.getLabel()); | + | var i = new Intent(intent); |
- | item.setTag("hide",false); | + | i.setClassName(pkg, name); |
- | var bmp = pm.getActivityIcon(i).getBitmap(); | + | var item = c.addShortcut(app.loadLabel(pm),i,0,0); |
- | var img = LL.createImage(bmp.getWidth(),bmp.getHeight()); | + | item.setName(item.getLabel()); |
- | img.draw().drawBitmap(bmp,0,0,null); | + | item.setTag("hide",false); |
- | item.setDefaultIcon(img); | + | var bmp = pm.getActivityIcon(i).getBitmap(); |
- | item.getProperties().edit().setEventHandler("i.longTap",EventHandler.RUN_SCRIPT,LL.getScriptByName("AppDrawer_menu").getId()).commit(); | + | var img = LL.createImage(bmp.getWidth(),bmp.getHeight()); |
- | db[b] = []; | + | img.draw().drawBitmap(bmp,0,0,null); |
- | db[b][0] = item.getId(); | + | item.setDefaultIcon(img); |
- | db[b][1] = app.activityInfo.name; | + | item.getProperties().edit().setEventHandler("i.longTap",EventHandler.RUN_SCRIPT,LL.getScriptByName("AppDrawer_menu").getId()).commit(); |
- | } | + | db[b] = []; |
- | db[b][2] = true; | + | db[b][0] = item.getId(); |
- | } | + | db[b][1] = name; |
- | sort(); | + | } |
- | if(typeof progress !== 'undefined')progress.dismiss(); | + | db[b][2] = true; |
+ | x++; | ||
+ | if(x<apps.size()) setTimeout(f,0); | ||
+ | else{ | ||
+ | sort(); | ||
+ | if(typeof progress !== 'undefined')progress.dismiss(); | ||
+ | } | ||
+ | }; | ||
+ | setTimeout(f,0); | ||
},100); | },100); | ||
function sort(){ | function sort(){ | ||
- | var labels=[]; | + | var labels=[]; |
- | for(var a = 0; a < db.length; a++){ | + | for(var a = 0; a < db.length; a++){ |
- | var item=LL.getItemById(db[a][0]); | + | var item=LL.getItemById(db[a][0]); |
- | if(db[a][2]){ | + | if(db[a][2]){ |
- | if(showHidden||!JSON.parse(item.getTag("hide")))labels.push(item.getName()); | + | if(showHidden||!JSON.parse(item.getTag("hide")))labels.push(item.getName()); |
- | else item.setVisibility(false); | + | else item.setVisibility(false); |
- | } | + | } |
- | else{ | + | else{ |
- | c.removeItem(item); | + | c.removeItem(item); |
- | db.splice(a,1); | + | db.splice(a,1); |
- | a--; | + | a--; |
- | } | + | } |
- | } | + | } |
- | data.db = db; | + | data.db = db; |
- | c.setTag(TAG,JSON.stringify(data)); | + | c.setTag(TAG,JSON.stringify(data)); |
- | labels.sort(noCaseSort); | + | labels.sort(noCaseSort); |
- | for(var a = 0; a < labels.length; a++){ | + | for(var a = 0; a < labels.length; a++){ |
- | var item = c.getItemByName(labels[a]); | + | var item = c.getItemByName(labels[a]); |
- | item.setVisibility(true); | + | item.setVisibility(true); |
- | if(rows==0)item.setCell(a%columns,Math.floor(a/columns),a%columns+1,Math.floor(a/columns)+1); | + | 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); | + | 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]) | + | c.getItemByName(labels[a]) |
- | LL.save(); | + | LL.save(); |
} | } | ||