From b868b583dd4f6d56831ef8ae1685744bba876747 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Sun, 26 May 2024 20:25:13 +0200 Subject: [PATCH] remove old device-dependent behavior not updated in 10 years, only few of those are still in use device-specific default key press volume and vibration duration and a workaround for bad touch firmware on Motorola Xoom --- .../keyboard/keyboard/PointerTracker.java | 32 ---- .../settings/PreferencesSettingsFragment.java | 8 +- .../keyboard/latin/settings/Settings.java | 32 +--- .../latin/settings/SettingsValues.java | 4 +- .../keyboard/latin/utils/ResourceUtils.java | 144 ------------------ .../values/keypress-vibration-durations.xml | 49 ------ app/src/main/res/values/keypress-volumes.xml | 16 -- .../phantom-sudden-move-event-device-list.xml | 13 -- 8 files changed, 10 insertions(+), 288 deletions(-) delete mode 100644 app/src/main/res/values/keypress-vibration-durations.xml delete mode 100644 app/src/main/res/values/keypress-volumes.xml delete mode 100644 app/src/main/res/values/phantom-sudden-move-event-device-list.xml diff --git a/app/src/main/java/helium314/keyboard/keyboard/PointerTracker.java b/app/src/main/java/helium314/keyboard/keyboard/PointerTracker.java index 0c6b0da2e..4b35442e2 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/PointerTracker.java +++ b/app/src/main/java/helium314/keyboard/keyboard/PointerTracker.java @@ -37,7 +37,6 @@ import helium314.keyboard.latin.define.DebugFlags; import helium314.keyboard.latin.settings.Settings; import helium314.keyboard.latin.settings.SettingsValues; import helium314.keyboard.latin.utils.Log; -import helium314.keyboard.latin.utils.ResourceUtils; import java.util.ArrayList; import java.util.Locale; @@ -84,10 +83,6 @@ public final class PointerTracker implements PointerTrackerQueue.Element, private static final int sPointerStep = (int)TypedValueCompat.dpToPx(10, Resources.getSystem().getDisplayMetrics()); private static GestureStrokeRecognitionParams sGestureStrokeRecognitionParams; private static GestureStrokeDrawingParams sGestureStrokeDrawingParams; - private static boolean sNeedsPhantomSuddenMoveEventHack; - // Move this threshold to resource. - // TODO: Device specific parameter would be better for device specific hack? - private static final float PHANTOM_SUDDEN_MOVE_THRESHOLD = 0.25f; // in keyWidth private static final ArrayList sTrackers = new ArrayList<>(); private static final PointerTrackerQueue sPointerTrackerQueue = new PointerTrackerQueue(); @@ -102,7 +97,6 @@ public final class PointerTracker implements PointerTrackerQueue.Element, // when new {@link Keyboard} is set by {@link #setKeyDetector(KeyDetector)}. private KeyDetector mKeyDetector = new KeyDetector(); private Keyboard mKeyboard; - private int mPhantomSuddenMoveThreshold; private final BogusMoveEventDetector mBogusMoveEventDetector = new BogusMoveEventDetector(); private boolean mIsDetectingGesture = false; // per PointerTracker. @@ -166,9 +160,6 @@ public final class PointerTracker implements PointerTrackerQueue.Element, sParams.mSuppressKeyPreviewAfterBatchInputDuration); final Resources res = mainKeyboardViewAttr.getResources(); - sNeedsPhantomSuddenMoveEventHack = Boolean.parseBoolean( - ResourceUtils.getDeviceOverrideValue(res, - R.array.phantom_sudden_move_event_device_list, Boolean.FALSE.toString())); BogusMoveEventDetector.init(res); sTimerProxy = timerProxy; @@ -365,7 +356,6 @@ public final class PointerTracker implements PointerTrackerQueue.Element, // Keep {@link #mCurrentKey} that comes from previous keyboard. The key preview of // {@link #mCurrentKey} will be dismissed by {@setReleasedKeyGraphics(Key)} via // {@link onMoveEventInternal(int,int,long)} or {@link #onUpEventInternal(int,int,long)}. - mPhantomSuddenMoveThreshold = (int)(keyWidth * PHANTOM_SUDDEN_MOVE_THRESHOLD); mBogusMoveEventDetector.setKeyboardGeometry(keyWidth, keyHeight); } @@ -799,20 +789,6 @@ public final class PointerTracker implements PointerTrackerQueue.Element, setPressedKeyGraphics(key, eventTime); } - private void processPhantomSuddenMoveHack(final Key key, final int x, final int y, - final long eventTime, final Key oldKey, final int lastX, final int lastY) { - if (DEBUG_MODE) { - Log.w(TAG, String.format(Locale.US, "[%d] onMoveEvent:" - + " phantom sudden move event (distance=%d) is translated to " - + "up[%d,%d,%s]/down[%d,%d,%s] events", mPointerId, - getDistance(x, y, lastX, lastY), - lastX, lastY, Constants.printableCode(oldKey.getCode()), - x, y, Constants.printableCode(key.getCode()))); - } - onUpEventInternal(x, y, eventTime); - onDownEventInternal(x, y, eventTime); - } - private void processProximateBogusDownMoveUpEventHack(final Key key, final int x, final int y, final long eventTime, final Key oldKey, final int lastX, final int lastY) { if (DEBUG_MODE) { @@ -849,14 +825,6 @@ public final class PointerTracker implements PointerTrackerQueue.Element, if (mIsAllowedDraggingFinger) { processDraggingFingerInToNewKey(key, x, y, eventTime); } - // HACK: On some devices, quick successive touches may be reported as a sudden move by - // touch panel firmware. This hack detects such cases and translates the move event to - // successive up and down events. - // TODO: Should find a way to balance gesture detection and this hack. - else if (sNeedsPhantomSuddenMoveEventHack - && getDistance(x, y, lastX, lastY) >= mPhantomSuddenMoveThreshold) { - processPhantomSuddenMoveHack(key, x, y, eventTime, oldKey, lastX, lastY); - } // HACK: On some devices, quick successive proximate touches may be reported as a bogus // down-move-up event by touch panel firmware. This hack detects such cases and breaks // these events into separate up and down events. diff --git a/app/src/main/java/helium314/keyboard/latin/settings/PreferencesSettingsFragment.java b/app/src/main/java/helium314/keyboard/latin/settings/PreferencesSettingsFragment.java index 4f98a2959..4ef8aa1c0 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/PreferencesSettingsFragment.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/PreferencesSettingsFragment.java @@ -151,12 +151,12 @@ public final class PreferencesSettingsFragment extends SubScreenFragment { @Override public int readValue(final String key) { - return Settings.readKeypressVibrationDuration(prefs, res); + return Settings.readKeypressVibrationDuration(prefs); } @Override public int readDefaultValue(final String key) { - return Settings.readDefaultKeypressVibrationDuration(res); + return -1; } @Override @@ -206,12 +206,12 @@ public final class PreferencesSettingsFragment extends SubScreenFragment { @Override public int readValue(final String key) { - return getPercentageFromValue(Settings.readKeypressSoundVolume(prefs, res)); + return getPercentageFromValue(Settings.readKeypressSoundVolume(prefs)); } @Override public int readDefaultValue(final String key) { - return getPercentageFromValue(Settings.readDefaultKeypressSoundVolume(res)); + return getPercentageFromValue(-1f); } @Override diff --git a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java index 60812d79e..b9f3c84e9 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/Settings.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/Settings.java @@ -327,20 +327,8 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang prefs.edit().putString(PREF_ADDITIONAL_SUBTYPES, prefSubtypes).apply(); } - public static float readKeypressSoundVolume(final SharedPreferences prefs, final Resources res) { - final float volume = prefs.getFloat( - PREF_KEYPRESS_SOUND_VOLUME, UNDEFINED_PREFERENCE_VALUE_FLOAT); - return (volume != UNDEFINED_PREFERENCE_VALUE_FLOAT) ? volume - : readDefaultKeypressSoundVolume(res); - } - - // Default keypress sound volume for unknown devices. - // The negative value means system default. - private static final String DEFAULT_KEYPRESS_SOUND_VOLUME = Float.toString(-1.0f); - - public static float readDefaultKeypressSoundVolume(final Resources res) { - return Float.parseFloat(ResourceUtils.getDeviceOverrideValue(res, - R.array.keypress_volumes, DEFAULT_KEYPRESS_SOUND_VOLUME)); + public static float readKeypressSoundVolume(final SharedPreferences prefs) { + return prefs.getFloat(PREF_KEYPRESS_SOUND_VOLUME, UNDEFINED_PREFERENCE_VALUE_FLOAT); } public static int readKeyLongpressTimeout(final SharedPreferences prefs, final Resources res) { @@ -354,20 +342,8 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang return res.getInteger(R.integer.config_default_longpress_key_timeout); } - public static int readKeypressVibrationDuration(final SharedPreferences prefs, final Resources res) { - final int milliseconds = prefs.getInt( - PREF_VIBRATION_DURATION_SETTINGS, UNDEFINED_PREFERENCE_VALUE_INT); - return (milliseconds != UNDEFINED_PREFERENCE_VALUE_INT) ? milliseconds - : readDefaultKeypressVibrationDuration(res); - } - - // Default keypress vibration duration for unknown devices. - // The negative value means system default. - private static final String DEFAULT_KEYPRESS_VIBRATION_DURATION = Integer.toString(-1); - - public static int readDefaultKeypressVibrationDuration(final Resources res) { - return Integer.parseInt(ResourceUtils.getDeviceOverrideValue(res, - R.array.keypress_vibration_durations, DEFAULT_KEYPRESS_VIBRATION_DURATION)); + public static int readKeypressVibrationDuration(final SharedPreferences prefs) { + return prefs.getInt(PREF_VIBRATION_DURATION_SETTINGS, UNDEFINED_PREFERENCE_VALUE_INT); } public static boolean readClipboardHistoryEnabled(final SharedPreferences prefs) { diff --git a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java index 92c523bf9..fbd14a256 100644 --- a/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java +++ b/app/src/main/java/helium314/keyboard/latin/settings/SettingsValues.java @@ -185,8 +185,8 @@ public class SettingsValues { // Compute other readable settings mKeyLongpressTimeout = Settings.readKeyLongpressTimeout(prefs, res); - mKeypressVibrationDuration = Settings.readKeypressVibrationDuration(prefs, res); - mKeypressSoundVolume = Settings.readKeypressSoundVolume(prefs, res); + mKeypressVibrationDuration = Settings.readKeypressVibrationDuration(prefs); + mKeypressSoundVolume = Settings.readKeypressSoundVolume(prefs); mEnableEmojiAltPhysicalKey = prefs.getBoolean(Settings.PREF_ENABLE_EMOJI_ALT_PHYSICAL_KEY, true); mGestureInputEnabled = Settings.readGestureInputEnabled(prefs); mGestureTrailEnabled = prefs.getBoolean(Settings.PREF_GESTURE_PREVIEW_TRAIL, true); diff --git a/app/src/main/java/helium314/keyboard/latin/utils/ResourceUtils.java b/app/src/main/java/helium314/keyboard/latin/utils/ResourceUtils.java index 564736601..c52ae0e45 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/ResourceUtils.java +++ b/app/src/main/java/helium314/keyboard/latin/utils/ResourceUtils.java @@ -9,8 +9,6 @@ package helium314.keyboard.latin.utils; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; -import android.os.Build; -import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.TypedValue; @@ -19,12 +17,7 @@ import androidx.core.util.TypedValueCompat; import helium314.keyboard.latin.R; import helium314.keyboard.latin.settings.SettingsValues; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.regex.PatternSyntaxException; - public final class ResourceUtils { - private static final String TAG = ResourceUtils.class.getSimpleName(); public static final float UNDEFINED_RATIO = -1.0f; public static final int UNDEFINED_DIMENSION = -1; @@ -33,143 +26,6 @@ public final class ResourceUtils { // This utility class is not publicly instantiable. } - private static final HashMap sDeviceOverrideValueMap = new HashMap<>(); - - private static final String[] BUILD_KEYS_AND_VALUES = { - "HARDWARE", Build.HARDWARE, - "MODEL", Build.MODEL, - "BRAND", Build.BRAND, - "MANUFACTURER", Build.MANUFACTURER - }; - private static final HashMap sBuildKeyValues; - private static final String sBuildKeyValuesDebugString; - - static { - sBuildKeyValues = new HashMap<>(); - final ArrayList keyValuePairs = new ArrayList<>(); - final int keyCount = BUILD_KEYS_AND_VALUES.length / 2; - for (int i = 0; i < keyCount; i++) { - final int index = i * 2; - final String key = BUILD_KEYS_AND_VALUES[index]; - final String value = BUILD_KEYS_AND_VALUES[index + 1]; - sBuildKeyValues.put(key, value); - keyValuePairs.add(key + '=' + value); - } - sBuildKeyValuesDebugString = "[" + TextUtils.join(" ", keyValuePairs) + "]"; - } - - public static String getDeviceOverrideValue(final Resources res, final int overrideResId, - final String defaultValue) { - final int orientation = res.getConfiguration().orientation; - final String key = overrideResId + "-" + orientation; - if (sDeviceOverrideValueMap.containsKey(key)) { - return sDeviceOverrideValueMap.get(key); - } - - final String[] overrideArray = res.getStringArray(overrideResId); - final String overrideValue = findConstantForKeyValuePairs(sBuildKeyValues, overrideArray); - // The overrideValue might be an empty string. - if (overrideValue != null) { - Log.i(TAG, "Find override value:" - + " resource="+ res.getResourceEntryName(overrideResId) - + " build=" + sBuildKeyValuesDebugString - + " override=" + overrideValue); - sDeviceOverrideValueMap.put(key, overrideValue); - return overrideValue; - } - - sDeviceOverrideValueMap.put(key, defaultValue); - return defaultValue; - } - - static class DeviceOverridePatternSyntaxError extends Exception { - public DeviceOverridePatternSyntaxError(final String message, final String expression) { - this(message, expression, null); - } - - public DeviceOverridePatternSyntaxError(final String message, final String expression, - final Throwable throwable) { - super(message + ": " + expression, throwable); - } - } - - /** - * Find the condition that fulfills specified key value pairs from an array of - * "condition,constant", and return the corresponding string constant. A condition is - * "pattern1[:pattern2...] (or an empty string for the default). A pattern is - * "key=regexp_value" string. The condition matches only if all patterns of the condition - * are true for the specified key value pairs. - *

- * For example, "condition,constant" has the following format. - * - HARDWARE=mako,constantForNexus4 - * - MODEL=Nexus 4:MANUFACTURER=LGE,constantForNexus4 - * - ,defaultConstant - * - * @param keyValuePairs attributes to be used to look for a matched condition. - * @param conditionConstantArray an array of "condition,constant" elements to be searched. - * @return the constant part of the matched "condition,constant" element. Returns null if no - * condition matches. - */ - static String findConstantForKeyValuePairs(final HashMap keyValuePairs, - final String[] conditionConstantArray) { - if (conditionConstantArray == null || keyValuePairs == null) { - return null; - } - String foundValue = null; - for (final String conditionConstant : conditionConstantArray) { - final int posComma = conditionConstant.indexOf(','); - if (posComma < 0) { - Log.w(TAG, "Array element has no comma: " + conditionConstant); - continue; - } - final String condition = conditionConstant.substring(0, posComma); - if (condition.isEmpty()) { - Log.w(TAG, "Array element has no condition: " + conditionConstant); - continue; - } - try { - if (fulfillsCondition(keyValuePairs, condition)) { - // Take first match - if (foundValue == null) { - foundValue = conditionConstant.substring(posComma + 1); - } - // And continue walking through all conditions. - } - } catch (final DeviceOverridePatternSyntaxError e) { - Log.w(TAG, "Syntax error, ignored", e); - } - } - return foundValue; - } - - private static boolean fulfillsCondition(final HashMap keyValuePairs, - final String condition) throws DeviceOverridePatternSyntaxError { - final String[] patterns = condition.split(":"); - // Check all patterns in a condition are true - boolean matchedAll = true; - for (final String pattern : patterns) { - final int posEqual = pattern.indexOf('='); - if (posEqual < 0) { - throw new DeviceOverridePatternSyntaxError("Pattern has no '='", condition); - } - final String key = pattern.substring(0, posEqual); - final String value = keyValuePairs.get(key); - if (value == null) { - throw new DeviceOverridePatternSyntaxError("Unknown key", condition); - } - final String patternRegexpValue = pattern.substring(posEqual + 1); - try { - if (!value.matches(patternRegexpValue)) { - matchedAll = false; - // And continue walking through all patterns. - } - } catch (final PatternSyntaxException e) { - throw new DeviceOverridePatternSyntaxError("Syntax error", condition, e); - } - } - return matchedAll; - } - public static int getKeyboardWidth(final Resources res, final SettingsValues settingsValues) { final int defaultKeyboardWidth = getDefaultKeyboardWidth(res); if (settingsValues.mOneHandedModeEnabled) { diff --git a/app/src/main/res/values/keypress-vibration-durations.xml b/app/src/main/res/values/keypress-vibration-durations.xml deleted file mode 100644 index 73b110552..000000000 --- a/app/src/main/res/values/keypress-vibration-durations.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - MODEL=Nexus S:BRAND=google,5 - - MODEL=Galaxy Nexus:BRAND=google,5 - - MODEL=Nexus 4:BRAND=google,8 - - MODEL=Nexus 10:BRAND=google,16 - - MODEL=GT-I(9100[GMPT]?|9108|9210T?):MANUFACTURER=samsung,8 - MODEL=SGH-(I9[27]7R?|I927|T989D?):MANUFACTURER=samsung,8 - MODEL=SHW-M250[KLS]?|SPH-D710|SCH-R760:MANUFACTURER=samsung,8 - MODEL=ISW11SC|SC-02C:MANUFACTURER=samsung,8 - - MODEL=(SAMSUNG-)?GT-I(930[05][NT]?|9308):MANUFACTURER=samsung,8 - MODEL=(SAMSUNG-)?SGH-(T999[V]?|I747[M]?|N064|N035):MANUFACTURER=samsung,8 - MODEL=(SAMSUNG-)?SCH-(J021|R530|I535|I939):MANUFACTURER=samsung,8 - MODEL=(SAMSUNG-)?(SCL21|SC-06D|SC-03E):MANUFACTURER=samsung,8 - MODEL=(SAMSUNG-)?(SHV-210[KLS]?|SPH-L710):MANUFACTURER=samsung,8 - - MODEL=(SAMSUNG-)?GT-I(950[0258][G]?):MANUFACTURER=samsung,7 - MODEL=(SAMSUNG-)?SGH-(I337|M919|N045):MANUFACTURER=samsung,7 - MODEL=(SAMSUNG-)?SCH-(I545|I959|R970):MANUFACTURER=samsung,7 - MODEL=(SAMSUNG-)?SPH-(L720):MANUFACTURER=samsung,7 - MODEL=(SAMSUNG-)?(SC-04E):MANUFACTURER=samsung,7 - MODEL=(SAMSUNG-)?(SHV-E300[KLS]?):MANUFACTURER=samsung,7 - - MODEL=LG-E97[013]|LS970|L-01E:MANUFACTURER=LGE,15 - - MODEL=HTC One X:MANUFACTURER=HTC,20 - - MODEL=HTC One:MANUFACTURER=HTC,15 - MODEL=HTL22:MANUFACTURER=HTC,15 - - MODEL=XT907:MANUFACTURER=motorola,30 - - MODEL=XT1035:MANUFACTURER=motorola,18 - - MODEL=C6603|C6806:MANUFACTURER=Sony,35 - - diff --git a/app/src/main/res/values/keypress-volumes.xml b/app/src/main/res/values/keypress-volumes.xml deleted file mode 100644 index be8d7a165..000000000 --- a/app/src/main/res/values/keypress-volumes.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - HARDWARE=herring,0.5f - HARDWARE=tuna,0.5f - HARDWARE=stingray,0.4f - HARDWARE=grouper,0.3f - HARDWARE=mako,0.3f - HARDWARE=manta,0.2f - - diff --git a/app/src/main/res/values/phantom-sudden-move-event-device-list.xml b/app/src/main/res/values/phantom-sudden-move-event-device-list.xml deleted file mode 100644 index a497a520c..000000000 --- a/app/src/main/res/values/phantom-sudden-move-event-device-list.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - HARDWARE=stingray,true - -