Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit af38a6bf authored by Anton Potapov's avatar Anton Potapov
Browse files

Updates home controls overflow menu visuals

Test: manual on foldable and phone. LTR and RTL layouts
Fixes: 266407418
Change-Id: I225334d9aea5501bdd3088a91c01f2ca4fa85de5
parent 0c907a97
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -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
+4 −4
Original line number Diff line number Diff line
@@ -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" />

+7 −9
Original line number Diff line number Diff line
@@ -1198,19 +1198,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>
+1 −1
Original line number Diff line number Diff line
@@ -886,7 +886,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">
+58 −13
Original line number Diff line number Diff line
@@ -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) {

@@ -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
@@ -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