Merge "Add debug logs for why taskbar might not be destroyed" into tm-qpr-dev
diff --git a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java
index c165750..ed4a212 100644
--- a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java
@@ -15,6 +15,7 @@
*/
package com.android.launcher3.taskbar;
+import static com.android.launcher3.Utilities.isRunningInTestHarness;
import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_APP;
import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_STASHED_LAUNCHER_STATE;
@@ -80,10 +81,13 @@
* Currently this animation just force stashes the taskbar in Overview.
*/
public Animator createAnimToRecentsState(RecentsState toState, long duration) {
- boolean useStashedLauncherState = toState.hasOverviewActions();
- boolean stashedLauncherState =
- useStashedLauncherState && FeatureFlags.ENABLE_GRID_ONLY_OVERVIEW.get()
- && toState == RecentsState.MODAL_TASK;
+ // Force stash the taskbar in overview modal state or when going home. We do not force
+ // stash on home when running in a test as 3p launchers rely on taskbar instead of hotseat.
+ boolean isGoingHome = toState == RecentsState.HOME && !isRunningInTestHarness();
+ boolean useStashedLauncherState = toState.hasOverviewActions() || isGoingHome;
+ boolean stashedLauncherState = useStashedLauncherState && (
+ (FeatureFlags.ENABLE_GRID_ONLY_OVERVIEW.get() && toState == RecentsState.MODAL_TASK)
+ || isGoingHome);
TaskbarStashController stashController = mControllers.taskbarStashController;
// Set both FLAG_IN_STASHED_LAUNCHER_STATE and FLAG_IN_APP to ensure the state is respected.
// For all other states, just use the current stashed-in-app setting (e.g. if long clicked).
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java
index edcd4c8..03d08eb 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java
@@ -1,17 +1,17 @@
package com.android.launcher3.taskbar;
import static com.android.launcher3.AbstractFloatingView.TYPE_ALL;
-import static com.android.systemui.shared.system.QuickStepContract.SCREEN_STATE_OFF;
+import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_AWAKE;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BACK_DISABLED;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DOZING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DREAMING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED;
-import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_ON;
-import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_STATE_MASK;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED;
+import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_WAKEFULNESS_MASK;
+import static com.android.systemui.shared.system.QuickStepContract.WAKEFULNESS_ASLEEP;
import android.app.KeyguardManager;
@@ -29,7 +29,7 @@
| SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING | SYSUI_STATE_DEVICE_DOZING
| SYSUI_STATE_OVERVIEW_DISABLED | SYSUI_STATE_HOME_DISABLED
| SYSUI_STATE_BACK_DISABLED | SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED
- | SYSUI_STATE_SCREEN_STATE_MASK;
+ | SYSUI_STATE_WAKEFULNESS_MASK;
// If any of these SysUi flags (via QuickstepContract) is set, the device to be considered
// locked.
@@ -75,13 +75,13 @@
keyguardOccluded);
updateIconsForBouncer();
- boolean screenOffOrTransitioningOff = (systemUiStateFlags & SYSUI_STATE_SCREEN_ON) == 0;
- boolean closeFloatingViews = keyguardShowing || screenOffOrTransitioningOff;
+ boolean asleepOrGoingToSleep = (systemUiStateFlags & SYSUI_STATE_AWAKE) == 0;
+ boolean closeFloatingViews = keyguardShowing || asleepOrGoingToSleep;
if (closeFloatingViews) {
- // animate the closing of the views, unless the screen is already fully turned off.
+ // animate the closing of the views, unless the screen is already asleep.
boolean animateViewClosing =
- (systemUiStateFlags & SYSUI_STATE_SCREEN_STATE_MASK) != SCREEN_STATE_OFF;
+ (systemUiStateFlags & SYSUI_STATE_WAKEFULNESS_MASK) != WAKEFULNESS_ASLEEP;
AbstractFloatingView.closeOpenViews(mContext, animateViewClosing, TYPE_ALL);
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
index cf8148e..b98ea81 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
@@ -22,7 +22,7 @@
import static com.android.launcher3.util.FlagDebugUtils.appendFlag;
import static com.android.launcher3.util.FlagDebugUtils.formatFlagChange;
import static com.android.systemui.animation.Interpolators.EMPHASIZED;
-import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_ON;
+import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_AWAKE;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -81,17 +81,17 @@
*
* This is cleared as soon as the screen begins to transition off.
*/
- private static final int FLAG_SCREEN_ON = 1 << 3;
+ private static final int FLAG_AWAKE = 1 << 3;
/**
- * Captures whether the launcher was active at the time the FLAG_SCREEN_ON was cleared.
- * Always cleared when FLAG_SCREEN_ON is set.
+ * Captures whether the launcher was active at the time the FLAG_AWAKE was cleared.
+ * Always cleared when FLAG_AWAKE is set.
* <p>
- * FLAG_RESUMED will be cleared when the screen is off, since all apps get paused at this point.
- * Thus, this flag indicates whether the launcher will be shown when the screen gets turned on
+ * FLAG_RESUMED will be cleared when the device is asleep, since all apps get paused at this
+ * point. Thus, this flag indicates whether the launcher will be shown when the device wakes up
* again.
*/
- private static final int FLAG_LAUNCHER_ACTIVE_AT_SCREEN_OFF = 1 << 4;
+ private static final int FLAG_LAUNCHER_WAS_ACTIVE_WHILE_AWAKE = 1 << 4;
/** Whether the device is currently locked. */
private static final int FLAG_DEVICE_LOCKED = 1 << 5;
@@ -265,15 +265,15 @@
/** SysUI flags updated, see QuickStepContract.SYSUI_STATE_* values. */
public void updateStateForSysuiFlags(int systemUiStateFlags, boolean skipAnim) {
- final boolean prevScreenIsOn = hasAnyFlag(FLAG_SCREEN_ON);
- final boolean currScreenIsOn = hasAnyFlag(systemUiStateFlags, SYSUI_STATE_SCREEN_ON);
+ final boolean prevIsAwake = hasAnyFlag(FLAG_AWAKE);
+ final boolean currIsAwake = hasAnyFlag(systemUiStateFlags, SYSUI_STATE_AWAKE);
- updateStateForFlag(FLAG_SCREEN_ON, currScreenIsOn);
- if (prevScreenIsOn != currScreenIsOn) {
+ updateStateForFlag(FLAG_AWAKE, currIsAwake);
+ if (prevIsAwake != currIsAwake) {
// The screen is switching between on/off. When turning off, capture whether the
// launcher is active and memoize this state.
- updateStateForFlag(FLAG_LAUNCHER_ACTIVE_AT_SCREEN_OFF,
- prevScreenIsOn && hasAnyFlag(FLAGS_LAUNCHER_ACTIVE));
+ updateStateForFlag(FLAG_LAUNCHER_WAS_ACTIVE_WHILE_AWAKE,
+ prevIsAwake && hasAnyFlag(FLAGS_LAUNCHER_ACTIVE));
}
boolean isDeviceLocked = hasAnyFlag(systemUiStateFlags, MASK_ANY_SYSUI_LOCKED);
@@ -377,7 +377,7 @@
}
}
- if (hasAnyFlag(changedFlags, FLAGS_LAUNCHER_ACTIVE | FLAG_SCREEN_ON)) {
+ if (hasAnyFlag(changedFlags, FLAGS_LAUNCHER_ACTIVE | FLAG_AWAKE)) {
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
@@ -573,10 +573,10 @@
/** Whether the launcher is considered active. */
private boolean isInLauncher() {
- if (hasAnyFlag(FLAG_SCREEN_ON)) {
+ if (hasAnyFlag(FLAG_AWAKE)) {
return hasAnyFlag(FLAGS_LAUNCHER_ACTIVE);
} else {
- return hasAnyFlag(FLAG_LAUNCHER_ACTIVE_AT_SCREEN_OFF);
+ return hasAnyFlag(FLAG_LAUNCHER_WAS_ACTIVE_WHILE_AWAKE);
}
}
@@ -677,9 +677,9 @@
appendFlag(result, flags, FLAG_TRANSITION_TO_RESUMED, "transition_to_resumed");
appendFlag(result, flags, FLAG_LAUNCHER_IN_STATE_TRANSITION,
"launcher_in_state_transition");
- appendFlag(result, flags, FLAG_SCREEN_ON, "screen_on");
- appendFlag(result, flags, FLAG_LAUNCHER_ACTIVE_AT_SCREEN_OFF,
- "launcher_active_at_screen_off");
+ appendFlag(result, flags, FLAG_AWAKE, "awake");
+ appendFlag(result, flags, FLAG_LAUNCHER_WAS_ACTIVE_WHILE_AWAKE,
+ "was_active_while_awake");
appendFlag(result, flags, FLAG_DEVICE_LOCKED, "device_locked");
return result.toString();
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
index 4ab093f..6eb409e 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
@@ -286,7 +286,7 @@
}
private ValueAnimator createRevealAnimForView(View view, boolean isStashed, float newWidth,
- boolean shouldStartAlign) {
+ boolean isQsb) {
Rect viewBounds = new Rect(0, 0, view.getWidth(), view.getHeight());
int centerY = viewBounds.centerY();
int halfHandleHeight = mStashedHandleHeight / 2;
@@ -295,7 +295,8 @@
final int left;
final int right;
- if (shouldStartAlign) {
+ // QSB will crop from the 'start' whereas all other icons will crop from the center.
+ if (isQsb) {
if (mIsRtl) {
right = viewBounds.right;
left = (int) (right - newWidth);
@@ -311,7 +312,10 @@
}
Rect stashedRect = new Rect(left, top, right, bottom);
- float radius = viewBounds.height() / 2f;
+ // QSB radius can be > 0 since it does not have any UI elements outside of it bounds.
+ float radius = isQsb
+ ? viewBounds.height() / 2f
+ : 0f;
float stashedRadius = stashedRect.height() / 2f;
return new RoundedRectRevealOutlineProvider(radius, stashedRadius, viewBounds, stashedRect)
diff --git a/src/com/android/launcher3/util/ViewOnDrawExecutor.java b/src/com/android/launcher3/util/ViewOnDrawExecutor.java
index 5d90291..3fa5799 100644
--- a/src/com/android/launcher3/util/ViewOnDrawExecutor.java
+++ b/src/com/android/launcher3/util/ViewOnDrawExecutor.java
@@ -16,11 +16,13 @@
package com.android.launcher3.util;
+import android.util.Log;
import android.view.View;
import android.view.View.OnAttachStateChangeListener;
import android.view.ViewTreeObserver.OnDrawListener;
import com.android.launcher3.Launcher;
+import com.android.launcher3.testing.shared.TestProtocol;
import java.util.function.Consumer;
@@ -42,12 +44,21 @@
private boolean mCancelled;
public ViewOnDrawExecutor(RunnableList tasks) {
+ if (TestProtocol.sDebugTracing) {
+ Log.d(TestProtocol.FLAKY_BINDING, "Initialize ViewOnDrawExecutor");
+ }
mTasks = tasks;
}
public void attachTo(Launcher launcher) {
mOnClearCallback = launcher::clearPendingExecutor;
mAttachedView = launcher.getWorkspace();
+
+ if (TestProtocol.sDebugTracing) {
+ Log.d(TestProtocol.FLAKY_BINDING, "ViewOnDrawExecutor.attachTo: launcher=" + launcher
+ + ", isAttachedToWindow=" + mAttachedView.isAttachedToWindow());
+ }
+
mAttachedView.addOnAttachStateChangeListener(this);
if (mAttachedView.isAttachedToWindow()) {
@@ -56,6 +67,10 @@
}
private void attachObserver() {
+ if (TestProtocol.sDebugTracing) {
+ Log.d(TestProtocol.FLAKY_BINDING,
+ "ViewOnDrawExecutor.attachObserver: mCompleted=" + mCompleted);
+ }
if (!mCompleted) {
mAttachedView.getViewTreeObserver().addOnDrawListener(this);
}
@@ -63,6 +78,9 @@
@Override
public void onViewAttachedToWindow(View v) {
+ if (TestProtocol.sDebugTracing) {
+ Log.d(TestProtocol.FLAKY_BINDING, "ViewOnDrawExecutor.onViewAttachedToWindow");
+ }
attachObserver();
}
@@ -71,11 +89,19 @@
@Override
public void onDraw() {
+ if (TestProtocol.sDebugTracing) {
+ Log.d(TestProtocol.FLAKY_BINDING, "ViewOnDrawExecutor.onDraw");
+ }
mFirstDrawCompleted = true;
mAttachedView.post(this);
}
public void onLoadAnimationCompleted() {
+ if (TestProtocol.sDebugTracing) {
+ Log.d(TestProtocol.FLAKY_BINDING,
+ "ViewOnDrawExecutor.onLoadAnimationCompleted: mAttachedView != null="
+ + (mAttachedView != null));
+ }
mLoadAnimationCompleted = true;
if (mAttachedView != null) {
mAttachedView.post(this);
@@ -84,6 +110,12 @@
@Override
public void run() {
+ if (TestProtocol.sDebugTracing) {
+ Log.d(TestProtocol.FLAKY_BINDING,
+ "ViewOnDrawExecutor.run: mLoadAnimationCompleted=" + mLoadAnimationCompleted
+ + ", mFirstDrawCompleted=" + mFirstDrawCompleted
+ + ", mCompleted=" + mCompleted);
+ }
// Post the pending tasks after both onDraw and onLoadAnimationCompleted have been called.
if (mLoadAnimationCompleted && mFirstDrawCompleted && !mCompleted) {
markCompleted();
@@ -94,6 +126,12 @@
* Executes all tasks immediately
*/
public void markCompleted() {
+ if (TestProtocol.sDebugTracing) {
+ Log.d(TestProtocol.FLAKY_BINDING,
+ "ViewOnDrawExecutor.markCompleted: mCancelled=" + mCancelled
+ + ", mOnClearCallback != null=" + (mOnClearCallback != null)
+ + ", mAttachedView != null=" + (mAttachedView != null));
+ }
if (!mCancelled) {
mTasks.executeAllAndDestroy();
}
@@ -108,6 +146,9 @@
}
public void cancel() {
+ if (TestProtocol.sDebugTracing) {
+ Log.d(TestProtocol.FLAKY_BINDING, "ViewOnDrawExecutor.cancel");
+ }
mCancelled = true;
markCompleted();
}