From bf7e4d562cd9c079bfbfa1b57ab2de5b9695792a Mon Sep 17 00:00:00 2001 From: Mayur Varde Date: Mon, 5 Sep 2022 14:14:22 +0530 Subject: [PATCH] Add uninstall button and it's fixes (#2840) * Lawnchair: Add uninstall button to system shortcuts [ghostrider-reborn] updated for android 12 [marshmello61] adapt for Lawnchair Change-Id: I005d676d9a98f65296c330e5e13fd0d849df6fe5 Signed-off-by: Adithya Signed-off-by: Mayur * Lawnchair: Fix NPE in SystemShortcut [marshmello61] adapt for Lawnchair Signed-off-by: Pranav Vashi Signed-off-by: Mayur * Lawnchair: Use standard launcher method for uninstalling [marshmello61] adapt for Lawnchair Signed-off-by: Pranav Vashi Signed-off-by: Mayur * Fix PR issues Co-authored-by: Ali B Co-authored-by: Pranav Vashi Co-authored-by: Yasan Ghaffarian --- .../android/quickstep/TaskOverlayFactory.java | 1 + .../quickstep/TaskShortcutFactory.java | 6 ++++ src/com/android/launcher3/Launcher.java | 3 +- .../launcher3/popup/SystemShortcut.java | 34 +++++++++++++++++++ .../launcher3/util/PackageManagerHelper.java | 26 ++++++++------ 5 files changed, 59 insertions(+), 11 deletions(-) diff --git a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java index 276e1c2a6f..ad2dc34ddc 100644 --- a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java +++ b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java @@ -169,6 +169,7 @@ public class TaskOverlayFactory implements ResourceBasedOverride { private static final TaskShortcutFactory[] MENU_OPTIONS = new TaskShortcutFactory[]{ TaskShortcutFactory.APP_INFO, TaskShortcutFactory.SPLIT_SCREEN, + TaskShortcutFactory.UNINSTALL, TaskShortcutFactory.PIN, TaskShortcutFactory.INSTALL, TaskShortcutFactory.FREE_FORM, diff --git a/quickstep/src/com/android/quickstep/TaskShortcutFactory.java b/quickstep/src/com/android/quickstep/TaskShortcutFactory.java index 5d3a91215c..3427c719ce 100644 --- a/quickstep/src/com/android/quickstep/TaskShortcutFactory.java +++ b/quickstep/src/com/android/quickstep/TaskShortcutFactory.java @@ -42,6 +42,7 @@ import com.android.launcher3.popup.SystemShortcut; import com.android.launcher3.popup.SystemShortcut.AppInfo; import com.android.launcher3.util.InstantAppResolver; import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption; +import com.android.launcher3.util.PackageManagerHelper; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskThumbnailView; import com.android.quickstep.views.TaskView; @@ -88,6 +89,11 @@ public interface TaskShortcutFactory { } }; + TaskShortcutFactory UNINSTALL = (activity, view) -> + PackageManagerHelper.isSystemApp(activity, + view.getTask().getTopComponent().getPackageName()) + ? null : new SystemShortcut.UnInstall(activity, view.getItemInfo()); + abstract class MultiWindowFactory implements TaskShortcutFactory { private final int mIconRes; diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 57ed3fa042..40a7161acb 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -56,6 +56,7 @@ import static com.android.launcher3.model.ItemInstallQueue.FLAG_ACTIVITY_PAUSED; import static com.android.launcher3.model.ItemInstallQueue.FLAG_DRAG_AND_DROP; import static com.android.launcher3.popup.SystemShortcut.APP_INFO; import static com.android.launcher3.popup.SystemShortcut.INSTALL; +import static com.android.launcher3.popup.SystemShortcut.UNINSTALL; import static com.android.launcher3.popup.SystemShortcut.WIDGETS; import static com.android.launcher3.states.RotationHelper.REQUEST_LOCK; import static com.android.launcher3.states.RotationHelper.REQUEST_NONE; @@ -3081,7 +3082,7 @@ public class Launcher extends StatefulActivity implements Launche } public Stream getSupportedShortcuts() { - return Stream.of(APP_INFO, WIDGETS, INSTALL); + return Stream.of(APP_INFO, WIDGETS, INSTALL, UNINSTALL); } protected LauncherAccessibilityDelegate createAccessibilityDelegate() { diff --git a/src/com/android/launcher3/popup/SystemShortcut.java b/src/com/android/launcher3/popup/SystemShortcut.java index cf88016109..79bf95e6fc 100644 --- a/src/com/android/launcher3/popup/SystemShortcut.java +++ b/src/com/android/launcher3/popup/SystemShortcut.java @@ -7,6 +7,7 @@ import android.app.ActivityOptions; import android.content.Context; import android.content.Intent; import android.graphics.Rect; +import android.net.Uri; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.ImageView; @@ -29,6 +30,7 @@ import com.android.launcher3.views.ActivityContext; import com.android.launcher3.widget.WidgetsBottomSheet; import com.patrykmichalik.opto.core.PreferenceExtensionsKt; +import java.net.URISyntaxException; import java.util.List; import app.lawnchair.preferences2.PreferenceManager2; @@ -237,6 +239,38 @@ public abstract class SystemShortcut extend } } + public static final Factory UNINSTALL = (activity, itemInfo) -> { + if (itemInfo.getTargetComponent() == null) { + return null; + } + if (PackageManagerHelper.isSystemApp(activity, + itemInfo.getTargetComponent().getPackageName())) { + return null; + } + return new UnInstall(activity, itemInfo); + }; + + public static class UnInstall extends SystemShortcut { + + public UnInstall(BaseDraggingActivity target, ItemInfo itemInfo) { + super(R.drawable.ic_uninstall_no_shadow, R.string.uninstall_drop_target_label, + target, itemInfo); + } + + @Override + public void onClick(View view) { + try { + Intent intent = Intent.parseUri(view.getContext().getString(R.string.delete_package_intent), 0) + .setData(Uri.fromParts("package", mItemInfo.getTargetComponent().getPackageName(), + mItemInfo.getTargetComponent().getClassName())).putExtra(Intent.EXTRA_USER, mItemInfo.user); + mTarget.startActivitySafely(view, intent, mItemInfo); + AbstractFloatingView.closeAllOpenViews(mTarget); + } catch (URISyntaxException e) { + // Do nothing. + } + } + } + public static void dismissTaskMenuView(T activity) { AbstractFloatingView.closeOpenViews(activity, true, AbstractFloatingView.TYPE_ALL & ~AbstractFloatingView.TYPE_REBIND_SAFE); diff --git a/src/com/android/launcher3/util/PackageManagerHelper.java b/src/com/android/launcher3/util/PackageManagerHelper.java index 6b25bfef84..b4b31e082a 100644 --- a/src/com/android/launcher3/util/PackageManagerHelper.java +++ b/src/com/android/launcher3/util/PackageManagerHelper.java @@ -258,19 +258,25 @@ public class PackageManagerHelper { public static boolean isSystemApp(Context context, Intent intent) { PackageManager pm = context.getPackageManager(); - ComponentName cn = intent.getComponent(); + // Get the package name for intent String packageName = null; - if (cn == null) { - ResolveInfo info = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); - if ((info != null) && (info.activityInfo != null)) { - packageName = info.activityInfo.packageName; + if (intent != null) { + ComponentName cn = intent.getComponent(); + if (cn == null) { + ResolveInfo info = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); + if ((info != null) && (info.activityInfo != null)) { + packageName = info.activityInfo.packageName; + } + } else { + packageName = cn.getPackageName(); } - } else { - packageName = cn.getPackageName(); - } - if (packageName == null) { - packageName = intent.getPackage(); } + return isSystemApp(context, packageName); + } + + public static boolean isSystemApp(Context context, String packageName) { + PackageManager pm = context.getPackageManager(); + // Check if the provided package is a system app. if (packageName != null) { try { PackageInfo info = pm.getPackageInfo(packageName, 0);