diff options
author | Trumeet <liangyuteng12345@gmail.com> | 2018-11-28 18:50:50 -0800 |
---|---|---|
committer | Trumeet <liangyuteng12345@gmail.com> | 2018-11-28 18:50:50 -0800 |
commit | e7bb52a97407426ba7e53ca54630f1381bdc2cdc (patch) | |
tree | 40d1ce94d9a7a364a5f49c002917710af9c1274e | |
parent | 34cb0084c7e680d3cedc0129aa2d21a8ba43efee (diff) | |
download | SysUIController-e7bb52a97407426ba7e53ca54630f1381bdc2cdc.tar SysUIController-e7bb52a97407426ba7e53ca54630f1381bdc2cdc.tar.gz SysUIController-e7bb52a97407426ba7e53ca54630f1381bdc2cdc.tar.bz2 SysUIController-e7bb52a97407426ba7e53ca54630f1381bdc2cdc.zip |
feat: add status bar icon deserialize
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 |