User Tools

Site Tools


script_autosetupappfreeze

====== 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_autosetupappfreeze [2015/11/10 22:35]
cdfa
script_autosetupappfreeze [2017/07/21 08:57] (current)
cdfa 1.8.4
Line 1: Line 1:
 ====== About the script ====== ====== About the script ======
-  * Purpose : this script automatically sets up app freezing on long tap+  * Purpose : this script automatically sets up app freezing on any action you want.
   * Author : cdfa   * Author : cdfa
-  * Link: https://​plus.google.com/​+JaroslavGrochal/​posts/​BDKDMrTMfxt+  * Initial request: https://​plus.google.com/​+JaroslavGrochal/​posts/​BDKDMrTMfxt 
 +  * GitHub: https://​github.com/​cdfa/​AutoSetupLongTapFreeze 
 +  * Version: 1.8.4
  
 ====== How to use the script ====== ====== How to use the script ======
  
-This script ​uses 3C toolbox: https://​play.google.com/​store/​apps/​details?​id=ccc71.at.free +Run script ​in any container to run setup freezing and unfreezing actions for all itemsThe action is configurable ​at the top of the script.
-If you know any other app that has a shortcut for freezing ​of apps i can make that work too if you want :).+
  
-After you've installed 3C toolbox ​,run the script from container and all items in that container ​which don'​t ​already have custom long tap eventhandler will now freeze on long tap.+You can setup autosync in the setup, or you can sync manually from the container menu => items => syncor you can run the script from any item in the container ​with "​sync"​ (without the ""​) as data, or from anywhere if you put the container id directly behind it, so like "​sync1"​. 
 + 
 +You can sync items separately from the item menu and choosing Sync, or sync all items in container ​also from the item menu. This can also be done when the items are in a folder by longpressing the folder item. 
 + 
 +Run the script from the container again to uninstall (this won'​t ​clear events you manually set to sync the container). 
 + 
 +Please report all issues at the GitHub page. 
 + 
 +====== Changelog ====== 
 +1.8 
 +  * Updated to LL 14b7 
 +  * sync action is now in the items menu in the container menu as well 
 +  * uninstall everywhere function is lost for now, because i cannot distinguish between the menu from the menu of container anymore. Please suggest new triggers if you want this functionality back. 
 + 
 +1.8.1 
 +  * workaround for double comfirm crash in LL14 
 + 
 +1.8.1.1 
 +  * Added item description to the toast message that is displayed if the item doesn'​t launch an app 
 + 
 +1.8.1.2 
 +  * Made the changes in 1.8.1.1 actually work 
 + 
 +1.8.1.3 
 +  * Toasts message that says the item doesn'​t launch an app now only shows when you're actually trying to freeze ​that item and not anymore ​on each sync. 
 + 
 +1.8.2 
 +  * The double confirm crash got fixed, so the workaround was removed 
 +  * Only commands that need root are executed as root 
 + 
 +1.8.3 
 +  * Added freezeing/​unfreezing all item from menu 
 +  * Added long press folder to freeze/​unfreeze all items in it 
 + 
 +1.8.4 
 +  * Ask to unfreeze and run an item if it is frozen instead of saying that the app is not installed
  
 ====== Script code ====== ====== Script code ======
 <sxh javascript>​ <sxh javascript>​
 +var blackList = ["​net.pierrox.lightning_launcher_extreme"​]
 +  , whiteList = []
 +  // for Sources see: http://​www.lightninglauncher.com/​scripting/​reference/​api/​reference/​net/​pierrox/​lightning_launcher/​script/​api/​Event.html
 +  // for Events see http://​www.lightninglauncher.com/​scripting/​reference/​api/​reference/​net/​pierrox/​lightning_launcher/​script/​api/​PropertySet.html
 +  , freezeSource = "​I_LONG_CLICK"​
 +  , freezeEvent = "​i.longTap";​
  
-var e = LL.getEvent(); +bindClass("​android.widget.Toast"); 
-var it = e.getItem();​ +bindClass("​android.content.pm.PackageManager"); 
-if(it==null){ +bindClass("​java.lang.Thread"); 
-  var c = e.getContainer(); +bindClass("​android.os.Handler"); 
-  ​c.getProperties().edit().setEventHandler("​i.longTap", EventHandler.RUN_SCRIPT,​ LL.getCurrentScript().getId()).commit(); +bindClass("​android.os.Looper"); 
-}else{ +bindClass('java.io.BufferedReader'​); 
-  LL.bindClass("​java.io.File"); +bindClass('java.io.InputStreamReader'​); 
-  LL.bindClass("​android.content.Context"); +bindClass('java.io.DataOutputStream'​); 
-  LL.bindClass("​java.io.FileInputStream") +bindClass('java.lang.StringBuffer'​); 
-  LL.bindClass("java.io.FileOutputStream"​+bindClass('java.lang.Runtime'​); 
-  LL.bindClass("​android.graphics.BitmapFactory"​+ 
-  LL.bindClass("​android.graphics.Bitmap"​+var script = getCurrentScript() 
-  LL.bindClass("​android.graphics.Canvas"​+  ​, screen = getActiveScreen() 
-  LL.bindClass("​android.graphics.ColorMatrix"​+  ​context = screen.getContext() 
-  ​LL.bindClass("​android.graphics.ColorMatrixColorFilter"​+  , threads = [] 
-   +  , GUIHandler = new Handler() 
-  ​var context = LL.getContext();​ +  , frozenApps; 
-  var storeDir ​new File(context.getFilesDir(), "​unfreezeColorImages"​); + 
-  ​if(!storeDir.exists())storeDir.mkdir(); +function setEventHandlerRestorably(ob,​ name, action, data){ 
-   +  var prop ob.getProperties(
-  function ​saveImage(bmp){ +    , ed = prop.edit() 
-    var out null+    ​evHa = prop.getEventHandler(name); 
-    ​try +  ​evHa = [evHa.getAction(), evHa.getData()]; 
-      ​out new FileOutputStream(storeDir.getPath()+"/"+it.getId()+".png"); +  ed.setEventHandler(name, action, data); 
-      ​bmp.compress(Bitmap.CompressFormat.PNG100out); +  ​ed.commit();​ 
-      // PNG is a lossless formatthe compression factor ​(100is ignored ​ +  ​ob.setTag("​old " + name + " evHa", JSON.stringify(evHa));​ 
-    ​} catch (e{ +
-       throw(e); + 
-    ​} finally ​+function ​restoreEventHandler(ob, name){ 
-      ​try { +  if(ob){ 
-        ​if (out !nullout.close(); +    var evHa JSON.parse(ob.getTag("​old " + name + " evHa"​))
-      ​} catch (e) { +    ​if(evHa)
-        ​throw(e);+      ​var ed ob.getProperties().edit()
 +      ed.setEventHandler(name,​ evHa[0], evHa[1]); 
 +      ed.commit();​ 
 +      ob.setTag("​name",​ null); 
 +    }else{ 
 +      throw new Error("​No eventhandler backup for " + name + " ​on " + ob + "​found!"​) 
 +    } 
 +  }else{ 
 +    throw new Error("​Cannot restore " + name + "of null!") 
 +  } 
 +
 + 
 +function uninstall(c){ 
 +  if(c && c.getTag("​longTapFreeze"​)){ 
 +    c.setTag("​longTapFreeze"​false); 
 +    restoreEventHandler(cfreezeEvent); 
 +    ​restoreEventHandler(c'​i.tap'​);​ 
 +    restoreEventHandler(c, "​i.menu"​); 
 +    ​restoreEventHandler(c, "​menu"​); 
 +    if(c.getTag("​autosync"​) === "​true"​) restoreEventHandler(c,​ "​resumed"​); 
 +    ​c.getAllItems().forEach(function(it)
 +      ​if(isFrozen(it)) 
 +        ​unfreezeEffect(it); 
 +    }); 
 +    var cs screen.getAllContainersById(c.getId()); 
 +    cs.forEach(function(c)
 +      var opener
 +      ​if((opener = c.getOpener()) && opener.getType() === "​Folder"​){ 
 +        ​if(isFrozen(opener)) 
 +          unfreezeEffect(opener);
       }       }
 +    });
 +  }
 +}
 +
 +/**
 + * Checks if an object is an array.
 + * @param object
 + * @returns {boolean}
 + */
 +function isArray(object){
 +  return Object.prototype.toString.call(object) === '​[object Array]';​
 +}
 +
 +/**
 + * If this function is executed in a thread that is the main GUI thread, execute func, or else execute func in the main GUI thread. (Android doesn'​t like it when you change the GUI outside of the main GUI thread)
 + * @param func {function}
 + */
 +function handleGUIEdit(func){
 +  if(Looper.getMainLooper().getThread() === Thread.currentThread()){
 +    func();
 +  }else{
 +    GUIHandler.post(func);​
 +  }
 +}
 +
 +/**
 + * Starts a new background thread with func.
 + * @param func {function} - The function the thread executes.
 + */
 +function startNewBackgroundThread(func){
 +  var thread = new Thread(function(){
 +    func();
 +    // if a looper was initialized in func, make sure the thread can die by stopping the thread when the Looper idles.
 +    if(threads[Thread.currentThread().getId()].prepared === true){
 +      Looper.myLooper().getQueue().addIdleHandler(function(){
 +        Looper.myLooper().quitSafely();​
 +      });
 +      Looper.loop();​
 +    }
 +  });
 +  thread.setUncaughtExceptionHandler(function(th,​ ex){
 +    handleGUIEdit(function(){
 +      alert(ex.getMessage());​
 +    })
 +  });
 +  threads[thread.getId()] = {};
 +  thread.start();​
 +}
 +
 +//​noinspection JSValidateJSDoc
 +/**
 + * Gets a handler for the current thread and initializes a looper if necessary.
 + * @returns {Handler}
 + */
 +function getHandler(){
 +  if(Looper.getMainLooper().getThread() === Thread.currentThread()){
 +    return GUIHandler;
 +  }else{
 +    var threadId = Thread.currentThread().getId();​
 +    if(threads[threadId].prepared !== true){
 +      Looper.prepare();​
 +      threads[threadId].prepared = true;
     }     }
 +    return new Handler();
   }   }
-   +
-  function ​toGrayscale(bmpOriginal) { + 
-    ​var imgGrayscale ​LL.createImage(bmpOriginal.getWidth(), bmpOriginal.getHeight()) +/** 
-    ​var canv imgGrayscale.draw(); + * This callback will be called when the executing of the command(s) is finished 
-    ​var paint = new Paint(); + * 
-    var cm = new ColorMatrix(); + * @callback finishedCallback 
-    cm.setSaturation(0); + * @param {string[]} An array of the lines the command(s) returned 
-    var = new ColorMatrixColorFilter(cm); + */ 
-    paint.setColorFilter(f); +/** 
-    canv.drawBitmap(bmpOriginal00, paint); + * This callback will be called when a command is executed. 
-    return ​imgGrayscale;+ * 
 + * @callback executedCallback 
 + */ 
 +/** 
 + * Runs a command in the terminal 
 + * @param cmds {string|string[]} - The command or array of commmands to be executed. 
 + * @param [asRoot=false] {boolean} - If the command(s) should be executed as root or not. 
 + * @param [newThread=true] {boolean} - If the executing of commands should happen in a new thread or not. (useful for root commands) 
 + * @param [callback] {finishedCallback} - The callback that handles the output. 
 + * @param [onExecuted] {executedCallback} - A callback that will be called when a command is executed. useful for multiple commands that take some time) 
 + * @returns {string[]||string[][]} - (only if asRoot == false && newThread == false) Returns an array of the lines written in the terminal or an array of arrays if multiple commands were executed. 
 + */ 
 +function runCmd(cmds,​ asRoot, newThread, callback, onExecuted){ 
 +  var handler = getHandler() 
 +    , output, process, reader, writer; 
 + 
 +  // set optional arguments 
 +  if(newThread !== false) 
 +    newThread = true; 
 + 
 +  /** 
 +   ​* Helper function for executing the command(s). Gets its parameters from the parent function. 
 +   * @returns {string[]||string[][]} - (only if asRoot == false && newThread == false) Returns an array of the lines written in the terminal or an array of arrays if multiple commands were executed. 
 +   */ 
 +  function ​execCmd(){ 
 +    ​/** 
 +     * Checks if the command is a string and if not alerts the user. 
 +     * @param cmd {string} 
 +     * @returns {boolean} 
 +     */ 
 +    function checkCmd(cmd){ 
 +      if(typeof(cmd) ​=== "​string"​){ 
 +        return true; 
 +      }else 
 +        handleGUIEdit(function(){ 
 +          alert(cmd + " is not a string!"​);​ 
 +        }); 
 +      return false; 
 +    } 
 + 
 +    //​noinspection JSValidateJSDoc 
 +    /** 
 +     * Actually executes command. 
 +     * @param cmd {string} 
 +     * @param writer {DataOutputStream} - The writer to write the command to. 
 +     * @returns {boolean} If the command was actually written or not. 
 +     */ 
 +    function exec(cmd, writer){ 
 +      if(checkCmd(cmd)){ 
 +        writer.writeBytes(cmd + "​\n"​)
 +        writer.flush();​ 
 +        return true; 
 +      } 
 +      return false; 
 +    } 
 + 
 +    //​noinspection JSValidateJSDoc 
 +    /** 
 +     * Read the output from the reader. 
 +     * @param reader {BufferedReader} 
 +     * @returns {Array} An array of lines that were outputted by the 
 +     */ 
 +    function readOutput(reader){ 
 +      var tmpoutput = []; 
 +      while((tmp = reader.readLine()) !== null) 
 +        output.push(tmp);​ 
 + 
 +      return output.length === 1 ? output[0] : output; 
 +    ​
 + 
 +    /** 
 +     * Executes the callback and if the callback is not a function alerts the user. 
 +     * @param callback 
 +     * @param output {Array} - The argument that is passed to the callback 
 +     */ 
 +    function handleCallback(callback,​ output){ 
 +      if(typeof callback ​=== "​function"​){ 
 +        handler.post(function(){ 
 +          callback(output); 
 +        }); 
 +      }else if(callback){ 
 +        handleGUIEdit(function(){ 
 +          alert(callback + " is not a function!"​);​ 
 +        }); 
 +      } 
 +    ​
 + 
 +    try{ 
 +      if(asRoot){ 
 +        process = Runtime.getRuntime().exec("​su"​);​ 
 +        reader ​= new BufferedReader(new InputStreamReader(process.getInputStream())); 
 +        ​writer ​= new DataOutputStream(process.getOutputStream()); 
 + 
 +        if(isArray(cmds)){ 
 +          output = []; 
 +          cmds.forEach(function(cmd){ 
 +            if(exec(cmd,​ writer)){ 
 +              handleCallback(onExecuted); 
 +            } 
 +          }); 
 + 
 +          exec("​exit",​ writer); 
 +          writer.close();​ 
 + 
 +          output = readOutput(reader);​ 
 +          handleCallback(callback,​ output); 
 +        }else{ 
 +          ​var succes = exec(cmds, writer); 
 + 
 +          exec("​exit",​ writer); 
 +          writer.close();​ 
 + 
 +          if(succes){ 
 +            output = readOutput(reader);​ 
 +            handleCallback(onExecuted);​ 
 +            handleCallback(callback,​ output); 
 +          } 
 +        } 
 + 
 +        reader.close();​ 
 +        process.waitFor();​ 
 +      }else{ 
 +        if(isArray(cmds)){ 
 +          var outputs = []; 
 +          cmds.forEach(function(cmd){ 
 +            if(checkCmd(cmd)){ 
 +              process = Runtime.getRuntime().exec(cmd);​ 
 +              reader ​= new BufferedReader(new InputStreamReader(process.getInputStream())); 
 +              ​output = readOutput(reader);​ 
 +              reader.close(); 
 +              ​outputs.push(output);​ 
 +              handleCallback(onExecuted);​ 
 +              handleCallback(callbackoutput); 
 +            } 
 +          }); 
 +          process.waitFor();​ 
 +          return outputs; 
 +        }else{ 
 +          process = Runtime.getRuntime().exec(cmds);​ 
 +          reader = new BufferedReader(new InputStreamReader(process.getInputStream()));​ 
 +          output = readOutput(reader);​ 
 +          reader.close();​ 
 +          process.waitFor();​ 
 +          handleCallback(onExecuted);​ 
 +          handleCallback(callbackoutput); 
 +          return ​output; 
 +        } 
 +      } 
 +    }catch(err){ 
 +      handleGUIEdit(function(){ 
 +        alert("​At line " + err.lineNumber + ": " + err); 
 +      }); 
 +    }
   }   }
-  ​ + 
-  ​LL.runAction(EventHandler.LAUNCH_SHORTCUT, ​"#Intent;action=ccc71.at.freeze;launchFlags=0x34000000;component=ccc71.at.free/ccc71.at.activities.tweaks.at_tweaker_activity;S.ccc71.at.packagename="+it.getIntent().getComponent().getPackageName()+";end") +  ​if(asRoot && isArray(callback)) 
-  ​var frozen = it.getTag("​frozen"​);​ +    throw new Error("​Multiple callbacks are not possible in su mode. Use onExecuteds instead."); 
-  if(frozen=="true"){ + 
-    if(it.getTag("​customIcon")=="true"​){ +  if(newThread){ 
-      var path storeDir.getPath()+"/"​+it.getId()+".png"; +    startNewBackgroundThread(function(){ 
-      it.setCustomIcon(LL.createImage(path)); +      execCmd();​ 
-      it.getCustomIcon().save(); +    }); 
-      var bmp new File(path); +  }else{ 
-      ​bmp.delete(); +    return execCmd();​ 
-    }else{ +  } 
-      ​it.setCustomIcon(null);+
 + 
 +function getPackageName(it){ 
 +  try{ 
 +    return it.getIntent().getComponent().getPackageName();​ 
 +  }catch(e){ 
 +    return null; 
 +  } 
 +
 + 
 +function isFreezable(pkgName){ 
 +  if(!pkgName) 
 +    return false; 
 + 
 +  var onWhiteList,​ 
 +    onBlackList ​blackList.some(function(pkg){ 
 +      return pkg === pkgName; 
 +    }); 
 + 
 +  if(whiteList.length === 0){ 
 +    onWhiteList = true; 
 +  }else{ 
 +    onWhiteList ​whiteList.some(function(pkg){ 
 +      return pkg === pkgName; 
 +    }); 
 +  } 
 + 
 +  return !onBlackList && onWhiteList;​ 
 +
 + 
 +function freezeChecks(it,​ allGood, giveFeedback){ 
 +  var pkgName ​getPackageName(it) 
 +    , freezeAble = isFreezable(pkgName);​ 
 +  if(pkgName && freezeAble){ 
 +    allGood(pkgName);​ 
 +  }else if(giveFeedback !== false){ 
 +    if(!pkgName) 
 +      Toast.makeText(context,​ it + " doesn'​t launch an app!", Toast.LENGTH_SHORT).show(); 
 +    else if(!freezeAble) 
 +      Toast.makeText(context,​ "​Cannot freeze/​unfreeze! (Probably because of black- or whitelist",​ Toast.LENGTH_SHORT).show(); 
 +  } 
 +
 + 
 +function freeze(it, callback){ 
 +  if(it.getType() === "​Folder"​){ 
 +    freezeContainer(it.getContainer());​ 
 +  }else{ 
 +    freezeChecks(it,​ function(pkgName){ 
 +      runCmd("​pm disable " + pkgName, true, true, null, function(){ 
 +        freezeEffect(it);​ 
 +        if(typeof callback === '​function'​) 
 +          callback();​ 
 +      }); 
 +    }); 
 +  } 
 +
 + 
 +function unfreeze(it,​ callback){ 
 +  if(it.getType() =="​Folder"​){ 
 +    unfreezeContainer(it.getContainer());​ 
 +  }else{ 
 +    freezeChecks(it,​ function(pkgName){ 
 +      runCmd("​pm enable ​" + pkgName, true, true, null, function(){ 
 +        unfreezeEffect(it);​ 
 +        if(typeof callback === '​function'​) 
 +          callback();​ 
 +      }); 
 +    }); 
 +  } 
 +
 + 
 +function freezeEffect(it){ 
 +  ​it.getProperties().edit().setInteger("​s.iconColorFilter",​ 0x00ffffff).commit();​ 
 +  it.setTag("frozen",​ true); 
 +
 + 
 +function unfreezeEffect(it){ 
 +  it.getProperties().edit().setInteger("s.iconColorFilter",​ 0xffffffff).commit(); 
 +  it.setTag("​frozen"​, false)
 +
 + 
 +function batchFreezeAction(items,​ action, callback){ 
 +  var frozenStateChecker,​ cmd, effect
 +  if(action === "freeze"){ 
 +    ​frozenStateChecker = function(it){ return !isFrozen(it);​ }; 
 +    cmd = "pm disable "; 
 +    effect = function(it){ freezeEffect(it);​ } 
 +  }else if(action === "​unfreeze"​){ 
 +    frozenStateChecker = function(it){ return isFrozen(it);​ }; 
 +    cmd = "pm enable "; 
 +    effect = function(it){ unfreezeEffect(it);​ } 
 +  } 
 + 
 +  var freezableItems = [] 
 +    , cmds = []; 
 + 
 +  items.forEach(function(it){ 
 +    if(frozenStateChecker(it)){ 
 +      freezeChecks(it,​ function(pkgName){ 
 +        freezableItems.push(it);​ 
 +        cmds.push(cmd + pkgName); 
 +      }, false); 
 +    } 
 +  }); 
 + 
 +  if(cmds.length !== 0){ 
 +    var counter = 0; 
 +    runCmd(cmds,​ true, true, function(){ 
 +      callback();​ 
 +    }, function(){ 
 +      effect(freezableItems[counter]);​ 
 +      counter++;​ 
 +    }); 
 +  } 
 +
 + 
 +function containerFreezeAction(c,​ effect){ 
 +  var cs = screen.getAllContainersById(c.getId());​ 
 +  cs.forEach(function(c){ 
 +    var opener; 
 +    if((opener = c.getOpener()) && opener.getType() === "​Folder"​) 
 +      effect(opener);​ 
 +  }); 
 +
 + 
 +function freezeContainer(c){ 
 +  batchFreezeAction(c.getAllItems(),​ "​freeze",​ function(){ 
 +    containerFreezeAction(c,​ freezeEffect);​ 
 +  }); 
 +
 + 
 +function unfreezeContainer(c){ 
 +  batchFreezeAction(c.getAllItems(),​ "​unfreeze",​ function(){ 
 +    containerFreezeAction(c,​ unfreezeEffect);​ 
 +  }); 
 +
 + 
 +function isFrozen(it){ 
 +  return ​it.getTag("​frozen") === 'true'; 
 +
 + 
 +function getFrozenApps(){ 
 +  if(typeof frozenApps === '​undefined'​){ 
 +    frozenApps = []; 
 +    var pkgs = runCmd("pm list packages -d", false, false); 
 +    pkgs.forEach(function(pkg,​ i){ 
 +      ​frozenApps[i] = pkg.split(":"​)[1];​ 
 +    }); 
 +  } 
 +  return frozenApps;​ 
 +
 + 
 +function syncContainer(c){ 
 +  startNewBackgroundThread(function(){ 
 +    ​var items c.getItems()
 +    for(var i = 0; i < items.length;​ i++){ 
 +      syncItem(items.getAt(i));​ 
 +    } 
 +  }); 
 +
 + 
 +function syncItem(it){ 
 +  var frozenApps = getFrozenApps();​ 
 +  if(it.getType() === "Shortcut"){ 
 +    var pkgName = getPackageName(it); 
 +    if(pkgName && isFreezable(pkgName)){ 
 +      ​var isFrozen = it.getTag("​frozen"​) === '​true';​ 
 +      var matched = frozenApps.some(function(pkg)
 +        return pkg === pkgName; 
 +      }); 
 +      ​if(!isFrozen && matched){ 
 +        handleGUIEdit(function(){ 
 +          freezeEffect(it); 
 +        }); 
 +      }else if(isFrozen && !matched)
 +        handleGUIEdit(function(){ 
 +          unfreezeEffect(it);​ 
 +        }); 
 +      ​
 +    } 
 +  } 
 +
 + 
 +if(typeof getEvent !== "​undefined"​){ 
 +  ​var 
 +    , e getEvent() 
 +    , it = e.getItem() 
 +    , data = e.getData(); 
 +  if(data){ 
 +    if(data === "​sync"​){ 
 +      ​if(c = e.getContainer()){ 
 +        syncContainer(c); 
 +      }else{ 
 +        throw new Error("​Could not find a way to determine the container to sync. Run the script from an item in the container or from the container itself or add the container id directly afrer '​sync'​."​) 
 +      } 
 +    }else if(data.substring(0,​ 4) === "​sync"​)
 +      ​var cId = data.substring(4, data.length);​ 
 +      c = screen.getContainerById(cId);​ 
 +      if(!c) throw new Error("​Could not find container with id:" + cId); 
 +      syncContainer(c);
     }     }
-    it.setTag("​frozen",​false);​ 
   }else{   }else{
-    ​var img = it.getCustomIcon(); +    ​if(!it){ 
-    if(img==null){ +      c = e.getContainer(); 
-      img = it.getDefaultIcon(); +      cId = c.getId();​ 
-      ​it.setTag("​customIcon", ​false);+      ​if(c.getTag("​longTapFreeze"​) ​=== "​true"​){ 
 +        ​if(confirm("​Are you sure you want to uninstall?"​)){ 
 +          uninstall(c);​ 
 +          Toast.makeText(context,​ "​Uninstalled!",​ Toast.LENGTH_SHORT).show(); 
 +        } 
 +      ​}else{ 
 +        if(confirm("​Are you sure you want to install?"​)){ 
 +          c.setTag("​longTapFreeze", ​true); 
 +          setEventHandlerRestorably(c,​ freezeEvent,​ EventHandler.RUN_SCRIPT,​ script.getId());​ 
 +          setEventHandlerRestorably(c,​ '​i.tap',​ EventHandler.RUN_SCRIPT,​ script.getId());​ 
 +          setEventHandlerRestorably(c,​ "​i.menu",​ EventHandler.RUN_SCRIPT,​ script.getId());​ 
 +          setEventHandlerRestorably(c,​ "​menu",​ EventHandler.RUN_SCRIPT,​ script.getId());​ 
 +          if(confirm("​Do you want to enable autosync?"​)){ 
 +            setEventHandlerRestorably(c,​ "​resumed",​ EventHandler.RUN_SCRIPT,​ script.getId() + "/​sync"​);​ 
 +            syncContainer(c);​ 
 +            c.setTag("​autosync",​ true); 
 +          } 
 +          Toast.makeText(context,​ "​Installed!",​ Toast.LENGTH_SHORT).show();​ 
 +        } 
 +      }
     }else{     }else{
-      ​it.setTag("customIcon", ​true);+      ​var src = e.getSource();​ 
 +      if(src === freezeSource){ 
 +        if(isFrozen(it)){ 
 +          unfreeze(it);​ 
 +        }else{ 
 +          freeze(it);​ 
 +        } 
 +      }else if(src === '​I_CLICK'​){ 
 +        if( isFrozen(it) && confirm("Unfreeze and run?")) 
 +          unfreeze(itfunction(){ 
 +            it.launch();​ 
 +          }); 
 +        else 
 +          it.launch(); 
 +      }
     }     }
-    ​var bmp img.getBitmap(); +  } 
-    ​saveImage(bmp); +}else if(menu){ 
-    ​it.setCustomIcon(toGrayscale(bmp)) +  ​var mode menu.getMode(); 
-    ​it.setTag("frozen",true);+  if(mode === Menu.MODE_ITEM_SUBMENU_ACTION || mode === Menu.MODE_ITEM_NO_EM){ 
 +    ​menu.addMainItem("​Sync frozen-state",​ function(){ 
 +      syncItem(item);​ 
 +      menu.close(); 
 +    ​}); 
 +  }else if(mode === Menu.MODE_CONTAINER_SUBMENU_ITEMS){ 
 +    menu.addMainItem("Sync frozen-state",​ function()
 +      syncContainer(container)
 +      menu.close();​ 
 +    ​}); 
 +    menu.addMainItem("Freeze all items", ​function(){ 
 +      freezeContainer(container);​ 
 +      menu.close();​ 
 +    }); 
 +    menu.addMainItem("​Unfreeze all items",​ function(){ 
 +      unfreezeContainer(container);​ 
 +      menu.close();​ 
 +    });
   }   }
 } }
- 
 </​sxh>​ </​sxh>​
script_autosetupappfreeze.1447194906.txt.gz · Last modified: 2015/11/10 22:35 by cdfa