aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrumeet <liangyuteng12345@gmail.com>2018-11-28 17:15:58 -0800
committerTrumeet <liangyuteng12345@gmail.com>2018-11-28 17:15:58 -0800
commit34cb0084c7e680d3cedc0129aa2d21a8ba43efee (patch)
tree88acbeda0e490121db062c7e1e407099cb4bdec7
parent2b7d69dbba731c4f8365204dee0c7b78834e36f1 (diff)
downloadSysUIController-34cb0084c7e680d3cedc0129aa2d21a8ba43efee.tar
SysUIController-34cb0084c7e680d3cedc0129aa2d21a8ba43efee.tar.gz
SysUIController-34cb0084c7e680d3cedc0129aa2d21a8ba43efee.tar.bz2
SysUIController-34cb0084c7e680d3cedc0129aa2d21a8ba43efee.zip
feat: auto dump disable flags from system
-rw-r--r--app/src/main/java/moe/yuuta/sysuicontroller/core/ControllerService.java40
-rw-r--r--app/src/main/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializer.java57
-rw-r--r--app/src/test/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializerTest.java39
3 files changed, 135 insertions, 1 deletions
diff --git a/app/src/main/java/moe/yuuta/sysuicontroller/core/ControllerService.java b/app/src/main/java/moe/yuuta/sysuicontroller/core/ControllerService.java
index 72785d9..d2b00a5 100644
--- a/app/src/main/java/moe/yuuta/sysuicontroller/core/ControllerService.java
+++ b/app/src/main/java/moe/yuuta/sysuicontroller/core/ControllerService.java
@@ -19,12 +19,15 @@ import java.util.Collections;
import java.util.Date;
import java.util.List;
+import androidx.annotation.Nullable;
import eu.chainfire.librootjava.IPCBroadcastHelper;
import eu.chainfire.librootjava.RootIPC;
import eu.chainfire.librootjava.RootJava;
import eu.chainfire.librootjavadaemon.RootDaemon;
+import eu.chainfire.libsuperuser.Shell;
import moe.yuuta.sysuicontroller.BuildConfig;
import moe.yuuta.sysuicontroller.IStatusController;
+import moe.yuuta.sysuicontroller.dump.StatusBarServiceDumpDeserializer;
import static moe.yuuta.sysuicontroller.Main.GLOBAL_TAG;
@@ -52,6 +55,7 @@ public class ControllerService extends IStatusController.Stub {
@SuppressLint({"WrongConstant", "MissingPermission"})
private void run (String... args) throws Throwable {
Looper.prepare();
+ Log.i(TAG, "Version: " + BuildConfig.VERSION_CODE);
mContext = RootJava.getSystemContext();
mManager = (StatusBarManager) mContext.getSystemService("statusbar");
@SuppressLint("PrivateApi") Method mGetService = StatusBarManager.class.getDeclaredMethod("getService");
@@ -87,7 +91,7 @@ public class ControllerService extends IStatusController.Stub {
public void exit () throws RemoteException {
enforcePermission();
try {
- mContext.removeStickyBroadcast(mKeepWakeUpIntent);
+ if (mKeepWakeUpIntent != null) mContext.removeStickyBroadcast(mKeepWakeUpIntent);
} catch (Throwable e) {
Log.e(TAG, "Unable to remove sticky broadcast", e);
}
@@ -147,15 +151,49 @@ public class ControllerService extends IStatusController.Stub {
@Override
public int getDisableFlags() throws RemoteException {
enforcePermission();
+ // Deserialize at first
+ int systemFlag = deserializeDisableFlag(false);
+ if (systemFlag != -1)
+ return systemFlag;
return disableFlags;
}
@Override
public int getDisable2Flags() throws RemoteException {
enforcePermission();
+ // Deserialize at first
+ int systemFlag = deserializeDisableFlag(true);
+ if (systemFlag != -1)
+ return systemFlag;
return disable2Flags;
}
+ private @Nullable StatusBarServiceDumpDeserializer deserialize () {
+ StatusBarServiceDumpDeserializer deserializer = new StatusBarServiceDumpDeserializer();
+ try {
+ StringBuilder builder = new StringBuilder();
+ for (String res : Shell.SH.run(Collections.singletonList("dumpsys statusbar"))) {
+ builder.append(res);
+ builder.append("\n");
+ }
+ String result = builder.toString();
+ if (BuildConfig.DEBUG) Log.d(TAG, "Result: " + result);
+ deserializer.deserialize(result);
+ } catch (Exception e) {
+ Log.e(TAG, "Error when deserialize status bar service", e);
+ return null;
+ }
+ return deserializer;
+ }
+
+ private int deserializeDisableFlag (boolean disable2) {
+ StatusBarServiceDumpDeserializer deserializer = deserialize();
+ if (deserializer == null) return -1;
+ int result = disable2 ? deserializer.getDisable2() : deserializer.getDisable1();
+ Log.i(TAG, "Deserialize from system" + (disable2 ? "(2)": "(1)") + ": " + result);
+ return result;
+ }
+
@Override
public List<DisableItem> getAvailableDisableItems() throws RemoteException {
Field[] fields = StatusBarManager.class.getDeclaredFields();
diff --git a/app/src/main/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializer.java b/app/src/main/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializer.java
new file mode 100644
index 0000000..a74b1d0
--- /dev/null
+++ b/app/src/main/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializer.java
@@ -0,0 +1,57 @@
+package moe.yuuta.sysuicontroller.dump;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import androidx.annotation.NonNull;
+import moe.yuuta.sysuicontroller.Main;
+
+public class StatusBarServiceDumpDeserializer {
+ private static final String TAG = Main.GLOBAL_TAG + ".Des";
+
+ private int mDisable1 = -1;
+ private int mDisable2 = -1;
+
+ /**
+ An example of input value:
+ <code>
+ mDisabled1=0xe0000
+ mDisabled2=0x0
+ mDisableRecords.size=2
+ [0] userId=0 what1=0x000E0000 what2=0x00000000 pkg=null token=android.os.BinderProxy@3bd9a02
+ [1] userId=0 what1=0x00000000 what2=0x00000000 pkg=null token=android.os.BinderProxy@c335f13
+ mCurrentUserId=0
+ mIcons=
+
+ String -> StatusBarIcon(icon=Icon(typ=RESOURCE pkg=String id=0x7f070077) level=1 visible user=0 ) "String"
+
+ String -> StatusBarIcon(icon=Icon(typ=RESOURCE pkg=String id=0x7f070078) level=1 visible user=0 ) "String"
+ </code>
+ */
+ public void deserialize (@NonNull String input) {
+ Pattern patternMDisabled = Pattern.compile(".*mDisabled\\d\\s*=\\s*(.*)", Pattern.MULTILINE);
+
+ Matcher matcherDisabled = patternMDisabled.matcher(input);
+ while (matcherDisabled.find()) {
+ String group = matcherDisabled.group();
+ if (group.contains("mDisabled1") && !group.contains("mDisabled2")) {
+ String[] ar = group.trim().split("=");
+ if (ar.length == 2) {
+ mDisable1 = Integer.parseInt(ar[1].replace("x", "0"), 16);
+ }
+ }
+ if (group.contains("mDisabled2") && !group.contains("mDisabled1")) {
+ String[] ar = group.trim().split("=");
+ if (ar.length == 2) {
+ mDisable2 = Integer.parseInt(ar[1].replace("x", "0"), 16);
+ }
+ }
+ }
+
+ //
+ }
+
+ public int getDisable1 () { return mDisable1; }
+
+ public int getDisable2 () { return mDisable2; }
+}
diff --git a/app/src/test/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializerTest.java b/app/src/test/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializerTest.java
new file mode 100644
index 0000000..a52805e
--- /dev/null
+++ b/app/src/test/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializerTest.java
@@ -0,0 +1,39 @@
+package moe.yuuta.sysuicontroller.dump;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class StatusBarServiceDumpDeserializerTest {
+ private StatusBarServiceDumpDeserializer mDeserializer;
+
+ private static final String TEST_INPUT = " mDisabled1=0xe0000\n" +
+ " mDisabled2=0x0\n" +
+ " mDisableRecords.size=3\n" +
+ " [0] userId=0 what1=0x00000000 what2=0x00000000 pkg=null token=android.os.BinderProxy@544056c\n" +
+ " [1] userId=0 what1=0x000E0000 what2=0x00000000 pkg=null token=android.os.BinderProxy@8013c9\n" +
+ " [2] userId=0 what1=0x00000000 what2=0x00000000 pkg=null token=android.os.Binder@305dace\n" +
+ " mCurrentUserId=0\n" +
+ " mIcons=\n" +
+ "\n" +
+ "deo-1 -> StatusBarIcon(icon=Icon(typ=RESOURCE pkg=moe.yuuta.sysuicontroller id=0x7f070077) level=1 visible user=0 ) \"deo icon\"\n" +
+ "\n" +
+ "deo-2 -> StatusBarIcon(icon=Icon(typ=RESOURCE pkg=moe.yuuta.sysuicontroller id=0x7f070078) level=1 visible user=0 ) \"deo icon2\"";
+
+ @Before
+ public void setUp() throws Exception {
+ mDeserializer = new StatusBarServiceDumpDeserializer();
+ mDeserializer.deserialize(TEST_INPUT);
+ }
+
+ @Test
+ public void testGetDisable1() {
+ assertEquals(0xe0000, mDeserializer.getDisable1());
+ }
+
+ @Test
+ public void testGetDisable2() {
+ assertEquals(0x0, mDeserializer.getDisable2());
+ }
+} \ No newline at end of file