From 0610c625e0670354ba389b5223b5994b2ea045c9 Mon Sep 17 00:00:00 2001 From: Johannes Gallmann Date: Fri, 22 Nov 2024 13:45:44 +0000 Subject: [PATCH] Only register Launcher back-callback when ROLE_HOME is held. When using a 3P Launcher, i.e. when the ROLE_HOME is not held by QuickstepLauncher, there should be no back callback registered with SystemUI. Bug: 374882166 Flag: EXEMPT bugfix Test: Manual, i.e. verified back-callback registration updates in SystemUI and also verified that back-to-home navigations in Nova Launcher are responsive. Change-Id: I03187f80a4c3c893a6529f0a22613f6fdfe7b7b3 --- .../launcher3/QuickstepTransitionManager.java | 22 ++++++++++++++++++- .../uioverrides/QuickstepLauncher.java | 14 ++++++++++++ .../quickstep/TouchInteractionService.java | 19 ++++++++++------ .../quickstep/interaction/AllSetActivity.java | 14 ++++++++++-- 4 files changed, 59 insertions(+), 10 deletions(-) diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java index e624be7e6e..7d193aa7ba 100644 --- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java @@ -19,6 +19,7 @@ package com.android.launcher3; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; +import static android.app.role.RoleManager.ROLE_HOME; import static android.provider.Settings.Secure.LAUNCHER_TASKBAR_EDUCATION_SHOWING; import static android.view.RemoteAnimationTarget.MODE_CLOSING; import static android.view.RemoteAnimationTarget.MODE_OPENING; @@ -74,6 +75,7 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.app.ActivityOptions; import android.app.WindowConfiguration; +import android.app.role.RoleManager; import android.content.ComponentName; import android.content.Context; import android.content.res.Resources; @@ -1194,7 +1196,9 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener .registerRemoteTransition(mLauncherOpenTransition, homeCheck); if (mBackAnimationController != null) { mBackAnimationController.registerComponentCallbacks(); - mBackAnimationController.registerBackCallbacks(mHandler); + if (isHomeRoleHeld()) { + mBackAnimationController.registerBackCallbacks(mHandler); + } } } @@ -1207,6 +1211,22 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener .unregisterContentObserver(mAnimationRemovalObserver)); } + /** + * Called when the overview-target changes. Updates the back callback registration state. + */ + public void onOverviewTargetChange() { + if (isHomeRoleHeld()) { + mBackAnimationController.registerBackCallbacks(mHandler); + } else { + mBackAnimationController.unregisterBackCallbacks(); + } + } + + private boolean isHomeRoleHeld() { + RoleManager roleManager = mLauncher.getSystemService(RoleManager.class); + return roleManager == null || roleManager.isRoleHeld(ROLE_HOME); + } + private void unregisterRemoteAnimations() { if (SEPARATE_RECENTS_ACTIVITY.get()) { return; diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 1baba74359..cc51adc260 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -264,6 +264,8 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, private boolean mIsOverlayVisible; + private final Runnable mOverviewTargetChangeRunnable = this::onOverviewTargetChanged; + public static QuickstepLauncher getLauncher(Context context) { return fromContext(context); } @@ -550,6 +552,10 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, mUnfoldTransitionProgressProvider.destroy(); } + TISBinder binder = mTISBindHelper.getBinder(); + if (binder != null) { + binder.unregisterOverviewTargetChangeListener(mOverviewTargetChangeRunnable); + } mTISBindHelper.onDestroy(); if (mLauncherUnfoldAnimationController != null) { @@ -1025,12 +1031,20 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, } } + private void onOverviewTargetChanged() { + QuickstepTransitionManager transitionManager = getAppTransitionManager(); + if (transitionManager != null) { + transitionManager.onOverviewTargetChange(); + } + } + private void onTISConnected(TISBinder binder) { TaskbarManager taskbarManager = mTISBindHelper.getTaskbarManager(); if (taskbarManager != null) { taskbarManager.setActivity(this); } mTISBindHelper.setPredictiveBackToHomeInProgress(mIsPredictiveBackToHomeInProgress); + binder.registerOverviewTargetChangeListener(mOverviewTargetChangeRunnable); } @Override diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index d38eaf33b9..8edb16f06c 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -137,6 +137,7 @@ import com.android.wm.shell.startingsurface.IStartingWindow; import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.ref.WeakReference; +import java.util.HashSet; import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; @@ -163,7 +164,7 @@ public class TouchInteractionService extends Service { private final WeakReference mTis; - @Nullable private Runnable mOnOverviewTargetChangeListener = null; + private final Set mOnOverviewTargetChangeListeners = new HashSet<>(); private TISBinder(TouchInteractionService tis) { mTis = new WeakReference<>(tis); @@ -512,15 +513,19 @@ public class TouchInteractionService extends Service { tis -> tis.mDeviceState.setGestureBlockingTaskId(taskId)); } - /** Sets a listener to be run on Overview Target updates. */ - public void setOverviewTargetChangeListener(@Nullable Runnable listener) { - mOnOverviewTargetChangeListener = listener; + /** Registers a listener to be run on Overview Target updates. */ + public void registerOverviewTargetChangeListener(@NonNull Runnable listener) { + mOnOverviewTargetChangeListeners.add(listener); + } + + /** Unregisters an OverviewTargetChange listener. */ + public void unregisterOverviewTargetChangeListener(@NonNull Runnable listener) { + mOnOverviewTargetChangeListeners.remove(listener); } protected void onOverviewTargetChange() { - if (mOnOverviewTargetChangeListener != null) { - mOnOverviewTargetChangeListener.run(); - mOnOverviewTargetChangeListener = null; + for (Runnable listener : mOnOverviewTargetChangeListeners) { + listener.run(); } } diff --git a/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java b/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java index f7f3157230..3eba9c0d31 100644 --- a/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java +++ b/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java @@ -121,6 +121,8 @@ public class AllSetActivity extends Activity { private TextView mHintView; + private final Runnable mOverviewTargetChangeRunnable = this::onOverviewTargetChanged; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -285,7 +287,7 @@ public class AllSetActivity extends Activity { private void onTISConnected(TISBinder binder) { setSetupUIVisible(isResumed()); binder.setSwipeUpProxy(isResumed() ? this::createSwipeUpProxy : null); - binder.setOverviewTargetChangeListener(binder::preloadOverviewForSUWAllSet); + binder.registerOverviewTargetChangeListener(mOverviewTargetChangeRunnable); binder.preloadOverviewForSUWAllSet(); TaskbarManager taskbarManager = binder.getTaskbarManager(); if (taskbarManager != null) { @@ -293,6 +295,14 @@ public class AllSetActivity extends Activity { } } + private void onOverviewTargetChanged() { + TISBinder binder = mTISBindHelper.getBinder(); + if (binder != null) { + binder.preloadOverviewForSUWAllSet(); + binder.unregisterOverviewTargetChangeListener(mOverviewTargetChangeRunnable); + } + } + @Override protected void onPause() { super.onPause(); @@ -309,7 +319,7 @@ public class AllSetActivity extends Activity { if (binder != null) { setSetupUIVisible(false); binder.setSwipeUpProxy(null); - binder.setOverviewTargetChangeListener(null); + binder.unregisterOverviewTargetChangeListener(mOverviewTargetChangeRunnable); } }