aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrumeet <liangyuteng12345@gmail.com>2018-11-28 18:50:50 -0800
committerTrumeet <liangyuteng12345@gmail.com>2018-11-28 18:50:50 -0800
commite7bb52a97407426ba7e53ca54630f1381bdc2cdc (patch)
tree40d1ce94d9a7a364a5f49c002917710af9c1274e
parent34cb0084c7e680d3cedc0129aa2d21a8ba43efee (diff)
downloadSysUIController-e7bb52a97407426ba7e53ca54630f1381bdc2cdc.tar
SysUIController-e7bb52a97407426ba7e53ca54630f1381bdc2cdc.tar.gz
SysUIController-e7bb52a97407426ba7e53ca54630f1381bdc2cdc.tar.bz2
SysUIController-e7bb52a97407426ba7e53ca54630f1381bdc2cdc.zip
feat: add status bar icon deserialize
-rw-r--r--app/src/main/java/moe/yuuta/sysuicontroller/core/StatusBarIcon.java171
-rw-r--r--app/src/main/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializer.java31
-rw-r--r--app/src/test/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializerTest.java16
3 files changed, 216 insertions, 2 deletions
diff --git a/app/src/main/java/moe/yuuta/sysuicontroller/core/StatusBarIcon.java b/app/src/main/java/moe/yuuta/sysuicontroller/core/StatusBarIcon.java
new file mode 100644
index 0000000..60ff82d
--- /dev/null
+++ b/app/src/main/java/moe/yuuta/sysuicontroller/core/StatusBarIcon.java
@@ -0,0 +1,171 @@
+package moe.yuuta.sysuicontroller.core;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Objects;
+
+public class StatusBarIcon implements Parcelable {
+ public static final String ICON_TYPE_RESOURCE = "RESOURCE";
+
+ private String slot;
+ private String iconType;
+ private String pkg;
+ private int id;
+ private int level;
+ private boolean visible;
+ private int user;
+ private String contentDescription;
+
+ public StatusBarIcon() {
+ }
+
+ public StatusBarIcon(String slot, String iconType, String pkg, int id, int level, boolean visible, int user, String contentDescription) {
+ this.slot = slot;
+ this.iconType = iconType;
+ this.pkg = pkg;
+ this.id = id;
+ this.level = level;
+ this.visible = visible;
+ this.user = user;
+ this.contentDescription = contentDescription;
+ }
+
+ protected StatusBarIcon(Parcel in) {
+ slot = in.readString();
+ iconType = in.readString();
+ pkg = in.readString();
+ id = in.readInt();
+ level = in.readInt();
+ visible = in.readByte() != 0;
+ user = in.readInt();
+ contentDescription = in.readString();
+ }
+
+ public static final Creator<StatusBarIcon> CREATOR = new Creator<StatusBarIcon>() {
+ @Override
+ public StatusBarIcon createFromParcel(Parcel in) {
+ return new StatusBarIcon(in);
+ }
+
+ @Override
+ public StatusBarIcon[] newArray(int size) {
+ return new StatusBarIcon[size];
+ }
+ };
+
+ public String getSlot() {
+ return slot;
+ }
+
+ public void setSlot(String slot) {
+ this.slot = slot;
+ }
+
+ public String getIconType() {
+ return iconType;
+ }
+
+ public void setIconType(String iconType) {
+ this.iconType = iconType;
+ }
+
+ public String getPkg() {
+ return pkg;
+ }
+
+ public void setPkg(String pkg) {
+ this.pkg = pkg;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public int getLevel() {
+ return level;
+ }
+
+ public void setLevel(int level) {
+ this.level = level;
+ }
+
+ public boolean isVisible() {
+ return visible;
+ }
+
+ public void setVisible(boolean visible) {
+ this.visible = visible;
+ }
+
+ public int getUser() {
+ return user;
+ }
+
+ public void setUser(int user) {
+ this.user = user;
+ }
+
+ public String getContentDescription() {
+ return contentDescription;
+ }
+
+ public void setContentDescription(String contentDescription) {
+ this.contentDescription = contentDescription;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(slot);
+ dest.writeString(iconType);
+ dest.writeString(pkg);
+ dest.writeInt(id);
+ dest.writeInt(level);
+ dest.writeByte((byte) (visible ? 1 : 0));
+ dest.writeInt(user);
+ dest.writeString(contentDescription);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ StatusBarIcon icon = (StatusBarIcon) o;
+ return id == icon.id &&
+ level == icon.level &&
+ visible == icon.visible &&
+ user == icon.user &&
+ Objects.equals(slot, icon.slot) &&
+ Objects.equals(iconType, icon.iconType) &&
+ Objects.equals(pkg, icon.pkg) &&
+ Objects.equals(contentDescription, icon.contentDescription);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(slot, iconType, pkg, id, level, visible, user, contentDescription);
+ }
+
+ @Override
+ public String toString() {
+ return "StatusBarIcon{" +
+ "slot='" + slot + '\'' +
+ ", iconType='" + iconType + '\'' +
+ ", pkg='" + pkg + '\'' +
+ ", id=" + id +
+ ", level=" + level +
+ ", visible=" + visible +
+ ", user=" + user +
+ ", contentDescription='" + contentDescription + '\'' +
+ '}';
+ }
+}
diff --git a/app/src/main/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializer.java b/app/src/main/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializer.java
index a74b1d0..4e0ef73 100644
--- a/app/src/main/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializer.java
+++ b/app/src/main/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializer.java
@@ -1,16 +1,20 @@
package moe.yuuta.sysuicontroller.dump;
+import java.util.ArrayList;
+import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import androidx.annotation.NonNull;
import moe.yuuta.sysuicontroller.Main;
+import moe.yuuta.sysuicontroller.core.StatusBarIcon;
public class StatusBarServiceDumpDeserializer {
private static final String TAG = Main.GLOBAL_TAG + ".Des";
private int mDisable1 = -1;
private int mDisable2 = -1;
+ private List<StatusBarIcon> mIcons;
/**
An example of input value:
@@ -43,15 +47,38 @@ public class StatusBarServiceDumpDeserializer {
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);
+ mDisable2 = parseHex(ar[1]);
}
}
}
- //
+ // TODO: Support non-resource type icon
+ Pattern patternMIcons = Pattern.compile("(.*) -> StatusBarIcon\\(icon=Icon\\(typ=(.*) pkg=(.*) id=(.*)\\) (.*)\\) \"(.*)\"");
+ Matcher matcherIcons = patternMIcons.matcher(input);
+ mIcons = new ArrayList<>(3);
+ while (matcherIcons.find()) {
+ // Group indexes should be synced with regex
+ String attributes = matcherIcons.group(5);
+ StatusBarIcon icon = new StatusBarIcon(matcherIcons.group(1),
+ matcherIcons.group(2),
+ matcherIcons.group(3),
+ parseHex(matcherIcons.group(4)),
+ 1, // TODO: Add level support
+ !attributes.contains("invisible"),
+ 0, // TODO: Add user support
+ null // TODO: Add content description support
+ );
+ mIcons.add(icon);
+ }
+ }
+
+ private static int parseHex (@NonNull String hex) {
+ return Integer.parseInt(hex.replace("x", "0"), 16);
}
public int getDisable1 () { return mDisable1; }
public int getDisable2 () { return mDisable2; }
+
+ public @NonNull List<StatusBarIcon> getIcons () { return mIcons; }
}
diff --git a/app/src/test/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializerTest.java b/app/src/test/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializerTest.java
index a52805e..d188f61 100644
--- a/app/src/test/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializerTest.java
+++ b/app/src/test/java/moe/yuuta/sysuicontroller/dump/StatusBarServiceDumpDeserializerTest.java
@@ -3,7 +3,13 @@ package moe.yuuta.sysuicontroller.dump;
import org.junit.Before;
import org.junit.Test;
+import java.util.List;
+
+import moe.yuuta.sysuicontroller.core.StatusBarIcon;
+
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
public class StatusBarServiceDumpDeserializerTest {
private StatusBarServiceDumpDeserializer mDeserializer;
@@ -36,4 +42,14 @@ public class StatusBarServiceDumpDeserializerTest {
public void testGetDisable2() {
assertEquals(0x0, mDeserializer.getDisable2());
}
+
+ @Test
+ public void testGetIcons () {
+ List<StatusBarIcon> icons = mDeserializer.getIcons();
+ assertNotNull(icons);
+ assertEquals(2, icons.size());
+ assertArrayEquals(new StatusBarIcon[]{
+ new StatusBarIcon("deo-1", "RESOURCE", "moe.yuuta.sysuicontroller", 0x7f070077, 1, true, 0, null),
+ new StatusBarIcon("deo-2", "RESOURCE", "moe.yuuta.sysuicontroller", 0x7f070078, 1, true, 0, null) }, icons.toArray());
+ }
} \ No newline at end of file