simplify config ui mode

This commit is contained in:
REAndroid 2023-03-23 10:22:46 -04:00
parent 43f299cc79
commit 6c4e4f08f6
2 changed files with 178 additions and 262 deletions

View File

@ -27,7 +27,7 @@ import com.reandroid.json.JSONObject;
import java.io.IOException;
import java.util.Arrays;
public class ResConfig extends FixedBlockContainer
public class ResConfig extends FixedBlockContainer
implements BlockLoad, JSONConvert<JSONObject>, Comparable<ResConfig> {
private final IntegerItem configSize;
@ -458,17 +458,33 @@ public class ResConfig extends FixedBlockContainer
}
mValuesContainer.put(OFFSET_uiMode, b);
}
public byte getUiModeValue(){
public int getUiMode(){
if(getConfigSize()<SIZE_32){
return 0;
}
return mValuesContainer.get(OFFSET_uiMode);
return mValuesContainer.get(OFFSET_uiMode) & 0xff;
}
public String getUiMode(){
return ResConfigHelper.decodeUiMode(getUiModeValue());
public UiModeType getUiModeType(){
return UiModeType.valueOf(getUiMode());
}
public void setUiMode(String uiMode){
setUiMode(ResConfigHelper.encodeUiMode(uiMode));
public void setUiModeType(UiModeType uiModeType){
int flip = (~UiModeType.MASK_UI_MODE_TYPE) & 0xff;
int value = getUiMode() & flip;
if(uiModeType!=null){
value = value | uiModeType.getFlag();
}
setUiMode((byte) value);
}
public UiModeNight getUiModeNight(){
return UiModeNight.valueOf(getUiMode());
}
public void setUiModeNight(UiModeNight uiModeNight){
int flip = (~UiModeNight.MASK_UI_MODE_NIGHT) & 0xff;
int value = getUiMode() & flip;
if(uiModeNight != null){
value = value | uiModeNight.getFlag();
}
setUiMode((byte) value);
}
public void setSmallestScreenWidthDp(short sh){
if(getConfigSize()<SIZE_32){
@ -732,9 +748,13 @@ public class ResConfig extends FixedBlockContainer
if(str!=null){
jsonObject.put(NAME_screenLayout, str);
}
str = getUiMode();
if(str!=null){
jsonObject.put(NAME_uiMode, str);
UiModeType uiModeType = getUiModeType();
if(uiModeType!=null){
jsonObject.put(NAME_ui_mode_type, uiModeType.toString());
}
UiModeNight uiModeNight = getUiModeNight();
if(uiModeNight!=null){
jsonObject.put(NAME_ui_mode_night, uiModeNight.toString());
}
val = getSmallestScreenWidthDp();
if(val!=0){
@ -781,7 +801,8 @@ public class ResConfig extends FixedBlockContainer
setSdkVersion((short) json.optInt(NAME_sdkVersion));
setMinorVersion((short) json.optInt(NAME_minorVersion));
setScreenLayout(json.optString(NAME_screenLayout));
setUiMode(json.optString(NAME_uiMode));
setUiModeType(UiModeType.valueOf(json.optString(NAME_ui_mode_type)));
setUiModeNight(UiModeNight.valueOf(json.optString(NAME_ui_mode_night)));
setSmallestScreenWidthDp((short) json.optInt(NAME_smallestScreenWidthDp));
setScreenWidthDp((short) json.optInt(NAME_screenWidthDp));
setScreenHeightDp((short) json.optInt(NAME_screenHeightDp));
@ -1150,6 +1171,142 @@ public class ResConfig extends FixedBlockContainer
return null;
}
}
public static final class UiModeType extends Flag{
public static final int MASK_UI_MODE_TYPE = 0x0f;
public static final UiModeType NORMAL = new UiModeType("normal", 0x01);
public static final UiModeType DESK = new UiModeType("desk", 0x02);
public static final UiModeType CAR = new UiModeType("car", 0x03);
public static final UiModeType TELEVISION = new UiModeType("television", 0x04);
public static final UiModeType APPLIANCE = new UiModeType("appliance", 0x05);
public static final UiModeType WATCH = new UiModeType("watch", 0x06);
public static final UiModeType VRHEADSET = new UiModeType("vrheadset", 0x07);
public static final UiModeType GODZILLAUI = new UiModeType("godzillaui", 0x0b);
public static final UiModeType SMALLUI = new UiModeType("smallui", 0x0c);
public static final UiModeType MEDIUMUI = new UiModeType("mediumui", 0x0d);
public static final UiModeType LARGEUI = new UiModeType("largeui", 0x0e);
public static final UiModeType HUGEUI = new UiModeType("hugeui", 0x0f);
private static final UiModeType[] VALUES = new UiModeType[]{
NORMAL,
DESK,
CAR,
TELEVISION,
APPLIANCE,
WATCH,
VRHEADSET,
GODZILLAUI,
SMALLUI,
MEDIUMUI,
LARGEUI,
HUGEUI
};
private UiModeType(String name, int flag) {
super(name, flag);
}
public static UiModeType valueOf(int flag){
return Flag.valueOf(VALUES, MASK_UI_MODE_TYPE, flag);
}
public static UiModeType valueOf(String name){
return Flag.valueOf(VALUES, name);
}
public static UiModeType fromQualifiers(String qualifiers){
return Flag.fromQualifiers(VALUES, qualifiers);
}
public static UiModeType fromQualifiers(String[] qualifiers){
return Flag.fromQualifiers(VALUES, qualifiers);
}
}
public static final class UiModeNight extends Flag{
public static final int MASK_UI_MODE_NIGHT = 0x30;
public static final UiModeNight NIGHT = new UiModeNight("night",0x20);
public static final UiModeNight NONIGHT = new UiModeNight("nonight",0x20);
private static final UiModeNight[] VALUES = new UiModeNight[]{
NIGHT,
NONIGHT
};
private UiModeNight(String name, int flag) {
super(name, flag);
}
public static UiModeNight valueOf(int flag){
return Flag.valueOf(VALUES, MASK_UI_MODE_NIGHT, flag);
}
public static UiModeNight valueOf(String name){
return Flag.valueOf(VALUES, name);
}
public static UiModeNight fromQualifiers(String qualifiers){
return Flag.fromQualifiers(VALUES, qualifiers);
}
public static UiModeNight fromQualifiers(String[] qualifiers){
return Flag.fromQualifiers(VALUES, qualifiers);
}
}
static class Flag{
private final String name;
private final int flag;
Flag(String name, int flag){
this.name = name;
this.flag = flag;
}
public int getFlag() {
return flag;
}
@Override
public boolean equals(Object obj) {
return obj == this;
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public String toString() {
return name;
}
static<T extends Flag> T fromQualifiers(T[] values, String qualifiers){
if(qualifiers == null){
return null;
}
return fromQualifiers(values, qualifiers.split("\\s*-\\s*"));
}
static<T extends Flag> T fromQualifiers(T[] values, String[] qualifiers){
if(qualifiers == null){
return null;
}
for(String name:qualifiers){
T flag = Flag.valueOf(values, name);
if(flag != null){
return flag;
}
}
return null;
}
static<T extends Flag> T valueOf(T[] values, int mask, int flagValue){
flagValue = flagValue & mask;
for(T flag:values){
if(flagValue == flag.getFlag()){
return flag;
}
}
return null;
}
static<T extends Flag> T valueOf(T[] values, String name){
if(name == null || name.length()==0){
return null;
}
if(name.charAt(0)=='-'){
name = name.substring(1);
}
name = name.toLowerCase();
for(T flag:values){
if(name.equals(flag.toString())){
return flag;
}
}
return null;
}
}
public static final int SIZE_16 = 16;
public static final int SIZE_28 = 28;
@ -1214,7 +1371,8 @@ public class ResConfig extends FixedBlockContainer
private static final String NAME_minorVersion = "minorVersion";
//SIZE=28
private static final String NAME_screenLayout = "screenLayout";
private static final String NAME_uiMode = "uiMode";
private static final String NAME_ui_mode_type = "ui_mode_type";
private static final String NAME_ui_mode_night = "ui_mode_night";
private static final String NAME_smallestScreenWidthDp = "smallestScreenWidthDp";
//SIZE=32 = "";
private static final String NAME_screenWidthDp = "screenWidthDp";

View File

@ -617,236 +617,18 @@ public class ResConfigHelper {
return "-"+touchscreen.toString();
}
private static void encodeUiMode(ResConfig resConfig, String[] split){
int uiMode=0;
for(int i=0;i<split.length;i++){
String s=split[i];
if(s==null){
continue;
}
int val;
switch (s) {
case "car":
val = (UI_MODE_TYPE_CAR);
break;
case "desk":
val = (UI_MODE_TYPE_DESK);
break;
case "television":
val = (UI_MODE_TYPE_TELEVISION);
break;
case "smallui":
val = (UI_MODE_TYPE_SMALLUI);
break;
case "mediumui":
val = (UI_MODE_TYPE_MEDIUMUI);
break;
case "largeui":
val = (UI_MODE_TYPE_LARGEUI);
break;
case "godzillaui":
val = (UI_MODE_TYPE_GODZILLAUI);
break;
case "hugeui":
val = (UI_MODE_TYPE_HUGEUI);
break;
case "appliance":
val = (UI_MODE_TYPE_APPLIANCE);
break;
case "watch":
val = (UI_MODE_TYPE_WATCH);
break;
case "vrheadset":
val = (UI_MODE_TYPE_VR_HEADSET);
break;
default:
continue;
}
uiMode=(uiMode | val);
split[i]=null;
}
for(int i=0;i<split.length;i++){
String s=split[i];
if(s==null){
continue;
}
int val;
if("night".equals(s)){
val = (UI_MODE_NIGHT_YES);
}else if("notnight".equals(s)){
val = (UI_MODE_NIGHT_NO);
}else {
continue;
}
uiMode=(uiMode | val);
split[i]=null;
}
resConfig.setUiMode((byte)uiMode);
}
public static byte encodeUiMode(String uiMode){
if(uiMode==null){
return 0;
}
String[] split=uiMode.split("-");
int result=0;
for(int i=0;i<split.length;i++){
String s=split[i];
if(s==null){
continue;
}
int val;
switch (s) {
case "car":
val = (UI_MODE_TYPE_CAR);
break;
case "desk":
val = (UI_MODE_TYPE_DESK);
break;
case "television":
val = (UI_MODE_TYPE_TELEVISION);
break;
case "smallui":
val = (UI_MODE_TYPE_SMALLUI);
break;
case "mediumui":
val = (UI_MODE_TYPE_MEDIUMUI);
break;
case "largeui":
val = (UI_MODE_TYPE_LARGEUI);
break;
case "godzillaui":
val = (UI_MODE_TYPE_GODZILLAUI);
break;
case "hugeui":
val = (UI_MODE_TYPE_HUGEUI);
break;
case "appliance":
val = (UI_MODE_TYPE_APPLIANCE);
break;
case "watch":
val = (UI_MODE_TYPE_WATCH);
break;
case "vrheadset":
val = (UI_MODE_TYPE_VR_HEADSET);
break;
default:
continue;
}
result=(result | val);
split[i]=null;
}
for(int i=0;i<split.length;i++){
String s=split[i];
if(s==null){
continue;
}
int val;
if("night".equals(s)){
val = (UI_MODE_NIGHT_YES);
}else if("notnight".equals(s)){
val = (UI_MODE_NIGHT_NO);
}else {
continue;
}
result=(result | val);
split[i]=null;
}
return (byte)result;
}
public static String decodeUiMode(byte uiMode){
StringBuilder ret=new StringBuilder();
switch (uiMode & MASK_UI_MODE_TYPE) {
case UI_MODE_TYPE_CAR:
ret.append("-car");
break;
case UI_MODE_TYPE_DESK:
ret.append("-desk");
break;
case UI_MODE_TYPE_TELEVISION:
ret.append("-television");
break;
case UI_MODE_TYPE_SMALLUI:
ret.append("-smallui");
break;
case UI_MODE_TYPE_MEDIUMUI:
ret.append("-mediumui");
break;
case UI_MODE_TYPE_LARGEUI:
ret.append("-largeui");
break;
case UI_MODE_TYPE_GODZILLAUI:
ret.append("-godzillaui");
break;
case UI_MODE_TYPE_HUGEUI:
ret.append("-hugeui");
break;
case UI_MODE_TYPE_APPLIANCE:
ret.append("-appliance");
break;
case UI_MODE_TYPE_WATCH:
ret.append("-watch");
break;
case UI_MODE_TYPE_VR_HEADSET:
ret.append("-vrheadset");
break;
}
switch (uiMode & MASK_UI_MODE_NIGHT) {
case UI_MODE_NIGHT_YES:
ret.append("-night");
break;
case UI_MODE_NIGHT_NO:
ret.append("-notnight");
break;
}
if(ret.length()==0){
return null;
}
return ret.toString();
resConfig.setUiModeNight(ResConfig.UiModeNight.fromQualifiers(split));
resConfig.setUiModeType(ResConfig.UiModeType.fromQualifiers(split));
}
private static String decodeUiMode(ResConfig resConfig){
StringBuilder ret=new StringBuilder();
byte uiMode=resConfig.getUiModeValue();
switch (uiMode & MASK_UI_MODE_TYPE) {
case UI_MODE_TYPE_CAR:
ret.append("-car");
break;
case UI_MODE_TYPE_DESK:
ret.append("-desk");
break;
case UI_MODE_TYPE_TELEVISION:
ret.append("-television");
break;
case UI_MODE_TYPE_SMALLUI:
ret.append("-smallui");
break;
case UI_MODE_TYPE_MEDIUMUI:
ret.append("-mediumui");
break;
case UI_MODE_TYPE_LARGEUI:
ret.append("-largeui");
break;
case UI_MODE_TYPE_GODZILLAUI:
ret.append("-godzillaui");
break;
case UI_MODE_TYPE_HUGEUI:
ret.append("-hugeui");
break;
case UI_MODE_TYPE_APPLIANCE:
ret.append("-appliance");
break;
case UI_MODE_TYPE_WATCH:
ret.append("-watch");
break;
case UI_MODE_TYPE_VR_HEADSET:
ret.append("-vrheadset");
break;
ResConfig.UiModeType uiModeType = resConfig.getUiModeType();
if(uiModeType!=null){
ret.append('-').append(uiModeType.toString());
}
switch (uiMode & MASK_UI_MODE_NIGHT) {
case UI_MODE_NIGHT_YES:
ret.append("-night");
break;
case UI_MODE_NIGHT_NO:
ret.append("-notnight");
break;
ResConfig.UiModeNight uiModeNight = resConfig.getUiModeNight();
if(uiModeNight!=null){
ret.append('-').append(uiModeNight.toString());
}
return ret.toString();
}
@ -1406,30 +1188,6 @@ public class ResConfigHelper {
public final static short SCREENLAYOUT_ROUND_NO = 0x1;
public final static short SCREENLAYOUT_ROUND_YES = 0x2;
public final static byte MASK_UI_MODE_TYPE = 0x0f;
public final static byte UI_MODE_TYPE_ANY = 0x00;
public final static byte UI_MODE_TYPE_NORMAL = 0x01;
public final static byte UI_MODE_TYPE_DESK = 0x02;
public final static byte UI_MODE_TYPE_CAR = 0x03;
public final static byte UI_MODE_TYPE_TELEVISION = 0x04;
public final static byte UI_MODE_TYPE_APPLIANCE = 0x05;
public final static byte UI_MODE_TYPE_WATCH = 0x06;
public final static byte UI_MODE_TYPE_VR_HEADSET = 0x07;
public final static byte MASK_UI_MODE_NIGHT = 0x30;
public final static byte UI_MODE_NIGHT_ANY = 0x00;
public final static byte UI_MODE_NIGHT_NO = 0x10;
public final static byte UI_MODE_NIGHT_YES = 0x20;
public final static byte UI_MODE_TYPE_GODZILLAUI = 0x0b;
public final static byte UI_MODE_TYPE_SMALLUI = 0x0c;
public final static byte UI_MODE_TYPE_MEDIUMUI = 0x0d;
public final static byte UI_MODE_TYPE_LARGEUI = 0x0e;
public final static byte UI_MODE_TYPE_HUGEUI = 0x0f;
public final static byte MASK_KEYSHIDDEN = 0x3;
public final static byte KEYSHIDDEN_ANY = 0x0;
public final static byte KEYSHIDDEN_NO = 0x1;