messages: convert emoji's to supported chars

Some devices don't support emoji's and display a series of `?` chars.
Instead of that, replace them by `:<emoji>:` text, e.g. `A 🐱` is
replaced by `A 🐱`.

This is done by using 'android-emojify' project and their
`EmojiUtils.shortCodify(text);` function.

For more details about this lib released under MIT license:

    https://anitrend.github.io/android-emojify/
This commit is contained in:
Matthieu Baerts
2018-12-23 12:52:49 +01:00
committed by Carsten Pfeiffer
parent 8585536c3c
commit 8d78c45e7d
8 changed files with 76 additions and 12 deletions
+1
View File
@@ -87,6 +87,7 @@ dependencies {
implementation "org.cyanogenmod:platform.sdk:6.0" implementation "org.cyanogenmod:platform.sdk:6.0"
implementation 'com.jaredrummler:colorpicker:1.0.2' implementation 'com.jaredrummler:colorpicker:1.0.2'
// implementation project(":DaoCore") // implementation project(":DaoCore")
implementation 'com.github.wax911:android-emojify:0.1.7'
} }
preBuild.dependsOn(":GBDaoGenerator:genSources") preBuild.dependsOn(":GBDaoGenerator:genSources")
@@ -53,6 +53,7 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import io.wax911.emojify.EmojiManager;
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
import nodomain.freeyourgadget.gadgetbridge.database.DBHelper; import nodomain.freeyourgadget.gadgetbridge.database.DBHelper;
import nodomain.freeyourgadget.gadgetbridge.database.DBOpenHelper; import nodomain.freeyourgadget.gadgetbridge.database.DBOpenHelper;
@@ -197,6 +198,8 @@ public class GBApplication extends Application {
} }
startService(new Intent(this, NotificationCollectorMonitorService.class)); startService(new Intent(this, NotificationCollectorMonitorService.class));
} }
EmojiManager.initEmojiData(getApplicationContext());
} }
@Override @Override
@@ -149,4 +149,7 @@ public abstract class AbstractDeviceCoordinator implements DeviceCoordinator {
public int[] getColorPresets() { public int[] getColorPresets() {
return new int[0]; return new int[0];
} }
@Override
public boolean supportsUnicodeEmojis() { return false; }
} }
@@ -278,4 +278,9 @@ public interface DeviceCoordinator {
*/ */
@NonNull @NonNull
int[] getColorPresets(); int[] getColorPresets();
/**
* Indicates whether the device supports unicode emojis.
*/
boolean supportsUnicodeEmojis();
} }
@@ -73,4 +73,7 @@ public class AmazfitCorCoordinator extends HuamiCoordinator {
public boolean supportsMusicInfo() { public boolean supportsMusicInfo() {
return true; return true;
} }
@Override
public boolean supportsUnicodeEmojis() { return true; }
} }
@@ -175,4 +175,7 @@ public class PebbleCoordinator extends AbstractDeviceCoordinator {
public boolean supportsMusicInfo() { public boolean supportsMusicInfo() {
return true; return true;
} }
@Override
public boolean supportsUnicodeEmojis() { return true; }
} }
@@ -73,6 +73,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.NotificationType;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.service.receivers.GBAutoFetchReceiver; import nodomain.freeyourgadget.gadgetbridge.service.receivers.GBAutoFetchReceiver;
import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper; import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper;
import nodomain.freeyourgadget.gadgetbridge.util.EmojiConverter;
import nodomain.freeyourgadget.gadgetbridge.util.GB; import nodomain.freeyourgadget.gadgetbridge.util.GB;
import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs; import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs;
import nodomain.freeyourgadget.gadgetbridge.util.Prefs; import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
@@ -175,6 +176,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
private DeviceSupportFactory mFactory; private DeviceSupportFactory mFactory;
private GBDevice mGBDevice = null; private GBDevice mGBDevice = null;
private DeviceSupport mDeviceSupport; private DeviceSupport mDeviceSupport;
private DeviceCoordinator mCoordinator = null;
private PhoneCallReceiver mPhoneCallReceiver = null; private PhoneCallReceiver mPhoneCallReceiver = null;
private SMSReceiver mSMSReceiver = null; private SMSReceiver mSMSReceiver = null;
@@ -226,8 +228,9 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
GBDevice device = intent.getParcelableExtra(GBDevice.EXTRA_DEVICE); GBDevice device = intent.getParcelableExtra(GBDevice.EXTRA_DEVICE);
if (mGBDevice != null && mGBDevice.equals(device)) { if (mGBDevice != null && mGBDevice.equals(device)) {
mGBDevice = device; mGBDevice = device;
mCoordinator = DeviceHelper.getInstance().getCoordinator(device);
boolean enableReceivers = mDeviceSupport != null && (mDeviceSupport.useAutoConnect() || mGBDevice.isInitialized()); boolean enableReceivers = mDeviceSupport != null && (mDeviceSupport.useAutoConnect() || mGBDevice.isInitialized());
setReceiversEnableState(enableReceivers, mGBDevice.isInitialized(), DeviceHelper.getInstance().getCoordinator(device)); setReceiversEnableState(enableReceivers, mGBDevice.isInitialized(), mCoordinator);
} else { } else {
LOG.error("Got ACTION_DEVICE_CHANGED from unexpected device: " + device); LOG.error("Got ACTION_DEVICE_CHANGED from unexpected device: " + device);
} }
@@ -352,6 +355,20 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
return START_STICKY; return START_STICKY;
} }
/**
* @param text: original text
* @return 'text' or a new String without non supported chars like emoticons, etc.
*/
private String sanitizeNotifText(String text) {
if (text == null || text.length() == 0)
return text;
if (!mCoordinator.supportsUnicodeEmojis())
return EmojiConverter.convertUnicodeEmojiToAscii(text);
return text;
}
private void handleAction(Intent intent, String action, Prefs prefs) { private void handleAction(Intent intent, String action, Prefs prefs) {
switch (action) { switch (action) {
case ACTION_REQUEST_DEVICEINFO: case ACTION_REQUEST_DEVICEINFO:
@@ -361,10 +378,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
int desiredId = intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1); int desiredId = intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1);
NotificationSpec notificationSpec = new NotificationSpec(desiredId); NotificationSpec notificationSpec = new NotificationSpec(desiredId);
notificationSpec.phoneNumber = intent.getStringExtra(EXTRA_NOTIFICATION_PHONENUMBER); notificationSpec.phoneNumber = intent.getStringExtra(EXTRA_NOTIFICATION_PHONENUMBER);
notificationSpec.sender = intent.getStringExtra(EXTRA_NOTIFICATION_SENDER); notificationSpec.sender = sanitizeNotifText(intent.getStringExtra(EXTRA_NOTIFICATION_SENDER));
notificationSpec.subject = intent.getStringExtra(EXTRA_NOTIFICATION_SUBJECT); notificationSpec.subject = sanitizeNotifText(intent.getStringExtra(EXTRA_NOTIFICATION_SUBJECT));
notificationSpec.title = intent.getStringExtra(EXTRA_NOTIFICATION_TITLE); notificationSpec.title = sanitizeNotifText(intent.getStringExtra(EXTRA_NOTIFICATION_TITLE));
notificationSpec.body = intent.getStringExtra(EXTRA_NOTIFICATION_BODY); notificationSpec.body = sanitizeNotifText(intent.getStringExtra(EXTRA_NOTIFICATION_BODY));
notificationSpec.sourceName = intent.getStringExtra(EXTRA_NOTIFICATION_SOURCENAME); notificationSpec.sourceName = intent.getStringExtra(EXTRA_NOTIFICATION_SOURCENAME);
notificationSpec.type = (NotificationType) intent.getSerializableExtra(EXTRA_NOTIFICATION_TYPE); notificationSpec.type = (NotificationType) intent.getSerializableExtra(EXTRA_NOTIFICATION_TYPE);
notificationSpec.attachedActions = (ArrayList<NotificationSpec.Action>) intent.getSerializableExtra(EXTRA_NOTIFICATION_ACTIONS); notificationSpec.attachedActions = (ArrayList<NotificationSpec.Action>) intent.getSerializableExtra(EXTRA_NOTIFICATION_ACTIONS);
@@ -405,9 +422,9 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
calendarEventSpec.type = intent.getByteExtra(EXTRA_CALENDAREVENT_TYPE, (byte) -1); calendarEventSpec.type = intent.getByteExtra(EXTRA_CALENDAREVENT_TYPE, (byte) -1);
calendarEventSpec.timestamp = intent.getIntExtra(EXTRA_CALENDAREVENT_TIMESTAMP, -1); calendarEventSpec.timestamp = intent.getIntExtra(EXTRA_CALENDAREVENT_TIMESTAMP, -1);
calendarEventSpec.durationInSeconds = intent.getIntExtra(EXTRA_CALENDAREVENT_DURATION, -1); calendarEventSpec.durationInSeconds = intent.getIntExtra(EXTRA_CALENDAREVENT_DURATION, -1);
calendarEventSpec.title = intent.getStringExtra(EXTRA_CALENDAREVENT_TITLE); calendarEventSpec.title = sanitizeNotifText(intent.getStringExtra(EXTRA_CALENDAREVENT_TITLE));
calendarEventSpec.description = intent.getStringExtra(EXTRA_CALENDAREVENT_DESCRIPTION); calendarEventSpec.description = sanitizeNotifText(intent.getStringExtra(EXTRA_CALENDAREVENT_DESCRIPTION));
calendarEventSpec.location = intent.getStringExtra(EXTRA_CALENDAREVENT_LOCATION); calendarEventSpec.location = sanitizeNotifText(intent.getStringExtra(EXTRA_CALENDAREVENT_LOCATION));
mDeviceSupport.onAddCalendarEvent(calendarEventSpec); mDeviceSupport.onAddCalendarEvent(calendarEventSpec);
break; break;
} }
@@ -440,6 +457,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
setReceiversEnableState(false, false, null); setReceiversEnableState(false, false, null);
mGBDevice = null; mGBDevice = null;
mDeviceSupport = null; mDeviceSupport = null;
mCoordinator = null;
break; break;
} }
case ACTION_FIND_DEVICE: { case ACTION_FIND_DEVICE: {
@@ -456,7 +474,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
CallSpec callSpec = new CallSpec(); CallSpec callSpec = new CallSpec();
callSpec.command = intent.getIntExtra(EXTRA_CALL_COMMAND, CallSpec.CALL_UNDEFINED); callSpec.command = intent.getIntExtra(EXTRA_CALL_COMMAND, CallSpec.CALL_UNDEFINED);
callSpec.number = intent.getStringExtra(EXTRA_CALL_PHONENUMBER); callSpec.number = intent.getStringExtra(EXTRA_CALL_PHONENUMBER);
callSpec.name = intent.getStringExtra(EXTRA_CALL_DISPLAYNAME); callSpec.name = sanitizeNotifText(intent.getStringExtra(EXTRA_CALL_DISPLAYNAME));
mDeviceSupport.onSetCallState(callSpec); mDeviceSupport.onSetCallState(callSpec);
break; break;
case ACTION_SETCANNEDMESSAGES: case ACTION_SETCANNEDMESSAGES:
@@ -473,9 +491,9 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
break; break;
case ACTION_SETMUSICINFO: case ACTION_SETMUSICINFO:
MusicSpec musicSpec = new MusicSpec(); MusicSpec musicSpec = new MusicSpec();
musicSpec.artist = intent.getStringExtra(EXTRA_MUSIC_ARTIST); musicSpec.artist = sanitizeNotifText(intent.getStringExtra(EXTRA_MUSIC_ARTIST));
musicSpec.album = intent.getStringExtra(EXTRA_MUSIC_ALBUM); musicSpec.album = sanitizeNotifText(intent.getStringExtra(EXTRA_MUSIC_ALBUM));
musicSpec.track = intent.getStringExtra(EXTRA_MUSIC_TRACK); musicSpec.track = sanitizeNotifText(intent.getStringExtra(EXTRA_MUSIC_TRACK));
musicSpec.duration = intent.getIntExtra(EXTRA_MUSIC_DURATION, 0); musicSpec.duration = intent.getIntExtra(EXTRA_MUSIC_DURATION, 0);
musicSpec.trackCount = intent.getIntExtra(EXTRA_MUSIC_TRACKCOUNT, 0); musicSpec.trackCount = intent.getIntExtra(EXTRA_MUSIC_TRACKCOUNT, 0);
musicSpec.trackNr = intent.getIntExtra(EXTRA_MUSIC_TRACKNR, 0); musicSpec.trackNr = intent.getIntExtra(EXTRA_MUSIC_TRACKNR, 0);
@@ -595,9 +613,11 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
mDeviceSupport.dispose(); mDeviceSupport.dispose();
mDeviceSupport = null; mDeviceSupport = null;
mGBDevice = null; mGBDevice = null;
mCoordinator = null;
} }
mDeviceSupport = deviceSupport; mDeviceSupport = deviceSupport;
mGBDevice = mDeviceSupport != null ? mDeviceSupport.getDevice() : null; mGBDevice = mDeviceSupport != null ? mDeviceSupport.getDevice() : null;
mCoordinator = mGBDevice != null ? DeviceHelper.getInstance().getCoordinator(mGBDevice) : null;
} }
private void start() { private void start() {
@@ -0,0 +1,26 @@
/* Copyright (C) 2018 Andreas Shimokawa, Matthieu Baerts
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.util;
import io.wax911.emojify.EmojiUtils;
public class EmojiConverter {
public static String convertUnicodeEmojiToAscii(String text) {
return EmojiUtils.shortCodify(text);
}
}