Merge "Add PowerOptionsAction to combine Power and Restart when needed." into rvc-dev

This commit is contained in:
Aran Ink
2020-06-05 16:21:10 +00:00
committed by Android (Google) Code Review
3 changed files with 313 additions and 32 deletions

View File

@@ -1785,6 +1785,7 @@
<java-symbol type="string" name="faceunlock_multiple_failures" /> <java-symbol type="string" name="faceunlock_multiple_failures" />
<java-symbol type="string" name="global_actions" /> <java-symbol type="string" name="global_actions" />
<java-symbol type="string" name="global_action_power_off" /> <java-symbol type="string" name="global_action_power_off" />
<java-symbol type="string" name="global_action_power_options" />
<java-symbol type="string" name="global_action_restart" /> <java-symbol type="string" name="global_action_restart" />
<java-symbol type="string" name="global_actions_airplane_mode_off_status" /> <java-symbol type="string" name="global_actions_airplane_mode_off_status" />
<java-symbol type="string" name="global_actions_airplane_mode_on_status" /> <java-symbol type="string" name="global_actions_airplane_mode_on_status" />

View File

@@ -175,7 +175,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private static final String GLOBAL_ACTION_KEY_SILENT = "silent"; private static final String GLOBAL_ACTION_KEY_SILENT = "silent";
private static final String GLOBAL_ACTION_KEY_USERS = "users"; private static final String GLOBAL_ACTION_KEY_USERS = "users";
private static final String GLOBAL_ACTION_KEY_SETTINGS = "settings"; private static final String GLOBAL_ACTION_KEY_SETTINGS = "settings";
private static final String GLOBAL_ACTION_KEY_LOCKDOWN = "lockdown"; static final String GLOBAL_ACTION_KEY_LOCKDOWN = "lockdown";
private static final String GLOBAL_ACTION_KEY_VOICEASSIST = "voiceassist"; private static final String GLOBAL_ACTION_KEY_VOICEASSIST = "voiceassist";
private static final String GLOBAL_ACTION_KEY_ASSIST = "assist"; private static final String GLOBAL_ACTION_KEY_ASSIST = "assist";
static final String GLOBAL_ACTION_KEY_RESTART = "restart"; static final String GLOBAL_ACTION_KEY_RESTART = "restart";
@@ -213,7 +213,9 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
@VisibleForTesting @VisibleForTesting
protected final ArrayList<Action> mItems = new ArrayList<>(); protected final ArrayList<Action> mItems = new ArrayList<>();
@VisibleForTesting @VisibleForTesting
final ArrayList<Action> mOverflowItems = new ArrayList<>(); protected final ArrayList<Action> mOverflowItems = new ArrayList<>();
@VisibleForTesting
protected final ArrayList<Action> mPowerItems = new ArrayList<>();
@VisibleForTesting @VisibleForTesting
protected ActionsDialog mDialog; protected ActionsDialog mDialog;
@@ -223,6 +225,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private MyAdapter mAdapter; private MyAdapter mAdapter;
private MyOverflowAdapter mOverflowAdapter; private MyOverflowAdapter mOverflowAdapter;
private MyPowerOptionsAdapter mPowerAdapter;
private boolean mKeyguardShowing = false; private boolean mKeyguardShowing = false;
private boolean mDeviceProvisioned = false; private boolean mDeviceProvisioned = false;
@@ -584,14 +587,19 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mItems.clear(); mItems.clear();
mOverflowItems.clear(); mOverflowItems.clear();
mPowerItems.clear();
String[] defaultActions = getDefaultActions(); String[] defaultActions = getDefaultActions();
ShutDownAction shutdownAction = new ShutDownAction();
RestartAction restartAction = new RestartAction();
ArraySet<String> addedKeys = new ArraySet<String>();
// make sure emergency affordance action is first, if needed // make sure emergency affordance action is first, if needed
if (mEmergencyAffordanceManager.needsEmergencyAffordance()) { if (mEmergencyAffordanceManager.needsEmergencyAffordance()) {
addActionItem(new EmergencyAffordanceAction()); addActionItem(new EmergencyAffordanceAction());
addedKeys.add(GLOBAL_ACTION_KEY_EMERGENCY);
} }
ArraySet<String> addedKeys = new ArraySet<String>();
for (int i = 0; i < defaultActions.length; i++) { for (int i = 0; i < defaultActions.length; i++) {
String actionKey = defaultActions[i]; String actionKey = defaultActions[i];
if (addedKeys.contains(actionKey)) { if (addedKeys.contains(actionKey)) {
@@ -599,7 +607,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
continue; continue;
} }
if (GLOBAL_ACTION_KEY_POWER.equals(actionKey)) { if (GLOBAL_ACTION_KEY_POWER.equals(actionKey)) {
addActionItem(new PowerAction()); addActionItem(shutdownAction);
} else if (GLOBAL_ACTION_KEY_AIRPLANE.equals(actionKey)) { } else if (GLOBAL_ACTION_KEY_AIRPLANE.equals(actionKey)) {
addActionItem(mAirplaneModeOn); addActionItem(mAirplaneModeOn);
} else if (GLOBAL_ACTION_KEY_BUGREPORT.equals(actionKey)) { } else if (GLOBAL_ACTION_KEY_BUGREPORT.equals(actionKey)) {
@@ -618,10 +626,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
} else if (GLOBAL_ACTION_KEY_SETTINGS.equals(actionKey)) { } else if (GLOBAL_ACTION_KEY_SETTINGS.equals(actionKey)) {
addActionItem(getSettingsAction()); addActionItem(getSettingsAction());
} else if (GLOBAL_ACTION_KEY_LOCKDOWN.equals(actionKey)) { } else if (GLOBAL_ACTION_KEY_LOCKDOWN.equals(actionKey)) {
int userId = getCurrentUser().id; if (shouldDisplayLockdown(getCurrentUser())) {
if (Settings.Secure.getIntForUser(mContentResolver,
Settings.Secure.LOCKDOWN_IN_POWER_MENU, 0, userId) != 0
&& shouldDisplayLockdown(userId)) {
addActionItem(getLockdownAction()); addActionItem(getLockdownAction());
} }
} else if (GLOBAL_ACTION_KEY_VOICEASSIST.equals(actionKey)) { } else if (GLOBAL_ACTION_KEY_VOICEASSIST.equals(actionKey)) {
@@ -629,7 +634,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
} else if (GLOBAL_ACTION_KEY_ASSIST.equals(actionKey)) { } else if (GLOBAL_ACTION_KEY_ASSIST.equals(actionKey)) {
addActionItem(getAssistAction()); addActionItem(getAssistAction());
} else if (GLOBAL_ACTION_KEY_RESTART.equals(actionKey)) { } else if (GLOBAL_ACTION_KEY_RESTART.equals(actionKey)) {
addActionItem(new RestartAction()); addActionItem(restartAction);
} else if (GLOBAL_ACTION_KEY_SCREENSHOT.equals(actionKey)) { } else if (GLOBAL_ACTION_KEY_SCREENSHOT.equals(actionKey)) {
addActionItem(new ScreenshotAction()); addActionItem(new ScreenshotAction());
} else if (GLOBAL_ACTION_KEY_LOGOUT.equals(actionKey)) { } else if (GLOBAL_ACTION_KEY_LOGOUT.equals(actionKey)) {
@@ -638,15 +643,32 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
addActionItem(new LogoutAction()); addActionItem(new LogoutAction());
} }
} else if (GLOBAL_ACTION_KEY_EMERGENCY.equals(actionKey)) { } else if (GLOBAL_ACTION_KEY_EMERGENCY.equals(actionKey)) {
if (!mEmergencyAffordanceManager.needsEmergencyAffordance()) { addActionItem(new EmergencyDialerAction());
addActionItem(new EmergencyDialerAction());
}
} else { } else {
Log.e(TAG, "Invalid global action key " + actionKey); Log.e(TAG, "Invalid global action key " + actionKey);
} }
// Add here so we don't add more than one. // Add here so we don't add more than one.
addedKeys.add(actionKey); addedKeys.add(actionKey);
} }
// replace power and restart with a single power options action, if needed
if (mItems.contains(shutdownAction) && mItems.contains(restartAction)
&& mOverflowItems.size() > 0) {
// transfer shutdown and restart to their own list of power actions
mItems.remove(shutdownAction);
mItems.remove(restartAction);
mPowerItems.add(shutdownAction);
mPowerItems.add(restartAction);
// add the PowerOptionsAction after Emergency, if present
int powerIndex = addedKeys.contains(GLOBAL_ACTION_KEY_EMERGENCY) ? 1 : 0;
mItems.add(powerIndex, new PowerOptionsAction());
// transfer the first overflow action to the main set of items
Action firstOverflowAction = mOverflowItems.get(0);
mOverflowItems.remove(0);
mItems.add(firstOverflowAction);
}
} }
private void onRotate() { private void onRotate() {
@@ -664,6 +686,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mAdapter = new MyAdapter(); mAdapter = new MyAdapter();
mOverflowAdapter = new MyOverflowAdapter(); mOverflowAdapter = new MyOverflowAdapter();
mPowerAdapter = new MyPowerOptionsAdapter();
mDepthController.setShowingHomeControls(true); mDepthController.setShowingHomeControls(true);
GlobalActionsPanelPlugin.PanelViewController walletViewController = GlobalActionsPanelPlugin.PanelViewController walletViewController =
@@ -676,7 +699,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
walletViewController, mDepthController, mSysuiColorExtractor, walletViewController, mDepthController, mSysuiColorExtractor,
mStatusBarService, mNotificationShadeWindowController, mStatusBarService, mNotificationShadeWindowController,
controlsAvailable(), uiController, controlsAvailable(), uiController,
mSysUiState, this::onRotate, mKeyguardShowing); mSysUiState, this::onRotate, mKeyguardShowing, mPowerAdapter);
boolean walletViewAvailable = walletViewController != null boolean walletViewAvailable = walletViewController != null
&& walletViewController.getPanelContent() != null; && walletViewController.getPanelContent() != null;
if (shouldShowLockMessage(walletViewAvailable)) { if (shouldShowLockMessage(walletViewAvailable)) {
@@ -689,7 +712,20 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
return dialog; return dialog;
} }
private boolean shouldDisplayLockdown(int userId) { @VisibleForTesting
protected boolean shouldDisplayLockdown(UserInfo user) {
if (user == null) {
return false;
}
int userId = user.id;
// No lockdown option if it's not turned on in Settings
if (Settings.Secure.getIntForUser(mContentResolver,
Settings.Secure.LOCKDOWN_IN_POWER_MENU, 0, userId) == 0) {
return false;
}
// Lockdown is meaningless without a place to go. // Lockdown is meaningless without a place to go.
if (!mKeyguardStateController.isMethodSecure()) { if (!mKeyguardStateController.isMethodSecure()) {
return false; return false;
@@ -740,8 +776,32 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mActivityStarter.startPendingIntentDismissingKeyguard(pendingIntent); mActivityStarter.startPendingIntentDismissingKeyguard(pendingIntent);
} }
private final class PowerAction extends SinglePressAction implements LongPressAction { @VisibleForTesting
private PowerAction() { protected final class PowerOptionsAction extends SinglePressAction {
private PowerOptionsAction() {
super(R.drawable.ic_lock_power_off, R.string.global_action_power_options);
}
@Override
public boolean showDuringKeyguard() {
return true;
}
@Override
public boolean showBeforeProvisioning() {
return true;
}
@Override
public void onPress() {
if (mDialog != null) {
mDialog.showPowerOptionsMenu();
}
}
}
private final class ShutDownAction extends SinglePressAction implements LongPressAction {
private ShutDownAction() {
super(R.drawable.ic_lock_power_off, super(R.drawable.ic_lock_power_off,
R.string.global_action_power_off); R.string.global_action_power_off);
} }
@@ -772,7 +832,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
} }
} }
private abstract class EmergencyAction extends SinglePressAction { @VisibleForTesting
protected abstract class EmergencyAction extends SinglePressAction {
EmergencyAction(int iconResId, int messageResId) { EmergencyAction(int iconResId, int messageResId) {
super(iconResId, messageResId); super(iconResId, messageResId);
} }
@@ -1317,7 +1378,10 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
Action item = mAdapter.getItem(position); Action item = mAdapter.getItem(position);
if (!(item instanceof SilentModeTriStateAction)) { if (!(item instanceof SilentModeTriStateAction)) {
if (mDialog != null) { if (mDialog != null) {
mDialog.dismiss(); // don't dismiss the dialog if we're opening the power options menu
if (!(item instanceof PowerOptionsAction)) {
mDialog.dismiss();
}
} else { } else {
Log.w(TAG, "Action clicked while mDialog is null."); Log.w(TAG, "Action clicked while mDialog is null.");
} }
@@ -1334,6 +1398,70 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
/** /**
* The adapter used for items in the overflow menu. * The adapter used for items in the overflow menu.
*/ */
public class MyPowerOptionsAdapter extends BaseAdapter {
@Override
public int getCount() {
return mPowerItems.size();
}
@Override
public Action getItem(int position) {
return mPowerItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Action action = getItem(position);
if (action == null) {
Log.w(TAG, "No power options action found at position: " + position);
return null;
}
int viewLayoutResource = com.android.systemui.R.layout.controls_more_item;
View view = convertView != null ? convertView
: LayoutInflater.from(mContext).inflate(viewLayoutResource, parent, false);
TextView textView = (TextView) view;
if (action.getMessageResId() != 0) {
textView.setText(action.getMessageResId());
} else {
textView.setText(action.getMessage());
}
return textView;
}
private boolean onLongClickItem(int position) {
final Action action = getItem(position);
if (action instanceof LongPressAction) {
if (mDialog != null) {
mDialog.dismiss();
} else {
Log.w(TAG, "Action long-clicked while mDialog is null.");
}
return ((LongPressAction) action).onLongPress();
}
return false;
}
private void onClickItem(int position) {
Action item = getItem(position);
if (!(item instanceof SilentModeTriStateAction)) {
if (mDialog != null) {
mDialog.dismiss();
} else {
Log.w(TAG, "Action clicked while mDialog is null.");
}
item.onPress();
}
}
}
/**
* The adapter used for items in the power options menu, triggered by the PowerOptionsAction.
*/
public class MyOverflowAdapter extends BaseAdapter { public class MyOverflowAdapter extends BaseAdapter {
@Override @Override
public int getCount() { public int getCount() {
@@ -1373,7 +1501,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
final Action action = getItem(position); final Action action = getItem(position);
if (action instanceof LongPressAction) { if (action instanceof LongPressAction) {
if (mDialog != null) { if (mDialog != null) {
mDialog.hidePowerOverflowMenu();
mDialog.dismiss(); mDialog.dismiss();
} else { } else {
Log.w(TAG, "Action long-clicked while mDialog is null."); Log.w(TAG, "Action long-clicked while mDialog is null.");
@@ -1387,7 +1514,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
Action item = getItem(position); Action item = getItem(position);
if (!(item instanceof SilentModeTriStateAction)) { if (!(item instanceof SilentModeTriStateAction)) {
if (mDialog != null) { if (mDialog != null) {
mDialog.hidePowerOverflowMenu();
mDialog.dismiss(); mDialog.dismiss();
} else { } else {
Log.w(TAG, "Action clicked while mDialog is null."); Log.w(TAG, "Action clicked while mDialog is null.");
@@ -1495,7 +1621,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
} }
} }
public int getMessageResId() { public int getMessageResId() {
return mMessageResId; return mMessageResId;
} }
@@ -1846,6 +1971,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mAirplaneState = inAirplaneMode ? ToggleState.On : ToggleState.Off; mAirplaneState = inAirplaneMode ? ToggleState.On : ToggleState.Off;
mAirplaneModeOn.updateState(mAirplaneState); mAirplaneModeOn.updateState(mAirplaneState);
mAdapter.notifyDataSetChanged(); mAdapter.notifyDataSetChanged();
mOverflowAdapter.notifyDataSetChanged();
mPowerAdapter.notifyDataSetChanged();
} }
}; };
@@ -1928,6 +2055,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private final Context mContext; private final Context mContext;
private final MyAdapter mAdapter; private final MyAdapter mAdapter;
private final MyOverflowAdapter mOverflowAdapter; private final MyOverflowAdapter mOverflowAdapter;
private final MyPowerOptionsAdapter mPowerOptionsAdapter;
private final IStatusBarService mStatusBarService; private final IStatusBarService mStatusBarService;
private final IBinder mToken = new Binder(); private final IBinder mToken = new Binder();
private MultiListLayout mGlobalActionsLayout; private MultiListLayout mGlobalActionsLayout;
@@ -1943,6 +2071,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private final NotificationShadeDepthController mDepthController; private final NotificationShadeDepthController mDepthController;
private final SysUiState mSysUiState; private final SysUiState mSysUiState;
private ListPopupWindow mOverflowPopup; private ListPopupWindow mOverflowPopup;
private ListPopupWindow mPowerOptionsPopup;
private final Runnable mOnRotateCallback; private final Runnable mOnRotateCallback;
private final boolean mControlsAvailable; private final boolean mControlsAvailable;
@@ -1958,11 +2087,13 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService, SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService,
NotificationShadeWindowController notificationShadeWindowController, NotificationShadeWindowController notificationShadeWindowController,
boolean controlsAvailable, @Nullable ControlsUiController controlsUiController, boolean controlsAvailable, @Nullable ControlsUiController controlsUiController,
SysUiState sysuiState, Runnable onRotateCallback, boolean keyguardShowing) { SysUiState sysuiState, Runnable onRotateCallback, boolean keyguardShowing,
MyPowerOptionsAdapter powerAdapter) {
super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions); super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions);
mContext = context; mContext = context;
mAdapter = adapter; mAdapter = adapter;
mOverflowAdapter = overflowAdapter; mOverflowAdapter = overflowAdapter;
mPowerOptionsAdapter = powerAdapter;
mDepthController = depthController; mDepthController = depthController;
mColorExtractor = sysuiColorExtractor; mColorExtractor = sysuiColorExtractor;
mStatusBarService = statusBarService; mStatusBarService = statusBarService;
@@ -2076,6 +2207,21 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
} }
} }
private ListPopupWindow createPowerOptionsPopup() {
GlobalActionsPopupMenu popup = new GlobalActionsPopupMenu(
new ContextThemeWrapper(
mContext,
com.android.systemui.R.style.Control_ListPopupWindow
), false /* isDropDownMode */);
popup.setOnItemClickListener(
(parent, view, position, id) -> mPowerOptionsAdapter.onClickItem(position));
popup.setOnItemLongClickListener(
(parent, view, position, id) -> mPowerOptionsAdapter.onLongClickItem(position));
popup.setAnchorView(mGlobalActionsLayout);
popup.setAdapter(mPowerOptionsAdapter);
return popup;
}
private ListPopupWindow createPowerOverflowPopup() { private ListPopupWindow createPowerOverflowPopup() {
GlobalActionsPopupMenu popup = new GlobalActionsPopupMenu( GlobalActionsPopupMenu popup = new GlobalActionsPopupMenu(
new ContextThemeWrapper( new ContextThemeWrapper(
@@ -2093,16 +2239,16 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
return popup; return popup;
} }
public void showPowerOptionsMenu() {
mPowerOptionsPopup = createPowerOptionsPopup();
mPowerOptionsPopup.show();
}
private void showPowerOverflowMenu() { private void showPowerOverflowMenu() {
mOverflowPopup = createPowerOverflowPopup(); mOverflowPopup = createPowerOverflowPopup();
mOverflowPopup.show(); mOverflowPopup.show();
} }
private void hidePowerOverflowMenu() {
mOverflowPopup.dismiss();
mOverflowPopup = null;
}
private void initializeLayout() { private void initializeLayout() {
setContentView(com.android.systemui.R.layout.global_actions_grid_v2); setContentView(com.android.systemui.R.layout.global_actions_grid_v2);
fixNavBarClipping(); fixNavBarClipping();
@@ -2278,6 +2424,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
// close first, as popup windows will not fade during the animation // close first, as popup windows will not fade during the animation
dismissOverflow(false); dismissOverflow(false);
dismissPowerOptions(false);
if (mControlsUiController != null) mControlsUiController.closeDialogs(false); if (mControlsUiController != null) mControlsUiController.closeDialogs(false);
}); });
} }
@@ -2302,6 +2449,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
resetOrientation(); resetOrientation();
dismissWallet(); dismissWallet();
dismissOverflow(true); dismissOverflow(true);
dismissPowerOptions(true);
if (mControlsUiController != null) mControlsUiController.hide(); if (mControlsUiController != null) mControlsUiController.hide();
mNotificationShadeWindowController.setForceHasTopUi(mHadTopUi); mNotificationShadeWindowController.setForceHasTopUi(mHadTopUi);
mDepthController.updateGlobalDialogVisibility(0, null /* view */); mDepthController.updateGlobalDialogVisibility(0, null /* view */);
@@ -2326,6 +2474,16 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
} }
} }
private void dismissPowerOptions(boolean immediate) {
if (mPowerOptionsPopup != null) {
if (immediate) {
mPowerOptionsPopup.dismissImmediate();
} else {
mPowerOptionsPopup.dismiss();
}
}
}
private void setRotationSuggestionsEnabled(boolean enabled) { private void setRotationSuggestionsEnabled(boolean enabled) {
try { try {
final int userId = Binder.getCallingUserHandle().getIdentifier(); final int userId = Binder.getCallingUserHandle().getIdentifier();
@@ -2369,6 +2527,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
// ensure dropdown menus are dismissed before re-initializing the dialog // ensure dropdown menus are dismissed before re-initializing the dialog
dismissWallet(); dismissWallet();
dismissOverflow(true); dismissOverflow(true);
dismissPowerOptions(true);
if (mControlsUiController != null) { if (mControlsUiController != null) {
mControlsUiController.hide(); mControlsUiController.hide();
} }

View File

@@ -19,6 +19,7 @@ package com.android.systemui.globalactions;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -244,7 +245,7 @@ public class GlobalActionsDialogTest extends SysuiTestCase {
} }
@Test @Test
public void testCreateActionItems_maxThree() { public void testCreateActionItems_maxThree_noOverflow() {
mGlobalActionsDialog = spy(mGlobalActionsDialog); mGlobalActionsDialog = spy(mGlobalActionsDialog);
// allow 3 items to be shown // allow 3 items to be shown
doReturn(3).when(mGlobalActionsDialog).getMaxShownPowerItems(); doReturn(3).when(mGlobalActionsDialog).getMaxShownPowerItems();
@@ -254,13 +255,129 @@ public class GlobalActionsDialogTest extends SysuiTestCase {
GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY, GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY,
GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER, GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER,
GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART, GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART,
};
doReturn(actions).when(mGlobalActionsDialog).getDefaultActions();
mGlobalActionsDialog.createActionItems();
assertEquals(3, mGlobalActionsDialog.mItems.size());
assertEquals(0, mGlobalActionsDialog.mOverflowItems.size());
assertEquals(0, mGlobalActionsDialog.mPowerItems.size());
}
@Test
public void testCreateActionItems_maxThree_condensePower() {
mGlobalActionsDialog = spy(mGlobalActionsDialog);
// allow 3 items to be shown
doReturn(3).when(mGlobalActionsDialog).getMaxShownPowerItems();
// ensure items are not blocked by keyguard or device provisioning
doReturn(true).when(mGlobalActionsDialog).shouldShowAction(any());
// make sure lockdown action will be shown
doReturn(true).when(mGlobalActionsDialog).shouldDisplayLockdown(any());
String[] actions = {
GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY,
GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER,
GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART,
GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN,
};
doReturn(actions).when(mGlobalActionsDialog).getDefaultActions();
mGlobalActionsDialog.createActionItems();
assertEquals(3, mGlobalActionsDialog.mItems.size());
assertEquals(0, mGlobalActionsDialog.mOverflowItems.size());
assertEquals(2, mGlobalActionsDialog.mPowerItems.size());
// PowerOptionsAction should appear immediately after the Emergency action
GlobalActionsDialog.Action firstItem = mGlobalActionsDialog.mItems.get(0);
GlobalActionsDialog.Action secondItem = mGlobalActionsDialog.mItems.get(1);
assertTrue(firstItem instanceof GlobalActionsDialog.EmergencyAction);
assertTrue(secondItem instanceof GlobalActionsDialog.PowerOptionsAction);
}
@Test
public void testCreateActionItems_maxThree_condensePower_noEmergency() {
mGlobalActionsDialog = spy(mGlobalActionsDialog);
// allow 3 items to be shown
doReturn(3).when(mGlobalActionsDialog).getMaxShownPowerItems();
// make sure lockdown action will be shown
doReturn(true).when(mGlobalActionsDialog).shouldDisplayLockdown(any());
// ensure items are not blocked by keyguard or device provisioning
doReturn(true).when(mGlobalActionsDialog).shouldShowAction(any());
String[] actions = {
GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER,
GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART,
GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT, GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT,
GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN,
};
doReturn(actions).when(mGlobalActionsDialog).getDefaultActions();
mGlobalActionsDialog.createActionItems();
assertEquals(3, mGlobalActionsDialog.mItems.size());
assertEquals(0, mGlobalActionsDialog.mOverflowItems.size());
assertEquals(2, mGlobalActionsDialog.mPowerItems.size());
// When Emergency isn't used, PowerOptionsAction should be first
GlobalActionsDialog.Action firstItem = mGlobalActionsDialog.mItems.get(0);
GlobalActionsDialog.Action secondItem = mGlobalActionsDialog.mItems.get(1);
assertTrue(firstItem instanceof GlobalActionsDialog.PowerOptionsAction);
assertTrue(secondItem instanceof GlobalActionsDialog.ScreenshotAction);
}
@Test
public void testCreateActionItems_maxFour_condensePower() {
mGlobalActionsDialog = spy(mGlobalActionsDialog);
// allow 3 items to be shown
doReturn(4).when(mGlobalActionsDialog).getMaxShownPowerItems();
// make sure lockdown action will be shown
doReturn(true).when(mGlobalActionsDialog).shouldDisplayLockdown(any());
// ensure items are not blocked by keyguard or device provisioning
doReturn(true).when(mGlobalActionsDialog).shouldShowAction(any());
String[] actions = {
GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY,
GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER,
GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART,
GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN,
GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT
};
doReturn(actions).when(mGlobalActionsDialog).getDefaultActions();
mGlobalActionsDialog.createActionItems();
assertEquals(4, mGlobalActionsDialog.mItems.size());
assertEquals(0, mGlobalActionsDialog.mOverflowItems.size());
assertEquals(2, mGlobalActionsDialog.mPowerItems.size());
// with four items, make sure power still shows up immediately after Emergency
GlobalActionsDialog.Action firstItem = mGlobalActionsDialog.mItems.get(0);
GlobalActionsDialog.Action secondItem = mGlobalActionsDialog.mItems.get(1);
assertTrue(firstItem instanceof GlobalActionsDialog.EmergencyAction);
assertTrue(secondItem instanceof GlobalActionsDialog.PowerOptionsAction);
}
@Test
public void testCreateActionItems_maxThree_doNotCondensePower() {
mGlobalActionsDialog = spy(mGlobalActionsDialog);
// allow 3 items to be shown
doReturn(3).when(mGlobalActionsDialog).getMaxShownPowerItems();
// make sure lockdown action will be shown
doReturn(true).when(mGlobalActionsDialog).shouldDisplayLockdown(any());
// ensure items are not blocked by keyguard or device provisioning
doReturn(true).when(mGlobalActionsDialog).shouldShowAction(any());
String[] actions = {
GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY,
GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER,
GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT,
GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN,
}; };
doReturn(actions).when(mGlobalActionsDialog).getDefaultActions(); doReturn(actions).when(mGlobalActionsDialog).getDefaultActions();
mGlobalActionsDialog.createActionItems(); mGlobalActionsDialog.createActionItems();
assertEquals(3, mGlobalActionsDialog.mItems.size()); assertEquals(3, mGlobalActionsDialog.mItems.size());
assertEquals(1, mGlobalActionsDialog.mOverflowItems.size()); assertEquals(1, mGlobalActionsDialog.mOverflowItems.size());
assertEquals(0, mGlobalActionsDialog.mPowerItems.size());
} }
@Test @Test
@@ -270,11 +387,13 @@ public class GlobalActionsDialogTest extends SysuiTestCase {
doReturn(Integer.MAX_VALUE).when(mGlobalActionsDialog).getMaxShownPowerItems(); doReturn(Integer.MAX_VALUE).when(mGlobalActionsDialog).getMaxShownPowerItems();
// ensure items are not blocked by keyguard or device provisioning // ensure items are not blocked by keyguard or device provisioning
doReturn(true).when(mGlobalActionsDialog).shouldShowAction(any()); doReturn(true).when(mGlobalActionsDialog).shouldShowAction(any());
// make sure lockdown action will be shown
doReturn(true).when(mGlobalActionsDialog).shouldDisplayLockdown(any());
String[] actions = { String[] actions = {
GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY, GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY,
GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER, GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER,
GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART, GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART,
GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT, GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN,
}; };
doReturn(actions).when(mGlobalActionsDialog).getDefaultActions(); doReturn(actions).when(mGlobalActionsDialog).getDefaultActions();
mGlobalActionsDialog.createActionItems(); mGlobalActionsDialog.createActionItems();
@@ -288,10 +407,12 @@ public class GlobalActionsDialogTest extends SysuiTestCase {
mGlobalActionsDialog = spy(mGlobalActionsDialog); mGlobalActionsDialog = spy(mGlobalActionsDialog);
// allow only 3 items to be shown // allow only 3 items to be shown
doReturn(3).when(mGlobalActionsDialog).getMaxShownPowerItems(); doReturn(3).when(mGlobalActionsDialog).getMaxShownPowerItems();
// make sure lockdown action will NOT be shown
doReturn(false).when(mGlobalActionsDialog).shouldDisplayLockdown(any());
String[] actions = { String[] actions = {
GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY, GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY,
// screenshot blocked because device not provisioned // lockdown action not allowed
GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT, GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN,
GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER, GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER,
GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART, GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART,
}; };