diff --git a/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java b/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java index aa3feb7614..b82e6edd7c 100644 --- a/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java @@ -23,7 +23,7 @@ import android.view.LayoutInflater; import com.android.launcher3.popup.SystemShortcut; import com.android.launcher3.util.BaseContext; -import com.android.launcher3.util.DisplayController; +import com.android.launcher3.util.NavigationMode; import com.android.launcher3.util.Themes; import com.android.quickstep.SystemUiProxy; @@ -33,21 +33,49 @@ public abstract class BaseTaskbarContext extends BaseContext implements SystemShortcut.BubbleActivityStarter { protected final LayoutInflater mLayoutInflater; - private final boolean mIsPrimaryDisplay; public BaseTaskbarContext(Context windowContext, boolean isPrimaryDisplay) { super(windowContext, Themes.getActivityThemeRes(windowContext)); mLayoutInflater = LayoutInflater.from(this).cloneInContext(this); - mIsPrimaryDisplay = isPrimaryDisplay; } - public boolean isTransientTaskbar() { - return DisplayController.isTransientTaskbar(this) && mIsPrimaryDisplay; - } + /** + * Returns whether taskbar is transient or persistent. External displays will be persistent. + * + * @return {@code true} if transient, {@code false} if persistent. + */ + public abstract boolean isTransientTaskbar(); - public boolean isPrimaryDisplay() { - return mIsPrimaryDisplay; - } + /** + * Returns whether the taskbar is pinned in gesture navigation mode. + */ + public abstract boolean isPinnedTaskbar(); + + /** + * Returns the current navigation mode. External displays will be in THREE_BUTTONS mode. + */ + public abstract NavigationMode getNavigationMode(); + + /** + * Returns whether the taskbar is in desktop mode. + */ + public abstract boolean isInDesktopMode(); + + /** + * Returns whether the taskbar is forced to be pinned when home is visible. + */ + public abstract boolean showLockedTaskbarOnHome(); + + /** + * Returns whether desktop taskbar (pinned taskbar that shows desktop tasks) is to be used on + * the display because the display is a freeform display. + */ + public abstract boolean showDesktopTaskbarForFreeformDisplay(); + + /** + * Returns whether the taskbar is displayed on primary or external display. + */ + public abstract boolean isPrimaryDisplay(); @Override public final LayoutInflater getLayoutInflater() { diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java index 6e210e337d..913035ae21 100644 --- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java @@ -223,7 +223,8 @@ public class LauncherTaskbarUIController extends TaskbarUIController { if (!Flags.predictiveBackToHomePolish()) { shouldOverrideToFastAnimation |= mLauncher.getPredictiveBackToHomeInProgress(); } - boolean isPinnedTaskbar = DisplayController.isPinnedTaskbar(mLauncher); + boolean isPinnedTaskbar = + mControllers.taskbarActivityContext.isPinnedTaskbar(); if (isVisible || isPinnedTaskbar) { return getTaskbarToHomeDuration(shouldOverrideToFastAnimation, isPinnedTaskbar); } else { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index e41b2d2748..ce92d9401d 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -405,9 +405,41 @@ public class TaskbarActivityContext extends BaseTaskbarContext { dispatchDeviceProfileChanged(); } - /** Returns whether current taskbar is transient. */ + @Override public boolean isTransientTaskbar() { - return super.isTransientTaskbar() && !isPhoneMode(); + return DisplayController.isTransientTaskbar(this) && mIsPrimaryDisplay && !isPhoneMode(); + } + + @Override + public boolean isPinnedTaskbar() { + return DisplayController.isPinnedTaskbar(this); + } + + @Override + public NavigationMode getNavigationMode() { + return isPrimaryDisplay() ? DisplayController.getNavigationMode(this) + : NavigationMode.THREE_BUTTONS; + } + + @Override + public boolean isInDesktopMode() { + return mControllers != null + && mControllers.taskbarDesktopModeController.isInDesktopMode(getDisplayId()); + } + + @Override + public boolean showLockedTaskbarOnHome() { + return DisplayController.showLockedTaskbarOnHome(this); + } + + @Override + public boolean showDesktopTaskbarForFreeformDisplay() { + return DisplayController.showDesktopTaskbarForFreeformDisplay(this); + } + + @Override + public boolean isPrimaryDisplay() { + return mIsPrimaryDisplay; } /** @@ -443,9 +475,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { .setIsTransientTaskbar(true) .build(); } - mNavMode = (DesktopExperienceFlags.ENABLE_TASKBAR_CONNECTED_DISPLAYS.isTrue() - && !mIsPrimaryDisplay) ? NavigationMode.THREE_BUTTONS - : DisplayController.getNavigationMode(this); + mNavMode = getNavigationMode(); } /** Called when the visibility of the bubble bar changed. */ @@ -1338,11 +1368,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext { mControllers.uiController.startSplitSelection(splitSelectSource); } - boolean isInDesktopMode() { - return mControllers != null - && mControllers.taskbarDesktopModeController.isInDesktopMode(getDisplayId()); - } - protected void onTaskbarIconClicked(View view) { TaskbarUIController taskbarUIController = mControllers.uiController; RecentsView recents = taskbarUIController.getRecentsView(); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt index ca8e4cad9f..c8392a8639 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt @@ -20,7 +20,6 @@ import android.content.Context import com.android.launcher3.statehandlers.DesktopVisibilityController import com.android.launcher3.statehandlers.DesktopVisibilityController.TaskbarDesktopModeListener import com.android.launcher3.taskbar.TaskbarBackgroundRenderer.Companion.MAX_ROUNDNESS -import com.android.launcher3.util.DisplayController /** Handles Taskbar in Desktop Windowing mode. */ class TaskbarDesktopModeController( @@ -52,9 +51,10 @@ class TaskbarDesktopModeController( } fun shouldShowDesktopTasksInTaskbar(): Boolean { + val activityContext = taskbarControllers.taskbarActivityContext return isInDesktopMode(context.displayId) || - DisplayController.showDesktopTaskbarForFreeformDisplay(context) || - (DisplayController.showLockedTaskbarOnHome(context) && + activityContext.showDesktopTaskbarForFreeformDisplay() || + (activityContext.showLockedTaskbarOnHome() && taskbarControllers.taskbarStashController.isOnHome) } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt index 7a23006b4f..038e374a64 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt @@ -44,7 +44,6 @@ import com.android.launcher3.Utilities import com.android.launcher3.config.FeatureFlags.enableTaskbarPinning import com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_EDU_OPEN import com.android.launcher3.taskbar.TaskbarControllers.LoggableTaskbarController -import com.android.launcher3.util.DisplayController import com.android.launcher3.util.OnboardingPrefs.TASKBAR_EDU_TOOLTIP_STEP import com.android.launcher3.util.OnboardingPrefs.TASKBAR_SEARCH_EDU_SEEN import com.android.launcher3.util.ResourceBasedOverride @@ -319,7 +318,7 @@ open class TaskbarEduTooltipController(context: Context) : fun maybeShowSearchEdu() { if ( !enableTaskbarPinning() || - !DisplayController.isPinnedTaskbar(activityContext) || + !activityContext.isPinnedTaskbar || !isTooltipEnabled || !shouldShowSearchEdu || userHasSeenSearchEdu || diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt index 3af2ab6d3c..f342fa52b3 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt @@ -51,7 +51,6 @@ import com.android.launcher3.config.FeatureFlags.ENABLE_TASKBAR_NAVBAR_UNIFICATI import com.android.launcher3.config.FeatureFlags.enableTaskbarNoRecreate import com.android.launcher3.taskbar.TaskbarControllers.LoggableTaskbarController import com.android.launcher3.testing.shared.ResourceUtils -import com.android.launcher3.util.DisplayController import com.android.launcher3.util.Executors import java.io.PrintWriter import kotlin.jvm.optionals.getOrNull @@ -150,7 +149,7 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas if ( taskbarStashController.isInApp || controllers.uiController.isInOverviewUi || - DisplayController.showLockedTaskbarOnHome(context) + context.showLockedTaskbarOnHome() ) { // only add the taskbar touch region if not on home val bottom = windowLayoutParams.height diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java index b510e7ebb5..98415d1a71 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java @@ -40,7 +40,6 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; -import android.content.Context; import android.os.SystemClock; import android.util.Log; import android.view.animation.Interpolator; @@ -61,7 +60,6 @@ import com.android.launcher3.anim.AnimatorListeners; import com.android.launcher3.statemanager.StateManager; import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController.BubbleLauncherState; import com.android.launcher3.uioverrides.QuickstepLauncher; -import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.MultiPropertyFactory.MultiProperty; import com.android.quickstep.RecentsAnimationCallbacks; import com.android.quickstep.RecentsAnimationController; @@ -225,11 +223,9 @@ public class TaskbarLauncherStateController { updateStateForFlag(FLAG_LAUNCHER_IN_STATE_TRANSITION, true); if (!mShouldDelayLauncherStateAnim) { if (toState == LauncherState.NORMAL) { + TaskbarActivityContext activity = mControllers.taskbarActivityContext; boolean isPinnedTaskbarAndNotInDesktopMode = - DisplayController.isPinnedTaskbar( - mControllers.taskbarActivityContext) - && !DisplayController.isInDesktopMode( - mControllers.taskbarActivityContext); + !activity.isInDesktopMode() && activity.isPinnedTaskbar(); applyState(QuickstepTransitionManager.getTaskbarToHomeDuration( isPinnedTaskbarAndNotInDesktopMode)); } else { @@ -475,8 +471,8 @@ public class TaskbarLauncherStateController { final boolean isIconAlignedWithHotseat = isIconAlignedWithHotseat(); final float toAlignment = isIconAlignedWithHotseat ? 1 : 0; boolean handleOpenFloatingViews = false; - boolean isPinnedTaskbar = DisplayController.isPinnedTaskbar( - mControllers.taskbarActivityContext); + boolean isPinnedTaskbar = + mControllers.taskbarActivityContext.isPinnedTaskbar(); if (DEBUG) { Log.d(TAG, "onStateChangeApplied - isInLauncher: " + isInLauncher + ", mLauncherState: " + mLauncherState @@ -590,7 +586,8 @@ public class TaskbarLauncherStateController { float backgroundAlpha = isInLauncher && isTaskbarAlignedWithHotseat() ? 0 : 1; AnimatedFloat taskbarBgOffset = mControllers.taskbarDragLayerController.getTaskbarBackgroundOffset(); - boolean showTaskbar = shouldShowTaskbar(mLauncher, isInLauncher, isInOverview); + boolean showTaskbar = shouldShowTaskbar(mControllers.taskbarActivityContext, isInLauncher, + isInOverview); float taskbarBgOffsetEnd = showTaskbar ? 0f : 1f; float taskbarBgOffsetStart = showTaskbar ? 1f : 0f; @@ -727,13 +724,13 @@ public class TaskbarLauncherStateController { return animatorSet; } - private static boolean shouldShowTaskbar(Context context, boolean isInLauncher, - boolean isInOverview) { - if (DisplayController.showDesktopTaskbarForFreeformDisplay(context)) { + private static boolean shouldShowTaskbar(TaskbarActivityContext activityContext, + boolean isInLauncher, boolean isInOverview) { + if (activityContext.showDesktopTaskbarForFreeformDisplay()) { return true; } - if (DisplayController.showLockedTaskbarOnHome(context) && isInLauncher) { + if (activityContext.showLockedTaskbarOnHome() && isInLauncher) { return true; } return !isInLauncher || isInOverview; @@ -788,11 +785,11 @@ public class TaskbarLauncherStateController { * This refers to the intended state - a transition to this state might be in progress. */ public boolean isTaskbarAlignedWithHotseat() { - if (DisplayController.showDesktopTaskbarForFreeformDisplay(mLauncher)) { + if (mControllers.taskbarActivityContext.showDesktopTaskbarForFreeformDisplay()) { return false; } - if (DisplayController.showLockedTaskbarOnHome(mLauncher) && isInLauncher()) { + if (mControllers.taskbarActivityContext.showLockedTaskbarOnHome() && isInLauncher()) { return false; } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java index b5e271d07f..1521715ce0 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java @@ -227,7 +227,7 @@ public class TaskbarManager { } // Only Handles Special Exit Cases for Desktop Mode Taskbar Recreation. if (taskbarActivityContext != null - && !DisplayController.showLockedTaskbarOnHome(context)) { + && !taskbarActivityContext.showLockedTaskbarOnHome()) { recreateTaskbars(); } } else { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index ad59c2e9d7..c89042d98c 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -65,7 +65,6 @@ import com.android.launcher3.R; import com.android.launcher3.anim.AnimatedFloat; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorListeners; -import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.MultiPropertyFactory.MultiProperty; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.util.SystemUiFlagUtils; @@ -306,8 +305,8 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba // TODO(b/390665752): Feature to "lock" pinned taskbar to home screen will be superseded by // pinning, in other launcher states, at which point this variable can be removed. mInAppStateAffectsDesktopTasksVisibilityInTaskbar = - !DisplayController.showDesktopTaskbarForFreeformDisplay(mActivity) - && DisplayController.showLockedTaskbarOnHome(mActivity); + !mActivity.showDesktopTaskbarForFreeformDisplay() + && mActivity.showLockedTaskbarOnHome(); mTaskbarBackgroundDuration = activity.getResources().getInteger( R.integer.taskbar_background_duration); @@ -412,7 +411,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba * Returns how long the stash/unstash animation should play. */ public long getStashDuration() { - if (DisplayController.isPinnedTaskbar(mActivity)) { + if (mActivity.isPinnedTaskbar()) { return PINNED_TASKBAR_TRANSITION_DURATION; } return mActivity.isTransientTaskbar() ? TRANSIENT_TASKBAR_STASH_DURATION @@ -1182,7 +1181,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba } // Do not stash if pinned taskbar, hardware keyboard is attached and no IME is docked - if (mActivity.isHardwareKeyboard() && DisplayController.isPinnedTaskbar(mActivity) + if (mActivity.isHardwareKeyboard() && mActivity.isPinnedTaskbar() && !mActivity.isImeDocked()) { return false; } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java index dcb9fbff42..d0886e0ca1 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java @@ -36,7 +36,6 @@ import androidx.annotation.Nullable; import com.android.internal.jank.Cuj; import com.android.launcher3.taskbar.bubbles.BubbleBarViewController; -import com.android.launcher3.util.DisplayController; import com.android.systemui.shared.system.InteractionJankMonitorWrapper; import com.android.wm.shell.shared.bubbles.BubbleBarLocation; @@ -67,8 +66,8 @@ public class TaskbarViewCallbacks { InteractionJankMonitorWrapper.begin(v, Cuj.CUJ_LAUNCHER_OPEN_ALL_APPS, /* tag= */ "TASKBAR_BUTTON"); mActivity.getStatsLogManager().logger().log(LAUNCHER_TASKBAR_ALLAPPS_BUTTON_TAP); - if (DisplayController.showLockedTaskbarOnHome(mActivity) - || DisplayController.showDesktopTaskbarForFreeformDisplay(mActivity)) { + if (mActivity.showLockedTaskbarOnHome() + || mActivity.showDesktopTaskbarForFreeformDisplay()) { // If the taskbar can be shown on the home screen, use mAllAppsToggler to toggle all // apps, which will toggle the launcher activity all apps when on home screen. // TODO(b/395913143): Reconsider this if a gap in taskbar all apps functionality that @@ -248,8 +247,7 @@ public class TaskbarViewCallbacks { /** Returns true if the taskbar pinning popup view was shown for {@code event}. */ private boolean maybeShowPinningView(@NonNull MotionEvent event) { - if (!DisplayController.isPinnedTaskbar(mActivity) || mTaskbarView.isEventOverAnyItem( - event)) { + if (!mActivity.isPinnedTaskbar() || mTaskbarView.isEventOverAnyItem(event)) { return false; } mControllers.taskbarPinningController.showPinningView(mTaskbarView, event.getRawX()); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java index 6786aed445..9d27f61b41 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -86,7 +86,6 @@ import com.android.launcher3.taskbar.bubbles.BubbleBarController; import com.android.launcher3.taskbar.bubbles.BubbleControllers; import com.android.launcher3.taskbar.customization.TaskbarAllAppsButtonContainer; import com.android.launcher3.taskbar.customization.TaskbarDividerContainer; -import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.LauncherBindableItemsContainer; import com.android.launcher3.util.MultiPropertyFactory; @@ -930,7 +929,9 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar private AnimatorPlaybackController createIconAlignmentController(DeviceProfile launcherDp) { PendingAnimation setter = new PendingAnimation(100); // icon alignment not needed for pinned taskbar. - if (DisplayController.isPinnedTaskbar(mActivity)) return setter.createPlaybackController(); + if (mActivity.isPinnedTaskbar()) { + return setter.createPlaybackController(); + } mOnControllerPreCreateCallback.run(); DeviceProfile taskbarDp = mActivity.getDeviceProfile(); Rect hotseatPadding = launcherDp.getHotseatLayoutPadding(mActivity); diff --git a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java index dd91d17c29..8574b89ecb 100644 --- a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java @@ -31,6 +31,7 @@ import com.android.launcher3.taskbar.TaskbarDragController; import com.android.launcher3.taskbar.TaskbarUIController; import com.android.launcher3.taskbar.allapps.TaskbarAllAppsContainerView; import com.android.launcher3.taskbar.allapps.TaskbarSearchSessionController; +import com.android.launcher3.util.NavigationMode; import com.android.launcher3.util.SplitConfigurationOptions.SplitSelectSource; /** @@ -141,6 +142,41 @@ public class TaskbarOverlayContext extends BaseTaskbarContext { mUiController.startSplitSelection(splitSelectSource); } + @Override + public boolean isTransientTaskbar() { + return mTaskbarContext.isTransientTaskbar(); + } + + @Override + public boolean isPinnedTaskbar() { + return mTaskbarContext.isPinnedTaskbar(); + } + + @Override + public NavigationMode getNavigationMode() { + return mTaskbarContext.getNavigationMode(); + } + + @Override + public boolean isInDesktopMode() { + return mTaskbarContext.isInDesktopMode(); + } + + @Override + public boolean showLockedTaskbarOnHome() { + return mTaskbarContext.showLockedTaskbarOnHome(); + } + + @Override + public boolean showDesktopTaskbarForFreeformDisplay() { + return mTaskbarContext.showDesktopTaskbarForFreeformDisplay(); + } + + @Override + public boolean isPrimaryDisplay() { + return mTaskbarContext.isPrimaryDisplay(); + } + @Override public void onDragStart() {}