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

Commit d9f3fdf4 authored by Alan Viverette's avatar Alan Viverette
Browse files

Ensure time picker dialog fits on small screens

Also fixes dialog padding in landscape mode and a bug in the
ColorStateList method used to apply a selected color.

BUG: 18251582
Change-Id: Id5b8c7893ec42fd4d5f4a7520e6ac170839d3143
parent e6ef98cf
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -353,7 +353,7 @@ public class ColorStateList implements Parcelable {
        for (int i = 0; i < inputStates.length; i++) {
            final int[] inputState = inputStates[i];
            for (int j = 0; j < inputState.length; j++) {
                if (inputState[i] == state) {
                if (inputState[j] == state) {
                    return colorStateList;
                }
            }
+31 −41
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.util.AttributeSet;
@@ -100,9 +99,7 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl
    private int mPmKeyCode;

    // Accessibility strings.
    private String mHourPickerDescription;
    private String mSelectHours;
    private String mMinutePickerDescription;
    private String mSelectMinutes;

    // Most recent time announcement values for accessibility.
@@ -122,9 +119,7 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl
                Context.LAYOUT_INFLATER_SERVICE);
        final Resources res = mContext.getResources();

        mHourPickerDescription = res.getString(R.string.hour_picker_description);
        mSelectHours = res.getString(R.string.select_hours);
        mMinutePickerDescription = res.getString(R.string.minute_picker_description);
        mSelectMinutes = res.getString(R.string.select_minutes);

        String[] amPmStrings = TimePickerSpinnerDelegate.getAmPmStrings(context);
@@ -153,6 +148,11 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl
            mMinuteView.setTextAppearance(context, headerTimeTextAppearance);
        }

        // Now that we have text appearances out of the way, make sure the hour
        // and minute views are correctly sized.
        mHourView.setMinWidth(computeStableWidth(mHourView, 24));
        mMinuteView.setMinWidth(computeStableWidth(mMinuteView, 60));

        // TODO: This can be removed once we support themed color state lists.
        final int headerSelectedTextColor = a.getColor(
                R.styleable.TimePicker_headerSelectedTextColor,
@@ -206,6 +206,23 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl
        initialize(currentHour, currentMinute, false /* 12h */, HOUR_INDEX);
    }

    private int computeStableWidth(TextView v, int maxNumber) {
        int maxWidth = 0;

        for (int i = 0; i < maxNumber; i++) {
            final String text = String.format("%02d", i);
            v.setText(text);
            v.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);

            final int width = v.getMeasuredWidth();
            if (width > maxWidth) {
                maxWidth = width;
            }
        }

        return maxWidth;
    }

    private void initialize(int hourOfDay, int minute, boolean is24HourView, int index) {
        mInitialHourOfDay = hourOfDay;
        mInitialMinute = minute;
@@ -242,48 +259,21 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl
        setCurrentItemShowing(index, false, true);
    }

    private int computeMaxWidthOfNumbers(int max) {
        TextView tempView = new TextView(mContext);
        tempView.setTextAppearance(mContext, R.style.TextAppearance_Material_TimePicker_TimeLabel);
        ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);
        tempView.setLayoutParams(lp);
        int maxWidth = 0;
        for (int minutes = 0; minutes < max; minutes++) {
            final String text = String.format("%02d", minutes);
            tempView.setText(text);
            tempView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
            maxWidth = Math.max(maxWidth, tempView.getMeasuredWidth());
        }
        return maxWidth;
    }

    private void updateHeaderAmPm() {
        if (mIs24HourView) {
            mAmPmLayout.setVisibility(View.GONE);
        } else {
            final String bestDateTimePattern = DateFormat.getBestDateTimePattern(
                    mCurrentLocale, "hm");
            boolean amPmOnLeft = bestDateTimePattern.startsWith("a");
            if (TextUtils.getLayoutDirectionFromLocale(mCurrentLocale) ==
                    View.LAYOUT_DIRECTION_RTL) {
                amPmOnLeft = !amPmOnLeft;
            // Ensure that AM/PM layout is in the correct position.
            final String dateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale, "hm");
            final boolean amPmAtStart = dateTimePattern.startsWith("a");
            final ViewGroup parent = (ViewGroup) mAmPmLayout.getParent();
            final int targetIndex = amPmAtStart ? 0 : parent.getChildCount() - 1;
            final int currentIndex = parent.indexOfChild(mAmPmLayout);
            if (targetIndex != currentIndex) {
                parent.removeView(mAmPmLayout);
                parent.addView(mAmPmLayout, targetIndex);
            }

            final ViewGroup.MarginLayoutParams params =
                    (ViewGroup.MarginLayoutParams) mAmPmLayout.getLayoutParams();

            if (amPmOnLeft) {
                params.leftMargin = 0;
                params.rightMargin = computeMaxWidthOfNumbers(12 /* for hours */);
            } else {
                params.leftMargin = computeMaxWidthOfNumbers(60 /* for minutes */);
                params.rightMargin = 0;
            }

            mAmPmLayout.setLayoutParams(params);
            mAmPmLayout.setVisibility(View.VISIBLE);

            updateAmPmLabelStates(mInitialHourOfDay < 12 ? AM : PM);
        }
    }
+1 −5
Original line number Diff line number Diff line
@@ -20,11 +20,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:layout_marginLeft="@dimen/timepicker_minimum_margin_sides"
    android:layout_marginRight="@dimen/timepicker_minimum_margin_sides"
    android:layout_marginTop="@dimen/timepicker_minimum_margin_top_bottom"
    android:layout_marginBottom="@dimen/timepicker_minimum_margin_top_bottom">
    android:orientation="horizontal">
    <FrameLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
+23 −20
Original line number Diff line number Diff line
@@ -17,46 +17,50 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/time_header"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    android:layout_height="match_parent"
    android:padding="@dimen/timepicker_separator_padding"
    android:gravity="center">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="bottom"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/hours"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@+id/separator"
            android:layout_centerVertical="true" />
            android:gravity="end" />

        <TextView
            android:id="@+id/separator"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="@dimen/timepicker_separator_padding"
            android:paddingRight="@dimen/timepicker_separator_padding"
            android:layout_centerInParent="true"
            android:layout_marginLeft="@dimen/timepicker_separator_padding"
            android:layout_marginRight="@dimen/timepicker_separator_padding"
            android:importantForAccessibility="no" />

        <TextView
            android:id="@+id/minutes"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/separator"
            android:layout_centerVertical="true" />
            android:gravity="start" />

        <LinearLayout
            android:id="@+id/ampm_layout"
            android:layout_alignBaseline="@+id/minutes"
            android:layout_toEndOf="@+id/separator"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:baselineAlignedChildIndex="1"
            android:orientation="vertical">
            android:orientation="vertical"
            android:baselineAlignedChildIndex="1">
            <CheckedTextView
                android:id="@+id/am_label"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingStart="@dimen/timepicker_ampm_horizontal_padding"
                android:paddingTop="@dimen/timepicker_ampm_vertical_padding"
                android:paddingEnd="@dimen/timepicker_ampm_horizontal_padding"
                android:paddingBottom="@dimen/timepicker_am_bottom_padding"
                android:paddingTop="@dimen/timepicker_ampm_vertical_padding"
                android:lines="1"
                android:ellipsize="none" />
            <CheckedTextView
@@ -64,11 +68,10 @@
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingStart="@dimen/timepicker_ampm_horizontal_padding"
                android:paddingTop="@dimen/timepicker_pm_top_padding"
                android:paddingEnd="@dimen/timepicker_ampm_horizontal_padding"
                android:paddingBottom="@dimen/timepicker_ampm_vertical_padding"
                android:paddingTop="@dimen/timepicker_pm_top_padding"
                android:lines="1"
                android:ellipsize="none" />
        </LinearLayout>
    </RelativeLayout>
    </LinearLayout>
</FrameLayout>
+1 −1
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@
-->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <include
Loading