diff options
author | Craig Stout <cstout@google.com> | 2014-06-23 09:04:32 -0700 |
---|---|---|
committer | Craig Stout <cstout@google.com> | 2014-07-07 23:08:11 +0000 |
commit | 59c7b4b04f8f69b1c03bd26b289d805d7e23498f (patch) | |
tree | 192782dfba8678e4d4d201c13612d888408461a8 | |
parent | 8e5e11b99fac942122ee2d6cdd30af51564861ae (diff) | |
download | frameworks_base-59c7b4b04f8f69b1c03bd26b289d805d7e23498f.zip frameworks_base-59c7b4b04f8f69b1c03bd26b289d805d7e23498f.tar.gz frameworks_base-59c7b4b04f8f69b1c03bd26b289d805d7e23498f.tar.bz2 |
TimePickerDialog does not force new ui on TV.
Add support for done button in LegacyTimePickerDelegate.
Provide leanback themed legacy time picker layout with buttons
on the side.
b/15194230
Change-Id: Ie05c1cf45b334e9642095d63c682aba314ff3c6b
-rw-r--r-- | core/java/android/app/TimePickerDialog.java | 9 | ||||
-rw-r--r-- | core/java/android/widget/LegacyTimePickerDelegate.java | 51 | ||||
-rw-r--r-- | core/res/res/layout/time_picker_legacy_leanback.xml | 92 | ||||
-rw-r--r-- | core/res/res/values/styles_leanback.xml | 5 | ||||
-rw-r--r-- | core/res/res/values/themes_leanback.xml | 2 |
5 files changed, 153 insertions, 6 deletions
diff --git a/core/java/android/app/TimePickerDialog.java b/core/java/android/app/TimePickerDialog.java index 8cf8c25..abd042b 100644 --- a/core/java/android/app/TimePickerDialog.java +++ b/core/java/android/app/TimePickerDialog.java @@ -16,9 +16,11 @@ package android.app; +import android.app.UiModeManager; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; +import android.content.res.Configuration; import android.os.Bundle; import android.util.TypedValue; import android.view.LayoutInflater; @@ -110,11 +112,14 @@ public class TimePickerDialog extends AlertDialog (LayoutInflater) themeContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.time_picker_dialog, null); setView(view); - setButtonPanelLayoutHint(LAYOUT_HINT_SIDE); mTimePicker = (TimePicker) view.findViewById(R.id.timePicker); // Initialize state - mTimePicker.setLegacyMode(false /* will show new UI */); + UiModeManager uiModeManager = + (UiModeManager) mContext.getSystemService(Context.UI_MODE_SERVICE); + if (uiModeManager.getCurrentModeType() != Configuration.UI_MODE_TYPE_TELEVISION) { + mTimePicker.setLegacyMode(false /* will show new UI */); + } mTimePicker.setShowDoneButton(true); mTimePicker.setDismissCallback(new TimePicker.TimePickerDismissCallback() { @Override diff --git a/core/java/android/widget/LegacyTimePickerDelegate.java b/core/java/android/widget/LegacyTimePickerDelegate.java index 1634d5f..97f46ea 100644 --- a/core/java/android/widget/LegacyTimePickerDelegate.java +++ b/core/java/android/widget/LegacyTimePickerDelegate.java @@ -75,6 +75,11 @@ class LegacyTimePickerDelegate extends TimePicker.AbstractTimePickerDelegate { // accommodates these two cases to be backwards compatible. private final Button mAmPmButton; + // May be null if layout has no done button + private final View mDoneButton; + private boolean mShowDoneButton; + private TimePicker.TimePickerDismissCallback mDismissCallback; + private final String[] mAmPmStrings; private boolean mIsEnabled = DEFAULT_ENABLED_STATE; @@ -218,6 +223,19 @@ class LegacyTimePickerDelegate extends TimePicker.AbstractTimePickerDelegate { } } + mDoneButton = delegator.findViewById(R.id.done_button); + if (mDoneButton != null) { + mDoneButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mDismissCallback != null) { + mDismissCallback.dismiss(mDelegator, false, getCurrentHour(), + getCurrentMinute()); + } + } + }); + } + getHourFormatData(); // update controls to initial state @@ -242,6 +260,9 @@ class LegacyTimePickerDelegate extends TimePicker.AbstractTimePickerDelegate { if (mDelegator.getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) { mDelegator.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); } + + mShowDoneButton = false; + updateDoneButton(); } private void getHourFormatData() { @@ -408,12 +429,23 @@ class LegacyTimePickerDelegate extends TimePicker.AbstractTimePickerDelegate { @Override public void setShowDoneButton(boolean showDoneButton) { - // Nothing to do + mShowDoneButton = showDoneButton; + updateDoneButton(); + } + + private boolean isShowDoneButton() { + return mShowDoneButton; + } + + private void updateDoneButton() { + if (mDoneButton != null) { + mDoneButton.setVisibility(mShowDoneButton ? View.VISIBLE : View.GONE); + } } @Override public void setDismissCallback(TimePicker.TimePickerDismissCallback callback) { - // Nothing to do + mDismissCallback = callback; } @Override @@ -428,7 +460,8 @@ class LegacyTimePickerDelegate extends TimePicker.AbstractTimePickerDelegate { @Override public Parcelable onSaveInstanceState(Parcelable superState) { - return new SavedState(superState, getCurrentHour(), getCurrentMinute()); + return new SavedState(superState, getCurrentHour(), getCurrentMinute(), + isShowDoneButton()); } @Override @@ -436,6 +469,7 @@ class LegacyTimePickerDelegate extends TimePicker.AbstractTimePickerDelegate { SavedState ss = (SavedState) state; setCurrentHour(ss.getHour()); setCurrentMinute(ss.getMinute()); + setShowDoneButton(ss.isShowDoneButton()); } @Override @@ -596,16 +630,20 @@ class LegacyTimePickerDelegate extends TimePicker.AbstractTimePickerDelegate { private final int mMinute; - private SavedState(Parcelable superState, int hour, int minute) { + private final boolean mShowDoneButton; + + private SavedState(Parcelable superState, int hour, int minute, boolean showDoneButton) { super(superState); mHour = hour; mMinute = minute; + mShowDoneButton = showDoneButton; } private SavedState(Parcel in) { super(in); mHour = in.readInt(); mMinute = in.readInt(); + mShowDoneButton = (in.readInt() == 1); } public int getHour() { @@ -616,11 +654,16 @@ class LegacyTimePickerDelegate extends TimePicker.AbstractTimePickerDelegate { return mMinute; } + public boolean isShowDoneButton() { + return mShowDoneButton; + } + @Override public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeInt(mHour); dest.writeInt(mMinute); + dest.writeInt(mShowDoneButton ? 1 : 0); } @SuppressWarnings({"unused", "hiding"}) diff --git a/core/res/res/layout/time_picker_legacy_leanback.xml b/core/res/res/layout/time_picker_legacy_leanback.xml new file mode 100644 index 0000000..397f733 --- /dev/null +++ b/core/res/res/layout/time_picker_legacy_leanback.xml @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2014 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. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/timePickerLayout" + android:orientation="horizontal" + android:layout_gravity="center_horizontal" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingStart="8dip" + android:paddingEnd="8dip"> + + <LinearLayout android:orientation="horizontal" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingStart="8dip" + android:paddingEnd="8dip" + android:layoutDirection="ltr"> + + <!-- hour --> + <NumberPicker + android:id="@+id/hour" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="16dip" + android:layout_marginBottom="16dip" + android:focusable="true" + android:focusableInTouchMode="true" + /> + + <!-- divider --> + <TextView + android:id="@+id/divider" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="6dip" + android:layout_marginEnd="6dip" + android:layout_gravity="center_vertical" + android:importantForAccessibility="no" + /> + + <!-- minute --> + <NumberPicker + android:id="@+id/minute" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="16dip" + android:layout_marginBottom="16dip" + android:focusable="true" + android:focusableInTouchMode="true" + /> + + </LinearLayout> + + <!-- AM / PM --> + <NumberPicker + android:id="@+id/amPm" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="16dip" + android:layout_marginBottom="16dip" + android:layout_marginStart="8dip" + android:layout_marginEnd="8dip" + android:focusable="true" + android:focusableInTouchMode="true" + /> + + <!-- Width fixed here because TextView doesn't set MEASURED_STATE_TOO_SMALL --> + <Button + android:id="@+id/done_button" + android:layout_width="100dp" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:text="@string/done_label" + android:textSize="@dimen/timepicker_done_label_size" + style="?android:attr/buttonBarButtonStyle" /> + +</LinearLayout> diff --git a/core/res/res/values/styles_leanback.xml b/core/res/res/values/styles_leanback.xml index 72d0379..ff9d73f 100644 --- a/core/res/res/values/styles_leanback.xml +++ b/core/res/res/values/styles_leanback.xml @@ -22,4 +22,9 @@ <style name="AlertDialog.Leanback.Light"> </style> + <style name="Widget.Leanback.TimePicker" parent="Widget.Material.TimePicker"> + <item name="legacyLayout">@layout/time_picker_legacy_leanback</item> + </style> + + </resources> diff --git a/core/res/res/values/themes_leanback.xml b/core/res/res/values/themes_leanback.xml index a571b98..15ae14c 100644 --- a/core/res/res/values/themes_leanback.xml +++ b/core/res/res/values/themes_leanback.xml @@ -33,6 +33,7 @@ <item name="textColorPrimary">@color/primary_text_leanback_dark</item> <item name="textColorSecondary">@color/secondary_text_leanback_dark</item> <item name="alertDialogStyle">@style/AlertDialog.Leanback</item> + <item name="timePickerStyle">@style/Widget.Leanback.TimePicker</item> </style> <style name="Theme.Leanback.Light.Dialog.TimePicker" parent="Theme.Material.Light.Dialog.BaseTimePicker"> @@ -40,6 +41,7 @@ <item name="textColorPrimary">@color/primary_text_leanback_light</item> <item name="textColorSecondary">@color/secondary_text_leanback_light</item> <item name="alertDialogStyle">@style/AlertDialog.Leanback.Light</item> + <item name="timePickerStyle">@style/Widget.Leanback.TimePicker</item> </style> <style name="Theme.Leanback.Light.Dialog" parent="Theme.Material.Light.Dialog"> |