DO NOT MERGE Hide UDFPS affordance when some dialogs show

- Add SystemUIDialogManager which tracks dialogs
and will send signals to listeners to hide affordances
when their managed dialogs are showing
- This CL hooks up SystemUIDialogManager to the showing
of the media output switcher and the global actions menu.
- If future dialogs should hide the udfps affordace,
it should pass the SystemUIDialogManager to the constructor
of the SystemUIDialog.

Fixes: 209042127
Fixes: 193517370
Test: atest SystemUITests
Test: manual test
  1. Enroll UDFPS, set power button => power dialog
  2. On the lock screen, long press power button
  Observe: udfps affordance disappears
Test: manual test
  1. Enroll UDFPS, play media so that a notification shows
  2. On LS, change the media output from the notification
    Observe: media output dialog appears and the udfps affordance
    disappears
  3. Tap on "Pair new device"
    Observe: UDFPS reappears to authenticate
Change-Id: Ia53ad92375a534bacd8956350ae3a31660e9c703
This commit is contained in:
Beverly
2021-12-09 11:44:30 -05:00
parent aebceb0325
commit e12375e4ea
21 changed files with 252 additions and 39 deletions

View File

@@ -23,6 +23,7 @@ import android.graphics.RectF;
import com.android.systemui.Dumpable; import com.android.systemui.Dumpable;
import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionListener; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionListener;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
import com.android.systemui.util.ViewController; import com.android.systemui.util.ViewController;
@@ -44,6 +45,7 @@ abstract class UdfpsAnimationViewController<T extends UdfpsAnimationView>
extends ViewController<T> implements Dumpable { extends ViewController<T> implements Dumpable {
@NonNull final StatusBarStateController mStatusBarStateController; @NonNull final StatusBarStateController mStatusBarStateController;
@NonNull final PanelExpansionStateManager mPanelExpansionStateManager; @NonNull final PanelExpansionStateManager mPanelExpansionStateManager;
@NonNull final SystemUIDialogManager mDialogManager;
@NonNull final DumpManager mDumpManger; @NonNull final DumpManager mDumpManger;
boolean mNotificationShadeVisible; boolean mNotificationShadeVisible;
@@ -52,10 +54,12 @@ abstract class UdfpsAnimationViewController<T extends UdfpsAnimationView>
T view, T view,
@NonNull StatusBarStateController statusBarStateController, @NonNull StatusBarStateController statusBarStateController,
@NonNull PanelExpansionStateManager panelExpansionStateManager, @NonNull PanelExpansionStateManager panelExpansionStateManager,
@NonNull SystemUIDialogManager dialogManager,
@NonNull DumpManager dumpManager) { @NonNull DumpManager dumpManager) {
super(view); super(view);
mStatusBarStateController = statusBarStateController; mStatusBarStateController = statusBarStateController;
mPanelExpansionStateManager = panelExpansionStateManager; mPanelExpansionStateManager = panelExpansionStateManager;
mDialogManager = dialogManager;
mDumpManger = dumpManager; mDumpManger = dumpManager;
} }
@@ -64,12 +68,14 @@ abstract class UdfpsAnimationViewController<T extends UdfpsAnimationView>
@Override @Override
protected void onViewAttached() { protected void onViewAttached() {
mPanelExpansionStateManager.addExpansionListener(mPanelExpansionListener); mPanelExpansionStateManager.addExpansionListener(mPanelExpansionListener);
mDialogManager.registerListener(mDialogListener);
mDumpManger.registerDumpable(getDumpTag(), this); mDumpManger.registerDumpable(getDumpTag(), this);
} }
@Override @Override
protected void onViewDetached() { protected void onViewDetached() {
mPanelExpansionStateManager.removeExpansionListener(mPanelExpansionListener); mPanelExpansionStateManager.removeExpansionListener(mPanelExpansionListener);
mDialogManager.registerListener(mDialogListener);
mDumpManger.unregisterDumpable(getDumpTag()); mDumpManger.unregisterDumpable(getDumpTag());
} }
@@ -95,7 +101,8 @@ abstract class UdfpsAnimationViewController<T extends UdfpsAnimationView>
* authentication. * authentication.
*/ */
boolean shouldPauseAuth() { boolean shouldPauseAuth() {
return mNotificationShadeVisible; return mNotificationShadeVisible
|| mDialogManager.shouldHideAffordance();
} }
/** /**
@@ -189,4 +196,7 @@ abstract class UdfpsAnimationViewController<T extends UdfpsAnimationView>
updatePauseAuth(); updatePauseAuth();
} }
}; };
private final SystemUIDialogManager.Listener mDialogListener =
(shouldHide) -> updatePauseAuth();
} }

View File

@@ -20,6 +20,7 @@ import android.annotation.NonNull;
import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
/** /**
@@ -30,8 +31,10 @@ class UdfpsBpViewController extends UdfpsAnimationViewController<UdfpsBpView> {
@NonNull UdfpsBpView view, @NonNull UdfpsBpView view,
@NonNull StatusBarStateController statusBarStateController, @NonNull StatusBarStateController statusBarStateController,
@NonNull PanelExpansionStateManager panelExpansionStateManager, @NonNull PanelExpansionStateManager panelExpansionStateManager,
@NonNull SystemUIDialogManager systemUIDialogManager,
@NonNull DumpManager dumpManager) { @NonNull DumpManager dumpManager) {
super(view, statusBarStateController, panelExpansionStateManager, dumpManager); super(view, statusBarStateController, panelExpansionStateManager,
systemUIDialogManager, dumpManager);
} }
@Override @Override

View File

@@ -70,6 +70,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.LockscreenShadeTransitionController; import com.android.systemui.statusbar.LockscreenShadeTransitionController;
import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -118,6 +119,7 @@ public class UdfpsController implements DozeReceiver {
@NonNull private final KeyguardStateController mKeyguardStateController; @NonNull private final KeyguardStateController mKeyguardStateController;
@NonNull private final StatusBarKeyguardViewManager mKeyguardViewManager; @NonNull private final StatusBarKeyguardViewManager mKeyguardViewManager;
@NonNull private final DumpManager mDumpManager; @NonNull private final DumpManager mDumpManager;
@NonNull private final SystemUIDialogManager mDialogManager;
@NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; @NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@Nullable private final Vibrator mVibrator; @Nullable private final Vibrator mVibrator;
@NonNull private final FalsingManager mFalsingManager; @NonNull private final FalsingManager mFalsingManager;
@@ -552,7 +554,8 @@ public class UdfpsController implements DozeReceiver {
@Main Handler mainHandler, @Main Handler mainHandler,
@NonNull ConfigurationController configurationController, @NonNull ConfigurationController configurationController,
@NonNull SystemClock systemClock, @NonNull SystemClock systemClock,
@NonNull UnlockedScreenOffAnimationController unlockedScreenOffAnimationController) { @NonNull UnlockedScreenOffAnimationController unlockedScreenOffAnimationController,
@NonNull SystemUIDialogManager dialogManager) {
mContext = context; mContext = context;
mExecution = execution; mExecution = execution;
mVibrator = vibrator; mVibrator = vibrator;
@@ -567,6 +570,7 @@ public class UdfpsController implements DozeReceiver {
mKeyguardStateController = keyguardStateController; mKeyguardStateController = keyguardStateController;
mKeyguardViewManager = statusBarKeyguardViewManager; mKeyguardViewManager = statusBarKeyguardViewManager;
mDumpManager = dumpManager; mDumpManager = dumpManager;
mDialogManager = dialogManager;
mKeyguardUpdateMonitor = keyguardUpdateMonitor; mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mFalsingManager = falsingManager; mFalsingManager = falsingManager;
mPowerManager = powerManager; mPowerManager = powerManager;
@@ -815,6 +819,7 @@ public class UdfpsController implements DozeReceiver {
mServerRequest.mEnrollHelper, mServerRequest.mEnrollHelper,
mStatusBarStateController, mStatusBarStateController,
mPanelExpansionStateManager, mPanelExpansionStateManager,
mDialogManager,
mDumpManager mDumpManager
); );
case BiometricOverlayConstants.REASON_AUTH_KEYGUARD: case BiometricOverlayConstants.REASON_AUTH_KEYGUARD:
@@ -833,6 +838,7 @@ public class UdfpsController implements DozeReceiver {
mSystemClock, mSystemClock,
mKeyguardStateController, mKeyguardStateController,
mUnlockedScreenOffAnimationController, mUnlockedScreenOffAnimationController,
mDialogManager,
this this
); );
case BiometricOverlayConstants.REASON_AUTH_BP: case BiometricOverlayConstants.REASON_AUTH_BP:
@@ -843,6 +849,7 @@ public class UdfpsController implements DozeReceiver {
bpView, bpView,
mStatusBarStateController, mStatusBarStateController,
mPanelExpansionStateManager, mPanelExpansionStateManager,
mDialogManager,
mDumpManager mDumpManager
); );
case BiometricOverlayConstants.REASON_AUTH_OTHER: case BiometricOverlayConstants.REASON_AUTH_OTHER:
@@ -854,6 +861,7 @@ public class UdfpsController implements DozeReceiver {
authOtherView, authOtherView,
mStatusBarStateController, mStatusBarStateController,
mPanelExpansionStateManager, mPanelExpansionStateManager,
mDialogManager,
mDumpManager mDumpManager
); );
default: default:

View File

@@ -22,6 +22,7 @@ import android.graphics.PointF;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
/** /**
@@ -54,8 +55,10 @@ public class UdfpsEnrollViewController extends UdfpsAnimationViewController<Udfp
@NonNull UdfpsEnrollHelper enrollHelper, @NonNull UdfpsEnrollHelper enrollHelper,
@NonNull StatusBarStateController statusBarStateController, @NonNull StatusBarStateController statusBarStateController,
@NonNull PanelExpansionStateManager panelExpansionStateManager, @NonNull PanelExpansionStateManager panelExpansionStateManager,
@NonNull SystemUIDialogManager systemUIDialogManager,
@NonNull DumpManager dumpManager) { @NonNull DumpManager dumpManager) {
super(view, statusBarStateController, panelExpansionStateManager, dumpManager); super(view, statusBarStateController, panelExpansionStateManager, systemUIDialogManager,
dumpManager);
mEnrollProgressBarRadius = getContext().getResources() mEnrollProgressBarRadius = getContext().getResources()
.getInteger(R.integer.config_udfpsEnrollProgressBar); .getInteger(R.integer.config_udfpsEnrollProgressBar);
mEnrollHelper = enrollHelper; mEnrollHelper = enrollHelper;

View File

@@ -20,6 +20,7 @@ import android.annotation.NonNull;
import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
/** /**
@@ -33,8 +34,10 @@ class UdfpsFpmOtherViewController extends UdfpsAnimationViewController<UdfpsFpmO
@NonNull UdfpsFpmOtherView view, @NonNull UdfpsFpmOtherView view,
@NonNull StatusBarStateController statusBarStateController, @NonNull StatusBarStateController statusBarStateController,
@NonNull PanelExpansionStateManager panelExpansionStateManager, @NonNull PanelExpansionStateManager panelExpansionStateManager,
@NonNull SystemUIDialogManager systemUIDialogManager,
@NonNull DumpManager dumpManager) { @NonNull DumpManager dumpManager) {
super(view, statusBarStateController, panelExpansionStateManager, dumpManager); super(view, statusBarStateController, panelExpansionStateManager, systemUIDialogManager,
dumpManager);
} }
@Override @Override

View File

@@ -31,6 +31,7 @@ import com.android.systemui.statusbar.LockscreenShadeTransitionController;
import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.KeyguardBouncer; import com.android.systemui.statusbar.phone.KeyguardBouncer;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionListener; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionListener;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
@@ -86,8 +87,10 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
@NonNull SystemClock systemClock, @NonNull SystemClock systemClock,
@NonNull KeyguardStateController keyguardStateController, @NonNull KeyguardStateController keyguardStateController,
@NonNull UnlockedScreenOffAnimationController unlockedScreenOffAnimationController, @NonNull UnlockedScreenOffAnimationController unlockedScreenOffAnimationController,
@NonNull SystemUIDialogManager systemUIDialogManager,
@NonNull UdfpsController udfpsController) { @NonNull UdfpsController udfpsController) {
super(view, statusBarStateController, panelExpansionStateManager, dumpManager); super(view, statusBarStateController, panelExpansionStateManager, systemUIDialogManager,
dumpManager);
mKeyguardViewManager = statusBarKeyguardViewManager; mKeyguardViewManager = statusBarKeyguardViewManager;
mKeyguardUpdateMonitor = keyguardUpdateMonitor; mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mLockScreenShadeTransitionController = transitionController; mLockScreenShadeTransitionController = transitionController;
@@ -217,6 +220,10 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud
return false; return false;
} }
if (mDialogManager.shouldHideAffordance()) {
return true;
}
if (mLaunchTransitionFadingAway) { if (mLaunchTransitionFadingAway) {
return true; return true;
} }

View File

@@ -121,6 +121,7 @@ import com.android.systemui.scrim.ScrimDrawable;
import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.telephony.TelephonyListenerManager; import com.android.systemui.telephony.TelephonyListenerManager;
@@ -236,6 +237,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
protected Handler mMainHandler; protected Handler mMainHandler;
private int mSmallestScreenWidthDp; private int mSmallestScreenWidthDp;
private final Optional<StatusBar> mStatusBarOptional; private final Optional<StatusBar> mStatusBarOptional;
private final SystemUIDialogManager mDialogManager;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private final DialogLaunchAnimator mDialogLaunchAnimator; private final DialogLaunchAnimator mDialogLaunchAnimator;
@@ -346,7 +348,8 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
PackageManager packageManager, PackageManager packageManager,
Optional<StatusBar> statusBarOptional, Optional<StatusBar> statusBarOptional,
KeyguardUpdateMonitor keyguardUpdateMonitor, KeyguardUpdateMonitor keyguardUpdateMonitor,
DialogLaunchAnimator dialogLaunchAnimator) { DialogLaunchAnimator dialogLaunchAnimator,
SystemUIDialogManager dialogManager) {
mContext = context; mContext = context;
mWindowManagerFuncs = windowManagerFuncs; mWindowManagerFuncs = windowManagerFuncs;
mAudioManager = audioManager; mAudioManager = audioManager;
@@ -378,6 +381,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
mStatusBarOptional = statusBarOptional; mStatusBarOptional = statusBarOptional;
mKeyguardUpdateMonitor = keyguardUpdateMonitor; mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mDialogLaunchAnimator = dialogLaunchAnimator; mDialogLaunchAnimator = dialogLaunchAnimator;
mDialogManager = dialogManager;
// receive broadcasts // receive broadcasts
IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter();
@@ -677,7 +681,8 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
mAdapter, mOverflowAdapter, mSysuiColorExtractor, mAdapter, mOverflowAdapter, mSysuiColorExtractor,
mStatusBarService, mNotificationShadeWindowController, mStatusBarService, mNotificationShadeWindowController,
mSysUiState, this::onRefresh, mKeyguardShowing, mPowerAdapter, mUiEventLogger, mSysUiState, this::onRefresh, mKeyguardShowing, mPowerAdapter, mUiEventLogger,
mStatusBarOptional, mKeyguardUpdateMonitor, mLockPatternUtils); mStatusBarOptional, mKeyguardUpdateMonitor, mLockPatternUtils,
mDialogManager);
dialog.setOnDismissListener(this); dialog.setOnDismissListener(this);
dialog.setOnShowListener(this); dialog.setOnShowListener(this);
@@ -2219,10 +2224,12 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
SysUiState sysuiState, Runnable onRefreshCallback, boolean keyguardShowing, SysUiState sysuiState, Runnable onRefreshCallback, boolean keyguardShowing,
MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger, MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger,
Optional<StatusBar> statusBarOptional, Optional<StatusBar> statusBarOptional,
KeyguardUpdateMonitor keyguardUpdateMonitor, LockPatternUtils lockPatternUtils) { KeyguardUpdateMonitor keyguardUpdateMonitor, LockPatternUtils lockPatternUtils,
SystemUIDialogManager systemUiDialogManager) {
// We set dismissOnDeviceLock to false because we have a custom broadcast receiver to // We set dismissOnDeviceLock to false because we have a custom broadcast receiver to
// dismiss this dialog when the device is locked. // dismiss this dialog when the device is locked.
super(context, themeRes, false /* dismissOnDeviceLock */); super(context, themeRes, false /* dismissOnDeviceLock */,
systemUiDialogManager);
mContext = context; mContext = context;
mAdapter = adapter; mAdapter = adapter;
mOverflowAdapter = overflowAdapter; mOverflowAdapter = overflowAdapter;

View File

@@ -44,6 +44,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
/** /**
* Base dialog for media output UI * Base dialog for media output UI
@@ -82,8 +83,9 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements
} }
}; };
public MediaOutputBaseDialog(Context context, MediaOutputController mediaOutputController) { public MediaOutputBaseDialog(Context context, MediaOutputController mediaOutputController,
super(context); SystemUIDialogManager dialogManager) {
super(context, dialogManager);
// Save the context that is wrapped with our theme. // Save the context that is wrapped with our theme.
mContext = getContext(); mContext = getContext();

View File

@@ -56,6 +56,7 @@ import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@@ -80,6 +81,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
private final ShadeController mShadeController; private final ShadeController mShadeController;
private final ActivityStarter mActivityStarter; private final ActivityStarter mActivityStarter;
private final DialogLaunchAnimator mDialogLaunchAnimator; private final DialogLaunchAnimator mDialogLaunchAnimator;
private final SystemUIDialogManager mDialogManager;
private final List<MediaDevice> mGroupMediaDevices = new CopyOnWriteArrayList<>(); private final List<MediaDevice> mGroupMediaDevices = new CopyOnWriteArrayList<>();
private final boolean mAboveStatusbar; private final boolean mAboveStatusbar;
private final boolean mVolumeAdjustmentForRemoteGroupSessions; private final boolean mVolumeAdjustmentForRemoteGroupSessions;
@@ -101,7 +103,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
boolean aboveStatusbar, MediaSessionManager mediaSessionManager, LocalBluetoothManager boolean aboveStatusbar, MediaSessionManager mediaSessionManager, LocalBluetoothManager
lbm, ShadeController shadeController, ActivityStarter starter, lbm, ShadeController shadeController, ActivityStarter starter,
NotificationEntryManager notificationEntryManager, UiEventLogger uiEventLogger, NotificationEntryManager notificationEntryManager, UiEventLogger uiEventLogger,
DialogLaunchAnimator dialogLaunchAnimator) { DialogLaunchAnimator dialogLaunchAnimator, SystemUIDialogManager dialogManager) {
mContext = context; mContext = context;
mPackageName = packageName; mPackageName = packageName;
mMediaSessionManager = mediaSessionManager; mMediaSessionManager = mediaSessionManager;
@@ -117,6 +119,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
mDialogLaunchAnimator = dialogLaunchAnimator; mDialogLaunchAnimator = dialogLaunchAnimator;
mVolumeAdjustmentForRemoteGroupSessions = mContext.getResources().getBoolean( mVolumeAdjustmentForRemoteGroupSessions = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_volumeAdjustmentForRemoteGroupSessions); com.android.internal.R.bool.config_volumeAdjustmentForRemoteGroupSessions);
mDialogManager = dialogManager;
} }
void start(@NonNull Callback cb) { void start(@NonNull Callback cb) {
@@ -478,9 +481,10 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback {
// We show the output group dialog from the output dialog. // We show the output group dialog from the output dialog.
MediaOutputController controller = new MediaOutputController(mContext, mPackageName, MediaOutputController controller = new MediaOutputController(mContext, mPackageName,
mAboveStatusbar, mMediaSessionManager, mLocalBluetoothManager, mShadeController, mAboveStatusbar, mMediaSessionManager, mLocalBluetoothManager, mShadeController,
mActivityStarter, mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator); mActivityStarter, mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator,
mDialogManager);
MediaOutputGroupDialog dialog = new MediaOutputGroupDialog(mContext, mAboveStatusbar, MediaOutputGroupDialog dialog = new MediaOutputGroupDialog(mContext, mAboveStatusbar,
controller); controller, mDialogManager);
mDialogLaunchAnimator.showFromView(dialog, mediaOutputDialog); mDialogLaunchAnimator.showFromView(dialog, mediaOutputDialog);
} }

View File

@@ -28,6 +28,7 @@ import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.UiEventLogger;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
/** /**
* Dialog for media output transferring. * Dialog for media output transferring.
@@ -37,8 +38,9 @@ public class MediaOutputDialog extends MediaOutputBaseDialog {
final UiEventLogger mUiEventLogger; final UiEventLogger mUiEventLogger;
MediaOutputDialog(Context context, boolean aboveStatusbar, MediaOutputController MediaOutputDialog(Context context, boolean aboveStatusbar, MediaOutputController
mediaOutputController, UiEventLogger uiEventLogger) { mediaOutputController, UiEventLogger uiEventLogger,
super(context, mediaOutputController); SystemUIDialogManager dialogManager) {
super(context, mediaOutputController, dialogManager);
mUiEventLogger = uiEventLogger; mUiEventLogger = uiEventLogger;
mAdapter = new MediaOutputAdapter(mMediaOutputController, this); mAdapter = new MediaOutputAdapter(mMediaOutputController, this);
if (!aboveStatusbar) { if (!aboveStatusbar) {

View File

@@ -25,6 +25,7 @@ import com.android.systemui.animation.DialogLaunchAnimator
import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.statusbar.notification.NotificationEntryManager import com.android.systemui.statusbar.notification.NotificationEntryManager
import com.android.systemui.statusbar.phone.ShadeController import com.android.systemui.statusbar.phone.ShadeController
import com.android.systemui.statusbar.phone.SystemUIDialogManager
import javax.inject.Inject import javax.inject.Inject
/** /**
@@ -38,7 +39,8 @@ class MediaOutputDialogFactory @Inject constructor(
private val starter: ActivityStarter, private val starter: ActivityStarter,
private val notificationEntryManager: NotificationEntryManager, private val notificationEntryManager: NotificationEntryManager,
private val uiEventLogger: UiEventLogger, private val uiEventLogger: UiEventLogger,
private val dialogLaunchAnimator: DialogLaunchAnimator private val dialogLaunchAnimator: DialogLaunchAnimator,
private val dialogManager: SystemUIDialogManager
) { ) {
companion object { companion object {
var mediaOutputDialog: MediaOutputDialog? = null var mediaOutputDialog: MediaOutputDialog? = null
@@ -51,8 +53,9 @@ class MediaOutputDialogFactory @Inject constructor(
val controller = MediaOutputController(context, packageName, aboveStatusBar, val controller = MediaOutputController(context, packageName, aboveStatusBar,
mediaSessionManager, lbm, shadeController, starter, notificationEntryManager, mediaSessionManager, lbm, shadeController, starter, notificationEntryManager,
uiEventLogger, dialogLaunchAnimator) uiEventLogger, dialogLaunchAnimator, dialogManager)
val dialog = MediaOutputDialog(context, aboveStatusBar, controller, uiEventLogger) val dialog = MediaOutputDialog(context, aboveStatusBar, controller, uiEventLogger,
dialogManager)
mediaOutputDialog = dialog mediaOutputDialog = dialog
// Show the dialog. // Show the dialog.

View File

@@ -25,6 +25,7 @@ import android.widget.LinearLayout;
import androidx.core.graphics.drawable.IconCompat; import androidx.core.graphics.drawable.IconCompat;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
/** /**
* Dialog for media output group. * Dialog for media output group.
@@ -32,8 +33,8 @@ import com.android.systemui.R;
public class MediaOutputGroupDialog extends MediaOutputBaseDialog { public class MediaOutputGroupDialog extends MediaOutputBaseDialog {
MediaOutputGroupDialog(Context context, boolean aboveStatusbar, MediaOutputController MediaOutputGroupDialog(Context context, boolean aboveStatusbar, MediaOutputController
mediaOutputController) { mediaOutputController, SystemUIDialogManager dialogManager) {
super(context, mediaOutputController); super(context, mediaOutputController, dialogManager);
mMediaOutputController.resetGroupMediaDevices(); mMediaOutputController.resetGroupMediaDevices();
mAdapter = new MediaOutputGroupAdapter(mMediaOutputController); mAdapter = new MediaOutputGroupAdapter(mMediaOutputController);
if (!aboveStatusbar) { if (!aboveStatusbar) {

View File

@@ -45,6 +45,10 @@ import com.android.systemui.statusbar.policy.KeyguardStateController;
/** /**
* Base class for dialogs that should appear over panels and keyguard. * Base class for dialogs that should appear over panels and keyguard.
*
* Optionally provide a {@link SystemUIDialogManager} to its constructor to send signals to
* listeners on whether this dialog is showing.
*
* The SystemUIDialog registers a listener for the screen off / close system dialogs broadcast, * The SystemUIDialog registers a listener for the screen off / close system dialogs broadcast,
* and dismisses itself when it receives the broadcast. * and dismisses itself when it receives the broadcast.
*/ */
@@ -54,8 +58,9 @@ public class SystemUIDialog extends AlertDialog implements ViewRootImpl.ConfigCh
"persist.systemui.flag_tablet_dialog_width"; "persist.systemui.flag_tablet_dialog_width";
private final Context mContext; private final Context mContext;
private final DismissReceiver mDismissReceiver; @Nullable private final DismissReceiver mDismissReceiver;
private final Handler mHandler = new Handler(); private final Handler mHandler = new Handler();
@Nullable private final SystemUIDialogManager mDialogManager;
private int mLastWidth = Integer.MIN_VALUE; private int mLastWidth = Integer.MIN_VALUE;
private int mLastHeight = Integer.MIN_VALUE; private int mLastHeight = Integer.MIN_VALUE;
@@ -66,11 +71,22 @@ public class SystemUIDialog extends AlertDialog implements ViewRootImpl.ConfigCh
this(context, R.style.Theme_SystemUI_Dialog); this(context, R.style.Theme_SystemUI_Dialog);
} }
public SystemUIDialog(Context context, SystemUIDialogManager dialogManager) {
this(context, R.style.Theme_SystemUI_Dialog, true, dialogManager);
}
public SystemUIDialog(Context context, int theme) { public SystemUIDialog(Context context, int theme) {
this(context, theme, true /* dismissOnDeviceLock */); this(context, theme, true /* dismissOnDeviceLock */);
} }
public SystemUIDialog(Context context, int theme, boolean dismissOnDeviceLock) { public SystemUIDialog(Context context, int theme, boolean dismissOnDeviceLock) {
this(context, theme, dismissOnDeviceLock, null);
}
/**
* @param udfpsDialogManager If set, UDFPS will hide if this dialog is showing.
*/
public SystemUIDialog(Context context, int theme, boolean dismissOnDeviceLock,
SystemUIDialogManager dialogManager) {
super(context, theme); super(context, theme);
mContext = context; mContext = context;
@@ -80,6 +96,7 @@ public class SystemUIDialog extends AlertDialog implements ViewRootImpl.ConfigCh
getWindow().setAttributes(attrs); getWindow().setAttributes(attrs);
mDismissReceiver = dismissOnDeviceLock ? new DismissReceiver(this) : null; mDismissReceiver = dismissOnDeviceLock ? new DismissReceiver(this) : null;
mDialogManager = dialogManager;
} }
@Override @Override
@@ -145,6 +162,10 @@ public class SystemUIDialog extends AlertDialog implements ViewRootImpl.ConfigCh
mDismissReceiver.register(); mDismissReceiver.register();
} }
if (mDialogManager != null) {
mDialogManager.setShowing(this, true);
}
// Listen for configuration changes to resize this dialog window. This is mostly necessary // Listen for configuration changes to resize this dialog window. This is mostly necessary
// for foldables that often go from large <=> small screen when folding/unfolding. // for foldables that often go from large <=> small screen when folding/unfolding.
ViewRootImpl.addConfigCallback(this); ViewRootImpl.addConfigCallback(this);
@@ -158,6 +179,10 @@ public class SystemUIDialog extends AlertDialog implements ViewRootImpl.ConfigCh
mDismissReceiver.unregister(); mDismissReceiver.unregister();
} }
if (mDialogManager != null) {
mDialogManager.setShowing(this, false);
}
ViewRootImpl.removeConfigCallback(this); ViewRootImpl.removeConfigCallback(this);
} }

View File

@@ -0,0 +1,118 @@
/*
* 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.systemui.statusbar.phone;
import androidx.annotation.NonNull;
import com.android.systemui.Dumpable;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.Set;
import javax.inject.Inject;
/**
* Register dialogs to this manager if extraneous affordances (like the UDFPS sensor area)
* should be hidden from the screen when the dialog shows.
*
* Currently, only used if UDFPS is supported on the device; however, can be extended in the future
* for other use cases.
*/
@SysUISingleton
public class SystemUIDialogManager implements Dumpable {
private final StatusBarKeyguardViewManager mKeyguardViewManager;
private final Set<SystemUIDialog> mDialogsShowing = new HashSet<>();
private final Set<Listener> mListeners = new HashSet<>();
@Inject
public SystemUIDialogManager(
DumpManager dumpManager,
StatusBarKeyguardViewManager statusBarKeyguardViewManager) {
dumpManager.registerDumpable(this);
mKeyguardViewManager = statusBarKeyguardViewManager;
}
/**
* Whether listeners should hide affordances like the UDFPS sensor icon.
*/
public boolean shouldHideAffordance() {
return !mDialogsShowing.isEmpty();
}
/**
* Register a listener to receive callbacks.
*/
public void registerListener(@NonNull Listener listener) {
mListeners.add(listener);
}
/**
* Unregister a listener from receiving callbacks.
*/
public void unregisterListener(@NonNull Listener listener) {
mListeners.remove(listener);
}
void setShowing(SystemUIDialog dialog, boolean showing) {
final boolean wasHidingAffordances = shouldHideAffordance();
if (showing) {
mDialogsShowing.add(dialog);
} else {
mDialogsShowing.remove(dialog);
}
if (wasHidingAffordances != shouldHideAffordance()) {
updateDialogListeners();
}
}
private void updateDialogListeners() {
if (shouldHideAffordance()) {
mKeyguardViewManager.resetAlternateAuth(true);
}
for (Listener listener : mListeners) {
listener.shouldHideAffordances(shouldHideAffordance());
}
}
@Override
public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
pw.println("listeners:");
for (Listener listener : mListeners) {
pw.println("\t" + listener);
}
pw.println("dialogs tracked:");
for (SystemUIDialog dialog : mDialogsShowing) {
pw.println("\t" + dialog);
}
}
/** SystemUIDialogManagerListener */
public interface Listener {
/**
* Callback where shouldHide=true if listeners should hide their views that may overlap
* a showing dialog.
*/
void shouldHideAffordances(boolean shouldHide);
}
}

View File

@@ -65,6 +65,7 @@ import com.android.systemui.statusbar.LockscreenShadeTransitionController;
import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -170,6 +171,8 @@ public class UdfpsControllerTest extends SysuiTestCase {
private TypedArray mBrightnessValues; private TypedArray mBrightnessValues;
@Mock @Mock
private TypedArray mBrightnessBacklight; private TypedArray mBrightnessBacklight;
@Mock
private SystemUIDialogManager mSystemUIDialogManager;
// Capture listeners so that they can be used to send events // Capture listeners so that they can be used to send events
@Captor private ArgumentCaptor<IUdfpsOverlayController> mOverlayCaptor; @Captor private ArgumentCaptor<IUdfpsOverlayController> mOverlayCaptor;
@@ -179,8 +182,6 @@ public class UdfpsControllerTest extends SysuiTestCase {
@Captor private ArgumentCaptor<ScreenLifecycle.Observer> mScreenObserverCaptor; @Captor private ArgumentCaptor<ScreenLifecycle.Observer> mScreenObserverCaptor;
private ScreenLifecycle.Observer mScreenObserver; private ScreenLifecycle.Observer mScreenObserver;
@Captor private ArgumentCaptor<UdfpsAnimationViewController> mAnimViewControllerCaptor;
@Before @Before
public void setUp() { public void setUp() {
setUpResources(); setUpResources();
@@ -238,7 +239,8 @@ public class UdfpsControllerTest extends SysuiTestCase {
mHandler, mHandler,
mConfigurationController, mConfigurationController,
mSystemClock, mSystemClock,
mUnlockedScreenOffAnimationController); mUnlockedScreenOffAnimationController,
mSystemUIDialogManager);
verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture()); verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
mOverlayController = mOverlayCaptor.getValue(); mOverlayController = mOverlayCaptor.getValue();
verify(mScreenLifecycle).addObserver(mScreenObserverCaptor.capture()); verify(mScreenLifecycle).addObserver(mScreenObserverCaptor.capture());

View File

@@ -42,6 +42,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.LockscreenShadeTransitionController; import com.android.systemui.statusbar.LockscreenShadeTransitionController;
import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionListener; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionListener;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
@@ -92,6 +93,8 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
@Mock @Mock
private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController;
@Mock @Mock
private SystemUIDialogManager mDialogManager;
@Mock
private UdfpsController mUdfpsController; private UdfpsController mUdfpsController;
private FakeSystemClock mSystemClock = new FakeSystemClock(); private FakeSystemClock mSystemClock = new FakeSystemClock();
@@ -130,6 +133,7 @@ public class UdfpsKeyguardViewControllerTest extends SysuiTestCase {
mSystemClock, mSystemClock,
mKeyguardStateController, mKeyguardStateController,
mUnlockedScreenOffAnimationController, mUnlockedScreenOffAnimationController,
mDialogManager,
mUdfpsController); mUdfpsController);
} }

View File

@@ -62,6 +62,7 @@ import com.android.systemui.plugins.GlobalActions;
import com.android.systemui.settings.UserContextProvider; import com.android.systemui.settings.UserContextProvider;
import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.telephony.TelephonyListenerManager; import com.android.systemui.telephony.TelephonyListenerManager;
@@ -117,6 +118,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
@Mock private StatusBar mStatusBar; @Mock private StatusBar mStatusBar;
@Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor; @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@Mock private DialogLaunchAnimator mDialogLaunchAnimator; @Mock private DialogLaunchAnimator mDialogLaunchAnimator;
@Mock private SystemUIDialogManager mDialogManager;
private TestableLooper mTestableLooper; private TestableLooper mTestableLooper;
@@ -162,7 +164,8 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
mPackageManager, mPackageManager,
Optional.of(mStatusBar), Optional.of(mStatusBar),
mKeyguardUpdateMonitor, mKeyguardUpdateMonitor,
mDialogLaunchAnimator); mDialogLaunchAnimator,
mDialogManager);
mGlobalActionsDialogLite.setZeroDialogPressDelayForTesting(); mGlobalActionsDialogLite.setZeroDialogPressDelayForTesting();
ColorExtractor.GradientColors backdropColors = new ColorExtractor.GradientColors(); ColorExtractor.GradientColors backdropColors = new ColorExtractor.GradientColors();

View File

@@ -43,6 +43,7 @@ import com.android.systemui.animation.DialogLaunchAnimator;
import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -65,6 +66,7 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
mock(NotificationEntryManager.class); mock(NotificationEntryManager.class);
private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class); private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class);
private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class); private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class);
private final SystemUIDialogManager mDialogManager = mock(SystemUIDialogManager.class);
private MediaOutputBaseDialogImpl mMediaOutputBaseDialogImpl; private MediaOutputBaseDialogImpl mMediaOutputBaseDialogImpl;
private MediaOutputController mMediaOutputController; private MediaOutputController mMediaOutputController;
@@ -77,7 +79,7 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
public void setUp() { public void setUp() {
mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, false, mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator); mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
mMediaOutputBaseDialogImpl = new MediaOutputBaseDialogImpl(mContext, mMediaOutputBaseDialogImpl = new MediaOutputBaseDialogImpl(mContext,
mMediaOutputController); mMediaOutputController);
mMediaOutputBaseDialogImpl.onCreate(new Bundle()); mMediaOutputBaseDialogImpl.onCreate(new Bundle());
@@ -167,7 +169,7 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
class MediaOutputBaseDialogImpl extends MediaOutputBaseDialog { class MediaOutputBaseDialogImpl extends MediaOutputBaseDialog {
MediaOutputBaseDialogImpl(Context context, MediaOutputController mediaOutputController) { MediaOutputBaseDialogImpl(Context context, MediaOutputController mediaOutputController) {
super(context, mediaOutputController); super(context, mediaOutputController, mDialogManager);
mAdapter = mMediaOutputBaseAdapter; mAdapter = mMediaOutputBaseAdapter;
} }

View File

@@ -54,6 +54,7 @@ import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -93,6 +94,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
mock(NotificationEntryManager.class); mock(NotificationEntryManager.class);
private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class); private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class);
private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class); private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class);
private final SystemUIDialogManager mDialogManager = mock(SystemUIDialogManager.class);
private Context mSpyContext; private Context mSpyContext;
private MediaOutputController mMediaOutputController; private MediaOutputController mMediaOutputController;
@@ -115,7 +117,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
mMediaOutputController = new MediaOutputController(mSpyContext, TEST_PACKAGE_NAME, false, mMediaOutputController = new MediaOutputController(mSpyContext, TEST_PACKAGE_NAME, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator); mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
mLocalMediaManager = spy(mMediaOutputController.mLocalMediaManager); mLocalMediaManager = spy(mMediaOutputController.mLocalMediaManager);
mMediaOutputController.mLocalMediaManager = mLocalMediaManager; mMediaOutputController.mLocalMediaManager = mLocalMediaManager;
MediaDescription.Builder builder = new MediaDescription.Builder(); MediaDescription.Builder builder = new MediaDescription.Builder();
@@ -159,7 +161,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
public void start_withoutPackageName_verifyMediaControllerInit() { public void start_withoutPackageName_verifyMediaControllerInit() {
mMediaOutputController = new MediaOutputController(mSpyContext, null, false, mMediaOutputController = new MediaOutputController(mSpyContext, null, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator); mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
mMediaOutputController.start(mCb); mMediaOutputController.start(mCb);
@@ -180,7 +182,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
public void stop_withoutPackageName_verifyMediaControllerDeinit() { public void stop_withoutPackageName_verifyMediaControllerDeinit() {
mMediaOutputController = new MediaOutputController(mSpyContext, null, false, mMediaOutputController = new MediaOutputController(mSpyContext, null, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator); mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
mMediaOutputController.start(mCb); mMediaOutputController.start(mCb);
@@ -451,7 +453,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
public void getNotificationLargeIcon_withoutPackageName_returnsNull() { public void getNotificationLargeIcon_withoutPackageName_returnsNull() {
mMediaOutputController = new MediaOutputController(mSpyContext, null, false, mMediaOutputController = new MediaOutputController(mSpyContext, null, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator); mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
assertThat(mMediaOutputController.getNotificationIcon()).isNull(); assertThat(mMediaOutputController.getNotificationIcon()).isNull();
} }

View File

@@ -40,6 +40,7 @@ import com.android.systemui.animation.DialogLaunchAnimator;
import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@@ -67,6 +68,7 @@ public class MediaOutputDialogTest extends SysuiTestCase {
mock(NotificationEntryManager.class); mock(NotificationEntryManager.class);
private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class); private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class);
private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class); private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class);
private final SystemUIDialogManager mDialogManager = mock(SystemUIDialogManager.class);
private MediaOutputDialog mMediaOutputDialog; private MediaOutputDialog mMediaOutputDialog;
private MediaOutputController mMediaOutputController; private MediaOutputController mMediaOutputController;
@@ -76,10 +78,10 @@ public class MediaOutputDialogTest extends SysuiTestCase {
public void setUp() { public void setUp() {
mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, false, mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator); mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
mMediaOutputController.mLocalMediaManager = mLocalMediaManager; mMediaOutputController.mLocalMediaManager = mLocalMediaManager;
mMediaOutputDialog = new MediaOutputDialog(mContext, false, mMediaOutputDialog = new MediaOutputDialog(mContext, false,
mMediaOutputController, mUiEventLogger); mMediaOutputController, mUiEventLogger, mDialogManager);
mMediaOutputDialog.show(); mMediaOutputDialog.show();
when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(mMediaDevice); when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(mMediaDevice);
@@ -125,7 +127,7 @@ public class MediaOutputDialogTest extends SysuiTestCase {
// and verify if the calling times increases. // and verify if the calling times increases.
public void onCreate_ShouldLogVisibility() { public void onCreate_ShouldLogVisibility() {
MediaOutputDialog testDialog = new MediaOutputDialog(mContext, false, MediaOutputDialog testDialog = new MediaOutputDialog(mContext, false,
mMediaOutputController, mUiEventLogger); mMediaOutputController, mUiEventLogger, mDialogManager);
testDialog.show(); testDialog.show();
testDialog.dismissDialog(); testDialog.dismissDialog();

View File

@@ -38,6 +38,7 @@ import com.android.systemui.animation.DialogLaunchAnimator;
import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@@ -66,6 +67,7 @@ public class MediaOutputGroupDialogTest extends SysuiTestCase {
mock(NotificationEntryManager.class); mock(NotificationEntryManager.class);
private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class); private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class);
private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class); private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class);
private final SystemUIDialogManager mDialogManager = mock(SystemUIDialogManager.class);
private MediaOutputGroupDialog mMediaOutputGroupDialog; private MediaOutputGroupDialog mMediaOutputGroupDialog;
private MediaOutputController mMediaOutputController; private MediaOutputController mMediaOutputController;
@@ -75,10 +77,10 @@ public class MediaOutputGroupDialogTest extends SysuiTestCase {
public void setUp() { public void setUp() {
mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, false, mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, false,
mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter,
mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator); mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, mDialogManager);
mMediaOutputController.mLocalMediaManager = mLocalMediaManager; mMediaOutputController.mLocalMediaManager = mLocalMediaManager;
mMediaOutputGroupDialog = new MediaOutputGroupDialog(mContext, false, mMediaOutputGroupDialog = new MediaOutputGroupDialog(mContext, false,
mMediaOutputController); mMediaOutputController, mDialogManager);
mMediaOutputGroupDialog.show(); mMediaOutputGroupDialog.show();
when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mMediaDevices); when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mMediaDevices);
} }