Give SysUi top-app while playing charging anim

So that if the device is performing multiple tasks, the charging
animation will be given priority and won't be janky.

Test: manual
Bug: 158678428
Change-Id: I02e31bdac3b46093a76e95e62f2abf4ee47cbb27
This commit is contained in:
Beverly
2020-07-14 11:31:47 -04:00
committed by Beverly Tai
parent 1813474cc9
commit c4b0c2c602
4 changed files with 33 additions and 23 deletions

View File

@@ -207,12 +207,6 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
/** Whether or not the BubbleStackView has been added to the WindowManager. */ /** Whether or not the BubbleStackView has been added to the WindowManager. */
private boolean mAddedToWindowManager = false; private boolean mAddedToWindowManager = false;
/**
* Value from {@link NotificationShadeWindowController#getForceHasTopUi()} when we forced top UI
* due to expansion. We'll restore this value when the stack collapses.
*/
private boolean mHadTopUi = false;
// Listens to user switch so bubbles can be saved and restored. // Listens to user switch so bubbles can be saved and restored.
private final NotificationLockscreenUserManager mNotifUserManager; private final NotificationLockscreenUserManager mNotifUserManager;
@@ -1303,7 +1297,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
// Collapsing? Do this first before remaining steps. // Collapsing? Do this first before remaining steps.
if (update.expandedChanged && !update.expanded) { if (update.expandedChanged && !update.expanded) {
mStackView.setExpanded(false); mStackView.setExpanded(false);
mNotificationShadeWindowController.setForceHasTopUi(mHadTopUi); mNotificationShadeWindowController.setRequestTopUi(false, TAG);
} }
// Do removals, if any. // Do removals, if any.
@@ -1393,8 +1387,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
if (update.expandedChanged && update.expanded) { if (update.expandedChanged && update.expanded) {
if (mStackView != null) { if (mStackView != null) {
mStackView.setExpanded(true); mStackView.setExpanded(true);
mHadTopUi = mNotificationShadeWindowController.getForceHasTopUi(); mNotificationShadeWindowController.setRequestTopUi(true, TAG);
mNotificationShadeWindowController.setForceHasTopUi(true);
} }
} }

View File

@@ -2129,7 +2129,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private boolean mShowing; private boolean mShowing;
private float mScrimAlpha; private float mScrimAlpha;
private ResetOrientationData mResetOrientationData; private ResetOrientationData mResetOrientationData;
private boolean mHadTopUi;
private final NotificationShadeWindowController mNotificationShadeWindowController; private final NotificationShadeWindowController mNotificationShadeWindowController;
private final NotificationShadeDepthController mDepthController; private final NotificationShadeDepthController mDepthController;
private final SysUiState mSysUiState; private final SysUiState mSysUiState;
@@ -2397,8 +2396,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
public void show() { public void show() {
super.show(); super.show();
mShowing = true; mShowing = true;
mHadTopUi = mNotificationShadeWindowController.getForceHasTopUi(); mNotificationShadeWindowController.setRequestTopUi(true, TAG);
mNotificationShadeWindowController.setForceHasTopUi(true);
mSysUiState.setFlag(SYSUI_STATE_GLOBAL_ACTIONS_SHOWING, true) mSysUiState.setFlag(SYSUI_STATE_GLOBAL_ACTIONS_SHOWING, true)
.commitUpdate(mContext.getDisplayId()); .commitUpdate(mContext.getDisplayId());
@@ -2499,7 +2497,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
dismissOverflow(true); dismissOverflow(true);
dismissPowerOptions(true); dismissPowerOptions(true);
if (mControlsUiController != null) mControlsUiController.hide(); if (mControlsUiController != null) mControlsUiController.hide();
mNotificationShadeWindowController.setForceHasTopUi(mHadTopUi); mNotificationShadeWindowController.setRequestTopUi(false, TAG);
mDepthController.updateGlobalDialogVisibility(0, null /* view */); mDepthController.updateGlobalDialogVisibility(0, null /* view */);
mSysUiState.setFlag(SYSUI_STATE_GLOBAL_ACTIONS_SHOWING, false) mSysUiState.setFlag(SYSUI_STATE_GLOBAL_ACTIONS_SHOWING, false)
.commitUpdate(mContext.getDisplayId()); .commitUpdate(mContext.getDisplayId());

View File

@@ -61,6 +61,8 @@ import java.lang.ref.WeakReference;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
import javax.inject.Inject; import javax.inject.Inject;
@@ -432,7 +434,7 @@ public class NotificationShadeWindowController implements Callback, Dumpable,
} }
private void applyHasTopUi(State state) { private void applyHasTopUi(State state) {
mHasTopUiChanged = state.mForceHasTopUi || isExpanded(state); mHasTopUiChanged = !state.mComponentsForcingTopUi.isEmpty() || isExpanded(state);
} }
private void applyNotTouchable(State state) { private void applyNotTouchable(State state) {
@@ -635,12 +637,17 @@ public class NotificationShadeWindowController implements Callback, Dumpable,
apply(mCurrentState); apply(mCurrentState);
} }
public boolean getForceHasTopUi() { /**
return mCurrentState.mForceHasTopUi; * SystemUI may need top-ui to avoid jank when performing animations. After the
} * animation is performed, the component should remove itself from the list of features that
* are forcing SystemUI to be top-ui.
public void setForceHasTopUi(boolean forceHasTopUi) { */
mCurrentState.mForceHasTopUi = forceHasTopUi; public void setRequestTopUi(boolean requestTopUi, String componentTag) {
if (requestTopUi) {
mCurrentState.mComponentsForcingTopUi.add(componentTag);
} else {
mCurrentState.mComponentsForcingTopUi.remove(componentTag);
}
apply(mCurrentState); apply(mCurrentState);
} }
@@ -663,7 +670,7 @@ public class NotificationShadeWindowController implements Callback, Dumpable,
boolean mBackdropShowing; boolean mBackdropShowing;
boolean mWallpaperSupportsAmbientMode; boolean mWallpaperSupportsAmbientMode;
boolean mNotTouchable; boolean mNotTouchable;
boolean mForceHasTopUi; Set<String> mComponentsForcingTopUi = new HashSet<>();
/** /**
* The {@link StatusBar} state from the status bar. * The {@link StatusBar} state from the status bar.

View File

@@ -213,7 +213,6 @@ import com.android.systemui.statusbar.notification.stack.NotificationListContain
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
import com.android.systemui.statusbar.phone.dagger.StatusBarPhoneModule; import com.android.systemui.statusbar.phone.dagger.StatusBarPhoneModule;
import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
import com.android.systemui.statusbar.policy.BrightnessMirrorController; import com.android.systemui.statusbar.policy.BrightnessMirrorController;
import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
@@ -2397,18 +2396,31 @@ public class StatusBar extends SystemUI implements DemoMode,
new WirelessChargingAnimation.Callback() { new WirelessChargingAnimation.Callback() {
@Override @Override
public void onAnimationStarting() { public void onAnimationStarting() {
mNotificationShadeWindowController.setRequestTopUi(true, TAG);
CrossFadeHelper.fadeOut(mNotificationPanelViewController.getView(), 1); CrossFadeHelper.fadeOut(mNotificationPanelViewController.getView(), 1);
} }
@Override @Override
public void onAnimationEnded() { public void onAnimationEnded() {
CrossFadeHelper.fadeIn(mNotificationPanelViewController.getView()); CrossFadeHelper.fadeIn(mNotificationPanelViewController.getView());
mNotificationShadeWindowController.setRequestTopUi(false, TAG);
} }
}, mDozing).show(animationDelay); }, mDozing).show(animationDelay);
} else { } else {
// workspace // workspace
WirelessChargingAnimation.makeWirelessChargingAnimation(mContext, null, WirelessChargingAnimation.makeWirelessChargingAnimation(mContext, null,
transmittingBatteryLevel, batteryLevel, null, false).show(animationDelay); transmittingBatteryLevel, batteryLevel,
new WirelessChargingAnimation.Callback() {
@Override
public void onAnimationStarting() {
mNotificationShadeWindowController.setRequestTopUi(true, TAG);
}
@Override
public void onAnimationEnded() {
mNotificationShadeWindowController.setRequestTopUi(false, TAG);
}
}, false).show(animationDelay);
} }
} }