From c8733128311ab65ae0be05ed484656693a7c68e0 Mon Sep 17 00:00:00 2001
From: ivanovlev <ivanovlev@mail.ru>
Date: Sat, 14 Jan 2017 02:39:36 +0300
Subject: [PATCH 1/9] Transliterate unsupported Russian characters into English

---
 app/build.gradle                              |  1 +
 .../service/devices/hplus/HPlusSupport.java   | 49 +++++++++++++++++++
 app/src/main/res/xml/changelog_master.xml     |  1 +
 3 files changed, 51 insertions(+)

diff --git a/app/build.gradle b/app/build.gradle
index b6b68af65..7a3175252 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -77,6 +77,7 @@ dependencies {
     compile 'org.apache.commons:commons-lang3:3.4'
 
 //    compile project(":DaoCore")
+    compile 'com.google.guava:guava:19.0'
 }
 
 preBuild.dependsOn(":GBDaoGenerator:genSources")
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java
index 4689155d7..a674d6b74 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java
@@ -14,6 +14,8 @@ import android.net.Uri;
 import android.support.v4.content.LocalBroadcastManager;
 import android.widget.Toast;
 
+import com.google.common.collect.ImmutableMap;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -21,6 +23,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.GregorianCalendar;
+import java.util.Map;
 import java.util.UUID;
 
 import nodomain.freeyourgadget.gadgetbridge.devices.hplus.HPlusConstants;
@@ -646,6 +649,7 @@ public class HPlusSupport extends AbstractBTLEDeviceSupport {
     private void showIncomingCall(String name, String number) {
         try {
             TransactionBuilder builder = performInitialized("incomingCallIcon");
+            name = transliterate(name);
 
             //Enable call notifications
             builder.write(ctrlCharacteristic, new byte[]{HPlusConstants.CMD_ACTION_INCOMING_CALL, 1});
@@ -703,6 +707,8 @@ public class HPlusSupport extends AbstractBTLEDeviceSupport {
         LOG.debug("Show Notification: "+title+" --> "+body);
         try {
             TransactionBuilder builder = performInitialized("notification");
+            title = transliterate(title);
+            body = transliterate(body);
 
             byte[] msg = new byte[20];
             for (int i = 0; i < msg.length; i++)
@@ -777,6 +783,49 @@ public class HPlusSupport extends AbstractBTLEDeviceSupport {
         }
     }
 
+    //replace unsupported symbols to english analog
+    private String transliterate(String txt){
+        StringBuilder message = new StringBuilder();
+        char[] chars = txt.toCharArray();
+
+        for (char c : chars)
+        {
+            message.append(transliterate(c));
+        }
+
+        return message.toString();
+    }
+
+    //replace unsupported symbol to english analog text
+    private String transliterate(char c){
+        Map<Character, String> map = ImmutableMap.<Character, String>builder()
+                .put('а', "a").put('б', "b").put('в', "v").put('г', "g")
+                .put('д', "d").put('е', "e").put('ё', "jo").put('ж', "zh")
+                .put('з', "z").put('и', "i").put('й', "jj").put('к', "k")
+                .put('л', "l").put('м', "m").put('н', "n").put('о', "o")
+                .put('п', "p").put('р', "r").put('с', "s").put('т', "t")
+                .put('у', "u").put('ф', "f").put('х', "kh").put('ц', "c")
+                .put('ч', "ch").put('ш', "sh").put('щ', "shh").put('ъ', "\"")
+                .put('ы', "y").put('ь', "'").put('э', "eh").put('ю', "ju")
+                .put('я', "ja")
+                .build();
+
+        char lowerChar = Character.toLowerCase(c);
+
+        if (map.containsKey(lowerChar)) {
+            String replace = map.get(lowerChar);
+
+            if (lowerChar != c)
+            {
+                return replace.toUpperCase();
+            }
+
+            return replace;
+        }
+
+        return String.valueOf(c);
+    }
+
     @Override
     public boolean onCharacteristicChanged(BluetoothGatt gatt,
                                            BluetoothGattCharacteristic characteristic) {
diff --git a/app/src/main/res/xml/changelog_master.xml b/app/src/main/res/xml/changelog_master.xml
index c54077e4c..34e61a413 100644
--- a/app/src/main/res/xml/changelog_master.xml
+++ b/app/src/main/res/xml/changelog_master.xml
@@ -16,6 +16,7 @@
         <change>HPlus: Near real time Heart rate measurement</change>
         <change>HPlus: Experimental synchronization of activity data (only sleep, steps and intensity)</change>
         <change>HPlus: Fix some disconnection issues</change>
+        <change>HPlus: Transliterate unsupported Russian characters into English</change>
     </release>
     <release version="0.16.0" versioncode="80">
         <change>New devices: HPlus (e.g. Zeblaze ZeBand), contributed by João Paulo Barraca</change>

From b9249065eb4f5fd8d9c7b9a518608b39e3dbb83c Mon Sep 17 00:00:00 2001
From: ivanovlev <ivanovlev@mail.ru>
Date: Sat, 14 Jan 2017 23:01:44 +0300
Subject: [PATCH 2/9] Fix for send message from debug screen

---
 .../gadgetbridge/service/devices/hplus/HPlusSupport.java     | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java
index a674d6b74..aa1836876 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java
@@ -785,7 +785,12 @@ public class HPlusSupport extends AbstractBTLEDeviceSupport {
 
     //replace unsupported symbols to english analog
     private String transliterate(String txt){
+        if (txt == null || txt.isEmpty()) {
+            return txt;
+        }
+
         StringBuilder message = new StringBuilder();
+
         char[] chars = txt.toCharArray();
 
         for (char c : chars)

From 074394cba49aacdf8d0b19df5208f042f9739a73 Mon Sep 17 00:00:00 2001
From: ivanovlev <ivanovlev@mail.ru>
Date: Sun, 15 Jan 2017 12:24:36 +0300
Subject: [PATCH 3/9] Transliteration is moved to a separate class, added
 settings option

---
 app/build.gradle                              |  1 -
 .../service/devices/hplus/HPlusSupport.java   | 65 +++----------------
 .../gadgetbridge/util/LanguageUtils.java      | 64 ++++++++++++++++++
 app/src/main/res/values-ru/strings.xml        |  2 +
 app/src/main/res/values/strings.xml           |  2 +
 app/src/main/res/xml/changelog_master.xml     |  3 +-
 app/src/main/res/xml/preferences.xml          |  7 ++
 7 files changed, 87 insertions(+), 57 deletions(-)
 create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java

diff --git a/app/build.gradle b/app/build.gradle
index 7a3175252..b6b68af65 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -77,7 +77,6 @@ dependencies {
     compile 'org.apache.commons:commons-lang3:3.4'
 
 //    compile project(":DaoCore")
-    compile 'com.google.guava:guava:19.0'
 }
 
 preBuild.dependsOn(":GBDaoGenerator:genSources")
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java
index aa1836876..319303dbc 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java
@@ -14,8 +14,6 @@ import android.net.Uri;
 import android.support.v4.content.LocalBroadcastManager;
 import android.widget.Toast;
 
-import com.google.common.collect.ImmutableMap;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -23,7 +21,6 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.GregorianCalendar;
-import java.util.Map;
 import java.util.UUID;
 
 import nodomain.freeyourgadget.gadgetbridge.devices.hplus.HPlusConstants;
@@ -41,10 +38,10 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLEDeviceSuppo
 import nodomain.freeyourgadget.gadgetbridge.service.btle.GattService;
 import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
 import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateAction;
-import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.AbstractBleProfile;
 import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfo;
 import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfoProfile;
 import nodomain.freeyourgadget.gadgetbridge.util.GB;
+import nodomain.freeyourgadget.gadgetbridge.util.LanguageUtils;
 
 
 public class HPlusSupport extends AbstractBTLEDeviceSupport {
@@ -649,7 +646,10 @@ public class HPlusSupport extends AbstractBTLEDeviceSupport {
     private void showIncomingCall(String name, String number) {
         try {
             TransactionBuilder builder = performInitialized("incomingCallIcon");
-            name = transliterate(name);
+
+            if (LanguageUtils.transliterate()) {
+                name = LanguageUtils.transliterate(name);
+            }
 
             //Enable call notifications
             builder.write(ctrlCharacteristic, new byte[]{HPlusConstants.CMD_ACTION_INCOMING_CALL, 1});
@@ -707,8 +707,11 @@ public class HPlusSupport extends AbstractBTLEDeviceSupport {
         LOG.debug("Show Notification: "+title+" --> "+body);
         try {
             TransactionBuilder builder = performInitialized("notification");
-            title = transliterate(title);
-            body = transliterate(body);
+
+            if (LanguageUtils.transliterate()) {
+                title = LanguageUtils.transliterate(title);
+                body = LanguageUtils.transliterate(body);
+            }
 
             byte[] msg = new byte[20];
             for (int i = 0; i < msg.length; i++)
@@ -783,54 +786,6 @@ public class HPlusSupport extends AbstractBTLEDeviceSupport {
         }
     }
 
-    //replace unsupported symbols to english analog
-    private String transliterate(String txt){
-        if (txt == null || txt.isEmpty()) {
-            return txt;
-        }
-
-        StringBuilder message = new StringBuilder();
-
-        char[] chars = txt.toCharArray();
-
-        for (char c : chars)
-        {
-            message.append(transliterate(c));
-        }
-
-        return message.toString();
-    }
-
-    //replace unsupported symbol to english analog text
-    private String transliterate(char c){
-        Map<Character, String> map = ImmutableMap.<Character, String>builder()
-                .put('а', "a").put('б', "b").put('в', "v").put('г', "g")
-                .put('д', "d").put('е', "e").put('ё', "jo").put('ж', "zh")
-                .put('з', "z").put('и', "i").put('й', "jj").put('к', "k")
-                .put('л', "l").put('м', "m").put('н', "n").put('о', "o")
-                .put('п', "p").put('р', "r").put('с', "s").put('т', "t")
-                .put('у', "u").put('ф', "f").put('х', "kh").put('ц', "c")
-                .put('ч', "ch").put('ш', "sh").put('щ', "shh").put('ъ', "\"")
-                .put('ы', "y").put('ь', "'").put('э', "eh").put('ю', "ju")
-                .put('я', "ja")
-                .build();
-
-        char lowerChar = Character.toLowerCase(c);
-
-        if (map.containsKey(lowerChar)) {
-            String replace = map.get(lowerChar);
-
-            if (lowerChar != c)
-            {
-                return replace.toUpperCase();
-            }
-
-            return replace;
-        }
-
-        return String.valueOf(c);
-    }
-
     @Override
     public boolean onCharacteristicChanged(BluetoothGatt gatt,
                                            BluetoothGattCharacteristic characteristic) {
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java
new file mode 100644
index 000000000..ae41ed3f0
--- /dev/null
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java
@@ -0,0 +1,64 @@
+package nodomain.freeyourgadget.gadgetbridge.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import nodomain.freeyourgadget.gadgetbridge.GBApplication;
+
+public class LanguageUtils {
+    //transliteration map with english equivalent for unsupported chars
+    private static Map<Character, String> transliterateMap = new HashMap<Character, String>(){
+        {
+            //russian chars
+            put('а', "a"); put('б', "b"); put('в', "v");  put('г', "g"); put('д', "d"); put('е', "e"); put('ё', "jo"); put('ж', "zh");
+            put('з', "z"); put('и', "i"); put('й', "jj"); put('к', "k"); put('л', "l"); put('м', "m"); put('н', "n");  put('о', "o");
+            put('п', "p"); put('р', "r"); put('с', "s");  put('т', "t"); put('у', "u"); put('ф', "f"); put('х', "kh"); put('ц', "c");
+            put('ч', "ch");put('ш', "sh");put('щ', "shh");put('ъ', "\"");put('ы', "y"); put('ь', "'"); put('э', "eh"); put('ю', "ju");
+            put('я', "ja");
+
+            //continue for other languages...
+        }
+    };
+
+    //check transliterate option status
+    public static boolean transliterate()
+    {
+        return GBApplication.getPrefs().getBoolean("transliteration", true);
+    }
+
+    //replace unsupported symbols to english analog
+    public static String transliterate(String txt){
+        if (txt == null || txt.isEmpty()) {
+            return txt;
+        }
+
+        StringBuilder message = new StringBuilder();
+
+        char[] chars = txt.toCharArray();
+
+        for (char c : chars)
+        {
+            message.append(transliterate(c));
+        }
+
+        return message.toString();
+    }
+
+    //replace unsupported symbol to english analog text
+    private static String transliterate(char c){
+        char lowerChar = Character.toLowerCase(c);
+
+        if (transliterateMap.containsKey(lowerChar)) {
+            String replace = transliterateMap.get(lowerChar);
+
+            if (lowerChar != c)
+            {
+                return replace.toUpperCase();
+            }
+
+            return replace;
+        }
+
+        return String.valueOf(c);
+    }
+}
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 7284db28f..2ed467a6b 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -52,6 +52,8 @@
   <string name="pref_title_whenscreenon">… даже когда экран включён</string>
   <string name="pref_title_notification_filter">Не беспокоить</string>
   <string name="pref_summary_notification_filter">Предотвращать отправку нежелательных уведомлений в режиме \"Не беспокоить\"</string>
+  <string name="pref_title_transliteration">Транслитерация</string>
+  <string name="pref_summary_transliteration">Используйте, если устройство не может работать с вашим языком</string>
   <string name="always">всегда</string>
   <string name="when_screen_off">когда экран выключен</string>
   <string name="never">никогда</string>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 522883d9f..765cc4612 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -80,6 +80,8 @@
     <string name="pref_title_whenscreenon">… also when screen is on</string>
     <string name="pref_title_notification_filter">Do Not Disturb</string>
     <string name="pref_summary_notification_filter">Stop unwanted Notifications from being sent based on the Do Not Disturb mode.</string>
+    <string name="pref_title_transliteration">Transliteration</string>
+    <string name="pref_summary_transliteration">Use, if the device can not work with your language</string>
 
     <string name="always">always</string>
     <string name="when_screen_off">when screen is off</string>
diff --git a/app/src/main/res/xml/changelog_master.xml b/app/src/main/res/xml/changelog_master.xml
index 34e61a413..672517f60 100644
--- a/app/src/main/res/xml/changelog_master.xml
+++ b/app/src/main/res/xml/changelog_master.xml
@@ -2,7 +2,8 @@
 <changelog>
     <release version="0.17.0" versioncode="81">
         <change>Add weather support through "Weather Notification" app</change>
-	<change>Various fixes for K9 mail when using the generic notification receiver</change>
+	    <change>Various fixes for K9 mail when using the generic notification receiver</change>
+        <change>Added transliteration option for notifications in the settings screen</change>
         <change>Pebble: Support for build-in weather system app (FW 4.x)</change>
         <change>Pebble: Add weather support for various watchfaces</change>
         <change>Pebble: Delete notifications that got dismissed on the phone</change>
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 43985431d..48eb91d87 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -91,6 +91,13 @@
             android:key="notifications_generic_whenscreenon"
             android:title="@string/pref_title_whenscreenon" />
 
+        <CheckBoxPreference
+            android:defaultValue="false"
+            android:key="transliteration"
+            android:summary="@string/pref_summary_transliteration"
+            android:title="@string/pref_title_transliteration"
+            />
+
         <CheckBoxPreference
             android:defaultValue="false"
             android:key="notification_filter"

From d08972e82ac01206fbcef0c1df63efcb5553de94 Mon Sep 17 00:00:00 2001
From: ivanovlev <ivanovlev@mail.ru>
Date: Sun, 15 Jan 2017 13:41:38 +0300
Subject: [PATCH 4/9] StyleCop

---
 app/src/main/res/xml/changelog_master.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/src/main/res/xml/changelog_master.xml b/app/src/main/res/xml/changelog_master.xml
index 6dac6eb9a..8544188a5 100644
--- a/app/src/main/res/xml/changelog_master.xml
+++ b/app/src/main/res/xml/changelog_master.xml
@@ -2,7 +2,7 @@
 <changelog>
     <release version="0.17.0" versioncode="81">
         <change>Add weather support through "Weather Notification" app</change>
-	      <change>Various fixes for K9 mail when using the generic notification receiver</change>
+	 <change>Various fixes for K9 mail when using the generic notification receiver</change>
         <change>Added transliteration option for notifications in the settings screen</change>
         <change>Add a preference to hide the notification icon of Gadgetbridge</change>
 

From 2de9580dea802a77c37d3335d4a92f8f625c9660 Mon Sep 17 00:00:00 2001
From: ivanovlev <ivanovlev@mail.ru>
Date: Sun, 15 Jan 2017 22:10:12 +0300
Subject: [PATCH 5/9] Added diacritic convertation into Transliteration

---
 .../gadgetbridge/util/LanguageUtils.java      | 19 +++++++++++++++++--
 app/src/main/res/xml/changelog_master.xml     |  2 +-
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java
index ae41ed3f0..a9a80aae4 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java
@@ -2,13 +2,16 @@ package nodomain.freeyourgadget.gadgetbridge.util;
 
 import java.util.HashMap;
 import java.util.Map;
-
+import java.text.Normalizer;
 import nodomain.freeyourgadget.gadgetbridge.GBApplication;
 
 public class LanguageUtils {
     //transliteration map with english equivalent for unsupported chars
     private static Map<Character, String> transliterateMap = new HashMap<Character, String>(){
         {
+            //extended ASCII characters
+            put('æ', "ae"); put('œ', "oe"); put('ß', "B");
+
             //russian chars
             put('а', "a"); put('б', "b"); put('в', "v");  put('г', "g"); put('д', "d"); put('е', "e"); put('ё', "jo"); put('ж', "zh");
             put('з', "z"); put('и', "i"); put('й', "jj"); put('к', "k"); put('л', "l"); put('м', "m"); put('н', "n");  put('о', "o");
@@ -41,7 +44,7 @@ public class LanguageUtils {
             message.append(transliterate(c));
         }
 
-        return message.toString();
+        return flattenToAscii(message.toString());
     }
 
     //replace unsupported symbol to english analog text
@@ -61,4 +64,16 @@ public class LanguageUtils {
 
         return String.valueOf(c);
     }
+
+    //convert diacritic
+    private static String flattenToAscii(String string) {
+        char[] out = new char[string.length()];
+        string = Normalizer.normalize(string, Normalizer.Form.NFD);
+        int j = 0;
+        for (int i = 0, n = string.length(); i < n; ++i) {
+            char c = string.charAt(i);
+            if (c <= '\u007F') out[j++] = c;
+        }
+        return new String(out);
+    }
 }
diff --git a/app/src/main/res/xml/changelog_master.xml b/app/src/main/res/xml/changelog_master.xml
index 8544188a5..d4b9c14bd 100644
--- a/app/src/main/res/xml/changelog_master.xml
+++ b/app/src/main/res/xml/changelog_master.xml
@@ -2,7 +2,7 @@
 <changelog>
     <release version="0.17.0" versioncode="81">
         <change>Add weather support through "Weather Notification" app</change>
-	 <change>Various fixes for K9 mail when using the generic notification receiver</change>
+	    <change>Various fixes for K9 mail when using the generic notification receiver</change>
         <change>Added transliteration option for notifications in the settings screen</change>
         <change>Add a preference to hide the notification icon of Gadgetbridge</change>
 

From bfe24dd9f0356ad571cde123c5810865a2207f9e Mon Sep 17 00:00:00 2001
From: ivanovlev <ivanovlev@mail.ru>
Date: Sun, 15 Jan 2017 22:46:30 +0300
Subject: [PATCH 6/9] Refactoring

---
 .../gadgetbridge/util/LanguageUtils.java               | 10 ++--------
 app/src/main/res/xml/changelog_master.xml              |  2 +-
 2 files changed, 3 insertions(+), 9 deletions(-)

diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java
index a9a80aae4..735dfd1fe 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java
@@ -10,7 +10,7 @@ public class LanguageUtils {
     private static Map<Character, String> transliterateMap = new HashMap<Character, String>(){
         {
             //extended ASCII characters
-            put('æ', "ae"); put('œ', "oe"); put('ß', "B");
+            put('æ', "ae"); put('œ', "oe"); put('ß', "B"); put('ª', "a"); put('º', "o");
 
             //russian chars
             put('а', "a"); put('б', "b"); put('в', "v");  put('г', "g"); put('д', "d"); put('е', "e"); put('ё', "jo"); put('ж', "zh");
@@ -67,13 +67,7 @@ public class LanguageUtils {
 
     //convert diacritic
     private static String flattenToAscii(String string) {
-        char[] out = new char[string.length()];
         string = Normalizer.normalize(string, Normalizer.Form.NFD);
-        int j = 0;
-        for (int i = 0, n = string.length(); i < n; ++i) {
-            char c = string.charAt(i);
-            if (c <= '\u007F') out[j++] = c;
-        }
-        return new String(out);
+        return string.replaceAll("\\p{M}", "");
     }
 }
diff --git a/app/src/main/res/xml/changelog_master.xml b/app/src/main/res/xml/changelog_master.xml
index d4b9c14bd..8e71c9a0c 100644
--- a/app/src/main/res/xml/changelog_master.xml
+++ b/app/src/main/res/xml/changelog_master.xml
@@ -2,7 +2,7 @@
 <changelog>
     <release version="0.17.0" versioncode="81">
         <change>Add weather support through "Weather Notification" app</change>
-	    <change>Various fixes for K9 mail when using the generic notification receiver</change>
+        <change>Various fixes for K9 mail when using the generic notification receiver</change>
         <change>Added transliteration option for notifications in the settings screen</change>
         <change>Add a preference to hide the notification icon of Gadgetbridge</change>
 

From cbc91e7fef7856379bf3b08a871478490e04e820 Mon Sep 17 00:00:00 2001
From: ivanovlev <ivanovlev@mail.ru>
Date: Tue, 17 Jan 2017 23:07:12 +0300
Subject: [PATCH 7/9] Moving transliteration call from module "HPlus" to common
 support

---
 .../service/DeviceCommunicationService.java   | 41 +++++++++++++------
 .../service/devices/hplus/HPlusSupport.java   | 10 -----
 .../gadgetbridge/util/LanguageUtils.java      |  2 +-
 3 files changed, 29 insertions(+), 24 deletions(-)

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 0edf91718..da4fa9a06 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java
@@ -51,6 +51,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
 import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper;
 import nodomain.freeyourgadget.gadgetbridge.util.GB;
 import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs;
+import nodomain.freeyourgadget.gadgetbridge.util.LanguageUtils;
 import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
 
 import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_ADD_CALENDAREVENT;
@@ -322,21 +323,23 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
                 break;
             case ACTION_NOTIFICATION: {
                 NotificationSpec notificationSpec = new NotificationSpec();
-                notificationSpec.phoneNumber = intent.getStringExtra(EXTRA_NOTIFICATION_PHONENUMBER);
-                notificationSpec.sender = intent.getStringExtra(EXTRA_NOTIFICATION_SENDER);
-                notificationSpec.subject = intent.getStringExtra(EXTRA_NOTIFICATION_SUBJECT);
-                notificationSpec.title = intent.getStringExtra(EXTRA_NOTIFICATION_TITLE);
-                notificationSpec.body = intent.getStringExtra(EXTRA_NOTIFICATION_BODY);
+                notificationSpec.phoneNumber = getStringExtra(intent, EXTRA_NOTIFICATION_PHONENUMBER);
+                notificationSpec.sender = getStringExtra(intent, EXTRA_NOTIFICATION_SENDER);
+                notificationSpec.subject = getStringExtra(intent, EXTRA_NOTIFICATION_SUBJECT);
+                notificationSpec.title = getStringExtra(intent, EXTRA_NOTIFICATION_TITLE);
+                notificationSpec.body = getStringExtra(intent, EXTRA_NOTIFICATION_BODY);
+                notificationSpec.sourceName = getStringExtra(intent, EXTRA_NOTIFICATION_SOURCENAME);
                 notificationSpec.type = (NotificationType) intent.getSerializableExtra(EXTRA_NOTIFICATION_TYPE);
                 notificationSpec.id = intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1);
                 notificationSpec.flags = intent.getIntExtra(EXTRA_NOTIFICATION_FLAGS, 0);
-                notificationSpec.sourceName = intent.getStringExtra(EXTRA_NOTIFICATION_SOURCENAME);
+
                 if (notificationSpec.type == NotificationType.GENERIC_SMS && notificationSpec.phoneNumber != null) {
                     notificationSpec.sender = getContactDisplayNameByNumber(notificationSpec.phoneNumber);
 
                     notificationSpec.id = mRandom.nextInt(); // FIXME: add this in external SMS Receiver?
                     GBApplication.getIDSenderLookup().add(notificationSpec.id, notificationSpec.phoneNumber);
                 }
+
                 if (((notificationSpec.flags & NotificationSpec.FLAG_WEARABLE_REPLY) > 0)
                         || (notificationSpec.type == NotificationType.GENERIC_SMS && notificationSpec.phoneNumber != null)) {
                     // NOTE: maybe not where it belongs
@@ -353,6 +356,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
                         notificationSpec.cannedReplies = replies.toArray(new String[replies.size()]);
                     }
                 }
+
                 mDeviceSupport.onNotification(notificationSpec);
                 break;
             }
@@ -366,8 +370,8 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
                 calendarEventSpec.type = intent.getByteExtra(EXTRA_CALENDAREVENT_TYPE, (byte) -1);
                 calendarEventSpec.timestamp = intent.getIntExtra(EXTRA_CALENDAREVENT_TIMESTAMP, -1);
                 calendarEventSpec.durationInSeconds = intent.getIntExtra(EXTRA_CALENDAREVENT_DURATION, -1);
-                calendarEventSpec.title = intent.getStringExtra(EXTRA_CALENDAREVENT_TITLE);
-                calendarEventSpec.description = intent.getStringExtra(EXTRA_CALENDAREVENT_DESCRIPTION);
+                calendarEventSpec.title = getStringExtra(intent, EXTRA_CALENDAREVENT_TITLE);
+                calendarEventSpec.description = getStringExtra(intent, EXTRA_CALENDAREVENT_DESCRIPTION);
                 mDeviceSupport.onAddCalendarEvent(calendarEventSpec);
                 break;
             }
@@ -412,7 +416,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
             case ACTION_CALLSTATE:
                 int command = intent.getIntExtra(EXTRA_CALL_COMMAND, CallSpec.CALL_UNDEFINED);
 
-                String phoneNumber = intent.getStringExtra(EXTRA_CALL_PHONENUMBER);
+                String phoneNumber = getStringExtra(intent, EXTRA_CALL_PHONENUMBER);
                 String callerName = null;
                 if (phoneNumber != null) {
                     callerName = getContactDisplayNameByNumber(phoneNumber);
@@ -438,9 +442,9 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
                 break;
             case ACTION_SETMUSICINFO:
                 MusicSpec musicSpec = new MusicSpec();
-                musicSpec.artist = intent.getStringExtra(EXTRA_MUSIC_ARTIST);
-                musicSpec.album = intent.getStringExtra(EXTRA_MUSIC_ALBUM);
-                musicSpec.track = intent.getStringExtra(EXTRA_MUSIC_TRACK);
+                musicSpec.artist = getStringExtra(intent, EXTRA_MUSIC_ARTIST);
+                musicSpec.album = getStringExtra(intent, EXTRA_MUSIC_ALBUM);
+                musicSpec.track = getStringExtra(intent, EXTRA_MUSIC_TRACK);
                 musicSpec.duration = intent.getIntExtra(EXTRA_MUSIC_DURATION, 0);
                 musicSpec.trackCount = intent.getIntExtra(EXTRA_MUSIC_TRACKCOUNT, 0);
                 musicSpec.trackNr = intent.getIntExtra(EXTRA_MUSIC_TRACKNR, 0);
@@ -703,7 +707,18 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
             // ignore, just return name below
         }
 
-        return name;
+        return LanguageUtils.transliterate()
+                    ? LanguageUtils.transliterate(name)
+                    : name;
+    }
+
+    //Standard method with transliteration
+    private String getStringExtra(Intent intent, String event){
+        String extra = intent.getStringExtra(event);
+
+        return LanguageUtils.transliterate()
+                    ? LanguageUtils.transliterate(extra)
+                    : extra;
     }
 
     @Override
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java
index 319303dbc..8335830f7 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java
@@ -41,7 +41,6 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateA
 import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfo;
 import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfoProfile;
 import nodomain.freeyourgadget.gadgetbridge.util.GB;
-import nodomain.freeyourgadget.gadgetbridge.util.LanguageUtils;
 
 
 public class HPlusSupport extends AbstractBTLEDeviceSupport {
@@ -647,10 +646,6 @@ public class HPlusSupport extends AbstractBTLEDeviceSupport {
         try {
             TransactionBuilder builder = performInitialized("incomingCallIcon");
 
-            if (LanguageUtils.transliterate()) {
-                name = LanguageUtils.transliterate(name);
-            }
-
             //Enable call notifications
             builder.write(ctrlCharacteristic, new byte[]{HPlusConstants.CMD_ACTION_INCOMING_CALL, 1});
 
@@ -708,11 +703,6 @@ public class HPlusSupport extends AbstractBTLEDeviceSupport {
         try {
             TransactionBuilder builder = performInitialized("notification");
 
-            if (LanguageUtils.transliterate()) {
-                title = LanguageUtils.transliterate(title);
-                body = LanguageUtils.transliterate(body);
-            }
-
             byte[] msg = new byte[20];
             for (int i = 0; i < msg.length; i++)
                 msg[i] = ' ';
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java
index 735dfd1fe..48359d09f 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java
@@ -10,7 +10,7 @@ public class LanguageUtils {
     private static Map<Character, String> transliterateMap = new HashMap<Character, String>(){
         {
             //extended ASCII characters
-            put('æ', "ae"); put('œ', "oe"); put('ß', "B"); put('ª', "a"); put('º', "o");
+            put('æ', "ae"); put('œ', "oe"); put('ß', "B"); put('ª', "a"); put('º', "o"); put('«',"\""); put('»',"\"");
 
             //russian chars
             put('а', "a"); put('б', "b"); put('в', "v");  put('г', "g"); put('д', "d"); put('е', "e"); put('ё', "jo"); put('ж', "zh");

From 0094805359cd99e087318fc3e342f85782835cd0 Mon Sep 17 00:00:00 2001
From: ivanovlev <ivanovlev@mail.ru>
Date: Tue, 17 Jan 2017 23:24:03 +0300
Subject: [PATCH 8/9] ChangeLog

---
 app/src/main/res/xml/changelog_master.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/src/main/res/xml/changelog_master.xml b/app/src/main/res/xml/changelog_master.xml
index 8e71c9a0c..6f3a0a33f 100644
--- a/app/src/main/res/xml/changelog_master.xml
+++ b/app/src/main/res/xml/changelog_master.xml
@@ -3,7 +3,8 @@
     <release version="0.17.0" versioncode="81">
         <change>Add weather support through "Weather Notification" app</change>
         <change>Various fixes for K9 mail when using the generic notification receiver</change>
-        <change>Added transliteration option for notifications in the settings screen</change>
+        <change>Added transliteration support for Russian characters into English</change>
+        <change>Added transliteration option in the settings screen</change>
         <change>Add a preference to hide the notification icon of Gadgetbridge</change>
 
         <change>Pebble: Support for build-in weather system app (FW 4.x)</change>
@@ -19,7 +20,6 @@
         <change>HPlus: Near real time Heart rate measurement</change>
         <change>HPlus: Experimental synchronization of activity data (only sleep, steps and intensity)</change>
         <change>HPlus: Fix some disconnection issues</change>
-        <change>HPlus: Transliterate unsupported Russian characters into English</change>
     </release>
     <release version="0.16.0" versioncode="80">
         <change>New devices: HPlus (e.g. Zeblaze ZeBand), contributed by João Paulo Barraca</change>

From c13725911f3cd01f2b05f7a9529617d81092db8a Mon Sep 17 00:00:00 2001
From: ivanovlev <ivanovlev@mail.ru>
Date: Thu, 19 Jan 2017 08:09:36 +0300
Subject: [PATCH 9/9] Transliteration off by default, if setting not exist

---
 .../freeyourgadget/gadgetbridge/util/LanguageUtils.java         | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java
index 48359d09f..59d7aa817 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LanguageUtils.java
@@ -26,7 +26,7 @@ public class LanguageUtils {
     //check transliterate option status
     public static boolean transliterate()
     {
-        return GBApplication.getPrefs().getBoolean("transliteration", true);
+        return GBApplication.getPrefs().getBoolean("transliteration", false);
     }
 
     //replace unsupported symbols to english analog