Loading packages/SystemUI/res/layout/controls_more_item.xml +10 −6 Original line number Diff line number Diff line Loading @@ -13,13 +13,17 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> <TextView xmlns:android="http://schemas.android.com/apk/res/android" <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/controls_more_item_text" style="@style/Control.MenuItem" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="start" android:layout_height="@dimen/control_menu_item_height" android:layout_gravity="center_vertical" android:background="@drawable/controls_popup_item_background" android:paddingStart="@dimen/control_menu_horizontal_padding" android:paddingEnd="@dimen/control_menu_horizontal_padding" android:textDirection="locale"/> android:textDirection="locale" android:textSize="@dimen/control_item_text_size" tools:fontFamily="@null" tools:text="@tools:sample/lorem/random" /> No newline at end of file packages/SystemUI/res/layout/controls_spinner_item.xml +4 −4 Original line number Diff line number Diff line Loading @@ -16,18 +16,18 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="@dimen/control_popup_item_height" android:layout_height="@dimen/control_apps_popup_item_height" android:background="@drawable/controls_popup_item_background" android:gravity="center_vertical|start" android:orientation="horizontal" android:paddingStart="@dimen/control_popup_item_padding" android:paddingEnd="@dimen/control_popup_item_padding"> android:paddingStart="@dimen/control_menu_horizontal_padding" android:paddingEnd="@dimen/control_menu_horizontal_padding"> <ImageView android:id="@+id/app_icon" android:layout_width="@dimen/controls_header_app_icon_size" android:layout_height="@dimen/controls_header_app_icon_size" android:layout_marginEnd="@dimen/control_popup_item_padding" android:layout_marginEnd="@dimen/control_menu_horizontal_padding" android:contentDescription="@null" tools:src="@drawable/ic_android" /> Loading packages/SystemUI/res/values/dimens.xml +7 −9 Original line number Diff line number Diff line Loading @@ -1199,19 +1199,17 @@ <dimen name="controls_top_margin">48dp</dimen> <dimen name="controls_content_margin_horizontal">0dp</dimen> <dimen name="control_header_text_size">24sp</dimen> <dimen name="control_item_text_size">16sp</dimen> <dimen name="control_item_text_size">14sp</dimen> <dimen name="control_menu_item_text_size">16sp</dimen> <dimen name="control_menu_item_min_height">56dp</dimen> <dimen name="control_menu_item_height">54dp</dimen> <dimen name="control_menu_vertical_padding">12dp</dimen> <dimen name="control_menu_horizontal_padding">16dp</dimen> <dimen name="control_popup_item_corner_radius">4dp</dimen> <dimen name="control_popup_item_height">56dp</dimen> <dimen name="control_popup_item_padding">16dp</dimen> <dimen name="control_popup_items_divider_height">1dp</dimen> <dimen name="control_menu_horizontal_padding">@dimen/notification_side_paddings</dimen> <dimen name="control_apps_popup_item_height">56dp</dimen> <dimen name="control_popup_item_corner_radius">@dimen/notification_corner_radius_small</dimen> <dimen name="control_popup_items_divider_height">@dimen/controls_app_divider_height</dimen> <dimen name="control_popup_max_width">380dp</dimen> <dimen name="control_popup_corner_radius">28dp</dimen> <dimen name="control_popup_corner_radius">@dimen/notification_corner_radius</dimen> <dimen name="control_popup_horizontal_margin">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> Loading packages/SystemUI/res/values/styles.xml +1 −1 Original line number Diff line number Diff line Loading @@ -895,7 +895,7 @@ <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> <item name="android:minHeight">@dimen/control_menu_item_height</item> </style> <style name="Control.Spinner"> Loading packages/SystemUI/src/com/android/systemui/controls/ui/ControlsPopupMenu.kt +58 −13 Original line number Diff line number Diff line Loading @@ -20,11 +20,18 @@ import android.content.Context import android.content.res.Resources import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import android.view.Gravity import android.view.Gravity.END import android.view.Gravity.GravityFlags import android.view.Gravity.NO_GRAVITY import android.view.Gravity.START import android.view.View import android.view.View.MeasureSpec import android.view.ViewGroup import android.widget.ListPopupWindow import android.widget.ListView import android.widget.PopupWindow import com.android.systemui.R import kotlin.math.max class ControlsPopupMenu(context: Context) : ListPopupWindow(context) { Loading @@ -40,13 +47,13 @@ class ControlsPopupMenu(context: Context) : ListPopupWindow(context) { private val dimDrawable: Drawable = ColorDrawable(resources.getColor(R.color.control_popup_dim)) private var dismissListener: PopupWindow.OnDismissListener? = null @GravityFlags private var dropDownGravity: Int = NO_GRAVITY init { setBackgroundDrawable(dialogBackground) inputMethodMode = INPUT_METHOD_NOT_NEEDED isModal = true setDropDownGravity(Gravity.START) // dismiss method isn't called when popup is hidden by outside touch. So we need to // override a listener to remove a dimming foreground Loading @@ -59,30 +66,68 @@ class ControlsPopupMenu(context: Context) : ListPopupWindow(context) { override fun show() { // need to call show() first in order to construct the listView super.show() val paddedWidth = resources.displayMetrics.widthPixels - 2 * horizontalMargin width = maxWidth.coerceAtMost(paddedWidth) updateWidth() anchorView?.let { horizontalOffset = -width / 2 + it.width / 2 verticalOffset = -it.height / 2 if (it.layoutDirection == View.LAYOUT_DIRECTION_RTL) { horizontalOffset = -horizontalOffset } positionPopup(it) it.rootView.foreground = dimDrawable } with(listView!!) { clipToOutline = true background = dialogBackground dividerHeight = listDividerHeight } // actual show takes into account updated ListView specs super.show() } override fun setDropDownGravity(@GravityFlags gravity: Int) { super.setDropDownGravity(gravity) dropDownGravity = gravity } override fun setOnDismissListener(listener: PopupWindow.OnDismissListener?) { dismissListener = listener } private fun updateWidth() { val paddedWidth = resources.displayMetrics.widthPixels - 2 * horizontalMargin val maxWidth = maxWidth.coerceAtMost(paddedWidth) when (width) { ViewGroup.LayoutParams.MATCH_PARENT -> { width = maxWidth } ViewGroup.LayoutParams.WRAP_CONTENT -> { width = listView!!.measureDesiredWidth(maxWidth).coerceAtMost(maxWidth) } } } private fun positionPopup(anchorView: View) { when (dropDownGravity) { NO_GRAVITY -> { horizontalOffset = (-width + anchorView.width) / 2 if (anchorView.layoutDirection == View.LAYOUT_DIRECTION_RTL) { horizontalOffset = -horizontalOffset } } END, START -> { horizontalOffset = 0 } } verticalOffset = -anchorView.height / 2 } private fun ListView.measureDesiredWidth(maxWidth: Int): Int { var maxItemWidth = 0 repeat(adapter.count) { val view = adapter.getView(it, null, listView) view.measure( MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.AT_MOST), MeasureSpec.UNSPECIFIED ) maxItemWidth = max(maxItemWidth, view.measuredWidth) } return maxItemWidth } } Loading
packages/SystemUI/res/layout/controls_more_item.xml +10 −6 Original line number Diff line number Diff line Loading @@ -13,13 +13,17 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> <TextView xmlns:android="http://schemas.android.com/apk/res/android" <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/controls_more_item_text" style="@style/Control.MenuItem" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="start" android:layout_height="@dimen/control_menu_item_height" android:layout_gravity="center_vertical" android:background="@drawable/controls_popup_item_background" android:paddingStart="@dimen/control_menu_horizontal_padding" android:paddingEnd="@dimen/control_menu_horizontal_padding" android:textDirection="locale"/> android:textDirection="locale" android:textSize="@dimen/control_item_text_size" tools:fontFamily="@null" tools:text="@tools:sample/lorem/random" /> No newline at end of file
packages/SystemUI/res/layout/controls_spinner_item.xml +4 −4 Original line number Diff line number Diff line Loading @@ -16,18 +16,18 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="@dimen/control_popup_item_height" android:layout_height="@dimen/control_apps_popup_item_height" android:background="@drawable/controls_popup_item_background" android:gravity="center_vertical|start" android:orientation="horizontal" android:paddingStart="@dimen/control_popup_item_padding" android:paddingEnd="@dimen/control_popup_item_padding"> android:paddingStart="@dimen/control_menu_horizontal_padding" android:paddingEnd="@dimen/control_menu_horizontal_padding"> <ImageView android:id="@+id/app_icon" android:layout_width="@dimen/controls_header_app_icon_size" android:layout_height="@dimen/controls_header_app_icon_size" android:layout_marginEnd="@dimen/control_popup_item_padding" android:layout_marginEnd="@dimen/control_menu_horizontal_padding" android:contentDescription="@null" tools:src="@drawable/ic_android" /> Loading
packages/SystemUI/res/values/dimens.xml +7 −9 Original line number Diff line number Diff line Loading @@ -1199,19 +1199,17 @@ <dimen name="controls_top_margin">48dp</dimen> <dimen name="controls_content_margin_horizontal">0dp</dimen> <dimen name="control_header_text_size">24sp</dimen> <dimen name="control_item_text_size">16sp</dimen> <dimen name="control_item_text_size">14sp</dimen> <dimen name="control_menu_item_text_size">16sp</dimen> <dimen name="control_menu_item_min_height">56dp</dimen> <dimen name="control_menu_item_height">54dp</dimen> <dimen name="control_menu_vertical_padding">12dp</dimen> <dimen name="control_menu_horizontal_padding">16dp</dimen> <dimen name="control_popup_item_corner_radius">4dp</dimen> <dimen name="control_popup_item_height">56dp</dimen> <dimen name="control_popup_item_padding">16dp</dimen> <dimen name="control_popup_items_divider_height">1dp</dimen> <dimen name="control_menu_horizontal_padding">@dimen/notification_side_paddings</dimen> <dimen name="control_apps_popup_item_height">56dp</dimen> <dimen name="control_popup_item_corner_radius">@dimen/notification_corner_radius_small</dimen> <dimen name="control_popup_items_divider_height">@dimen/controls_app_divider_height</dimen> <dimen name="control_popup_max_width">380dp</dimen> <dimen name="control_popup_corner_radius">28dp</dimen> <dimen name="control_popup_corner_radius">@dimen/notification_corner_radius</dimen> <dimen name="control_popup_horizontal_margin">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> Loading
packages/SystemUI/res/values/styles.xml +1 −1 Original line number Diff line number Diff line Loading @@ -895,7 +895,7 @@ <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> <item name="android:minHeight">@dimen/control_menu_item_height</item> </style> <style name="Control.Spinner"> Loading
packages/SystemUI/src/com/android/systemui/controls/ui/ControlsPopupMenu.kt +58 −13 Original line number Diff line number Diff line Loading @@ -20,11 +20,18 @@ import android.content.Context import android.content.res.Resources import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import android.view.Gravity import android.view.Gravity.END import android.view.Gravity.GravityFlags import android.view.Gravity.NO_GRAVITY import android.view.Gravity.START import android.view.View import android.view.View.MeasureSpec import android.view.ViewGroup import android.widget.ListPopupWindow import android.widget.ListView import android.widget.PopupWindow import com.android.systemui.R import kotlin.math.max class ControlsPopupMenu(context: Context) : ListPopupWindow(context) { Loading @@ -40,13 +47,13 @@ class ControlsPopupMenu(context: Context) : ListPopupWindow(context) { private val dimDrawable: Drawable = ColorDrawable(resources.getColor(R.color.control_popup_dim)) private var dismissListener: PopupWindow.OnDismissListener? = null @GravityFlags private var dropDownGravity: Int = NO_GRAVITY init { setBackgroundDrawable(dialogBackground) inputMethodMode = INPUT_METHOD_NOT_NEEDED isModal = true setDropDownGravity(Gravity.START) // dismiss method isn't called when popup is hidden by outside touch. So we need to // override a listener to remove a dimming foreground Loading @@ -59,30 +66,68 @@ class ControlsPopupMenu(context: Context) : ListPopupWindow(context) { override fun show() { // need to call show() first in order to construct the listView super.show() val paddedWidth = resources.displayMetrics.widthPixels - 2 * horizontalMargin width = maxWidth.coerceAtMost(paddedWidth) updateWidth() anchorView?.let { horizontalOffset = -width / 2 + it.width / 2 verticalOffset = -it.height / 2 if (it.layoutDirection == View.LAYOUT_DIRECTION_RTL) { horizontalOffset = -horizontalOffset } positionPopup(it) it.rootView.foreground = dimDrawable } with(listView!!) { clipToOutline = true background = dialogBackground dividerHeight = listDividerHeight } // actual show takes into account updated ListView specs super.show() } override fun setDropDownGravity(@GravityFlags gravity: Int) { super.setDropDownGravity(gravity) dropDownGravity = gravity } override fun setOnDismissListener(listener: PopupWindow.OnDismissListener?) { dismissListener = listener } private fun updateWidth() { val paddedWidth = resources.displayMetrics.widthPixels - 2 * horizontalMargin val maxWidth = maxWidth.coerceAtMost(paddedWidth) when (width) { ViewGroup.LayoutParams.MATCH_PARENT -> { width = maxWidth } ViewGroup.LayoutParams.WRAP_CONTENT -> { width = listView!!.measureDesiredWidth(maxWidth).coerceAtMost(maxWidth) } } } private fun positionPopup(anchorView: View) { when (dropDownGravity) { NO_GRAVITY -> { horizontalOffset = (-width + anchorView.width) / 2 if (anchorView.layoutDirection == View.LAYOUT_DIRECTION_RTL) { horizontalOffset = -horizontalOffset } } END, START -> { horizontalOffset = 0 } } verticalOffset = -anchorView.height / 2 } private fun ListView.measureDesiredWidth(maxWidth: Int): Int { var maxItemWidth = 0 repeat(adapter.count) { val view = adapter.getView(it, null, listView) view.measure( MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.AT_MOST), MeasureSpec.UNSPECIFIED ) maxItemWidth = max(maxItemWidth, view.measuredWidth) } return maxItemWidth } }