diff options
11 files changed, 165 insertions, 90 deletions
diff --git a/packages/SystemUI/res/drawable/control_spinner_background.xml b/packages/SystemUI/res/drawable/control_spinner_background.xml index 999a77c71bb2..7a8728d2983c 100644 --- a/packages/SystemUI/res/drawable/control_spinner_background.xml +++ b/packages/SystemUI/res/drawable/control_spinner_background.xml @@ -16,7 +16,7 @@ <layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:paddingMode="stack" - android:paddingStart="0dp" + android:paddingStart="40dp" android:paddingEnd="40dp" android:paddingLeft="0dp" android:paddingRight="0dp"> diff --git a/packages/SystemUI/res/drawable/controls_list_divider_inset.xml b/packages/SystemUI/res/drawable/controls_list_divider_inset.xml new file mode 100644 index 000000000000..ddfa18c53db9 --- /dev/null +++ b/packages/SystemUI/res/drawable/controls_list_divider_inset.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> +<inset + xmlns:android="http://schemas.android.com/apk/res/android" + android:drawable="@drawable/controls_list_divider" + android:insetRight="@dimen/control_spinner_padding_horizontal" + android:insetLeft="@dimen/control_spinner_padding_horizontal" /> diff --git a/packages/SystemUI/res/layout/controls_more_item.xml b/packages/SystemUI/res/layout/controls_more_item.xml index 549874a31acd..f24850e11e46 100644 --- a/packages/SystemUI/res/layout/controls_more_item.xml +++ b/packages/SystemUI/res/layout/controls_more_item.xml @@ -18,6 +18,5 @@ style="@style/Control.MenuItem" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="24dp" android:layout_gravity="start" /> diff --git a/packages/SystemUI/res/layout/controls_spinner_item.xml b/packages/SystemUI/res/layout/controls_spinner_item.xml index 45540f102de1..574aed62ea86 100644 --- a/packages/SystemUI/res/layout/controls_spinner_item.xml +++ b/packages/SystemUI/res/layout/controls_spinner_item.xml @@ -17,7 +17,8 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="8dp"> + android:paddingVertical="@dimen/control_spinner_padding_vertical" + android:paddingHorizontal="@dimen/control_spinner_padding_horizontal"> <LinearLayout android:orientation="horizontal" diff --git a/packages/SystemUI/res/layout/controls_with_favorites.xml b/packages/SystemUI/res/layout/controls_with_favorites.xml index b32320956e26..065ff68774eb 100644 --- a/packages/SystemUI/res/layout/controls_with_favorites.xml +++ b/packages/SystemUI/res/layout/controls_with_favorites.xml @@ -21,14 +21,14 @@ android:layout_height="match_parent" android:orientation="horizontal" android:layout_marginTop="@dimen/controls_top_margin" - android:layout_marginEnd="@dimen/controls_header_side_margin" - android:layout_marginStart="@dimen/controls_header_side_margin"> + android:layout_marginBottom="@dimen/controls_header_bottom_margin"> <!-- make sure the header stays centered in the layout by adding a spacer --> <Space android:layout_width="@dimen/controls_header_menu_size" android:layout_height="1dp" /> - + <!-- need to keep this outer view in order to have a correctly sized anchor + for the dropdown menu, as well as dropdown background in the right place --> <LinearLayout android:id="@+id/controls_header" android:orientation="horizontal" @@ -38,15 +38,6 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center"> - - <ImageView - android:id="@+id/app_icon" - android:layout_gravity="center" - android:layout_width="@dimen/controls_header_app_icon_size" - android:layout_height="@dimen/controls_header_app_icon_size" - android:contentDescription="@null" - android:layout_marginEnd="10dp" /> - <TextView style="@style/Control.Spinner.Header" android:clickable="false" @@ -55,7 +46,6 @@ android:layout_height="wrap_content" android:layout_gravity="center" /> </LinearLayout> - <ImageView android:id="@+id/controls_more" android:src="@drawable/ic_more_vert" @@ -73,7 +63,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:paddingTop="30dp" android:layout_marginLeft="@dimen/global_actions_side_margin" android:layout_marginRight="@dimen/global_actions_side_margin" /> </merge> diff --git a/packages/SystemUI/res/layout/global_actions_grid_v2.xml b/packages/SystemUI/res/layout/global_actions_grid_v2.xml index fb57b47f63a0..e4e9d2975220 100644 --- a/packages/SystemUI/res/layout/global_actions_grid_v2.xml +++ b/packages/SystemUI/res/layout/global_actions_grid_v2.xml @@ -20,8 +20,6 @@ android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingLeft="@dimen/global_actions_grid_horizontal_padding" - android:paddingRight="@dimen/global_actions_grid_horizontal_padding" android:paddingTop="@dimen/global_actions_grid_vertical_padding" android:paddingBottom="@dimen/global_actions_grid_vertical_padding" android:orientation="horizontal" diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 48648e547a84..23a887c86a26 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1249,9 +1249,17 @@ <!-- Home Controls --> <dimen name="controls_header_side_margin">4dp</dimen> <dimen name="controls_header_menu_size">48dp</dimen> - <dimen name="controls_header_app_icon_size">40dp</dimen> - <dimen name="controls_top_margin">44dp</dimen> - <dimen name="control_header_text_size">22sp</dimen> + <dimen name="controls_header_bottom_margin">24dp</dimen> + <dimen name="controls_header_app_icon_size">24dp</dimen> + <dimen name="controls_top_margin">48dp</dimen> + <dimen name="control_header_text_size">20sp</dimen> + <dimen name="control_item_text_size">16sp</dimen> + <dimen name="control_menu_item_text_size">16sp</dimen> + <dimen name="control_menu_item_min_height">56dp</dimen> + <dimen name="control_menu_vertical_padding">12dp</dimen> + <dimen name="control_menu_horizontal_padding">16dp</dimen> + <dimen name="control_spinner_padding_vertical">24dp</dimen> + <dimen name="control_spinner_padding_horizontal">20dp</dimen> <dimen name="control_text_size">14sp</dimen> <dimen name="control_icon_size">24dp</dimen> <dimen name="control_spacing">4dp</dimen> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 57d2040bed57..d3a5f04b7285 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -692,14 +692,16 @@ <style name="Control" /> <style name="Control.MenuItem"> - <item name="android:fontFamily">@*android:string/config_bodyFontFamilyMedium</item> - <item name="android:textSize">@dimen/control_text_size</item> + <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> + <item name="android:textSize">@dimen/control_menu_item_text_size</item> <item name="android:textColor">@color/control_primary_text</item> <item name="android:singleLine">true</item> + <item name="android:gravity">center_vertical</item> + <item name="android:minHeight">@dimen/control_menu_item_min_height</item> </style> <style name="Control.Spinner"> - <item name="android:textSize">@dimen/control_header_text_size</item> + <item name="android:textColor">@color/control_primary_text</item> <item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item> <item name="android:singleLine">true</item> <item name="android:ellipsize">end</item> @@ -707,11 +709,12 @@ <style name="Control.Spinner.Header"> <item name="android:background">@drawable/control_spinner_background</item> - <item name="android:textColor">@color/control_primary_text</item> + <item name="android:textSize">@dimen/control_header_text_size</item> </style> <style name="Control.Spinner.Item"> - <item name="android:textColor">@color/control_secondary_text</item> + <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> + <item name="android:textSize">@dimen/control_item_text_size</item> </style> <style name="TextAppearance.Control.Status"> @@ -735,7 +738,8 @@ <item name="android:overlapAnchor">true</item> <!-- used to override dark/light theming --> - <item name="*android:colorPopupBackground">@color/GM2_grey_900</item> + <item name="*android:colorBackgroundFloating">@color/GM2_grey_800</item> + <item name="*android:colorPopupBackground">@color/GM2_grey_800</item> </style> <style name="TextAppearance.ControlSetup"> diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt index 7108966072b9..38e732517c79 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt @@ -35,7 +35,6 @@ import android.util.TypedValue import android.view.ContextThemeWrapper import android.view.LayoutInflater import android.view.View -import android.view.View.MeasureSpec import android.view.ViewGroup import android.view.WindowManager import android.view.animation.AccelerateInterpolator @@ -58,6 +57,7 @@ import com.android.systemui.controls.management.ControlsListingController import com.android.systemui.controls.management.ControlsProviderSelectorActivity import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.globalactions.GlobalActionsPopupMenu import com.android.systemui.plugins.ActivityStarter import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.concurrency.DelayableExecutor @@ -287,14 +287,6 @@ class ControlsUiControllerImpl @Inject constructor ( createMenu() } - private fun createPopup(): ListPopupWindow { - return ListPopupWindow( - ContextThemeWrapper(context, R.style.Control_ListPopupWindow)).apply { - setWindowLayoutType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY) - setModal(true) - } - } - private fun createMenu() { val items = arrayOf( context.resources.getString(R.string.controls_menu_add), @@ -306,7 +298,7 @@ class ControlsUiControllerImpl @Inject constructor ( val anchor = parent.requireViewById<ImageView>(R.id.controls_more) anchor.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View) { - popup = createPopup().apply { + popup = GlobalActionsPopupMenu(context, false /* isDropDownMode */).apply { setAnchorView(anchor) setAdapter(adapter) setOnItemClickListener(object : AdapterView.OnItemClickListener { @@ -329,20 +321,6 @@ class ControlsUiControllerImpl @Inject constructor ( dismiss() } }) - // need to call show() first in order to construct the listView - show() - var width = 0 - getListView()?.apply { - // width should be between [.5, .9] of screen - val parentWidth = this@ControlsUiControllerImpl.parent.getWidth() - val widthSpec = MeasureSpec.makeMeasureSpec( - (parentWidth * 0.9).toInt(), MeasureSpec.AT_MOST) - val child = adapter.getView(0, null, this) - child.measure(widthSpec, MeasureSpec.UNSPECIFIED) - width = Math.max(child.getMeasuredWidth(), (parentWidth * 0.5).toInt()) - } - setWidth(width) - setHorizontalOffset(-width + anchor.getWidth()) show() } } @@ -408,9 +386,6 @@ class ControlsUiControllerImpl @Inject constructor ( (getBackground() as LayerDrawable).getDrawable(1) .setTint(context.resources.getColor(R.color.control_spinner_dropdown, null)) } - parent.requireViewById<ImageView>(R.id.app_icon).apply { - setImageDrawable(selectionItem.icon) - } if (itemsWithStructure.size == 1) { spinner.setBackground(null) @@ -420,9 +395,14 @@ class ControlsUiControllerImpl @Inject constructor ( val anchor = parent.requireViewById<ViewGroup>(R.id.controls_header) anchor.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View) { - popup = createPopup().apply { + popup = GlobalActionsPopupMenu(context, true /* isDropDownMode */).apply { setAnchorView(anchor) setAdapter(adapter) + val theme = ContextThemeWrapper(context, R.style.Control_ListPopupWindow) + .getTheme() + setBackgroundDrawable( + context.resources.getDrawable(R.drawable.rounded_bg_full, theme)) + setOnItemClickListener(object : AdapterView.OnItemClickListener { override fun onItemClick( parent: AdapterView<*>, @@ -435,14 +415,6 @@ class ControlsUiControllerImpl @Inject constructor ( dismiss() } }) - // need to call show() first in order to construct the listView - show() - getListView()?.apply { - setDividerHeight( - context.resources.getDimensionPixelSize(R.dimen.control_list_divider)) - setDivider( - context.resources.getDrawable(R.drawable.controls_list_divider)) - } show() } } diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index 8123158408dd..cf9e1412f3bd 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -82,7 +82,6 @@ import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.LinearLayout; import android.widget.ListPopupWindow; -import android.widget.ListView; import android.widget.TextView; import androidx.annotation.NonNull; @@ -2021,42 +2020,23 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } private ListPopupWindow createPowerOverflowPopup() { - ListPopupWindow popup = new ListPopupWindow(new ContextThemeWrapper( - mContext, com.android.systemui.R.style.Control_ListPopupWindow)); - popup.setWindowLayoutType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY); + ListPopupWindow popup = new GlobalActionsPopupMenu( + mContext, false /* isDropDownMode */); View overflowButton = findViewById(com.android.systemui.R.id.global_actions_overflow_button); popup.setAnchorView(overflowButton); - int parentWidth = mGlobalActionsLayout.getWidth(); - // arbitrarily set the menu width to half of parent - // TODO: Logic for menu sizing based on contents. - int halfParentWidth = Math.round(parentWidth * 0.5f); - popup.setContentWidth(halfParentWidth); popup.setAdapter(mOverflowAdapter); - popup.setModal(true); return popup; } private void showPowerOverflowMenu() { - mOverflowPopup.show(); - - // Width is fixed to slightly more than half of the GlobalActionsLayout container. - // TODO: Resize the width of this dialog based on the sizes of the items in it. - int width = Math.round(mGlobalActionsLayout.getWidth() * 0.6f); - - ListView listView = mOverflowPopup.getListView(); - listView.setDividerHeight(mContext.getResources() - .getDimensionPixelSize(com.android.systemui.R.dimen.control_list_divider)); - listView.setDivider(mContext.getResources().getDrawable( - com.android.systemui.R.drawable.controls_list_divider)); - mOverflowPopup.setWidth(width); - mOverflowPopup.setHorizontalOffset(-width + mOverflowPopup.getAnchorView().getWidth()); - mOverflowPopup.setVerticalOffset(mOverflowPopup.getAnchorView().getHeight()); + mOverflowPopup = createPowerOverflowPopup(); mOverflowPopup.show(); } private void hidePowerOverflowMenu() { mOverflowPopup.dismiss(); + mOverflowPopup = null; } private void initializeLayout() { @@ -2081,8 +2061,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mContainer = mGlobalActionsLayout; } - mOverflowPopup = createPowerOverflowPopup(); - View overflowButton = findViewById( com.android.systemui.R.id.global_actions_overflow_button); if (overflowButton != null) { diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsPopupMenu.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsPopupMenu.java new file mode 100644 index 000000000000..02ea25128993 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsPopupMenu.java @@ -0,0 +1,106 @@ +/* + * 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.annotation.Nullable; +import android.content.Context; +import android.content.res.Resources; +import android.view.ContextThemeWrapper; +import android.view.View; +import android.view.View.MeasureSpec; +import android.view.WindowManager; +import android.widget.ListAdapter; +import android.widget.ListPopupWindow; +import android.widget.ListView; + +import com.android.systemui.R; + +/** + * Customized widget for use in the GlobalActionsDialog. Ensures common positioning and user + * interactions. + */ +public class GlobalActionsPopupMenu extends ListPopupWindow { + private Context mContext; + private boolean mIsDropDownMode; + private int mMenuHorizontalPadding = 0; + private int mMenuVerticalPadding = 0; + private int mGlobalActionsSidePadding = 0; + private ListAdapter mAdapter; + + public GlobalActionsPopupMenu(@NonNull Context context, boolean isDropDownMode) { + super(new ContextThemeWrapper(context, R.style.Control_ListPopupWindow)); + mContext = context; + mIsDropDownMode = isDropDownMode; + + // required to show above the global actions dialog + setWindowLayoutType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY); + setModal(true); + + Resources res = mContext.getResources(); + mGlobalActionsSidePadding = res.getDimensionPixelSize(R.dimen.global_actions_side_margin); + if (!isDropDownMode) { + mMenuVerticalPadding = res.getDimensionPixelSize(R.dimen.control_menu_vertical_padding); + mMenuHorizontalPadding = + res.getDimensionPixelSize(R.dimen.control_menu_horizontal_padding); + } + } + + /** + * Set the listadapter used to populate this menu. + */ + public void setAdapter(@Nullable ListAdapter adapter) { + mAdapter = adapter; + super.setAdapter(adapter); + } + + /** + * Show the dialog. + */ + public void show() { + // need to call show() first in order to construct the listView + super.show(); + + ListView listView = getListView(); + Resources res = mContext.getResources(); + + setVerticalOffset(-getAnchorView().getHeight() / 2); + + if (mIsDropDownMode) { + // use a divider + listView.setDividerHeight(res.getDimensionPixelSize(R.dimen.control_list_divider)); + listView.setDivider(res.getDrawable(R.drawable.controls_list_divider_inset)); + } else { + if (mAdapter == null) return; + + // width should be between [.5, .9] of screen + int parentWidth = res.getSystem().getDisplayMetrics().widthPixels; + int widthSpec = MeasureSpec.makeMeasureSpec( + (int) (parentWidth * 0.9), MeasureSpec.AT_MOST); + View child = mAdapter.getView(0, null, listView); + child.measure(widthSpec, MeasureSpec.UNSPECIFIED); + int width = Math.max(child.getMeasuredWidth(), (int) (parentWidth * 0.5)); + + listView.setPadding(mMenuHorizontalPadding, mMenuVerticalPadding, + mMenuHorizontalPadding, mMenuVerticalPadding); + + setWidth(width); + setHorizontalOffset(getAnchorView().getWidth() - mGlobalActionsSidePadding - width); + } + + super.show(); + } +} |