diff --git a/briar-android/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java b/briar-android/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java index 09778df1fa0e5b6bdec758ab47f3d5540a9b0dfc..5a34edf4b3d3a585e514b7703feb8e124b31285b 100644 --- a/briar-android/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java +++ b/briar-android/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java @@ -8,12 +8,14 @@ import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.AsyncTask; -import android.support.annotation.NonNull; +import android.support.annotation.UiThread; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.util.SparseArray; import android.widget.TextView; +import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; +import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.system.AndroidExecutor; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.BaseActivity; @@ -38,6 +40,8 @@ import static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; +@MethodsNotNullByDefault +@ParametersNotNullByDefault public class EmojiProvider { private static volatile EmojiProvider INSTANCE = null; @@ -64,7 +68,7 @@ public class EmojiProvider { private static final int EMOJI_PER_ROW = 32; private final Context context; - private final float decodeScale, verticalPad; + private final float decodeScale; private final List<EmojiPageModel> staticPages; static EmojiProvider getInstance(Context context) { @@ -86,7 +90,6 @@ public class EmojiProvider { float drawerSize = context.getResources().getDimension(R.dimen.emoji_drawer_size); decodeScale = Math.min(1f, drawerSize / EMOJI_RAW_HEIGHT); - verticalPad = EMOJI_VERT_PAD * this.decodeScale; staticPages = EmojiPages.getPages(context); for (EmojiPageModel page : staticPages) { if (page.hasSpriteMap()) { @@ -100,8 +103,8 @@ public class EmojiProvider { } @Nullable - Spannable emojify(@Nullable CharSequence text, - @NonNull TextView tv) { + @UiThread + Spannable emojify(@Nullable CharSequence text, TextView tv) { if (text == null) return null; Matcher matches = EMOJI_RANGE.matcher(text); SpannableStringBuilder builder = new SpannableStringBuilder(text); @@ -118,12 +121,13 @@ public class EmojiProvider { } @Nullable + @UiThread Drawable getEmojiDrawable(int emojiCode) { return getEmojiDrawable(offsets.get(emojiCode)); } @Nullable - private Drawable getEmojiDrawable(DrawInfo drawInfo) { + private Drawable getEmojiDrawable(@Nullable DrawInfo drawInfo) { if (drawInfo == null) { return null; } @@ -154,10 +158,10 @@ public class EmojiProvider { } - class EmojiDrawable extends Drawable { + static class EmojiDrawable extends Drawable { private final DrawInfo info; - private final float intrinsicWidth, intrinsicHeight; + private final float intrinsicWidth, intrinsicHeight, verticalPad; private Bitmap bmp; @@ -165,6 +169,7 @@ public class EmojiProvider { this.info = info; intrinsicWidth = EMOJI_RAW_WIDTH * decodeScale; intrinsicHeight = EMOJI_RAW_HEIGHT * decodeScale; + verticalPad = EMOJI_VERT_PAD * decodeScale; } @Override @@ -178,7 +183,7 @@ public class EmojiProvider { } @Override - public void draw(@NonNull Canvas canvas) { + public void draw(Canvas canvas) { if (bmp == null) { return; } @@ -212,7 +217,7 @@ public class EmojiProvider { } @Override - public void setColorFilter(ColorFilter cf) { + public void setColorFilter(@Nullable ColorFilter cf) { } } @@ -245,49 +250,46 @@ public class EmojiProvider { this.model = model; } + @UiThread private ListenableFutureTask<Bitmap> get() { - if (bitmapReference != null && bitmapReference.get() != null) { - return new ListenableFutureTask<>(bitmapReference.get()); - } else if (task != null) { - return task; - } else { - Callable<Bitmap> callable = new Callable<Bitmap>() { - @Override - @Nullable - public Bitmap call() throws Exception { - try { - if (LOG.isLoggable(INFO)) - LOG.info("Loading page " + model.getSprite()); - return loadPage(); - } catch (IOException ioe) { - LOG.log(WARNING, ioe.toString(), ioe); - } - return null; - } - }; - task = new ListenableFutureTask<>(callable); - new AsyncTask<Void, Void, Void>() { - @Override - protected Void doInBackground(Void... params) { - task.run(); - return null; - } - - @Override - protected void onPostExecute(Void aVoid) { - task = null; - } - }.execute(); + if (bitmapReference != null) { + Bitmap bitmap = bitmapReference.get(); + if (bitmap != null) return new ListenableFutureTask<>(bitmap); } + if (task != null) return task; + Callable<Bitmap> callable = new Callable<Bitmap>() { + @Override + @Nullable + public Bitmap call() throws Exception { + if (LOG.isLoggable(INFO)) + LOG.info("Loading page " + model.getSprite()); + return loadPage(); + } + }; + task = new ListenableFutureTask<>(callable); + new AsyncTask<Void, Void, Void>() { + @Override + protected Void doInBackground(Void... params) { + task.run(); + return null; + } + + @Override + protected void onPostExecute(Void aVoid) { + task = null; + } + }.execute(); return task; } private Bitmap loadPage() throws IOException { - if (bitmapReference != null && bitmapReference.get() != null) - return bitmapReference.get(); + if (bitmapReference != null) { + Bitmap bitmap = bitmapReference.get(); + if (bitmap != null) return bitmap; + } try { - final Bitmap bitmap = BitmapUtil.createScaledBitmap(context, + Bitmap bitmap = BitmapUtil.createScaledBitmap(context, "file:///android_asset/" + model.getSprite(), decodeScale); bitmapReference = new SoftReference<>(bitmap);