Masquerade: Rewrite uninstall broadcast receiver

This process makes it disable each overlay in ONE line
- Only if the overlay is enabled
- Uninstalls these overlays in one line if they are enabled

This logic allows for the uninstall method to run with one window
refresh
diff --git a/app/build.gradle b/app/build.gradle
index 3dad1c7..fc67912 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -20,8 +20,8 @@
         applicationId "projekt.substratum.helper"
         minSdkVersion 23
         targetSdkVersion 24
-        versionCode 2
-        versionName "masquerade"
+        versionCode 3
+        versionName "three (masquerade)"
     }
     buildTypes {
         debug {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index aff0984..4bd7e9b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,6 +1,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="projekt.substratum.helper">
 
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
 
     <application
@@ -9,7 +11,7 @@
         android:label="@string/app_name"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
-        <receiver android:name=".services.BootCompletedDetector">
+        <receiver android:name=".services.BootDetector">
             <intent-filter>
                 <action android:name="android.intent.action.BOOT_COMPLETED"/>
             </intent-filter>
@@ -19,11 +21,6 @@
                 <action android:name="projekt.substratum.helper.COMMANDS"/>
             </intent-filter>
         </receiver>
-        <receiver android:name=".services.Initializer">
-            <intent-filter>
-                <action android:name="projekt.substratum.helper.INITIALIZE"/>
-            </intent-filter>
-        </receiver>
 
         <activity android:name=".activities.MainActivity">
             <intent-filter>
diff --git a/app/src/main/java/projekt/substratum/helper/activities/LoaderActivity.java b/app/src/main/java/projekt/substratum/helper/activities/LoaderActivity.java
index eefe047..bf61169 100644
--- a/app/src/main/java/projekt/substratum/helper/activities/LoaderActivity.java
+++ b/app/src/main/java/projekt/substratum/helper/activities/LoaderActivity.java
@@ -3,8 +3,6 @@
 import android.app.Activity;
 import android.os.Bundle;
 
-import projekt.substratum.helper.util.Root;
-
 /**
  * @author Nicholas Chum (nicholaschum)
  */
@@ -14,6 +12,5 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         finish();
-        Root.requestRootAccess();
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/projekt/substratum/helper/activities/MainActivity.java b/app/src/main/java/projekt/substratum/helper/activities/MainActivity.java
index 436d1e1..13a50e7 100644
--- a/app/src/main/java/projekt/substratum/helper/activities/MainActivity.java
+++ b/app/src/main/java/projekt/substratum/helper/activities/MainActivity.java
@@ -4,8 +4,6 @@
 import android.content.pm.PackageManager;
 import android.os.Bundle;
 
-import projekt.substratum.helper.util.Root;
-
 /**
  * @author Nicholas Chum (nicholaschum)
  */
@@ -20,6 +18,5 @@
                 PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                 PackageManager.DONT_KILL_APP);
         finish();
-        Root.requestRootAccess();
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/projekt/substratum/helper/services/BootCompletedDetector.java b/app/src/main/java/projekt/substratum/helper/services/BootDetector.java
similarity index 88%
rename from app/src/main/java/projekt/substratum/helper/services/BootCompletedDetector.java
rename to app/src/main/java/projekt/substratum/helper/services/BootDetector.java
index 716c1f0..6c0e78d 100644
--- a/app/src/main/java/projekt/substratum/helper/services/BootCompletedDetector.java
+++ b/app/src/main/java/projekt/substratum/helper/services/BootDetector.java
@@ -8,7 +8,7 @@
  * @author Nicholas Chum (nicholaschum)
  */
 
-public class BootCompletedDetector extends BroadcastReceiver {
+public class BootDetector extends BroadcastReceiver {
     @Override
     public void onReceive(Context context, Intent intent) {
         if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
diff --git a/app/src/main/java/projekt/substratum/helper/services/Helper.java b/app/src/main/java/projekt/substratum/helper/services/Helper.java
index 6ce7035..cc1761a 100644
--- a/app/src/main/java/projekt/substratum/helper/services/Helper.java
+++ b/app/src/main/java/projekt/substratum/helper/services/Helper.java
@@ -3,7 +3,13 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.os.Environment;
+import android.util.Log;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import projekt.substratum.helper.util.ReadOverlaysFile;
 import projekt.substratum.helper.util.Root;
 
 /**
@@ -12,8 +18,86 @@
 
 public class Helper extends BroadcastReceiver {
 
+    private List<String> state5overlays = null;
+
     @Override
     public void onReceive(Context context, Intent intent) {
-        Root.runCommand(intent.getStringExtra("om-commands"));
+        Log.e("SubstratumHelper",
+                "BroadcastReceiver has accepted Substratum's commands and is running now...");
+        Root.requestRootAccess();
+
+        if (intent.getStringArrayListExtra("pm-uninstall") != null) {
+            uninstall_handler(intent);
+        }
+
+        if (intent.getStringExtra("om-commands") != null) {
+            Log.e("SubstratumHelper", intent.getStringExtra("om-commands"));
+            Root.runCommand(intent.getStringExtra("om-commands"));
+        }
+    }
+
+    private boolean checkIfPackageActivated(String package_name) {
+        return (state5overlays.contains(package_name));
+    }
+
+    private void uninstall_handler(Intent intent) {
+        String final_commands_disable = "";
+        String final_commands_uninstall = "";
+
+        Root.runCommand(
+                "pm grant projekt.substratum.helper android.permission.READ_EXTERNAL_STORAGE");
+        Root.runCommand(
+                "pm grant projekt.substratum.helper android.permission.WRITE_EXTERNAL_STORAGE");
+
+        ArrayList<String> packages_to_uninstall =
+                new ArrayList<>(intent.getStringArrayListExtra("pm-uninstall"));
+        Root.runCommand("cp /data/system/overlays" +
+                ".xml " + Environment.getExternalStorageDirectory().getAbsolutePath() +
+                "/.substratum/current_overlays.xml");
+        String[] state5initial = {Environment.getExternalStorageDirectory().getAbsolutePath() +
+                "/.substratum/current_overlays.xml", "5"};
+        state5overlays = ReadOverlaysFile.main(state5initial);
+
+        for (int i = 0; i < packages_to_uninstall.size(); i++) {
+            String current = packages_to_uninstall.get(i);
+
+            Log.e("SubstratumHelper", "Intent received to purge referendum package file \"" +
+                    current + "\"");
+            if (checkIfPackageActivated(packages_to_uninstall.get(i))) {
+                Log.e("SubstratumHelper", "Package file \"" + current +
+                        "\" requires an overlay disable prior to uninstall...");
+                if (final_commands_disable.length() == 0) {
+                    final_commands_disable = "om disable " + current;
+                } else {
+                    final_commands_disable = final_commands_disable + " " + current;
+                }
+
+                if (final_commands_uninstall.length() == 0) {
+                    final_commands_uninstall = "pm uninstall " + current;
+                } else {
+                    final_commands_uninstall = final_commands_uninstall +
+                            " && pm uninstall " + current;
+                }
+            } else {
+                Root.runCommand("pm uninstall " + current);
+            }
+        }
+
+        if (final_commands_disable.length() > 0) {
+            Log.e("SubstratumHelper", "Disable commands: " + final_commands_disable);
+            Root.runCommand(final_commands_disable);
+        } else {
+            if (final_commands_uninstall.length() > 0) {
+                Log.e("SubstratumHelper", "Uninstall commands: " + final_commands_uninstall);
+                Root.runCommand(final_commands_uninstall);
+            }
+        }
+        
+        // Clear the resource idmapping files generated by OMS
+        Log.e("SubstratumHelper", "Cleaning up resource-cache directory...");
+        Root.runCommand("rm /data/resource-cache/*");
+        // Now clear the persistent overlays database
+        Log.e("SubstratumHelper", "Finalizing clean up of persistent overlays database...");
+        Root.runCommand("rm -rf /data/system/overlays.xml");
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/projekt/substratum/helper/services/Initializer.java b/app/src/main/java/projekt/substratum/helper/services/Initializer.java
deleted file mode 100644
index 9881c4c..0000000
--- a/app/src/main/java/projekt/substratum/helper/services/Initializer.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package projekt.substratum.helper.services;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-import projekt.substratum.helper.util.Root;
-
-/**
- * @author Nicholas Chum (nicholaschum)
- */
-
-public class Initializer extends BroadcastReceiver {
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        Root.requestRootAccess();
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/projekt/substratum/helper/util/ReadOverlaysFile.java b/app/src/main/java/projekt/substratum/helper/util/ReadOverlaysFile.java
new file mode 100644
index 0000000..34bc9de
--- /dev/null
+++ b/app/src/main/java/projekt/substratum/helper/util/ReadOverlaysFile.java
@@ -0,0 +1,38 @@
+package projekt.substratum.helper.util;
+
+import android.util.Log;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Nicholas Chum (nicholaschum)
+ */
+
+public class ReadOverlaysFile {
+
+    public static List<String> main(String argv[]) {
+
+        File file = new File(argv[0]);
+        int state_count = Integer.parseInt(argv[1]);
+
+        List<String> list = new ArrayList<>();
+
+        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
+            for (String line; (line = br.readLine()) != null; ) {
+                if (line.contains("state=\"" + state_count + "\"")) {
+                    String[] split = line.substring(21).split("\\s+");
+                    list.add(split[0].substring(1, split[0].length() - 1));
+                }
+            }
+        } catch (IOException ioe) {
+            ioe.printStackTrace();
+            Log.e("SubstratumLogger", "Unable to load XML file correctly.");
+        }
+        return list;
+    }
+}
\ No newline at end of file