Loading quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java +19 −1 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ import com.android.launcher3.statehandlers.DepthController; import com.android.launcher3.statemanager.StateManager.StateHandler; import com.android.launcher3.taskbar.TaskbarContainerView; import com.android.launcher3.taskbar.TaskbarController; import com.android.launcher3.taskbar.TaskbarStateHandler; import com.android.launcher3.uioverrides.RecentsViewStateController; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.UiThreadHelper; Loading Loading @@ -82,6 +83,7 @@ public abstract class BaseQuickstepLauncher extends Launcher private OverviewActionsView mActionsView; private @Nullable TaskbarController mTaskbarController; private final TaskbarStateHandler mTaskbarStateHandler = new TaskbarStateHandler(this); @Override protected void onCreate(Bundle savedInstanceState) { Loading Loading @@ -245,13 +247,23 @@ public abstract class BaseQuickstepLauncher extends Launcher getWorkspace(), getDepthController(), new RecentsViewStateController(this), new BackButtonAlphaHandler(this)}; new BackButtonAlphaHandler(this), getTaskbarStateHandler(), }; } public DepthController getDepthController() { return mDepthController; } public @Nullable TaskbarController getTaskbarController() { return mTaskbarController; } public TaskbarStateHandler getTaskbarStateHandler() { return mTaskbarStateHandler; } @Override public void useFadeOutAnimationForLauncherStart(CancellationSignal signal) { QuickstepAppTransitionManagerImpl appTransitionManager = Loading Loading @@ -296,6 +308,12 @@ public abstract class BaseQuickstepLauncher extends Launcher mDepthController.setActivityStarted(isStarted()); } if ((changeBits & ACTIVITY_STATE_RESUMED) != 0) { if (mTaskbarController != null) { mTaskbarController.onLauncherResumedOrPaused(hasBeenResumed()); } } super.onActivityFlagsChanged(changeBits); } Loading quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java +1 −1 Original line number Diff line number Diff line Loading @@ -139,7 +139,7 @@ public abstract class QuickstepAppTransitionManagerImpl extends LauncherAppTrans private static final int LAUNCHER_RESUME_START_DELAY = 100; private static final int CLOSING_TRANSITION_DURATION_MS = 250; protected static final int CONTENT_ALPHA_DURATION = 217; public static final int CONTENT_ALPHA_DURATION = 217; protected static final int CONTENT_TRANSLATION_DURATION = 350; // Progress = 0: All apps is fully pulled up, Progress = 1: All apps is fully pulled down. Loading quickstep/src/com/android/launcher3/taskbar/TaskbarController.java +97 −0 Original line number Diff line number Diff line Loading @@ -22,13 +22,22 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import static com.android.systemui.shared.system.WindowManagerWrapper.ITYPE_BOTTOM_TAPPABLE_ELEMENT; import static com.android.systemui.shared.system.WindowManagerWrapper.ITYPE_EXTRA_NAVIGATION_BAR; import android.animation.Animator; import android.graphics.PixelFormat; import android.graphics.Point; import android.view.Gravity; import android.view.WindowManager; import androidx.annotation.Nullable; import com.android.launcher3.BaseQuickstepLauncher; import com.android.launcher3.LauncherState; import com.android.launcher3.QuickstepAppTransitionManagerImpl; import com.android.launcher3.R; import com.android.launcher3.anim.AlphaUpdateListener; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.states.StateAnimationConfig; import com.android.quickstep.AnimatedFloat; import com.android.systemui.shared.system.WindowManagerWrapper; /** Loading @@ -44,7 +53,10 @@ public class TaskbarController { private final WindowManager mWindowManager; // Layout width and height of the Taskbar in the default state. private final Point mTaskbarSize; private final TaskbarStateHandler mTaskbarStateHandler; private final TaskbarVisibilityController mTaskbarVisibilityController; // Initialized in init(). private WindowManager.LayoutParams mWindowLayoutParams; public TaskbarController(BaseQuickstepLauncher launcher, Loading @@ -55,6 +67,24 @@ public class TaskbarController { mWindowManager = mLauncher.getWindowManager(); mTaskbarSize = new Point(MATCH_PARENT, mLauncher.getResources().getDimensionPixelSize(R.dimen.taskbar_size)); mTaskbarStateHandler = mLauncher.getTaskbarStateHandler(); mTaskbarVisibilityController = new TaskbarVisibilityController(mLauncher, createTaskbarVisibilityControllerCallbacks()); } private TaskbarVisibilityControllerCallbacks createTaskbarVisibilityControllerCallbacks() { return new TaskbarVisibilityControllerCallbacks() { @Override public void updateTaskbarBackgroundAlpha(float alpha) { mTaskbarView.setBackgroundAlpha(alpha); } @Override public void updateTaskbarVisibilityAlpha(float alpha) { mTaskbarContainerView.setAlpha(alpha); AlphaUpdateListener.updateVisibility(mTaskbarContainerView); } }; } /** Loading @@ -62,6 +92,17 @@ public class TaskbarController { */ public void init() { addToWindowManager(); mTaskbarStateHandler.setTaskbarCallbacks(createTaskbarStateHandlerCallbacks()); mTaskbarVisibilityController.init(); } private TaskbarStateHandlerCallbacks createTaskbarStateHandlerCallbacks() { return new TaskbarStateHandlerCallbacks() { @Override public AnimatedFloat getAlphaTarget() { return mTaskbarVisibilityController.getTaskbarVisibilityForLauncherState(); } }; } /** Loading @@ -69,6 +110,8 @@ public class TaskbarController { */ public void cleanup() { removeFromWindowManager(); mTaskbarStateHandler.setTaskbarCallbacks(null); mTaskbarVisibilityController.cleanup(); } private void removeFromWindowManager() { Loading Loading @@ -108,4 +151,58 @@ public class TaskbarController { mWindowManager.addView(mTaskbarContainerView, mWindowLayoutParams); } /** * Should be called from onResume() and onPause(), and animates the Taskbar accordingly. */ public void onLauncherResumedOrPaused(boolean isResumed) { long duration = QuickstepAppTransitionManagerImpl.CONTENT_ALPHA_DURATION; final Animator anim; if (isResumed) { anim = createAnimToLauncher(null, duration); } else { anim = createAnimToApp(duration); } anim.start(); } /** * Create Taskbar animation when going from an app to Launcher. * @param toState If known, the state we will end up in when reaching Launcher. */ public Animator createAnimToLauncher(@Nullable LauncherState toState, long duration) { PendingAnimation anim = new PendingAnimation(duration); anim.add(mTaskbarVisibilityController.createAnimToBackgroundAlpha(0, duration)); if (toState != null) { mTaskbarStateHandler.setStateWithAnimation(toState, new StateAnimationConfig(), anim); } return anim.buildAnim(); } private Animator createAnimToApp(long duration) { return mTaskbarVisibilityController.createAnimToBackgroundAlpha(1, duration); } /** * Should be called when the IME visibility changes, so we can hide/show Taskbar accordingly. */ public void setIsImeVisible(boolean isImeVisible) { mTaskbarVisibilityController.animateToVisibilityForIme(isImeVisible ? 0 : 1); } /** * Contains methods that TaskbarStateHandler can call to interface with TaskbarController. */ protected interface TaskbarStateHandlerCallbacks { AnimatedFloat getAlphaTarget(); } /** * Contains methods that TaskbarVisibilityController can call to interface with * TaskbarController. */ protected interface TaskbarVisibilityControllerCallbacks { void updateTaskbarBackgroundAlpha(float alpha); void updateTaskbarVisibilityAlpha(float alpha); } } quickstep/src/com/android/launcher3/taskbar/TaskbarStateHandler.java 0 → 100644 +77 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 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; import static com.android.launcher3.LauncherState.TASKBAR; import static com.android.launcher3.states.StateAnimationConfig.ANIM_TASKBAR_FADE; import static com.android.launcher3.states.StateAnimationConfig.SKIP_TASKBAR; import androidx.annotation.Nullable; import com.android.launcher3.BaseQuickstepLauncher; import com.android.launcher3.LauncherState; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.statemanager.StateManager; import com.android.launcher3.states.StateAnimationConfig; import com.android.quickstep.AnimatedFloat; /** * StateHandler to animate Taskbar according to Launcher's state machine. Does nothing if Taskbar * isn't present (i.e. {@link #setTaskbarCallbacks} is never called). */ public class TaskbarStateHandler implements StateManager.StateHandler<LauncherState> { private final BaseQuickstepLauncher mLauncher; // Contains Taskbar-related methods and fields we should aniamte. If null, don't do anything. private @Nullable TaskbarController.TaskbarStateHandlerCallbacks mTaskbarCallbacks = null; public TaskbarStateHandler(BaseQuickstepLauncher launcher) { mLauncher = launcher; } public void setTaskbarCallbacks(TaskbarController.TaskbarStateHandlerCallbacks callbacks) { mTaskbarCallbacks = callbacks; } @Override public void setState(LauncherState state) { if (mTaskbarCallbacks == null) { return; } AnimatedFloat alphaTarget = mTaskbarCallbacks.getAlphaTarget(); boolean isTaskbarVisible = (state.getVisibleElements(mLauncher) & TASKBAR) != 0; alphaTarget.updateValue(isTaskbarVisible ? 1f : 0f); } @Override public void setStateWithAnimation(LauncherState toState, StateAnimationConfig config, PendingAnimation animation) { if (mTaskbarCallbacks == null) { return; } if (config.hasAnimationFlag(SKIP_TASKBAR)) { return; } AnimatedFloat alphaTarget = mTaskbarCallbacks.getAlphaTarget(); boolean isTaskbarVisible = (toState.getVisibleElements(mLauncher) & TASKBAR) != 0; animation.setFloat(alphaTarget, AnimatedFloat.VALUE, isTaskbarVisible ? 1f : 0f, config.getInterpolator(ANIM_TASKBAR_FADE, Interpolators.LINEAR)); } } quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +13 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.launcher3.taskbar; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.util.AttributeSet; import android.widget.LinearLayout; Loading @@ -26,6 +27,9 @@ import androidx.annotation.Nullable; * Hosts the Taskbar content such as Hotseat and Recent Apps. Drawn on top of other apps. */ public class TaskbarView extends LinearLayout { private final ColorDrawable mBackgroundDrawable; public TaskbarView(@NonNull Context context) { this(context, null); } Loading @@ -42,5 +46,14 @@ public class TaskbarView extends LinearLayout { public TaskbarView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); mBackgroundDrawable = (ColorDrawable) getBackground(); } /** * Sets the alpha of the background color behind all the Taskbar contents. * @param alpha 0 is fully transparent, 1 is fully opaque. */ public void setBackgroundAlpha(float alpha) { mBackgroundDrawable.setAlpha((int) (alpha * 255)); } } Loading
quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java +19 −1 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ import com.android.launcher3.statehandlers.DepthController; import com.android.launcher3.statemanager.StateManager.StateHandler; import com.android.launcher3.taskbar.TaskbarContainerView; import com.android.launcher3.taskbar.TaskbarController; import com.android.launcher3.taskbar.TaskbarStateHandler; import com.android.launcher3.uioverrides.RecentsViewStateController; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.UiThreadHelper; Loading Loading @@ -82,6 +83,7 @@ public abstract class BaseQuickstepLauncher extends Launcher private OverviewActionsView mActionsView; private @Nullable TaskbarController mTaskbarController; private final TaskbarStateHandler mTaskbarStateHandler = new TaskbarStateHandler(this); @Override protected void onCreate(Bundle savedInstanceState) { Loading Loading @@ -245,13 +247,23 @@ public abstract class BaseQuickstepLauncher extends Launcher getWorkspace(), getDepthController(), new RecentsViewStateController(this), new BackButtonAlphaHandler(this)}; new BackButtonAlphaHandler(this), getTaskbarStateHandler(), }; } public DepthController getDepthController() { return mDepthController; } public @Nullable TaskbarController getTaskbarController() { return mTaskbarController; } public TaskbarStateHandler getTaskbarStateHandler() { return mTaskbarStateHandler; } @Override public void useFadeOutAnimationForLauncherStart(CancellationSignal signal) { QuickstepAppTransitionManagerImpl appTransitionManager = Loading Loading @@ -296,6 +308,12 @@ public abstract class BaseQuickstepLauncher extends Launcher mDepthController.setActivityStarted(isStarted()); } if ((changeBits & ACTIVITY_STATE_RESUMED) != 0) { if (mTaskbarController != null) { mTaskbarController.onLauncherResumedOrPaused(hasBeenResumed()); } } super.onActivityFlagsChanged(changeBits); } Loading
quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java +1 −1 Original line number Diff line number Diff line Loading @@ -139,7 +139,7 @@ public abstract class QuickstepAppTransitionManagerImpl extends LauncherAppTrans private static final int LAUNCHER_RESUME_START_DELAY = 100; private static final int CLOSING_TRANSITION_DURATION_MS = 250; protected static final int CONTENT_ALPHA_DURATION = 217; public static final int CONTENT_ALPHA_DURATION = 217; protected static final int CONTENT_TRANSLATION_DURATION = 350; // Progress = 0: All apps is fully pulled up, Progress = 1: All apps is fully pulled down. Loading
quickstep/src/com/android/launcher3/taskbar/TaskbarController.java +97 −0 Original line number Diff line number Diff line Loading @@ -22,13 +22,22 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import static com.android.systemui.shared.system.WindowManagerWrapper.ITYPE_BOTTOM_TAPPABLE_ELEMENT; import static com.android.systemui.shared.system.WindowManagerWrapper.ITYPE_EXTRA_NAVIGATION_BAR; import android.animation.Animator; import android.graphics.PixelFormat; import android.graphics.Point; import android.view.Gravity; import android.view.WindowManager; import androidx.annotation.Nullable; import com.android.launcher3.BaseQuickstepLauncher; import com.android.launcher3.LauncherState; import com.android.launcher3.QuickstepAppTransitionManagerImpl; import com.android.launcher3.R; import com.android.launcher3.anim.AlphaUpdateListener; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.states.StateAnimationConfig; import com.android.quickstep.AnimatedFloat; import com.android.systemui.shared.system.WindowManagerWrapper; /** Loading @@ -44,7 +53,10 @@ public class TaskbarController { private final WindowManager mWindowManager; // Layout width and height of the Taskbar in the default state. private final Point mTaskbarSize; private final TaskbarStateHandler mTaskbarStateHandler; private final TaskbarVisibilityController mTaskbarVisibilityController; // Initialized in init(). private WindowManager.LayoutParams mWindowLayoutParams; public TaskbarController(BaseQuickstepLauncher launcher, Loading @@ -55,6 +67,24 @@ public class TaskbarController { mWindowManager = mLauncher.getWindowManager(); mTaskbarSize = new Point(MATCH_PARENT, mLauncher.getResources().getDimensionPixelSize(R.dimen.taskbar_size)); mTaskbarStateHandler = mLauncher.getTaskbarStateHandler(); mTaskbarVisibilityController = new TaskbarVisibilityController(mLauncher, createTaskbarVisibilityControllerCallbacks()); } private TaskbarVisibilityControllerCallbacks createTaskbarVisibilityControllerCallbacks() { return new TaskbarVisibilityControllerCallbacks() { @Override public void updateTaskbarBackgroundAlpha(float alpha) { mTaskbarView.setBackgroundAlpha(alpha); } @Override public void updateTaskbarVisibilityAlpha(float alpha) { mTaskbarContainerView.setAlpha(alpha); AlphaUpdateListener.updateVisibility(mTaskbarContainerView); } }; } /** Loading @@ -62,6 +92,17 @@ public class TaskbarController { */ public void init() { addToWindowManager(); mTaskbarStateHandler.setTaskbarCallbacks(createTaskbarStateHandlerCallbacks()); mTaskbarVisibilityController.init(); } private TaskbarStateHandlerCallbacks createTaskbarStateHandlerCallbacks() { return new TaskbarStateHandlerCallbacks() { @Override public AnimatedFloat getAlphaTarget() { return mTaskbarVisibilityController.getTaskbarVisibilityForLauncherState(); } }; } /** Loading @@ -69,6 +110,8 @@ public class TaskbarController { */ public void cleanup() { removeFromWindowManager(); mTaskbarStateHandler.setTaskbarCallbacks(null); mTaskbarVisibilityController.cleanup(); } private void removeFromWindowManager() { Loading Loading @@ -108,4 +151,58 @@ public class TaskbarController { mWindowManager.addView(mTaskbarContainerView, mWindowLayoutParams); } /** * Should be called from onResume() and onPause(), and animates the Taskbar accordingly. */ public void onLauncherResumedOrPaused(boolean isResumed) { long duration = QuickstepAppTransitionManagerImpl.CONTENT_ALPHA_DURATION; final Animator anim; if (isResumed) { anim = createAnimToLauncher(null, duration); } else { anim = createAnimToApp(duration); } anim.start(); } /** * Create Taskbar animation when going from an app to Launcher. * @param toState If known, the state we will end up in when reaching Launcher. */ public Animator createAnimToLauncher(@Nullable LauncherState toState, long duration) { PendingAnimation anim = new PendingAnimation(duration); anim.add(mTaskbarVisibilityController.createAnimToBackgroundAlpha(0, duration)); if (toState != null) { mTaskbarStateHandler.setStateWithAnimation(toState, new StateAnimationConfig(), anim); } return anim.buildAnim(); } private Animator createAnimToApp(long duration) { return mTaskbarVisibilityController.createAnimToBackgroundAlpha(1, duration); } /** * Should be called when the IME visibility changes, so we can hide/show Taskbar accordingly. */ public void setIsImeVisible(boolean isImeVisible) { mTaskbarVisibilityController.animateToVisibilityForIme(isImeVisible ? 0 : 1); } /** * Contains methods that TaskbarStateHandler can call to interface with TaskbarController. */ protected interface TaskbarStateHandlerCallbacks { AnimatedFloat getAlphaTarget(); } /** * Contains methods that TaskbarVisibilityController can call to interface with * TaskbarController. */ protected interface TaskbarVisibilityControllerCallbacks { void updateTaskbarBackgroundAlpha(float alpha); void updateTaskbarVisibilityAlpha(float alpha); } }
quickstep/src/com/android/launcher3/taskbar/TaskbarStateHandler.java 0 → 100644 +77 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 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; import static com.android.launcher3.LauncherState.TASKBAR; import static com.android.launcher3.states.StateAnimationConfig.ANIM_TASKBAR_FADE; import static com.android.launcher3.states.StateAnimationConfig.SKIP_TASKBAR; import androidx.annotation.Nullable; import com.android.launcher3.BaseQuickstepLauncher; import com.android.launcher3.LauncherState; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.statemanager.StateManager; import com.android.launcher3.states.StateAnimationConfig; import com.android.quickstep.AnimatedFloat; /** * StateHandler to animate Taskbar according to Launcher's state machine. Does nothing if Taskbar * isn't present (i.e. {@link #setTaskbarCallbacks} is never called). */ public class TaskbarStateHandler implements StateManager.StateHandler<LauncherState> { private final BaseQuickstepLauncher mLauncher; // Contains Taskbar-related methods and fields we should aniamte. If null, don't do anything. private @Nullable TaskbarController.TaskbarStateHandlerCallbacks mTaskbarCallbacks = null; public TaskbarStateHandler(BaseQuickstepLauncher launcher) { mLauncher = launcher; } public void setTaskbarCallbacks(TaskbarController.TaskbarStateHandlerCallbacks callbacks) { mTaskbarCallbacks = callbacks; } @Override public void setState(LauncherState state) { if (mTaskbarCallbacks == null) { return; } AnimatedFloat alphaTarget = mTaskbarCallbacks.getAlphaTarget(); boolean isTaskbarVisible = (state.getVisibleElements(mLauncher) & TASKBAR) != 0; alphaTarget.updateValue(isTaskbarVisible ? 1f : 0f); } @Override public void setStateWithAnimation(LauncherState toState, StateAnimationConfig config, PendingAnimation animation) { if (mTaskbarCallbacks == null) { return; } if (config.hasAnimationFlag(SKIP_TASKBAR)) { return; } AnimatedFloat alphaTarget = mTaskbarCallbacks.getAlphaTarget(); boolean isTaskbarVisible = (toState.getVisibleElements(mLauncher) & TASKBAR) != 0; animation.setFloat(alphaTarget, AnimatedFloat.VALUE, isTaskbarVisible ? 1f : 0f, config.getInterpolator(ANIM_TASKBAR_FADE, Interpolators.LINEAR)); } }
quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +13 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.launcher3.taskbar; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.util.AttributeSet; import android.widget.LinearLayout; Loading @@ -26,6 +27,9 @@ import androidx.annotation.Nullable; * Hosts the Taskbar content such as Hotseat and Recent Apps. Drawn on top of other apps. */ public class TaskbarView extends LinearLayout { private final ColorDrawable mBackgroundDrawable; public TaskbarView(@NonNull Context context) { this(context, null); } Loading @@ -42,5 +46,14 @@ public class TaskbarView extends LinearLayout { public TaskbarView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); mBackgroundDrawable = (ColorDrawable) getBackground(); } /** * Sets the alpha of the background color behind all the Taskbar contents. * @param alpha 0 is fully transparent, 1 is fully opaque. */ public void setBackgroundAlpha(float alpha) { mBackgroundDrawable.setAlpha((int) (alpha * 255)); } }