From e96d30bddb783f712770122b75f9d7f288d4831c Mon Sep 17 00:00:00 2001 From: Jeremy Sim Date: Wed, 31 Jan 2024 18:13:09 +0800 Subject: [PATCH] Make app pairs respond properly to disabled state 1) App pair member icons are now always redrawn when app pair icon is redrawn, allowing greyed out icons to be updated immediately when an app is disabled. 2) App pairs now check for disabled status when clicked. If one or both of the apps is disabled, app pair will not be launched, and the appropriate error message or affordance will be displayed. Fixes: 323088270 Test: Manual Flag: ACONFIG com.android.wm.shell.enable_app_pairs TEAMFOOD Change-Id: I7f2af75db0d8579d5d04583c0d3ead32714768e4 --- .../launcher3/apppairs/AppPairIconGraphic.kt | 12 ++---------- .../android/launcher3/model/data/FolderInfo.java | 9 +++++++++ .../android/launcher3/touch/ItemClickHandler.java | 15 ++++++++++++++- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/com/android/launcher3/apppairs/AppPairIconGraphic.kt b/src/com/android/launcher3/apppairs/AppPairIconGraphic.kt index b2497a3050..ce354b681a 100644 --- a/src/com/android/launcher3/apppairs/AppPairIconGraphic.kt +++ b/src/com/android/launcher3/apppairs/AppPairIconGraphic.kt @@ -112,7 +112,6 @@ class AppPairIconGraphic @JvmOverloads constructor(context: Context, attrs: Attr appIcon2?.setBounds(0, 0, memberIconSize.toInt(), memberIconSize.toInt()) } - /** Gets this icon graphic's bounds, with respect to the parent icon's coordinate system. */ fun getIconBounds(outBounds: Rect) { outBounds.set(0, 0, backgroundSize.toInt(), backgroundSize.toInt()) @@ -138,15 +137,8 @@ class AppPairIconGraphic @JvmOverloads constructor(context: Context, attrs: Attr // Draw background appPairBackground.draw(canvas) - // Make sure icons are loaded - if ( - appIcon1 == null || - appIcon2 == null || - appIcon1 is PlaceHolderIconDrawable || - appIcon2 is PlaceHolderIconDrawable - ) { - applyIcons(parentIcon.info.contents) - } + // Make sure icons are loaded and fresh + applyIcons(parentIcon.info.contents) // Draw first icon canvas.save() diff --git a/src/com/android/launcher3/model/data/FolderInfo.java b/src/com/android/launcher3/model/data/FolderInfo.java index 5b541d045b..83ba2b3a9f 100644 --- a/src/com/android/launcher3/model/data/FolderInfo.java +++ b/src/com/android/launcher3/model/data/FolderInfo.java @@ -371,4 +371,13 @@ public class FolderInfo extends ItemInfo { } return LauncherAtom.ToState.TO_STATE_UNSPECIFIED; } + + @Override + public boolean isDisabled() { + if (itemType == LauncherSettings.Favorites.ITEM_TYPE_APP_PAIR) { + return contents.stream().anyMatch((WorkspaceItemInfo::isDisabled)); + } + + return super.isDisabled(); + } } diff --git a/src/com/android/launcher3/touch/ItemClickHandler.java b/src/com/android/launcher3/touch/ItemClickHandler.java index 9d50e6ac9c..f47ab90822 100644 --- a/src/com/android/launcher3/touch/ItemClickHandler.java +++ b/src/com/android/launcher3/touch/ItemClickHandler.java @@ -149,7 +149,20 @@ public class ItemClickHandler { private static void onClickAppPairIcon(View v) { Launcher launcher = Launcher.getLauncher(v.getContext()); AppPairIcon appPairIcon = (AppPairIcon) v; - launcher.launchAppPair(appPairIcon); + if (appPairIcon.getInfo().isDisabled()) { + WorkspaceItemInfo app1 = appPairIcon.getInfo().contents.get(0); + WorkspaceItemInfo app2 = appPairIcon.getInfo().contents.get(1); + // Show the user why the app pair is disabled. + if (app1.isDisabled() && !handleDisabledItemClicked(app1, launcher)) { + // If handleDisabledItemClicked() did not handle the error message, we initiate an + // app launch so Framework can tell the user why the app is suspended. + onClickAppShortcut(v, app1, launcher); + } else if (app2.isDisabled() && !handleDisabledItemClicked(app2, launcher)) { + onClickAppShortcut(v, app2, launcher); + } + } else { + launcher.launchAppPair(appPairIcon); + } } /**