From da6e026cc6bfefc8b0bd5b6f761099e9f5d65a7c Mon Sep 17 00:00:00 2001 From: Nik Clayton Date: Sun, 3 Mar 2024 17:21:04 +0100 Subject: [PATCH] refactor: Implement updateShortcut as a suspending function (#491) Previously a regular function that created and subscribed to an rxJava callable, now it's a suspending function that enforces Dispatchers.IO as the context, launched in its own coroutine. --- app/src/main/java/app/pachli/MainActivity.kt | 4 +- .../app/pachli/util/ShareShortcutHelper.kt | 105 +++++++++--------- 2 files changed, 53 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/app/pachli/MainActivity.kt b/app/src/main/java/app/pachli/MainActivity.kt index 17d3757b2..f090b6fae 100644 --- a/app/src/main/java/app/pachli/MainActivity.kt +++ b/app/src/main/java/app/pachli/MainActivity.kt @@ -979,7 +979,9 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, MenuProvider { } updateProfiles() - updateShortcut(applicationContext, accountManager.activeAccount!!) + externalScope.launch { + updateShortcut(applicationContext, accountManager.activeAccount!!) + } } @SuppressLint("CheckResult") diff --git a/app/src/main/java/app/pachli/util/ShareShortcutHelper.kt b/app/src/main/java/app/pachli/util/ShareShortcutHelper.kt index bae6da82d..0392e34b1 100644 --- a/app/src/main/java/app/pachli/util/ShareShortcutHelper.kt +++ b/app/src/main/java/app/pachli/util/ShareShortcutHelper.kt @@ -29,64 +29,59 @@ import app.pachli.core.database.model.AccountEntity import app.pachli.core.designsystem.R as DR import app.pachli.core.navigation.MainActivityIntent import com.bumptech.glide.Glide -import io.reactivex.rxjava3.core.Single -import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext -fun updateShortcut(context: Context, account: AccountEntity) { - Single.fromCallable { - val innerSize = context.resources.getDimensionPixelSize(DR.dimen.adaptive_bitmap_inner_size) - val outerSize = context.resources.getDimensionPixelSize(DR.dimen.adaptive_bitmap_outer_size) +suspend fun updateShortcut(context: Context, account: AccountEntity) = withContext(Dispatchers.IO) { + val innerSize = context.resources.getDimensionPixelSize(DR.dimen.adaptive_bitmap_inner_size) + val outerSize = context.resources.getDimensionPixelSize(DR.dimen.adaptive_bitmap_outer_size) - val bmp = if (TextUtils.isEmpty(account.profilePictureUrl)) { - Glide.with(context) - .asBitmap() - .load(DR.drawable.avatar_default) - .submit(innerSize, innerSize) - .get() - } else { - Glide.with(context) - .asBitmap() - .load(account.profilePictureUrl) - .error(DR.drawable.avatar_default) - .submit(innerSize, innerSize) - .get() - } - - // inset the loaded bitmap inside a 108dp transparent canvas so it looks good as adaptive icon - val outBmp = Bitmap.createBitmap(outerSize, outerSize, Bitmap.Config.ARGB_8888) - - val canvas = Canvas(outBmp) - canvas.drawBitmap(bmp, (outerSize - innerSize).toFloat() / 2f, (outerSize - innerSize).toFloat() / 2f, null) - - val icon = IconCompat.createWithAdaptiveBitmap(outBmp) - - val person = Person.Builder() - .setIcon(icon) - .setName(account.displayName) - .setKey(account.identifier) - .build() - - // This intent will be sent when the user clicks on one of the launcher shortcuts. Intent from share sheet will be different - val intent = MainActivityIntent(context).apply { - action = Intent.ACTION_SEND - type = "text/plain" - putExtra(ShortcutManagerCompat.EXTRA_SHORTCUT_ID, account.id.toString()) - } - - val shortcutInfo = ShortcutInfoCompat.Builder(context, account.id.toString()) - .setIntent(intent) - .setCategories(setOf("app.pachli.Share")) - .setShortLabel(account.displayName) - .setPerson(person) - .setLongLived(true) - .setIcon(icon) - .build() - - ShortcutManagerCompat.addDynamicShortcuts(context, listOf(shortcutInfo)) + val bmp = if (TextUtils.isEmpty(account.profilePictureUrl)) { + Glide.with(context) + .asBitmap() + .load(DR.drawable.avatar_default) + .submit(innerSize, innerSize) + .get() + } else { + Glide.with(context) + .asBitmap() + .load(account.profilePictureUrl) + .error(DR.drawable.avatar_default) + .submit(innerSize, innerSize) + .get() } - .subscribeOn(Schedulers.io()) - .onErrorReturnItem(false) - .subscribe() + + // inset the loaded bitmap inside a 108dp transparent canvas so it looks good as adaptive icon + val outBmp = Bitmap.createBitmap(outerSize, outerSize, Bitmap.Config.ARGB_8888) + + val canvas = Canvas(outBmp) + canvas.drawBitmap(bmp, (outerSize - innerSize).toFloat() / 2f, (outerSize - innerSize).toFloat() / 2f, null) + + val icon = IconCompat.createWithAdaptiveBitmap(outBmp) + + val person = Person.Builder() + .setIcon(icon) + .setName(account.displayName) + .setKey(account.identifier) + .build() + + // This intent will be sent when the user clicks on one of the launcher shortcuts. Intent from share sheet will be different + val intent = MainActivityIntent(context).apply { + action = Intent.ACTION_SEND + type = "text/plain" + putExtra(ShortcutManagerCompat.EXTRA_SHORTCUT_ID, account.id.toString()) + } + + val shortcutInfo = ShortcutInfoCompat.Builder(context, account.id.toString()) + .setIntent(intent) + .setCategories(setOf("app.pachli.Share")) + .setShortLabel(account.displayName) + .setPerson(person) + .setLongLived(true) + .setIcon(icon) + .build() + + ShortcutManagerCompat.addDynamicShortcuts(context, listOf(shortcutInfo)) } fun removeShortcut(context: Context, account: AccountEntity) {