From 143eea4f7e117ac39e4ac01cdb5847d74e3ff5ed Mon Sep 17 00:00:00 2001 From: Aran Ink Date: Tue, 16 Jun 2020 19:18:49 -0400 Subject: [PATCH] Convert PowerOptions menu into a dialog and update styling. Fixes: 158491154 Test: Manual -- dialog matching spec appears when Power option is pressed. Test: Manual -- power dialog correctly passes through press and longpress events Test: Manual -- poewr dialog displays correctly across relevant display sizes. Change-Id: Id4936fa158ac2c840594a6287b729f4acc617558 --- .../layout/global_actions_power_dialog.xml | 24 ++++++ .../res/layout/global_actions_power_item.xml | 45 ++++++++++ packages/SystemUI/res/values/dimens.xml | 4 + .../globalactions/GlobalActionsDialog.java | 85 +++++++++++-------- .../GlobalActionsPowerDialog.java | 60 +++++++++++++ 5 files changed, 184 insertions(+), 34 deletions(-) create mode 100644 packages/SystemUI/res/layout/global_actions_power_dialog.xml create mode 100644 packages/SystemUI/res/layout/global_actions_power_item.xml create mode 100644 packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsPowerDialog.java diff --git a/packages/SystemUI/res/layout/global_actions_power_dialog.xml b/packages/SystemUI/res/layout/global_actions_power_dialog.xml new file mode 100644 index 0000000000000..ff3f0fb74cd5b --- /dev/null +++ b/packages/SystemUI/res/layout/global_actions_power_dialog.xml @@ -0,0 +1,24 @@ + + + diff --git a/packages/SystemUI/res/layout/global_actions_power_item.xml b/packages/SystemUI/res/layout/global_actions_power_item.xml new file mode 100644 index 0000000000000..0d060b63486ff --- /dev/null +++ b/packages/SystemUI/res/layout/global_actions_power_item.xml @@ -0,0 +1,45 @@ + + + + + + diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 44d3b02f0db7c..997d6e2ed2b3b 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1058,6 +1058,10 @@ 40dp + + 190dp + 255dp + 8dp diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index 915092134cc50..7326f4987dc2c 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -1422,16 +1422,26 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, Log.w(TAG, "No power options action found at position: " + position); return null; } - int viewLayoutResource = com.android.systemui.R.layout.controls_more_item; + int viewLayoutResource = com.android.systemui.R.layout.global_actions_power_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()); + view.setOnClickListener(v -> onClickItem(position)); + if (action instanceof LongPressAction) { + view.setOnLongClickListener(v -> onLongClickItem(position)); } - return textView; + ImageView icon = view.findViewById(R.id.icon); + TextView messageView = view.findViewById(R.id.message); + messageView.setSelected(true); // necessary for marquee to work + + icon.setImageDrawable(action.getIcon(mContext)); + icon.setScaleType(ScaleType.CENTER_CROP); + + if (action.getMessage() != null) { + messageView.setText(action.getMessage()); + } else { + messageView.setText(action.getMessageResId()); + } + return view; } private boolean onLongClickItem(int position) { @@ -1566,6 +1576,11 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, */ int getMessageResId(); + /** + * Return the icon drawable for this action. + */ + Drawable getIcon(Context context); + /** * Return the message associated with this action, or null if it doesn't have one. * @return @@ -1630,6 +1645,15 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, return mMessage; } + @Override + public Drawable getIcon(Context context) { + if (mIcon != null) { + return mIcon; + } else { + return context.getDrawable(mIconResId); + } + } + public View create( Context context, View convertView, ViewGroup parent, LayoutInflater inflater) { View v = inflater.inflate(com.android.systemui.R.layout.global_actions_grid_item_v2, @@ -1639,12 +1663,9 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, TextView messageView = v.findViewById(R.id.message); messageView.setSelected(true); // necessary for marquee to work - if (mIcon != null) { - icon.setImageDrawable(mIcon); - icon.setScaleType(ScaleType.CENTER_CROP); - } else if (mIconResId != 0) { - icon.setImageDrawable(context.getDrawable(mIconResId)); - } + icon.setImageDrawable(getIcon(context)); + icon.setScaleType(ScaleType.CENTER_CROP); + if (mMessage != null) { messageView.setText(mMessage); } else { @@ -1735,6 +1756,11 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, return isOn() ? mEnabledIconResId : mDisabledIconResid; } + @Override + public Drawable getIcon(Context context) { + return context.getDrawable(getIconResId()); + } + public View create(Context context, View convertView, ViewGroup parent, LayoutInflater inflater) { willCreate(); @@ -1901,6 +1927,12 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, return null; } + @Override + public Drawable getIcon(Context context) { + return null; + } + + public View create(Context context, View convertView, ViewGroup parent, LayoutInflater inflater) { View v = inflater.inflate(R.layout.global_actions_silent_mode, parent, false); @@ -2072,7 +2104,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, private final NotificationShadeDepthController mDepthController; private final SysUiState mSysUiState; private ListPopupWindow mOverflowPopup; - private ListPopupWindow mPowerOptionsPopup; + private Dialog mPowerOptionsDialog; private final Runnable mOnRotateCallback; private final boolean mControlsAvailable; @@ -2208,21 +2240,6 @@ 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() { GlobalActionsPopupMenu popup = new GlobalActionsPopupMenu( new ContextThemeWrapper( @@ -2241,8 +2258,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } public void showPowerOptionsMenu() { - mPowerOptionsPopup = createPowerOptionsPopup(); - mPowerOptionsPopup.show(); + mPowerOptionsDialog = GlobalActionsPowerDialog.create(mContext, mPowerOptionsAdapter); + mPowerOptionsDialog.show(); } private void showPowerOverflowMenu() { @@ -2476,11 +2493,11 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } private void dismissPowerOptions(boolean immediate) { - if (mPowerOptionsPopup != null) { + if (mPowerOptionsDialog != null) { if (immediate) { - mPowerOptionsPopup.dismissImmediate(); + mPowerOptionsDialog.dismiss(); } else { - mPowerOptionsPopup.dismiss(); + mPowerOptionsDialog.dismiss(); } } } diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsPowerDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsPowerDialog.java new file mode 100644 index 0000000000000..9dec3ab859b15 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsPowerDialog.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2020 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.globalactions; + +import android.annotation.NonNull; +import android.app.Dialog; +import android.content.Context; +import android.content.res.Resources; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ListAdapter; + +/** + * Creates a customized Dialog for displaying the Shut Down and Restart actions. + */ +public class GlobalActionsPowerDialog { + + /** + * Create a dialog for displaying Shut Down and Restart actions. + */ + public static Dialog create(@NonNull Context context, ListAdapter adapter) { + ViewGroup listView = (ViewGroup) LayoutInflater.from(context).inflate( + com.android.systemui.R.layout.global_actions_power_dialog, null); + + for (int i = 0; i < adapter.getCount(); i++) { + View action = adapter.getView(i, null, listView); + listView.addView(action); + } + + Resources res = context.getResources(); + + Dialog dialog = new Dialog(context); + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + dialog.setContentView(listView); + + Window window = dialog.getWindow(); + window.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY); + window.setTitle(""); // prevent Talkback from speaking first item name twice + window.setBackgroundDrawable(res.getDrawable( + com.android.systemui.R.drawable.control_background, context.getTheme())); + + return dialog; + } +}