diff options
author | Trumeet <liangyuteng12345@gmail.com> | 2018-11-28 17:15:58 -0800 |
---|---|---|
committer | Trumeet <liangyuteng12345@gmail.com> | 2018-11-28 17:15:58 -0800 |
commit | 34cb0084c7e680d3cedc0129aa2d21a8ba43efee (patch) | |
tree | 88acbeda0e490121db062c7e1e407099cb4bdec7 | |
parent | 2b7d69dbba731c4f8365204dee0c7b78834e36f1 (diff) | |
download | SysUIController-34cb0084c7e680d3cedc0129aa2d21a8ba43efee.tar SysUIController-34cb0084c7e680d3cedc0129aa2d21a8ba43efee.tar.gz SysUIController-34cb0084c7e680d3cedc0129aa2d21a8ba43efee.tar.bz2 SysUIController-34cb0084c7e680d3cedc0129aa2d21a8ba43efee.zip |
feat: auto dump disable flags from system
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 |