diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index de91c548a7..e41b2d2748 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -139,6 +139,7 @@ import com.android.launcher3.taskbar.bubbles.stashing.PersistentBubbleStashContr import com.android.launcher3.taskbar.bubbles.stashing.TransientBubbleStashController; import com.android.launcher3.taskbar.customization.TaskbarFeatureEvaluator; import com.android.launcher3.taskbar.customization.TaskbarSpecsEvaluator; +import com.android.launcher3.taskbar.growth.NudgeController; import com.android.launcher3.taskbar.navbutton.NearestTouchFrame; import com.android.launcher3.taskbar.overlay.TaskbarOverlayController; import com.android.launcher3.testing.TestLogging; @@ -381,7 +382,8 @@ public class TaskbarActivityContext extends BaseTaskbarContext { new TaskbarPinningController(this), bubbleControllersOptional, new TaskbarDesktopModeController(this, - DesktopVisibilityController.INSTANCE.get(this))); + DesktopVisibilityController.INSTANCE.get(this)), + new NudgeController(this)); mLauncherPrefs = LauncherPrefs.get(this); onViewCreated(); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java index a2b642353a..9e15a60ed1 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java @@ -25,6 +25,7 @@ import androidx.annotation.VisibleForTesting; import com.android.launcher3.anim.AnimatedFloat; import com.android.launcher3.taskbar.allapps.TaskbarAllAppsController; import com.android.launcher3.taskbar.bubbles.BubbleControllers; +import com.android.launcher3.taskbar.growth.NudgeController; import com.android.launcher3.taskbar.overlay.TaskbarOverlayController; import com.android.systemui.shared.rotation.RotationButtonController; import com.android.wm.shell.shared.bubbles.BubbleBarLocation; @@ -67,6 +68,7 @@ public class TaskbarControllers { public final TaskbarPinningController taskbarPinningController; public final Optional bubbleControllers; public final TaskbarDesktopModeController taskbarDesktopModeController; + public final NudgeController nudgeController; @Nullable private LoggableTaskbarController[] mControllersToLog = null; @Nullable private BackgroundRendererController[] mBackgroundRendererControllers = null; @@ -115,7 +117,8 @@ public class TaskbarControllers { KeyboardQuickSwitchController keyboardQuickSwitchController, TaskbarPinningController taskbarPinningController, Optional bubbleControllers, - TaskbarDesktopModeController taskbarDesktopModeController) { + TaskbarDesktopModeController taskbarDesktopModeController, + NudgeController nudgeController) { this.taskbarActivityContext = taskbarActivityContext; this.taskbarDragController = taskbarDragController; this.navButtonController = navButtonController; @@ -143,6 +146,7 @@ public class TaskbarControllers { this.taskbarPinningController = taskbarPinningController; this.bubbleControllers = bubbleControllers; this.taskbarDesktopModeController = taskbarDesktopModeController; + this.nudgeController = nudgeController; } /** @@ -179,6 +183,7 @@ public class TaskbarControllers { keyboardQuickSwitchController.init(this); taskbarPinningController.init(this, mSharedState); taskbarDesktopModeController.init(this, mSharedState); + nudgeController.init(this); mControllersToLog = new LoggableTaskbarController[] { taskbarDragController, navButtonController, navbarButtonsViewController, @@ -189,6 +194,7 @@ public class TaskbarControllers { voiceInteractionWindowController, taskbarRecentAppsController, taskbarTranslationController, taskbarEduTooltipController, keyboardQuickSwitchController, taskbarPinningController, + nudgeController }; mBackgroundRendererControllers = new BackgroundRendererController[] { taskbarDragLayerController, taskbarScrimViewController, @@ -344,7 +350,7 @@ public class TaskbarControllers { return taskbarActivityContext; } - protected interface LoggableTaskbarController { + public interface LoggableTaskbarController { void dumpLogs(String prefix, PrintWriter pw); } diff --git a/quickstep/src/com/android/launcher3/taskbar/growth/NudgeController.kt b/quickstep/src/com/android/launcher3/taskbar/growth/NudgeController.kt new file mode 100644 index 0000000000..04e41bc3bd --- /dev/null +++ b/quickstep/src/com/android/launcher3/taskbar/growth/NudgeController.kt @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2025 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.launcher3.taskbar.growth + +import android.content.Context +import com.android.launcher3.Utilities +import com.android.launcher3.taskbar.TaskbarActivityContext +import com.android.launcher3.taskbar.TaskbarControllers +import com.android.launcher3.taskbar.TaskbarControllers.LoggableTaskbarController +import com.android.launcher3.util.DisplayController +import com.android.launcher3.views.ActivityContext +import java.io.PrintWriter + +/** Controls nudge lifecycles. */ +class NudgeController(context: Context) : LoggableTaskbarController { + + protected val activityContext: TaskbarActivityContext = ActivityContext.lookupContext(context) + + private val isNudgeEnabled: Boolean + get() { + return !Utilities.isRunningInTestHarness() && + !activityContext.isPhoneMode && + !activityContext.isTinyTaskbar + } + + private lateinit var controllers: TaskbarControllers + + fun init(controllers: TaskbarControllers) { + this.controllers = controllers + } + + fun maybeShow(payload: NudgePayload) { + if (!isNudgeEnabled || !DisplayController.isTransientTaskbar(activityContext)) { + return + } + // TODO: b/398033012 - create and show nudge view based on the payload. + } + + /** Closes the current [nudgeView]. */ + fun hide() { + // TODO: b/398033012 - hide the nudge view. + } + + override fun dumpLogs(prefix: String?, pw: PrintWriter?) { + pw?.println(prefix + "NudgeController:") + pw?.println("$prefix\tisNudgeEnabled=$isNudgeEnabled") + } +} diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt index 26f1197f7e..52d288a723 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt @@ -17,6 +17,7 @@ package com.android.launcher3.taskbar import com.android.launcher3.taskbar.allapps.TaskbarAllAppsController import com.android.launcher3.taskbar.bubbles.BubbleControllers +import com.android.launcher3.taskbar.growth.NudgeController import com.android.launcher3.taskbar.overlay.TaskbarOverlayController import com.android.systemui.shared.rotation.RotationButtonController import java.util.Optional @@ -58,6 +59,7 @@ abstract class TaskbarBaseTestCase { @Mock lateinit var taskbarPinningController: TaskbarPinningController @Mock lateinit var optionalBubbleControllers: Optional @Mock lateinit var taskbarDesktopModeController: TaskbarDesktopModeController + @Mock lateinit var nudgeController: NudgeController lateinit var taskbarControllers: TaskbarControllers @@ -100,6 +102,7 @@ abstract class TaskbarBaseTestCase { taskbarPinningController, optionalBubbleControllers, taskbarDesktopModeController, + nudgeController, ) } }