From 876515f1fd787e8d036c71ee2e141f4369e59690 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sat, 14 Sep 2019 00:05:39 +0200 Subject: [PATCH] Amazfit Cor: support custom emoji font This commit refactors code and implements a custom device specific string filter, which does nothing by default. The implementation in HuamiSupport does the custom emoji conversion. The setting has been moved from devicesettings_amazfitbip.xml to an extra file As soon as there is a custom font for Mi Band 2/3/4 it is sufficient to add "devicesettings_custom_emoji_font.xml" to the list of supported settings in the appropriate coordinator and everything will work. --- .../devices/AbstractDeviceCoordinator.java | 3 -- .../devices/DeviceCoordinator.java | 5 --- .../amazfitbip/AmazfitBipCoordinator.java | 6 +-- .../amazfitcor/AmazfitCorCoordinator.java | 1 + .../service/AbstractDeviceSupport.java | 4 ++ .../service/DeviceCommunicationService.java | 19 ++------- .../gadgetbridge/service/DeviceSupport.java | 5 +++ .../service/ServiceDeviceSupport.java | 5 +++ .../service/devices/huami/HuamiSupport.java | 41 ++++++++++++++++++- .../gadgetbridge/util/StringUtils.java | 32 --------------- .../res/xml/devicesettings_amazfitbip.xml | 6 --- .../xml/devicesettings_custom_emoji_font.xml | 9 ++++ 12 files changed, 67 insertions(+), 69 deletions(-) create mode 100644 app/src/main/res/xml/devicesettings_custom_emoji_font.xml diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java index 35c96f444..6d8a030f3 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java @@ -167,9 +167,6 @@ public abstract class AbstractDeviceCoordinator implements DeviceCoordinator { @Override public boolean supportsUnicodeEmojis() { return false; } - @Override - public boolean supportsCustomFont() { return false; } - @Override public int[] getSupportedDeviceSpecificSettings(GBDevice device) { return null; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java index 6b1049959..a9d7fd7e7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java @@ -280,11 +280,6 @@ public interface DeviceCoordinator { */ boolean supportsUnicodeEmojis(); - /** - * Indicates whether the device supports using a custom font. - */ - boolean supportsCustomFont(); - /** * Indicates which device specific settings the device supports (not per device type or family, but unique per device). */ diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipCoordinator.java index 73c82aded..9b167dc46 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipCoordinator.java @@ -77,15 +77,11 @@ public class AmazfitBipCoordinator extends HuamiCoordinator { return true; } - @Override - public boolean supportsCustomFont() { - return true; - } - @Override public int[] getSupportedDeviceSpecificSettings(GBDevice device) { return new int[]{ R.xml.devicesettings_amazfitbip, + R.xml.devicesettings_custom_emoji_font, R.xml.devicesettings_liftwrist_display, R.xml.devicesettings_disconnectnotification, R.xml.devicesettings_expose_hr_thirdparty, diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitcor/AmazfitCorCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitcor/AmazfitCorCoordinator.java index 96ac2e9fc..91103a461 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitcor/AmazfitCorCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitcor/AmazfitCorCoordinator.java @@ -84,6 +84,7 @@ public class AmazfitCorCoordinator extends HuamiCoordinator { public int[] getSupportedDeviceSpecificSettings(GBDevice device) { return new int[]{ R.xml.devicesettings_amazfitcor, + R.xml.devicesettings_custom_emoji_font, R.xml.devicesettings_liftwrist_display, R.xml.devicesettings_disconnectnotification, R.xml.devicesettings_expose_hr_thirdparty, diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/AbstractDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/AbstractDeviceSupport.java index 859fb8271..0aba18fbf 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/AbstractDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/AbstractDeviceSupport.java @@ -409,4 +409,8 @@ public abstract class AbstractDeviceSupport implements DeviceSupport { LocalBroadcastManager.getInstance(context).sendBroadcast(messageIntent); } + + public String customStringFilter(String inputString) { + return inputString; + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java index 4d3d439d0..34dd7f66b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java @@ -199,7 +199,6 @@ public class DeviceCommunicationService extends Service implements SharedPrefere private CMWeatherReceiver mCMWeatherReceiver = null; private LineageOsWeatherReceiver mLineageOsWeatherReceiver = null; private OmniJawsObserver mOmniJawsObserver = null; - private Random mRandom = new Random(); private final String[] mMusicActions = { "com.android.music.metachanged", @@ -370,21 +369,9 @@ public class DeviceCommunicationService extends Service implements SharedPrefere if (text == null || text.length() == 0) return text; + text = mDeviceSupport.customStringFilter(text); + if (!mCoordinator.supportsUnicodeEmojis()) { - - // use custom font for emoji, if it is supported and enabled - if (mCoordinator.supportsCustomFont()) { - switch (mCoordinator.getDeviceType()) { - case AMAZFITBIP: - if (((HuamiCoordinator)mCoordinator).getUseCustomFont(mGBDevice.getAddress())) - return StringUtils.toCustomFont(text); - break; - // TODO: implement for Amazfit Cor - default: - break; - } - } - return EmojiConverter.convertUnicodeEmojiToAscii(text, getApplicationContext()); } @@ -763,7 +750,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere if (mOmniJawsObserver == null && coordinator != null && coordinator.supportsWeather()) { try { mOmniJawsObserver = new OmniJawsObserver(new Handler()); - getContentResolver().registerContentObserver(mOmniJawsObserver.WEATHER_URI, true, mOmniJawsObserver); + getContentResolver().registerContentObserver(OmniJawsObserver.WEATHER_URI, true, mOmniJawsObserver); } catch (PackageManager.NameNotFoundException e) { //Nothing wrong, it just means we're not running on omnirom. } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupport.java index ff6569dce..17e7f68a4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupport.java @@ -130,4 +130,9 @@ public interface DeviceSupport extends EventHandler { * Returns the Android context to use, e.g. to look up resources. */ Context getContext(); + + /** + * converts String in a device specific way, e.g. re-map characters for a custom font + */ + String customStringFilter(String inputString); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java index b1f48866a..308573e62 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java @@ -113,6 +113,11 @@ public class ServiceDeviceSupport implements DeviceSupport { return delegate.getContext(); } + @Override + public String customStringFilter(String inputString) { + return delegate.customStringFilter(inputString); + } + @Override public boolean useAutoConnect() { return delegate.useAutoConnect(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java index 3b323dafa..f32400011 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java @@ -127,6 +127,7 @@ import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper; import nodomain.freeyourgadget.gadgetbridge.util.GB; import nodomain.freeyourgadget.gadgetbridge.util.NotificationUtils; import nodomain.freeyourgadget.gadgetbridge.util.Prefs; +import nodomain.freeyourgadget.gadgetbridge.util.StringUtils; import nodomain.freeyourgadget.gadgetbridge.util.Version; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.DEFAULT_VALUE_VIBRATION_COUNT; @@ -414,7 +415,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { int userid = alias.hashCode(); // hash from alias like mi1 // FIXME: Do encoding like in PebbleProtocol, this is ugly - byte bytes[] = new byte[]{ + byte[] bytes = new byte[]{ HuamiService.COMMAND_SET_USERINFO, 0, 0, @@ -913,7 +914,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { } private byte[] getLatency(int minConnectionInterval, int maxConnectionInterval, int latency, int timeout, int advertisementInterval) { - byte result[] = new byte[12]; + byte[] result = new byte[12]; result[0] = (byte) (minConnectionInterval & 0xff); result[1] = (byte) (0xff & minConnectionInterval >> 8); result[2] = (byte) (maxConnectionInterval & 0xff); @@ -2079,6 +2080,42 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { } } + @Override + public String customStringFilter(String inputString) { + if (HuamiCoordinator.getUseCustomFont(gbDevice.getAddress())) { + return convertEmojiToCustomFont(inputString); + } + return inputString; + } + + + private String convertEmojiToCustomFont(String str) { + StringBuilder sb = new StringBuilder(); + int i = 0; + while (i < str.length()) { + char charAt = str.charAt(i); + if (Character.isHighSurrogate(charAt)) { + int i2 = i + 1; + try { + int codePoint = Character.toCodePoint(charAt, str.charAt(i2)); + if (codePoint < 127744 || codePoint > 129510) { + sb.append(charAt); + } else { + sb.append((char) (codePoint - 83712)); + i = i2; + } + } catch (StringIndexOutOfBoundsException e) { + LOG.warn("error while converting emoji to custom font", e); + sb.append(charAt); + } + } else { + sb.append(charAt); + } + i++; + } + return sb.toString(); + } + public void phase2Initialize(TransactionBuilder builder) { LOG.info("phase2Initialize..."); requestBatteryInfo(builder); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/StringUtils.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/StringUtils.java index 89dedbd24..007853deb 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/StringUtils.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/StringUtils.java @@ -96,36 +96,4 @@ public class StringUtils { } return ""; } - - /** - * @param str original text - * @return str with the emoticons in a format that can be displayed on an - * Amazfit Bip by using a custom font firmware with emoji support - */ - public static String toCustomFont(String str) { - StringBuilder sb = new StringBuilder(); - int i = 0; - while (i < str.length()) { - char charAt = str.charAt(i); - if (Character.isHighSurrogate(charAt)) { - int i2 = i + 1; - try { - int codePoint = Character.toCodePoint(charAt, str.charAt(i2)); - if (codePoint < 127744 || codePoint > 129510) { - sb.append(charAt); - } else { - sb.append(Character.toString((char) (codePoint - 83712))); - i = i2; - } - } catch (StringIndexOutOfBoundsException e) { - e.printStackTrace(); - sb.append(charAt); - } - } else { - sb.append(charAt); - } - i++; - } - return sb.toString(); - } } diff --git a/app/src/main/res/xml/devicesettings_amazfitbip.xml b/app/src/main/res/xml/devicesettings_amazfitbip.xml index e469798bd..d2133e176 100644 --- a/app/src/main/res/xml/devicesettings_amazfitbip.xml +++ b/app/src/main/res/xml/devicesettings_amazfitbip.xml @@ -17,10 +17,4 @@ android:key="language" android:summary="%s" android:title="@string/pref_title_language" /> - diff --git a/app/src/main/res/xml/devicesettings_custom_emoji_font.xml b/app/src/main/res/xml/devicesettings_custom_emoji_font.xml new file mode 100644 index 000000000..f9d64604a --- /dev/null +++ b/app/src/main/res/xml/devicesettings_custom_emoji_font.xml @@ -0,0 +1,9 @@ + + + +