From f449a459122d0113b00d2fff6bb09aa5480c8741 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Wed, 25 Mar 2020 12:30:15 -0300 Subject: [PATCH] Utilize normal fallback for homescreen icons. --- .../conversation/ConversationActivity.java | 88 +++++++++++-------- .../securesms/util/DrawableUtil.java | 22 +++++ 2 files changed, 74 insertions(+), 36 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/util/DrawableUtil.java diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java index d78c30067f..93ee4518c2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -28,10 +28,10 @@ import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.TypedArray; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; import android.hardware.Camera; import android.net.Uri; import android.os.AsyncTask; @@ -73,6 +73,8 @@ import androidx.core.graphics.drawable.IconCompat; import androidx.lifecycle.ViewModelProviders; import com.annimon.stream.Stream; +import com.bumptech.glide.request.target.CustomTarget; +import com.bumptech.glide.request.transition.Transition; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -207,7 +209,7 @@ import org.thoughtcrime.securesms.stickers.StickerSearchRepository; import org.thoughtcrime.securesms.util.BitmapUtil; import org.thoughtcrime.securesms.util.CharacterCalculator.CharacterState; import org.thoughtcrime.securesms.util.CommunicationActions; -import org.thoughtcrime.securesms.util.Dialogs; +import org.thoughtcrime.securesms.util.DrawableUtil; import org.thoughtcrime.securesms.util.DynamicDarkToolbarTheme; import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicTheme; @@ -261,6 +263,9 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity StickerKeyboardProvider.StickerEventListener, AttachmentKeyboard.Callback { + + private static final int SHORTCUT_ICON_SIZE = Build.VERSION.SDK_INT >= 26 ? ViewUtil.dpToPx(72) : ViewUtil.dpToPx(48 + 16 * 2); + private static final String TAG = ConversationActivity.class.getSimpleName(); public static final String RECIPIENT_EXTRA = "recipient_id"; @@ -1047,47 +1052,58 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity private void handleAddShortcut() { Log.i(TAG, "Creating home screen shortcut for recipient " + recipient.get().getId()); - new AsyncTask() { + final Context context = getApplicationContext(); + final Recipient recipient = this.recipient.get(); - @Override - protected IconCompat doInBackground(Void... voids) { - Context context = getApplicationContext(); - IconCompat icon = null; + GlideApp.with(this) + .asBitmap() + .load(recipient.getContactPhoto()) + .error(recipient.getFallbackContactPhoto().asDrawable(this, recipient.getColor().toAvatarColor(this), false)) + .into(new CustomTarget() { + @Override + public void onLoadFailed(@Nullable Drawable errorDrawable) { + if (errorDrawable == null) { + throw new AssertionError(); + } - if (recipient.get().getContactPhoto() != null) { - try { - Bitmap bitmap = BitmapFactory.decodeStream(recipient.get().getContactPhoto().openInputStream(context)); - bitmap = BitmapUtil.createScaledBitmap(bitmap, 300, 300); - icon = IconCompat.createWithAdaptiveBitmap(bitmap); - } catch (IOException e) { - Log.w(TAG, "Failed to decode contact photo during shortcut creation. Falling back to generic icon.", e); - } - } + Log.w(TAG, "Utilizing fallback photo for shortcut for recipient " + recipient.getId()); - if (icon == null) { - icon = IconCompat.createWithResource(context, recipient.get().isGroup() ? R.mipmap.ic_group_shortcut - : R.mipmap.ic_person_shortcut); - } + SimpleTask.run(() -> DrawableUtil.toBitmap(errorDrawable, SHORTCUT_ICON_SIZE, SHORTCUT_ICON_SIZE), + bitmap -> addIconToHomeScreen(context, bitmap, recipient)); + } - return icon; - } + @Override + public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) { + SimpleTask.run(() -> BitmapUtil.createScaledBitmap(resource, SHORTCUT_ICON_SIZE, SHORTCUT_ICON_SIZE), + bitmap -> addIconToHomeScreen(context, bitmap, recipient)); + } - @Override - protected void onPostExecute(IconCompat icon) { - Context context = getApplicationContext(); - String name = recipient.get().getDisplayName(ConversationActivity.this); + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + } + }); - ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(context, recipient.get().getId().serialize() + '-' + System.currentTimeMillis()) - .setShortLabel(name) - .setIcon(icon) - .setIntent(ShortcutLauncherActivity.createIntent(context, recipient.getId())) - .build(); + } - if (ShortcutManagerCompat.requestPinShortcut(context, shortcutInfo, null)) { - Toast.makeText(context, getString(R.string.ConversationActivity_added_to_home_screen), Toast.LENGTH_LONG).show(); - } - } - }.execute(); + private static void addIconToHomeScreen(@NonNull Context context, + @NonNull Bitmap bitmap, + @NonNull Recipient recipient) + { + IconCompat icon = IconCompat.createWithAdaptiveBitmap(bitmap); + String name = recipient.isLocalNumber() ? context.getString(R.string.note_to_self) + : recipient.getDisplayName(context); + + ShortcutInfoCompat shortcutInfoCompat = new ShortcutInfoCompat.Builder(context, recipient.getId().serialize() + '-' + System.currentTimeMillis()) + .setShortLabel(name) + .setIcon(icon) + .setIntent(ShortcutLauncherActivity.createIntent(context, recipient.getId())) + .build(); + + if (ShortcutManagerCompat.requestPinShortcut(context, shortcutInfoCompat, null)) { + Toast.makeText(context, context.getString(R.string.ConversationActivity_added_to_home_screen), Toast.LENGTH_LONG).show(); + } + + bitmap.recycle(); } private void handleSearch() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/DrawableUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/DrawableUtil.java new file mode 100644 index 0000000000..f03b27e3c5 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/util/DrawableUtil.java @@ -0,0 +1,22 @@ +package org.thoughtcrime.securesms.util; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; + +import androidx.annotation.NonNull; + +public final class DrawableUtil { + + private DrawableUtil() {} + + public static @NonNull Bitmap toBitmap(@NonNull Drawable drawable, int width, int height) { + Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + drawable.draw(canvas); + + return bitmap; + } +}