From bb52f8cd1c31f52098c57779bf1c703514d9c701 Mon Sep 17 00:00:00 2001 From: SerpentSpirale Date: Tue, 7 Sep 2021 20:58:07 +0200 Subject: [PATCH] Reduce ControlButton memory usage --- .../customcontrols/ControlData.java | 61 +++++++++++++------ 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java index 490794c74..5d6b78cc0 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java @@ -33,10 +33,12 @@ public class ControlData { // Internal usage only public boolean isHideable; - private static WeakReference builder; - private static WeakReference expression; + private static WeakReference builder = new WeakReference<>(null); + private static WeakReference expression = new WeakReference<>(null); + private static WeakReference> conversionMap = new WeakReference<>(null); static { bypassExpressionBuilder(); + buildConversionMap(); } @@ -178,28 +180,14 @@ public class ControlData { public float insertDynamicPos(String dynamicPos) { - // Values in the map below may be always changed - Map keyValueMap = new ArrayMap<>(); - keyValueMap.put("top", "0"); - keyValueMap.put("left", "0"); - keyValueMap.put("right", Float.toString(CallbackBridge.physicalWidth - getWidth())); - keyValueMap.put("bottom", Float.toString(CallbackBridge.physicalHeight - getHeight())); - keyValueMap.put("width", Float.toString(getWidth())); - keyValueMap.put("height", Float.toString(getHeight())); - keyValueMap.put("screen_width", Integer.toString(CallbackBridge.physicalWidth)); - keyValueMap.put("screen_height", Integer.toString(CallbackBridge.physicalHeight)); - keyValueMap.put("margin", Integer.toString((int) Tools.dpToPx(2))); - keyValueMap.put("preferred_scale", Float.toString(LauncherPreferences.PREF_BUTTONSIZE)); - // Insert value to ${variable} - String insertedPos = JSONUtils.insertSingleJSONValue(dynamicPos, keyValueMap); + String insertedPos = JSONUtils.insertSingleJSONValue(dynamicPos, fillConversionMap()); // Calculate, because the dynamic position contains some math equations return calculate(insertedPos); } private static float calculate(String math) { - if(builder.get() == null) bypassExpressionBuilder(); setExpression(math); return (float) builder.get().build().evaluate(); } @@ -269,10 +257,49 @@ public class ControlData { * @param stringExpression the expression to set. */ private static void setExpression(String stringExpression){ + if(builder.get() == null) bypassExpressionBuilder(); try { expression.get().set(builder.get(), (String) stringExpression); }catch (IllegalAccessException e){} } + /** + * Build a shared conversion map without the view dependent values + * You need to set the view dependent values before using it. + */ + private static void buildConversionMap() { + // Values in the map below may be always changed + ArrayMap keyValueMap = new ArrayMap<>(10); + keyValueMap.put("top", "0"); + keyValueMap.put("left", "0"); + keyValueMap.put("right", "DUMMY_RIGHT"); + keyValueMap.put("bottom", "DUMMY_BOTTOM"); + keyValueMap.put("width", "DUMMY_WIDTH"); + keyValueMap.put("height", "DUMMY_HEIGHT"); + keyValueMap.put("screen_width", Integer.toString(CallbackBridge.physicalWidth)); + keyValueMap.put("screen_height", Integer.toString(CallbackBridge.physicalHeight)); + keyValueMap.put("margin", Integer.toString((int) Tools.dpToPx(2))); + keyValueMap.put("preferred_scale", Float.toString(LauncherPreferences.PREF_BUTTONSIZE)); + + conversionMap = new WeakReference<>(keyValueMap); + } + + /** + * Fill the conversionMap with + */ + private Map fillConversionMap(){ + ArrayMap valueMap = conversionMap.get(); + if (valueMap == null){ + buildConversionMap(); + valueMap = conversionMap.get(); + } + + valueMap.put("right", Float.toString(CallbackBridge.physicalWidth - getWidth())); + valueMap.put("bottom", Float.toString(CallbackBridge.physicalHeight - getHeight())); + valueMap.put("width", Float.toString(getWidth())); + valueMap.put("height", Float.toString(getHeight())); + + return valueMap; + } }