From 89fdf1186f3a60640d6a0fce4a914e3391d62afd Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Fri, 23 Feb 2024 12:23:21 +0530 Subject: [PATCH] AppDetailsFragment: Show menu action to create app shortcut if supported Signed-off-by: Aayush Gupta --- .../aurora/store/util/ShortcutManagerUtil.kt | 35 +++++++++++++++++++ .../view/ui/details/AppDetailsFragment.kt | 14 ++++++++ app/src/main/res/menu/menu_details.xml | 5 +++ app/src/main/res/values/strings.xml | 1 + 4 files changed, 55 insertions(+) create mode 100644 app/src/main/java/com/aurora/store/util/ShortcutManagerUtil.kt diff --git a/app/src/main/java/com/aurora/store/util/ShortcutManagerUtil.kt b/app/src/main/java/com/aurora/store/util/ShortcutManagerUtil.kt new file mode 100644 index 000000000..34c690055 --- /dev/null +++ b/app/src/main/java/com/aurora/store/util/ShortcutManagerUtil.kt @@ -0,0 +1,35 @@ +package com.aurora.store.util + +import android.content.Context +import androidx.core.content.pm.ShortcutInfoCompat +import androidx.core.content.pm.ShortcutManagerCompat +import androidx.core.graphics.drawable.IconCompat +import androidx.core.graphics.drawable.toBitmap + +object ShortcutManagerUtil { + + private const val TAG = "ShortcutManagerUtil" + + fun canPinShortcut(context: Context): Boolean { + return ShortcutManagerCompat.isRequestPinShortcutSupported(context) + } + + fun requestPinShortcut(context: Context, packageName: String) { + val packageManager = context.packageManager + val launchIntent = packageManager.getLaunchIntentForPackage(packageName) ?: return + try { + val appInfo = packageManager.getApplicationInfo(packageName, 0) + val shortcutInfo = ShortcutInfoCompat.Builder(context, packageName) + .setShortLabel(appInfo.loadLabel(packageManager)) + .setIcon( + IconCompat.createWithBitmap(appInfo.loadIcon(packageManager).toBitmap()) + ) + .setIntent(launchIntent) + .build() + + ShortcutManagerCompat.requestPinShortcut(context, shortcutInfo, null) + } catch (exception: Exception) { + Log.e(TAG, "Failed to request shortcut pin!", exception) + } + } +} diff --git a/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt b/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt index e48722380..53879ad59 100644 --- a/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt @@ -76,6 +76,7 @@ import com.aurora.store.util.CommonUtil import com.aurora.store.util.PackageUtil import com.aurora.store.util.PathUtil import com.aurora.store.util.Preferences +import com.aurora.store.util.ShortcutManagerUtil import com.aurora.store.util.isExternalStorageEnable import com.aurora.store.view.custom.RatingView import com.aurora.store.view.epoxy.controller.DetailsCarouselController @@ -156,6 +157,8 @@ class AppDetailsFragment : BaseFragment(R.layout.fragment_details) { if (app.packageName == event.packageName) { attachActions() binding.layoutDetailsToolbar.toolbar.menu.apply { + findItem(R.id.action_home_screen)?.isVisible = + ShortcutManagerUtil.canPinShortcut(requireContext()) findItem(R.id.action_uninstall)?.isVisible = true findItem(R.id.menu_app_settings)?.isVisible = true } @@ -166,6 +169,7 @@ class AppDetailsFragment : BaseFragment(R.layout.fragment_details) { if (app.packageName == event.packageName) { attachActions() binding.layoutDetailsToolbar.toolbar.menu.apply { + findItem(R.id.action_home_screen)?.isVisible = false findItem(R.id.action_uninstall)?.isVisible = false findItem(R.id.menu_app_settings)?.isVisible = false } @@ -368,6 +372,13 @@ class AppDetailsFragment : BaseFragment(R.layout.fragment_details) { setOnMenuItemClickListener { when (it.itemId) { + R.id.action_home_screen -> { + ShortcutManagerUtil.requestPinShortcut( + requireContext(), + app.packageName + ) + } + R.id.action_share -> { view.context.share(app) } @@ -406,6 +417,9 @@ class AppDetailsFragment : BaseFragment(R.layout.fragment_details) { if (::app.isInitialized) { app.isInstalled = PackageUtil.isInstalled(requireContext(), app.packageName) + menu?.findItem(R.id.action_home_screen)?.isVisible = + app.isInstalled && ShortcutManagerUtil.canPinShortcut(requireContext()) + menu?.findItem(R.id.action_uninstall)?.isVisible = app.isInstalled menu?.findItem(R.id.menu_app_settings)?.isVisible = app.isInstalled uninstallActionEnabled = app.isInstalled diff --git a/app/src/main/res/menu/menu_details.xml b/app/src/main/res/menu/menu_details.xml index 8af137f03..16170e64c 100644 --- a/app/src/main/res/menu/menu_details.xml +++ b/app/src/main/res/menu/menu_details.xml @@ -47,4 +47,9 @@ + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 04c26dfd3..cd94bc68f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -91,6 +91,7 @@ "Search" "Share" "Uninstall" + Add to Home screen "Do you want to uninstall this app ?" "App Info" "Update"