Revert "Support toggling Taskbar All Apps with 3P Launcher."
This reverts commit 176f186a6dab9fa8a61217d6429b07baea6c9ad2.
Reason for revert: DroidMonitor: Potential culprit for http://b/331438065 - verifying through ABTD before revert submission. This is part of the standard investigation process, and does not mean your CL will be reverted.
Change-Id: Ie375277ad2f65199749f0211ab50037d4b37e664
Merged-In: Ie375277ad2f65199749f0211ab50037d4b37e664
diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
index 30be058..1e861d2 100644
--- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
@@ -414,13 +414,6 @@
}
@Override
- protected boolean canToggleHomeAllApps() {
- return mLauncher.isResumed()
- && !mTaskbarLauncherStateController.isInOverview()
- && !mLauncher.areFreeformTasksVisible();
- }
-
- @Override
public RecentsView getRecentsView() {
return mLauncher.getOverviewPanel();
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index 9224658..c543307 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -1558,13 +1558,4 @@
public float getStashedTaskbarScale() {
return mControllers.stashedHandleViewController.getStashedHandleHintScale().value;
}
-
- /** Closes the KeyboardQuickSwitchView without an animation if open. */
- public void closeKeyboardQuickSwitchView() {
- mControllers.keyboardQuickSwitchController.closeQuickSwitchView(false);
- }
-
- boolean canToggleHomeAllApps() {
- return mControllers.uiController.canToggleHomeAllApps();
- }
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index ecbc7e7..ff33ca9 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -23,6 +23,7 @@
import static com.android.launcher3.BaseActivity.EVENT_DESTROYED;
import static com.android.launcher3.Flags.enableUnfoldStateAnimation;
+import static com.android.launcher3.LauncherState.OVERVIEW;
import static com.android.launcher3.config.FeatureFlags.ENABLE_TASKBAR_NAVBAR_UNIFICATION;
import static com.android.launcher3.config.FeatureFlags.enableTaskbarNoRecreate;
import static com.android.launcher3.util.DisplayController.CHANGE_DENSITY;
@@ -68,7 +69,6 @@
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.SettingsCache;
import com.android.launcher3.util.SimpleBroadcastReceiver;
-import com.android.quickstep.AllAppsActionManager;
import com.android.quickstep.RecentsActivity;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.TouchInteractionService;
@@ -158,8 +158,6 @@
private final SimpleBroadcastReceiver mTaskbarBroadcastReceiver =
new SimpleBroadcastReceiver(this::showTaskbarFromBroadcast);
- private final AllAppsActionManager mAllAppsActionManager;
-
private final Runnable mActivityOnDestroyCallback = new Runnable() {
@Override
public void run() {
@@ -214,14 +212,12 @@
private Boolean mFolded;
@SuppressLint("WrongConstant")
- public TaskbarManager(
- TouchInteractionService service, AllAppsActionManager allAppsActionManager) {
+ public TaskbarManager(TouchInteractionService service) {
Display display =
service.getSystemService(DisplayManager.class).getDisplay(DEFAULT_DISPLAY);
mContext = service.createWindowContext(display,
ENABLE_TASKBAR_NAVBAR_UNIFICATION ? TYPE_NAVIGATION_BAR : TYPE_NAVIGATION_BAR_PANEL,
null);
- mAllAppsActionManager = allAppsActionManager;
mNavigationBarPanelContext = ENABLE_TASKBAR_NAVBAR_UNIFICATION
? service.createWindowContext(display, TYPE_NAVIGATION_BAR_PANEL, null)
: null;
@@ -295,10 +291,10 @@
recreateTaskbar();
} else {
// Config change might be handled without re-creating the taskbar
- if (dp != null && !isTaskbarEnabled(dp)) {
+ if (dp != null && !isTaskbarPresent(dp)) {
destroyExistingTaskbar();
} else {
- if (dp != null && isTaskbarEnabled(dp)) {
+ if (dp != null && isTaskbarPresent(dp)) {
if (ENABLE_TASKBAR_NAVBAR_UNIFICATION) {
// Re-initialize for screen size change? Should this be done
// by looking at screen-size change flag in configDiff in the
@@ -353,7 +349,7 @@
}
DeviceProfile dp = mUserUnlocked ?
LauncherAppState.getIDP(mContext).getDeviceProfile(mContext) : null;
- if (dp == null || !isTaskbarEnabled(dp)) {
+ if (dp == null || !isTaskbarPresent(dp)) {
removeTaskbarRootViewFromWindow();
}
}
@@ -373,11 +369,20 @@
* @param homeAllAppsIntent Intent used if Taskbar is not enabled or Launcher is resumed.
*/
public void toggleAllApps(Intent homeAllAppsIntent) {
- if (mTaskbarActivityContext == null || mTaskbarActivityContext.canToggleHomeAllApps()) {
+ if (mTaskbarActivityContext == null) {
mContext.startActivity(homeAllAppsIntent);
- } else {
- mTaskbarActivityContext.toggleAllAppsSearch();
+ return;
}
+
+ if (mActivity != null
+ && mActivity.isResumed()
+ && !mActivity.isInState(OVERVIEW)
+ && !(mActivity instanceof QuickstepLauncher l && l.areFreeformTasksVisible())) {
+ mContext.startActivity(homeAllAppsIntent);
+ return;
+ }
+
+ mTaskbarActivityContext.toggleAllAppsSearch();
}
/**
@@ -472,12 +477,9 @@
DeviceProfile dp = mUserUnlocked ?
LauncherAppState.getIDP(mContext).getDeviceProfile(mContext) : null;
- // All Apps action is unrelated to navbar unification, so we only need to check DP.
- mAllAppsActionManager.setTaskbarPresent(dp != null && dp.isTaskbarPresent);
-
destroyExistingTaskbar();
- boolean isTaskbarEnabled = dp != null && isTaskbarEnabled(dp);
+ boolean isTaskbarEnabled = dp != null && isTaskbarPresent(dp);
debugWhyTaskbarNotDestroyed("recreateTaskbar: isTaskbarEnabled=" + isTaskbarEnabled
+ " [dp != null (i.e. mUserUnlocked)]=" + (dp != null)
+ " FLAG_HIDE_NAVBAR_WINDOW=" + ENABLE_TASKBAR_NAVBAR_UNIFICATION
@@ -542,7 +544,7 @@
}
}
- private static boolean isTaskbarEnabled(DeviceProfile deviceProfile) {
+ private static boolean isTaskbarPresent(DeviceProfile deviceProfile) {
return ENABLE_TASKBAR_NAVBAR_UNIFICATION || deviceProfile.isTaskbarPresent;
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
index 109400e..efe1e39 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
@@ -197,11 +197,6 @@
return false;
}
- /** Returns {@code true} if Home All Apps available instead of Taskbar All Apps. */
- protected boolean canToggleHomeAllApps() {
- return false;
- }
-
@CallSuper
protected void dumpLogs(String prefix, PrintWriter pw) {
pw.println(String.format(
diff --git a/quickstep/src/com/android/quickstep/AllAppsActionManager.kt b/quickstep/src/com/android/quickstep/AllAppsActionManager.kt
deleted file mode 100644
index fd2ed3a..0000000
--- a/quickstep/src/com/android/quickstep/AllAppsActionManager.kt
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.quickstep
-
-import android.accessibilityservice.AccessibilityService.GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS
-import android.app.PendingIntent
-import android.app.RemoteAction
-import android.content.Context
-import android.graphics.drawable.Icon
-import android.view.accessibility.AccessibilityManager
-import com.android.launcher3.R
-import java.util.concurrent.Executor
-
-/**
- * Registers a [RemoteAction] for toggling All Apps if needed.
- *
- * We need this action when either [isHomeAndOverviewSame] or [isTaskbarPresent] is `true`. When
- * home and overview are the same, we can control Launcher's or Taskbar's All Apps tray. If they are
- * not the same, but Taskbar is present, we can only control Taskbar's tray.
- */
-class AllAppsActionManager(
- private val context: Context,
- private val bgExecutor: Executor,
- private val createAllAppsPendingIntent: () -> PendingIntent,
-) {
-
- /** `true` if home and overview are the same Activity. */
- var isHomeAndOverviewSame = false
- set(value) {
- field = value
- updateSystemAction()
- }
-
- /** `true` if Taskbar is enabled. */
- var isTaskbarPresent = false
- set(value) {
- field = value
- updateSystemAction()
- }
-
- /** `true` if the action should be registered. */
- var isActionRegistered = false
- private set
-
- private fun updateSystemAction() {
- val shouldRegisterAction = isHomeAndOverviewSame || isTaskbarPresent
- if (isActionRegistered == shouldRegisterAction) return
- isActionRegistered = shouldRegisterAction
-
- bgExecutor.execute {
- val accessibilityManager =
- context.getSystemService(AccessibilityManager::class.java) ?: return@execute
- if (shouldRegisterAction) {
- accessibilityManager.registerSystemAction(
- RemoteAction(
- Icon.createWithResource(context, R.drawable.ic_apps),
- context.getString(R.string.all_apps_label),
- context.getString(R.string.all_apps_label),
- createAllAppsPendingIntent(),
- ),
- GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS,
- )
- } else {
- accessibilityManager.unregisterSystemAction(GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS)
- }
- }
- }
-
- fun onDestroy() {
- context
- .getSystemService(AccessibilityManager::class.java)
- ?.unregisterSystemAction(
- GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS,
- )
- }
-}
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index d242e06..7880124 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -31,7 +31,6 @@
import static com.android.launcher3.MotionEventsUtils.isTrackpadMultiFingerSwipe;
import static com.android.launcher3.config.FeatureFlags.ENABLE_TRACKPAD_GESTURE;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
-import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
import static com.android.launcher3.util.OnboardingPrefs.HOME_BOUNCE_SEEN;
import static com.android.launcher3.util.window.WindowManagerProxy.MIN_TABLET_WIDTH;
import static com.android.quickstep.GestureState.DEFAULT_STATE;
@@ -60,12 +59,14 @@
import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_STARTING_WINDOW;
import android.app.PendingIntent;
+import android.app.RemoteAction;
import android.app.Service;
import android.content.IIntentReceiver;
import android.content.IIntentSender;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Region;
+import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Looper;
@@ -76,6 +77,7 @@
import android.view.InputDevice;
import android.view.InputEvent;
import android.view.MotionEvent;
+import android.view.accessibility.AccessibilityManager;
import androidx.annotation.BinderThread;
import androidx.annotation.NonNull;
@@ -86,6 +88,7 @@
import com.android.launcher3.ConstantItem;
import com.android.launcher3.EncryptionType;
import com.android.launcher3.LauncherPrefs;
+import com.android.launcher3.R;
import com.android.launcher3.anim.AnimatedFloat;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.provider.RestoreDbTask;
@@ -98,6 +101,7 @@
import com.android.launcher3.uioverrides.flags.FlagsFactory;
import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper;
import com.android.launcher3.util.DisplayController;
+import com.android.launcher3.util.Executors;
import com.android.launcher3.util.LockedUserState;
import com.android.launcher3.util.SafeCloseable;
import com.android.launcher3.util.ScreenOnTracker;
@@ -484,7 +488,6 @@
private TaskbarManager mTaskbarManager;
private Function<GestureState, AnimatedFloat> mSwipeUpProxyProvider = i -> null;
- private AllAppsActionManager mAllAppsActionManager;
@Override
public void onCreate() {
@@ -494,9 +497,7 @@
mMainChoreographer = Choreographer.getInstance();
mAM = ActivityManagerWrapper.getInstance();
mDeviceState = new RecentsAnimationDeviceState(this, true);
- mAllAppsActionManager = new AllAppsActionManager(
- this, UI_HELPER_EXECUTOR, this::createAllAppsPendingIntent);
- mTaskbarManager = new TaskbarManager(this, mAllAppsActionManager);
+ mTaskbarManager = new TaskbarManager(this);
mRotationTouchHelper = mDeviceState.getRotationTouchHelper();
mInputConsumer = InputConsumerController.getRecentsAnimationInputConsumer();
BootAwarePreloader.start(this);
@@ -589,7 +590,16 @@
}
private void onOverviewTargetChange(boolean isHomeAndOverviewSame) {
- mAllAppsActionManager.setHomeAndOverviewSame(isHomeAndOverviewSame);
+ Executors.UI_HELPER_EXECUTOR.execute(() -> {
+ AccessibilityManager am = getSystemService(AccessibilityManager.class);
+
+ if (isHomeAndOverviewSame) {
+ am.registerSystemAction(
+ createAllAppsAction(), GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS);
+ } else {
+ am.unregisterSystemAction(GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS);
+ }
+ });
StatefulActivity newOverviewActivity = mOverviewComponentObserver.getActivityInterface()
.getCreatedActivity();
@@ -599,12 +609,13 @@
mTISBinder.onOverviewTargetChange();
}
- private PendingIntent createAllAppsPendingIntent() {
+ private RemoteAction createAllAppsAction() {
final Intent homeIntent = new Intent(mOverviewComponentObserver.getHomeIntent())
.setAction(INTENT_ACTION_ALL_APPS_TOGGLE);
+ final PendingIntent actionPendingIntent;
if (FeatureFlags.ENABLE_ALL_APPS_SEARCH_IN_TASKBAR.get()) {
- return new PendingIntent(new IIntentSender.Stub() {
+ actionPendingIntent = new PendingIntent(new IIntentSender.Stub() {
@Override
public void send(int code, Intent intent, String resolvedType,
IBinder allowlistToken, IIntentReceiver finishedReceiver,
@@ -613,12 +624,18 @@
}
});
} else {
- return PendingIntent.getActivity(
+ actionPendingIntent = PendingIntent.getActivity(
this,
GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS,
homeIntent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
}
+
+ return new RemoteAction(
+ Icon.createWithResource(this, R.drawable.ic_apps),
+ getString(R.string.all_apps_label),
+ getString(R.string.all_apps_label),
+ actionPendingIntent);
}
@UiThread
@@ -661,7 +678,8 @@
mDeviceState.destroy();
SystemUiProxy.INSTANCE.get(this).clearProxy();
- mAllAppsActionManager.onDestroy();
+ getSystemService(AccessibilityManager.class)
+ .unregisterSystemAction(GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS);
mTaskbarManager.destroy();
sConnected = false;
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/AllAppsActionManagerTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/AllAppsActionManagerTest.kt
deleted file mode 100644
index 73b35e8..0000000
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/AllAppsActionManagerTest.kt
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.quickstep
-
-import android.app.PendingIntent
-import android.content.IIntentSender
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.platform.app.InstrumentationRegistry
-import com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR
-import com.android.launcher3.util.TestUtil
-import com.google.common.truth.Truth.assertThat
-import java.util.concurrent.Semaphore
-import java.util.concurrent.TimeUnit.SECONDS
-import org.junit.Test
-import org.junit.runner.RunWith
-
-private const val TIMEOUT = 5L
-
-@RunWith(AndroidJUnit4::class)
-class AllAppsActionManagerTest {
- private val callbackSemaphore = Semaphore(0)
- private val bgExecutor = UI_HELPER_EXECUTOR
-
- private val allAppsActionManager =
- AllAppsActionManager(
- InstrumentationRegistry.getInstrumentation().targetContext,
- bgExecutor,
- ) {
- callbackSemaphore.release()
- PendingIntent(IIntentSender.Default())
- }
-
- @Test
- fun taskbarPresent_actionRegistered() {
- allAppsActionManager.isTaskbarPresent = true
- assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue()
- assertThat(allAppsActionManager.isActionRegistered).isTrue()
- }
-
- @Test
- fun homeAndOverviewSame_actionRegistered() {
- allAppsActionManager.isHomeAndOverviewSame = true
- assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue()
- assertThat(allAppsActionManager.isActionRegistered).isTrue()
- }
-
- @Test
- fun toggleTaskbar_destroyedAfterActionRegistered_actionUnregistered() {
- allAppsActionManager.isTaskbarPresent = true
- assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue()
-
- allAppsActionManager.isTaskbarPresent = false
- TestUtil.runOnExecutorSync(bgExecutor) {} // Force system action to unregister.
- assertThat(allAppsActionManager.isActionRegistered).isFalse()
- }
-
- @Test
- fun toggleTaskbar_destroyedBeforeActionRegistered_pendingActionUnregistered() {
- allAppsActionManager.isTaskbarPresent = true
- allAppsActionManager.isTaskbarPresent = false
-
- TestUtil.runOnExecutorSync(bgExecutor) {} // Force system action to unregister.
- assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue()
- assertThat(allAppsActionManager.isActionRegistered).isFalse()
- }
-
- @Test
- fun changeHome_sameAsOverviewBeforeActionUnregistered_actionRegisteredAgain() {
- allAppsActionManager.isHomeAndOverviewSame = true // Initialize to same.
- assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue()
-
- allAppsActionManager.isHomeAndOverviewSame = false
- allAppsActionManager.isHomeAndOverviewSame = true
- assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue()
- assertThat(allAppsActionManager.isActionRegistered).isTrue()
- }
-}