summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2020-05-20 20:47:19 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-05-20 20:47:19 +0000
commit2af75c5f8fa16d38c2a1b6b16c135642f45d6a28 (patch)
treef87824cf909cfabe838774ae0eb985d373f5ea8a
parenta53c8288f58b22faafe1e79a8e9b135793fd379f (diff)
parent927a58fb6d36895ab9b927ab4ce99bd6afd945d8 (diff)
Merge "Show lock message in Global Actions" into rvc-dev am: 315edf11f8 am: 927a58fb6d
Change-Id: Ie9b901cdfbccca6b6497b5e6f490cd734251660e
-rw-r--r--packages/SystemUI/res/layout/global_actions_grid_v2.xml46
-rw-r--r--packages/SystemUI/res/values/dimens.xml3
-rw-r--r--packages/SystemUI/res/values/strings.xml7
-rw-r--r--packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java269
-rw-r--r--packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java80
6 files changed, 242 insertions, 169 deletions
diff --git a/packages/SystemUI/res/layout/global_actions_grid_v2.xml b/packages/SystemUI/res/layout/global_actions_grid_v2.xml
index ab4732de7124..7d45de3fa50d 100644
--- a/packages/SystemUI/res/layout/global_actions_grid_v2.xml
+++ b/packages/SystemUI/res/layout/global_actions_grid_v2.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/global_actions_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -43,39 +44,50 @@
</LinearLayout>
</com.android.systemui.globalactions.GlobalActionsFlatLayout>
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:id="@+id/global_actions_lock_message_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="gone">
+ <TextView
+ android:id="@+id/global_actions_lock_message"
+ style="@style/TextAppearance.Control.Title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginHorizontal="@dimen/global_actions_side_margin"
+ android:drawablePadding="12dp"
+ android:gravity="center"
+ android:text="@string/global_action_lock_message"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_bias="0.35"/>
+ </androidx.constraintlayout.widget.ConstraintLayout>
+
<com.android.systemui.globalactions.MinHeightScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
- android:scrollbars="none"
- >
+ android:scrollbars="none">
+
<LinearLayout
android:id="@+id/global_actions_grid_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="false"
android:orientation="vertical"
- android:clipToPadding="false"
- >
- <LinearLayout
- android:id="@+id/global_actions_panel"
+ android:clipToPadding="false">
+
+ <FrameLayout
+ android:id="@+id/global_actions_wallet"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- >
- <FrameLayout
- android:id="@+id/global_actions_panel_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- />
- </LinearLayout>
+ android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/global_actions_controls"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
- />
+ android:orientation="vertical"/>
+
</LinearLayout>
</com.android.systemui.globalactions.MinHeightScrollView>
</LinearLayout>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 31edcf643285..1481bff7bf1e 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -1028,6 +1028,9 @@
<!-- Amount to shift the layout when exiting/entering for controls activities -->
<dimen name="global_actions_controls_y_translation">20dp</dimen>
+ <!-- Shift quick access wallet down in Global Actions when Controls are unavailable -->
+ <dimen name="global_actions_wallet_top_margin">40dp</dimen>
+
<!-- The maximum offset in either direction that elements are moved horizontally to prevent
burn-in on AOD. -->
<dimen name="burn_in_prevention_offset_x">8dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index de483179a92a..e1df81a32f43 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -212,6 +212,13 @@
<!-- Power menu item for taking a screenshot [CHAR LIMIT=20]-->
<string name="global_action_screenshot">Screenshot</string>
+ <!-- Text shown when viewing global actions while phone is locked and additional controls are hidden [CHAR LIMIT=NONE] -->
+ <string name="global_action_lock_message" product="default">Unlock your phone for more options</string>
+ <!-- Text shown when viewing global actions while phone is locked and additional controls are hidden [CHAR LIMIT=NONE] -->
+ <string name="global_action_lock_message" product="tablet">Unlock your tablet for more options</string>
+ <!-- Text shown when viewing global actions while phone is locked and additional controls are hidden [CHAR LIMIT=NONE] -->
+ <string name="global_action_lock_message" product="device">Unlock your device for more options</string>
+
<!-- text to show in place of RemoteInput images when they cannot be shown.
[CHAR LIMIT=50] -->
<string name="remote_input_image_insertion_text">sent an image</string>
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index d69c3b01493f..c66a09554ec3 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -129,11 +129,8 @@ import com.android.systemui.model.SysUiState;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.GlobalActions.GlobalActionsManager;
import com.android.systemui.plugins.GlobalActionsPanelPlugin;
-import com.android.systemui.shared.system.QuickStepContract;
-import com.android.systemui.statusbar.BlurUtils;
import com.android.systemui.statusbar.NotificationShadeDepthController;
import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
-import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.EmergencyDialerConstants;
@@ -167,19 +164,19 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
/* Valid settings for global actions keys.
* see config.xml config_globalActionList */
@VisibleForTesting
- protected static final String GLOBAL_ACTION_KEY_POWER = "power";
- protected static final String GLOBAL_ACTION_KEY_AIRPLANE = "airplane";
- protected static final String GLOBAL_ACTION_KEY_BUGREPORT = "bugreport";
- protected static final String GLOBAL_ACTION_KEY_SILENT = "silent";
- protected static final String GLOBAL_ACTION_KEY_USERS = "users";
- protected static final String GLOBAL_ACTION_KEY_SETTINGS = "settings";
- protected static final String GLOBAL_ACTION_KEY_LOCKDOWN = "lockdown";
- protected static final String GLOBAL_ACTION_KEY_VOICEASSIST = "voiceassist";
- protected static final String GLOBAL_ACTION_KEY_ASSIST = "assist";
- protected static final String GLOBAL_ACTION_KEY_RESTART = "restart";
- protected static final String GLOBAL_ACTION_KEY_LOGOUT = "logout";
- protected static final String GLOBAL_ACTION_KEY_EMERGENCY = "emergency";
- protected static final String GLOBAL_ACTION_KEY_SCREENSHOT = "screenshot";
+ static final String GLOBAL_ACTION_KEY_POWER = "power";
+ private static final String GLOBAL_ACTION_KEY_AIRPLANE = "airplane";
+ private static final String GLOBAL_ACTION_KEY_BUGREPORT = "bugreport";
+ 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_SETTINGS = "settings";
+ private static final String GLOBAL_ACTION_KEY_LOCKDOWN = "lockdown";
+ private static final String GLOBAL_ACTION_KEY_VOICEASSIST = "voiceassist";
+ private static final String GLOBAL_ACTION_KEY_ASSIST = "assist";
+ static final String GLOBAL_ACTION_KEY_RESTART = "restart";
+ private static final String GLOBAL_ACTION_KEY_LOGOUT = "logout";
+ static final String GLOBAL_ACTION_KEY_EMERGENCY = "emergency";
+ static final String GLOBAL_ACTION_KEY_SCREENSHOT = "screenshot";
private static final String PREFS_CONTROLS_SEEDING_COMPLETED = "ControlsSeedingCompleted";
private static final String PREFS_CONTROLS_FILE = "controls_prefs";
@@ -202,7 +199,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private final MetricsLogger mMetricsLogger;
private final UiEventLogger mUiEventLogger;
private final NotificationShadeDepthController mDepthController;
- private final BlurUtils mBlurUtils;
private final SysUiState mSysUiState;
// Used for RingerModeTracker
@@ -211,7 +207,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
@VisibleForTesting
protected final ArrayList<Action> mItems = new ArrayList<>();
@VisibleForTesting
- protected final ArrayList<Action> mOverflowItems = new ArrayList<>();
+ final ArrayList<Action> mOverflowItems = new ArrayList<>();
@VisibleForTesting
protected ActionsDialog mDialog;
@@ -236,18 +232,18 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private final SysuiColorExtractor mSysuiColorExtractor;
private final IStatusBarService mStatusBarService;
private final NotificationShadeWindowController mNotificationShadeWindowController;
- private GlobalActionsPanelPlugin mPanelPlugin;
+ private GlobalActionsPanelPlugin mWalletPlugin;
private ControlsUiController mControlsUiController;
private final IWindowManager mIWindowManager;
private final Executor mBackgroundExecutor;
- private final ControlsListingController mControlsListingController;
private List<ControlsServiceInfo> mControlsServiceInfos = new ArrayList<>();
private ControlsController mControlsController;
private SharedPreferences mControlsPreferences;
private final RingerModeTracker mRingerModeTracker;
private int mDialogPressDelay = DIALOG_PRESS_DELAY; // ms
private Handler mMainHandler;
- private boolean mShowLockScreenCardsAndControls = false;
+ @VisibleForTesting
+ boolean mShowLockScreenCardsAndControls = false;
@VisibleForTesting
public enum GlobalActionsEvent implements UiEventLogger.UiEventEnum {
@@ -299,7 +295,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
TrustManager trustManager, IActivityManager iActivityManager,
@Nullable TelecomManager telecomManager, MetricsLogger metricsLogger,
NotificationShadeDepthController depthController, SysuiColorExtractor colorExtractor,
- IStatusBarService statusBarService, BlurUtils blurUtils,
+ IStatusBarService statusBarService,
NotificationShadeWindowController notificationShadeWindowController,
ControlsUiController controlsUiController, IWindowManager iWindowManager,
@Background Executor backgroundExecutor,
@@ -330,8 +326,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mControlsUiController = controlsUiController;
mIWindowManager = iWindowManager;
mBackgroundExecutor = backgroundExecutor;
- mControlsListingController = controlsListingController;
- mBlurUtils = blurUtils;
mRingerModeTracker = ringerModeTracker;
mControlsController = controlsController;
mSysUiState = sysUiState;
@@ -372,20 +366,21 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
@Override
public void onUnlockedChanged() {
if (mDialog != null) {
- if (mDialog.mPanelController != null) {
- mDialog.mPanelController.onDeviceLockStateChanged(
- !mKeyguardStateController.isUnlocked());
+ boolean unlocked = mKeyguardStateController.isUnlocked();
+ if (mDialog.mWalletViewController != null) {
+ mDialog.mWalletViewController.onDeviceLockStateChanged(!unlocked);
}
if (!mDialog.isShowingControls() && shouldShowControls()) {
mDialog.showControls(mControlsUiController);
}
+ if (unlocked) {
+ mDialog.hideLockMessage();
+ }
}
}
});
- mControlsListingController.addCallback(list -> {
- mControlsServiceInfos = list;
- });
+ controlsListingController.addCallback(list -> mControlsServiceInfos = list);
// Need to be user-specific with the context to make sure we read the correct prefs
Context userContext = context.createContextAsUser(
@@ -450,10 +445,10 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
* @param keyguardShowing True if keyguard is showing
*/
public void showOrHideDialog(boolean keyguardShowing, boolean isDeviceProvisioned,
- GlobalActionsPanelPlugin panelPlugin) {
+ GlobalActionsPanelPlugin walletPlugin) {
mKeyguardShowing = keyguardShowing;
mDeviceProvisioned = isDeviceProvisioned;
- mPanelPlugin = panelPlugin;
+ mWalletPlugin = walletPlugin;
if (mDialog != null && mDialog.isShowing()) {
// In order to force global actions to hide on the same affordance press, we must
// register a call to onGlobalActionsShown() first to prevent the default actions
@@ -520,11 +515,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
*/
@VisibleForTesting
protected int getMaxShownPowerItems() {
- if (shouldUseControlsLayout()) {
- return mResources.getInteger(com.android.systemui.R.integer.power_menu_max_columns);
- } else {
- return Integer.MAX_VALUE;
- }
+ return mResources.getInteger(com.android.systemui.R.integer.power_menu_max_columns);
}
/**
@@ -593,9 +584,10 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
} else if (GLOBAL_ACTION_KEY_SETTINGS.equals(actionKey)) {
addActionItem(getSettingsAction());
} else if (GLOBAL_ACTION_KEY_LOCKDOWN.equals(actionKey)) {
+ int userId = getCurrentUser().id;
if (Settings.Secure.getIntForUser(mContentResolver,
- Settings.Secure.LOCKDOWN_IN_POWER_MENU, 0, getCurrentUser().id) != 0
- && shouldDisplayLockdown()) {
+ Settings.Secure.LOCKDOWN_IN_POWER_MENU, 0, userId) != 0
+ && shouldDisplayLockdown(userId)) {
addActionItem(getLockdownAction());
}
} else if (GLOBAL_ACTION_KEY_VOICEASSIST.equals(actionKey)) {
@@ -639,12 +631,19 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mAdapter = new MyAdapter();
mOverflowAdapter = new MyOverflowAdapter();
- mDepthController.setShowingHomeControls(shouldUseControlsLayout());
+ mDepthController.setShowingHomeControls(true);
+ GlobalActionsPanelPlugin.PanelViewController walletViewController =
+ getWalletViewController();
ActionsDialog dialog = new ActionsDialog(mContext, mAdapter, mOverflowAdapter,
- getWalletPanelViewController(), mDepthController, mSysuiColorExtractor,
+ walletViewController, mDepthController, mSysuiColorExtractor,
mStatusBarService, mNotificationShadeWindowController,
- shouldShowControls() ? mControlsUiController : null, mBlurUtils, mSysUiState,
- shouldUseControlsLayout(), this::onRotate, mKeyguardShowing);
+ controlsAvailable(), shouldShowControls() ? mControlsUiController : null,
+ mSysUiState, this::onRotate, mKeyguardShowing);
+ boolean walletViewAvailable = walletViewController != null
+ && walletViewController.getPanelContent() != null;
+ if (shouldShowLockMessage(walletViewAvailable)) {
+ dialog.showLockMessage();
+ }
dialog.setCanceledOnTouchOutside(false); // Handled by the custom class.
dialog.setOnDismissListener(this);
dialog.setOnShowListener(this);
@@ -652,13 +651,12 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
return dialog;
}
- private boolean shouldDisplayLockdown() {
+ private boolean shouldDisplayLockdown(int userId) {
// Lockdown is meaningless without a place to go.
if (!mKeyguardStateController.isMethodSecure()) {
return false;
}
- int userId = getCurrentUser().id;
// Only show the lockdown button if the device isn't locked down (for whatever reason).
int state = mLockPatternUtils.getStrongAuthForUser(userId);
return (state == STRONG_AUTH_NOT_REQUIRED
@@ -678,11 +676,11 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
}
@Nullable
- private GlobalActionsPanelPlugin.PanelViewController getWalletPanelViewController() {
- if (mPanelPlugin == null) {
+ private GlobalActionsPanelPlugin.PanelViewController getWalletViewController() {
+ if (mWalletPlugin == null) {
return null;
}
- return mPanelPlugin.onPanelShown(this, !mKeyguardStateController.isUnlocked());
+ return mWalletPlugin.onPanelShown(this, !mKeyguardStateController.isUnlocked());
}
/**
@@ -743,7 +741,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
@Override
public boolean shouldBeSeparated() {
- return !shouldUseControlsLayout();
+ return false;
}
@Override
@@ -751,18 +749,10 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
Context context, View convertView, ViewGroup parent, LayoutInflater inflater) {
View v = super.create(context, convertView, parent, inflater);
int textColor;
- if (shouldUseControlsLayout()) {
- v.setBackgroundTintList(ColorStateList.valueOf(v.getResources().getColor(
- com.android.systemui.R.color.global_actions_emergency_background)));
- textColor = v.getResources().getColor(
- com.android.systemui.R.color.global_actions_emergency_text);
- } else if (shouldBeSeparated()) {
- textColor = v.getResources().getColor(
- com.android.systemui.R.color.global_actions_alert_text);
- } else {
- textColor = v.getResources().getColor(
- com.android.systemui.R.color.global_actions_text);
- }
+ v.setBackgroundTintList(ColorStateList.valueOf(v.getResources().getColor(
+ com.android.systemui.R.color.global_actions_emergency_background)));
+ textColor = v.getResources().getColor(
+ com.android.systemui.R.color.global_actions_emergency_text);
TextView messageView = v.findViewById(R.id.message);
messageView.setTextColor(textColor);
messageView.setSelected(true); // necessary for marquee to work
@@ -1192,13 +1182,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mUiEventLogger.log(GlobalActionsEvent.GA_POWER_MENU_OPEN);
}
- private int getActionLayoutId() {
- if (shouldUseControlsLayout()) {
- return com.android.systemui.R.layout.global_actions_grid_item_v2;
- }
- return com.android.systemui.R.layout.global_actions_grid_item;
- }
-
/**
* The adapter used for power menu items shown in the global actions dialog.
*/
@@ -1492,7 +1475,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
public View create(
Context context, View convertView, ViewGroup parent, LayoutInflater inflater) {
- View v = inflater.inflate(getActionLayoutId(), parent, false /* attach */);
+ View v = inflater.inflate(com.android.systemui.R.layout.global_actions_grid_item_v2,
+ parent, false /* attach */);
ImageView icon = v.findViewById(R.id.icon);
TextView messageView = v.findViewById(R.id.message);
@@ -1598,7 +1582,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
LayoutInflater inflater) {
willCreate();
- View v = inflater.inflate(getActionLayoutId(), parent, false /* attach */);
+ View v = inflater.inflate(com.android.systemui.R.layout.global_actions_grid_item_v2,
+ parent, false /* attach */);
ImageView icon = (ImageView) v.findViewById(R.id.icon);
TextView messageView = (TextView) v.findViewById(R.id.message);
@@ -1905,7 +1890,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
return mLifecycle;
}
- private static final class ActionsDialog extends Dialog implements DialogInterface,
+ @VisibleForTesting
+ static final class ActionsDialog extends Dialog implements DialogInterface,
ColorExtractor.OnColorsChangedListener {
private final Context mContext;
@@ -1916,7 +1902,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private MultiListLayout mGlobalActionsLayout;
private Drawable mBackgroundDrawable;
private final SysuiColorExtractor mColorExtractor;
- private final GlobalActionsPanelPlugin.PanelViewController mPanelController;
+ private final GlobalActionsPanelPlugin.PanelViewController mWalletViewController;
private boolean mKeyguardShowing;
private boolean mShowing;
private float mScrimAlpha;
@@ -1924,24 +1910,24 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private boolean mHadTopUi;
private final NotificationShadeWindowController mNotificationShadeWindowController;
private final NotificationShadeDepthController mDepthController;
- private final BlurUtils mBlurUtils;
private final SysUiState mSysUiState;
- private final boolean mUseControlsLayout;
private ListPopupWindow mOverflowPopup;
private final Runnable mOnRotateCallback;
+ private final boolean mControlsAvailable;
private ControlsUiController mControlsUiController;
private ViewGroup mControlsView;
private ViewGroup mContainer;
+ @VisibleForTesting ViewGroup mLockMessageContainer;
+ private TextView mLockMessage;
ActionsDialog(Context context, MyAdapter adapter, MyOverflowAdapter overflowAdapter,
- GlobalActionsPanelPlugin.PanelViewController plugin,
+ GlobalActionsPanelPlugin.PanelViewController walletViewController,
NotificationShadeDepthController depthController,
SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService,
NotificationShadeWindowController notificationShadeWindowController,
- ControlsUiController controlsUiController, BlurUtils blurUtils,
- SysUiState sysuiState, boolean useControlsLayout, Runnable onRotateCallback,
- boolean keyguardShowing) {
+ boolean controlsAvailable, @Nullable ControlsUiController controlsUiController,
+ SysUiState sysuiState, Runnable onRotateCallback, boolean keyguardShowing) {
super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions);
mContext = context;
mAdapter = adapter;
@@ -1950,10 +1936,9 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mColorExtractor = sysuiColorExtractor;
mStatusBarService = statusBarService;
mNotificationShadeWindowController = notificationShadeWindowController;
+ mControlsAvailable = controlsAvailable;
mControlsUiController = controlsUiController;
- mBlurUtils = blurUtils;
mSysUiState = sysuiState;
- mUseControlsLayout = useControlsLayout;
mOnRotateCallback = onRotateCallback;
mKeyguardShowing = keyguardShowing;
@@ -1978,7 +1963,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
window.getAttributes().setFitInsetsTypes(0 /* types */);
setTitle(R.string.global_actions);
- mPanelController = plugin;
+ mWalletViewController = walletViewController;
initializeLayout();
}
@@ -1991,11 +1976,11 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mControlsUiController.show(mControlsView, this::dismissForControlsActivity);
}
- private boolean shouldUsePanel() {
- return mPanelController != null && mPanelController.getPanelContent() != null;
- }
+ private void initializeWalletView() {
+ if (mWalletViewController == null || mWalletViewController.getPanelContent() == null) {
+ return;
+ }
- private void initializePanel() {
int rotation = RotationUtils.getRotation(mContext);
boolean rotationLocked = RotationPolicy.isRotationLocked(mContext);
if (rotation != RotationUtils.ROTATION_NONE) {
@@ -2032,12 +2017,16 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
setRotationSuggestionsEnabled(false);
FrameLayout panelContainer =
- findViewById(com.android.systemui.R.id.global_actions_panel_container);
+ findViewById(com.android.systemui.R.id.global_actions_wallet);
FrameLayout.LayoutParams panelParams =
new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT);
- View walletView = mPanelController.getPanelContent();
+ if (!mControlsAvailable) {
+ panelParams.topMargin = mContext.getResources().getDimensionPixelSize(
+ com.android.systemui.R.dimen.global_actions_wallet_top_margin);
+ }
+ View walletView = mWalletViewController.getPanelContent();
panelContainer.addView(walletView, panelParams);
// Smooth transitions when wallet is resized, which can happen when a card is added
ViewGroup root = findViewById(com.android.systemui.R.id.global_actions_grid_root);
@@ -2077,7 +2066,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
}
private void initializeLayout() {
- setContentView(getGlobalActionsLayoutId(mContext));
+ setContentView(com.android.systemui.R.layout.global_actions_grid_v2);
fixNavBarClipping();
mControlsView = findViewById(com.android.systemui.R.id.global_actions_controls);
mGlobalActionsLayout = findViewById(com.android.systemui.R.id.global_actions_view);
@@ -2093,10 +2082,9 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
mGlobalActionsLayout.setRotationListener(this::onRotate);
mGlobalActionsLayout.setAdapter(mAdapter);
mContainer = findViewById(com.android.systemui.R.id.global_actions_container);
- // Some legacy dialog layouts don't have the outer container
- if (mContainer == null) {
- mContainer = mGlobalActionsLayout;
- }
+ mLockMessageContainer = requireViewById(
+ com.android.systemui.R.id.global_actions_lock_message_container);
+ mLockMessage = requireViewById(com.android.systemui.R.id.global_actions_lock_message);
View overflowButton = findViewById(
com.android.systemui.R.id.global_actions_overflow_button);
@@ -2117,17 +2105,10 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
}
}
- if (shouldUsePanel()) {
- initializePanel();
- }
+ initializeWalletView();
if (mBackgroundDrawable == null) {
mBackgroundDrawable = new ScrimDrawable();
- if (mUseControlsLayout) {
- mScrimAlpha = 1.0f;
- } else {
- mScrimAlpha = mBlurUtils.supportsBlursOnWindows()
- ? ScrimController.BLUR_SCRIM_ALPHA : ScrimController.BUSY_SCRIM_ALPHA;
- }
+ mScrimAlpha = 1.0f;
}
getWindow().setBackgroundDrawable(mBackgroundDrawable);
}
@@ -2141,29 +2122,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
contentParent.setClipToPadding(false);
}
- private int getGlobalActionsLayoutId(Context context) {
- if (mUseControlsLayout) {
- return com.android.systemui.R.layout.global_actions_grid_v2;
- }
-
- int rotation = RotationUtils.getRotation(context);
- boolean useGridLayout = isForceGridEnabled(context)
- || (shouldUsePanel() && rotation == RotationUtils.ROTATION_NONE);
- if (rotation == RotationUtils.ROTATION_SEASCAPE) {
- if (useGridLayout) {
- return com.android.systemui.R.layout.global_actions_grid_seascape;
- } else {
- return com.android.systemui.R.layout.global_actions_column_seascape;
- }
- } else {
- if (useGridLayout) {
- return com.android.systemui.R.layout.global_actions_grid;
- } else {
- return com.android.systemui.R.layout.global_actions_column;
- }
- }
- }
-
@Override
protected void onStart() {
super.setCanceledOnTouchOutside(true);
@@ -2187,9 +2145,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
if (!(mBackgroundDrawable instanceof ScrimDrawable)) {
return;
}
- ((ScrimDrawable) mBackgroundDrawable).setColor(
- !mUseControlsLayout && colors.supportsDarkText()
- ? Color.WHITE : Color.BLACK, animate);
+ ((ScrimDrawable) mBackgroundDrawable).setColor(Color.BLACK, animate);
View decorView = getWindow().getDecorView();
if (colors.supportsDarkText()) {
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR |
@@ -2216,12 +2172,10 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
ViewGroup root = (ViewGroup) mGlobalActionsLayout.getRootView();
root.setOnApplyWindowInsetsListener((v, windowInsets) -> {
- if (mUseControlsLayout) {
- root.setPadding(windowInsets.getStableInsetLeft(),
- windowInsets.getStableInsetTop(),
- windowInsets.getStableInsetRight(),
- windowInsets.getStableInsetBottom());
- }
+ root.setPadding(windowInsets.getStableInsetLeft(),
+ windowInsets.getStableInsetTop(),
+ windowInsets.getStableInsetRight(),
+ windowInsets.getStableInsetBottom());
return WindowInsets.CONSUMED;
});
if (mControlsUiController != null) {
@@ -2308,7 +2262,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
private void completeDismiss() {
mShowing = false;
resetOrientation();
- dismissPanel();
+ dismissWallet();
dismissOverflow(true);
if (mControlsUiController != null) mControlsUiController.hide();
mNotificationShadeWindowController.setForceHasTopUi(mHadTopUi);
@@ -2318,9 +2272,9 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
super.dismiss();
}
- private void dismissPanel() {
- if (mPanelController != null) {
- mPanelController.onDismissed();
+ private void dismissWallet() {
+ if (mWalletViewController != null) {
+ mWalletViewController.onDismissed();
}
}
@@ -2375,7 +2329,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
public void refreshDialog() {
// ensure dropdown menus are dismissed before re-initializing the dialog
- dismissPanel();
+ dismissWallet();
dismissOverflow(true);
if (mControlsUiController != null) {
mControlsUiController.hide();
@@ -2396,6 +2350,25 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
}
}
+ void hideLockMessage() {
+ if (mLockMessageContainer.getVisibility() == View.VISIBLE) {
+ mLockMessageContainer.animate().alpha(0).setDuration(150).setListener(
+ new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mLockMessageContainer.setVisibility(View.GONE);
+ }
+ }).start();
+ }
+ }
+
+ void showLockMessage() {
+ Drawable lockIcon = mContext.getDrawable(com.android.internal.R.drawable.ic_lock);
+ lockIcon.setTint(mContext.getColor(com.android.systemui.R.color.control_primary_text));
+ mLockMessage.setCompoundDrawablesWithIntrinsicBounds(null, lockIcon, null, null);
+ mLockMessageContainer.setVisibility(View.VISIBLE);
+ }
+
private static class ResetOrientationData {
public boolean locked;
public int rotation;
@@ -2418,17 +2391,21 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener,
return isPanelDebugModeEnabled(context);
}
- @VisibleForTesting
- protected boolean shouldShowControls() {
+ private boolean shouldShowControls() {
return (mKeyguardStateController.isUnlocked() || mShowLockScreenCardsAndControls)
+ && controlsAvailable();
+ }
+
+ private boolean controlsAvailable() {
+ return mDeviceProvisioned
&& mControlsUiController.getAvailable()
- && !mControlsServiceInfos.isEmpty()
- && mDeviceProvisioned;
+ && !mControlsServiceInfos.isEmpty();
}
- // TODO: Remove legacy layout XML and classes.
- protected boolean shouldUseControlsLayout() {
- // always use new controls layout
- return true;
+
+ private boolean shouldShowLockMessage(boolean walletViewAvailable) {
+ return !mKeyguardStateController.isUnlocked()
+ && !mShowLockScreenCardsAndControls
+ && (controlsAvailable() || walletViewAvailable);
}
private void onPowerMenuLockScreenSettingsChanged() {
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
index 09757a4d6204..b55b29a80410 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
@@ -53,7 +53,7 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks
private final Lazy<GlobalActionsDialog> mGlobalActionsDialogLazy;
private final KeyguardStateController mKeyguardStateController;
private final DeviceProvisionedController mDeviceProvisionedController;
- private final ExtensionController.Extension<GlobalActionsPanelPlugin> mPanelExtension;
+ private final ExtensionController.Extension<GlobalActionsPanelPlugin> mWalletPluginProvider;
private final BlurUtils mBlurUtils;
private final CommandQueue mCommandQueue;
private GlobalActionsDialog mGlobalActionsDialog;
@@ -69,7 +69,7 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks
mCommandQueue = commandQueue;
mBlurUtils = blurUtils;
mCommandQueue.addCallback(this);
- mPanelExtension = Dependency.get(ExtensionController.class)
+ mWalletPluginProvider = Dependency.get(ExtensionController.class)
.newExtension(GlobalActionsPanelPlugin.class)
.withPlugin(GlobalActionsPanelPlugin.class)
.build();
@@ -90,7 +90,7 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks
mGlobalActionsDialog = mGlobalActionsDialogLazy.get();
mGlobalActionsDialog.showOrHideDialog(mKeyguardStateController.isShowing(),
mDeviceProvisionedController.isDeviceProvisioned(),
- mPanelExtension.get());
+ mWalletPluginProvider.get());
Dependency.get(KeyguardUpdateMonitor.class).requestFaceAuth();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java
index 4a8598009381..8db57cdf5f71 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java
@@ -16,9 +16,13 @@
package com.android.systemui.globalactions;
+import static com.google.common.truth.Truth.assertThat;
+
import static junit.framework.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
@@ -30,6 +34,7 @@ import android.app.admin.DevicePolicyManager;
import android.app.trust.TrustManager;
import android.content.ContentResolver;
import android.content.res.Resources;
+import android.graphics.Color;
import android.media.AudioManager;
import android.net.ConnectivityManager;
import android.os.Handler;
@@ -40,9 +45,12 @@ import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.FeatureFlagUtils;
import android.view.IWindowManager;
+import android.view.View;
+import android.widget.FrameLayout;
import androidx.test.filters.SmallTest;
+import com.android.internal.colorextraction.ColorExtractor;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.statusbar.IStatusBarService;
@@ -56,7 +64,7 @@ import com.android.systemui.controls.ui.ControlsUiController;
import com.android.systemui.model.SysUiState;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.GlobalActions;
-import com.android.systemui.statusbar.BlurUtils;
+import com.android.systemui.plugins.GlobalActionsPanelPlugin;
import com.android.systemui.statusbar.NotificationShadeDepthController;
import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -98,7 +106,6 @@ public class GlobalActionsDialogTest extends SysuiTestCase {
@Mock private NotificationShadeDepthController mDepthController;
@Mock private SysuiColorExtractor mColorExtractor;
@Mock private IStatusBarService mStatusBarService;
- @Mock private BlurUtils mBlurUtils;
@Mock private NotificationShadeWindowController mNotificationShadeWindowController;
@Mock private ControlsUiController mControlsUiController;
@Mock private IWindowManager mWindowManager;
@@ -109,6 +116,8 @@ public class GlobalActionsDialogTest extends SysuiTestCase {
@Mock private RingerModeTracker mRingerModeTracker;
@Mock private RingerModeLiveData mRingerModeLiveData;
@Mock private SysUiState mSysUiState;
+ @Mock GlobalActionsPanelPlugin mWalletPlugin;
+ @Mock GlobalActionsPanelPlugin.PanelViewController mWalletController;
@Mock private Handler mHandler;
private TestableLooper mTestableLooper;
@@ -143,7 +152,6 @@ public class GlobalActionsDialogTest extends SysuiTestCase {
mDepthController,
mColorExtractor,
mStatusBarService,
- mBlurUtils,
mNotificationShadeWindowController,
mControlsUiController,
mWindowManager,
@@ -156,6 +164,11 @@ public class GlobalActionsDialogTest extends SysuiTestCase {
mHandler
);
mGlobalActionsDialog.setZeroDialogPressDelayForTesting();
+
+ ColorExtractor.GradientColors backdropColors = new ColorExtractor.GradientColors();
+ backdropColors.setMainColor(Color.BLACK);
+ when(mColorExtractor.getNeutralColors()).thenReturn(backdropColors);
+ when(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState);
}
@Test
@@ -277,4 +290,65 @@ public class GlobalActionsDialogTest extends SysuiTestCase {
assertEquals(3, mGlobalActionsDialog.mItems.size());
assertEquals(0, mGlobalActionsDialog.mOverflowItems.size());
}
+
+ @Test
+ public void testShouldShowLockScreenMessage() {
+ mGlobalActionsDialog = spy(mGlobalActionsDialog);
+ mGlobalActionsDialog.mDialog = null;
+ when(mKeyguardStateController.isUnlocked()).thenReturn(false);
+ mGlobalActionsDialog.mShowLockScreenCardsAndControls = false;
+ setupDefaultActions();
+ when(mWalletPlugin.onPanelShown(any(), anyBoolean())).thenReturn(mWalletController);
+ when(mWalletController.getPanelContent()).thenReturn(new FrameLayout(mContext));
+
+ mGlobalActionsDialog.showOrHideDialog(false, true, mWalletPlugin);
+
+ GlobalActionsDialog.ActionsDialog dialog = mGlobalActionsDialog.mDialog;
+ assertThat(dialog).isNotNull();
+ assertThat(dialog.mLockMessageContainer.getVisibility()).isEqualTo(View.VISIBLE);
+ }
+
+ @Test
+ public void testShouldNotShowLockScreenMessage_whenWalletOrControlsShownOnLockScreen() {
+ mGlobalActionsDialog = spy(mGlobalActionsDialog);
+ mGlobalActionsDialog.mDialog = null;
+ when(mKeyguardStateController.isUnlocked()).thenReturn(false);
+ mGlobalActionsDialog.mShowLockScreenCardsAndControls = true;
+ setupDefaultActions();
+ when(mWalletPlugin.onPanelShown(any(), anyBoolean())).thenReturn(mWalletController);
+ when(mWalletController.getPanelContent()).thenReturn(new FrameLayout(mContext));
+
+ mGlobalActionsDialog.showOrHideDialog(false, true, mWalletPlugin);
+
+ GlobalActionsDialog.ActionsDialog dialog = mGlobalActionsDialog.mDialog;
+ assertThat(dialog).isNotNull();
+ assertThat(dialog.mLockMessageContainer.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void testShouldNotShowLockScreenMessage_whenControlsAndWalletBothDisabled() {
+ mGlobalActionsDialog = spy(mGlobalActionsDialog);
+ mGlobalActionsDialog.mDialog = null;
+ when(mKeyguardStateController.isUnlocked()).thenReturn(false);
+ mGlobalActionsDialog.mShowLockScreenCardsAndControls = true;
+ setupDefaultActions();
+ when(mWalletPlugin.onPanelShown(any(), anyBoolean())).thenReturn(mWalletController);
+ when(mWalletController.getPanelContent()).thenReturn(null);
+ when(mControlsUiController.getAvailable()).thenReturn(false);
+
+ mGlobalActionsDialog.showOrHideDialog(false, true, mWalletPlugin);
+
+ GlobalActionsDialog.ActionsDialog dialog = mGlobalActionsDialog.mDialog;
+ assertThat(dialog).isNotNull();
+ assertThat(dialog.mLockMessageContainer.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ private void setupDefaultActions() {
+ String[] actions = {
+ GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER,
+ GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART,
+ GlobalActionsDialog.GLOBAL_ACTION_KEY_SCREENSHOT,
+ };
+ doReturn(actions).when(mGlobalActionsDialog).getDefaultActions();
+ }
}