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 @@
+
+
+
+