From 6f94fc48c1bfd4eec6af2fad4bc1226d22011605 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sun, 12 Jan 2020 10:20:36 -0600 Subject: [PATCH 01/12] First version of EditHabitActivity --- android/uhabits-android/build.gradle | 4 +- .../src/main/AndroidManifest.xml | 251 +++++++------- .../habits/edit/EditHabitActivity.kt | 41 +++ .../habits/list/ListHabitsScreen.kt | 4 +- .../isoron/uhabits/intents/IntentFactory.kt | 6 + .../res/drawable/ic_arrow_drop_down_dark.xml | 9 + .../res/drawable/input_box_background.xml | 11 + .../main/res/layout/activity_edit_habit.xml | 313 ++++++++++++++++++ 8 files changed, 502 insertions(+), 137 deletions(-) create mode 100644 android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt create mode 100644 android/uhabits-android/src/main/res/drawable/ic_arrow_drop_down_dark.xml create mode 100644 android/uhabits-android/src/main/res/drawable/input_box_background.xml create mode 100644 android/uhabits-android/src/main/res/layout/activity_edit_habit.xml diff --git a/android/uhabits-android/build.gradle b/android/uhabits-android/build.gradle index 521f4f19a..1b7282409 100644 --- a/android/uhabits-android/build.gradle +++ b/android/uhabits-android/build.gradle @@ -4,6 +4,7 @@ plugins { id 'kotlin-android' id 'kotlin-kapt' id 'com.github.triplet.play' version '2.6.2' + id 'kotlin-android-extensions' } android { @@ -88,6 +89,7 @@ dependencies { implementation "com.google.code.findbugs:jsr305:3.0.2" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$KOTLIN_VERSION" + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' compileOnly "javax.annotation:jsr250-api:1.0" compileOnly "com.google.auto.factory:auto-factory:$AUTO_FACTORY_VERSION" kapt "com.google.dagger:dagger-compiler:$DAGGER_VERSION" @@ -134,4 +136,4 @@ kapt { play { serviceAccountCredentials = file("../../.secret/gcp-key.json") track = "alpha" -} \ No newline at end of file +} diff --git a/android/uhabits-android/src/main/AndroidManifest.xml b/android/uhabits-android/src/main/AndroidManifest.xml index 0c298306b..dfabd05fc 100644 --- a/android/uhabits-android/src/main/AndroidManifest.xml +++ b/android/uhabits-android/src/main/AndroidManifest.xml @@ -1,229 +1,212 @@ - - - - - - - - + + + + + android:name=".HabitsApplication" + android:allowBackup="true" + android:backupAgent=".HabitsBackupAgent" + android:icon="@mipmap/ic_launcher" + android:label="@string/main_activity_title" + android:supportsRtl="true" + android:theme="@style/AppBaseTheme"> + + + + android:name="com.google.android.backup.api_key" + android:value="AEdPqrEAAAAI6aeWncbnMNo8E5GWeZ44dlc5cQ7tCROwFhOtiw" /> + android:name=".activities.habits.list.ListHabitsActivity" + android:exported="true" + android:label="@string/main_activity_title" + android:launchMode="singleTop" /> + android:name=".MainActivity" + android:label="@string/main_activity_title" + android:launchMode="singleTop" + android:targetActivity=".activities.habits.list.ListHabitsActivity"> - - + + + + android:name=".activities.habits.show.ShowHabitActivity" + android:label="@string/title_activity_show_habit"> + android:name="android.support.PARENT_ACTIVITY" + android:value=".activities.habits.list.ListHabitsActivity" /> + android:name=".activities.settings.SettingsActivity" + android:label="@string/settings"> + android:name="android.support.PARENT_ACTIVITY" + android:value=".activities.habits.list.ListHabitsActivity" /> + android:name=".activities.intro.IntroActivity" + android:label="" + android:theme="@style/Theme.AppCompat.Light.NoActionBar" /> + android:name=".widgets.HabitPickerDialog" + android:theme="@style/Theme.AppCompat.Light.Dialog"> - + + android:name=".activities.about.AboutActivity" + android:label="@string/about"> - - + android:name="android.support.PARENT_ACTIVITY" + android:value=".activities.habits.list.ListHabitsActivity" /> + + android:name=".widgets.CheckmarkWidgetProvider" + android:label="@string/checkmark"> - + + android:name="android.appwidget.provider" + android:resource="@xml/widget_checkmark_info" /> - + + + + android:name=".widgets.HistoryWidgetProvider" + android:label="@string/history"> - + + android:name="android.appwidget.provider" + android:resource="@xml/widget_history_info" /> + android:name=".widgets.ScoreWidgetProvider" + android:label="@string/habit_strength"> - + + android:name="android.appwidget.provider" + android:resource="@xml/widget_score_info" /> + android:name=".widgets.StreakWidgetProvider" + android:label="@string/streaks"> - + + android:name="android.appwidget.provider" + android:resource="@xml/widget_streak_info" /> + android:name=".widgets.FrequencyWidgetProvider" + android:label="@string/frequency"> - + + android:name="android.appwidget.provider" + android:resource="@xml/widget_frequency_info" /> - + - + - + + android:host="org.isoron.uhabits" + android:scheme="content" /> - + - + + android:host="org.isoron.uhabits" + android:scheme="content" /> - + - + + android:host="org.isoron.uhabits" + android:scheme="content" /> - - - + + android:name=".automation.EditSettingActivity" + android:exported="true" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name"> - + - - - + + android:name=".automation.FireSettingReceiver" + android:exported="true"> - + + android:name="androidx.core.content.FileProvider" + android:authorities="org.isoron.uhabits" + android:exported="false" + android:grantUriPermissions="true"> + android:name="android.support.FILE_PROVIDER_PATHS" + android:resource="@xml/file_paths" /> - + android:name=".sync.SyncService" + android:enabled="true" + android:exported="false"> \ No newline at end of file diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt new file mode 100644 index 000000000..b8446034e --- /dev/null +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2016 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +package org.isoron.uhabits.activities.habits.edit + +import android.graphics.* +import android.os.* +import androidx.appcompat.app.* +import androidx.appcompat.widget.* +import org.isoron.uhabits.* + +class EditHabitActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_edit_habit) + + window.statusBarColor = Color.parseColor("#B4285A") + + val toolbar = findViewById(R.id.toolbar) + setSupportActionBar(toolbar) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + supportActionBar?.setDisplayShowHomeEnabled(true) + supportActionBar?.elevation = 10.0f + } +} diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt index 4cf89c363..a55fee4df 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt @@ -138,8 +138,8 @@ class ListHabitsScreen } override fun showCreateBooleanHabitScreen() { - val dialog = editHabitDialogFactory.createBoolean() - activity.showDialog(dialog, "editHabit") + val intent = intentFactory.startEditActivity(activity) + activity.startActivity(intent) } override fun showCreateNumericalHabitScreen() { diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.kt index 11ac9d24c..03d418f68 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.kt @@ -21,8 +21,10 @@ package org.isoron.uhabits.intents import android.content.* import android.net.* +import org.isoron.androidbase.activities.* import org.isoron.uhabits.* import org.isoron.uhabits.activities.about.* +import org.isoron.uhabits.activities.habits.edit.* import org.isoron.uhabits.activities.habits.show.* import org.isoron.uhabits.activities.intro.* import org.isoron.uhabits.activities.settings.* @@ -81,4 +83,8 @@ class IntentFactory fun codeContributors(context: Context) = buildViewIntent(context.getString(R.string.codeContributorsURL)) + + fun startEditActivity(context: Context): Intent? { + return Intent(context, EditHabitActivity::class.java) + } } diff --git a/android/uhabits-android/src/main/res/drawable/ic_arrow_drop_down_dark.xml b/android/uhabits-android/src/main/res/drawable/ic_arrow_drop_down_dark.xml new file mode 100644 index 000000000..64aecb682 --- /dev/null +++ b/android/uhabits-android/src/main/res/drawable/ic_arrow_drop_down_dark.xml @@ -0,0 +1,9 @@ + + + diff --git a/android/uhabits-android/src/main/res/drawable/input_box_background.xml b/android/uhabits-android/src/main/res/drawable/input_box_background.xml new file mode 100644 index 000000000..6bbf34405 --- /dev/null +++ b/android/uhabits-android/src/main/res/drawable/input_box_background.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/android/uhabits-android/src/main/res/layout/activity_edit_habit.xml b/android/uhabits-android/src/main/res/layout/activity_edit_habit.xml new file mode 100644 index 000000000..9e6d5be32 --- /dev/null +++ b/android/uhabits-android/src/main/res/layout/activity_edit_habit.xml @@ -0,0 +1,313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 175000efd179ffda4141868ecceba2c5500fbd64 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sun, 12 Jan 2020 11:54:15 -0600 Subject: [PATCH 02/12] Follow current theme; implement color switching --- .../src/main/AndroidManifest.xml | 7 ++- .../activities/AndroidThemeSwitcher.kt | 5 ++- .../activities/HabitsActivityComponent.kt | 2 +- .../activities/HabitsActivityModule.kt | 13 ++++-- .../habits/edit/EditHabitActivity.kt | 43 +++++++++++++++++-- .../habits/edit/EditHabitDialog.java | 2 +- .../res/drawable/ic_arrow_drop_down_dark.xml | 2 +- .../res/drawable/input_box_background.xml | 6 +-- .../main/res/layout/activity_edit_habit.xml | 30 +++++++------ .../src/main/res/values/styles.xml | 10 ++--- 10 files changed, 84 insertions(+), 36 deletions(-) diff --git a/android/uhabits-android/src/main/AndroidManifest.xml b/android/uhabits-android/src/main/AndroidManifest.xml index dfabd05fc..b5138b3d3 100644 --- a/android/uhabits-android/src/main/AndroidManifest.xml +++ b/android/uhabits-android/src/main/AndroidManifest.xml @@ -17,9 +17,12 @@ android:theme="@style/AppBaseTheme"> + android:name=".activities.habits.edit.EditHabitActivity"> + + (R.id.toolbar) setSupportActionBar(toolbar) supportActionBar?.setDisplayHomeAsUpEnabled(true) supportActionBar?.setDisplayShowHomeEnabled(true) supportActionBar?.elevation = 10.0f + + val colorPickerDialogFactory = ColorPickerDialogFactory(this) + colorButton.setOnClickListener { + val dialog = colorPickerDialogFactory.create(paletteColor) + dialog.setListener { paletteColor -> + this.paletteColor = paletteColor + updateColors() + } + dialog.show(supportFragmentManager, "colorPicker") + } + } + + private fun updateColors() { + val androidColor = PaletteUtils.getColor(this, paletteColor) + colorButton.backgroundTintList = ColorStateList.valueOf(androidColor) + if(!themeSwitcher.isNightMode) { + val darkerAndroidColor = ColorUtils.mixColors(Color.BLACK, androidColor, 0.15f) + window.statusBarColor = darkerAndroidColor + toolbar.setBackgroundColor(androidColor) + } } } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java index 0a90f7aa4..b57352543 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java @@ -82,7 +82,7 @@ public class EditHabitDialog extends AppCompatDialogFragment public int getTheme() { HabitsActivity activity = (HabitsActivity) getActivity(); - return activity.getComponent().getThemeSwitcher().getDialogTheme(); + return ((AndroidThemeSwitcher) activity.getComponent().getThemeSwitcher()).getDialogTheme(); } @Override diff --git a/android/uhabits-android/src/main/res/drawable/ic_arrow_drop_down_dark.xml b/android/uhabits-android/src/main/res/drawable/ic_arrow_drop_down_dark.xml index 64aecb682..8b5305ed8 100644 --- a/android/uhabits-android/src/main/res/drawable/ic_arrow_drop_down_dark.xml +++ b/android/uhabits-android/src/main/res/drawable/ic_arrow_drop_down_dark.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/android/uhabits-android/src/main/res/drawable/input_box_background.xml b/android/uhabits-android/src/main/res/drawable/input_box_background.xml index 6bbf34405..ed5de9ef4 100644 --- a/android/uhabits-android/src/main/res/drawable/input_box_background.xml +++ b/android/uhabits-android/src/main/res/drawable/input_box_background.xml @@ -1,8 +1,8 @@ - - - + + + @@ -17,13 +17,13 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="#E23673" + android:background="?attr/colorPrimary" android:elevation="2dp" android:gravity="end" android:minHeight="?attr/actionBarSize" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" - app:title="Edit habit" - app:titleTextColor="@android:color/white"> + app:title="@string/create_habit" + app:titleTextColor="@color/white"> @@ -82,7 +82,7 @@ android:layout_marginStart="8dp" android:layout_marginTop="-17dp" android:layout_marginBottom="-4dp" - android:background="@color/white" + android:background="?attr/highContrastReverseTextColor" android:paddingStart="8dp" android:paddingEnd="8dp" android:textSize="@dimen/smallTextSize" @@ -122,13 +122,14 @@ android:layout_marginStart="8dp" android:layout_marginTop="-17dp" android:layout_marginBottom="-4dp" - android:background="@color/white" + android:background="?attr/highContrastReverseTextColor" android:paddingStart="8dp" android:paddingEnd="8dp" android:textSize="@dimen/smallTextSize" android:text="Color" /> + android:textColor="?attr/highContrastTextColor" /> @@ -249,7 +251,7 @@ android:layout_marginStart="8dp" android:layout_marginTop="-17dp" android:layout_marginBottom="-4dp" - android:background="@color/white" + android:background="?attr/highContrastReverseTextColor" android:textSize="@dimen/smallTextSize" android:paddingStart="8dp" android:paddingEnd="8dp" @@ -261,7 +263,7 @@ android:background="?attr/selectableItemBackground" android:drawableEnd="@drawable/ic_arrow_drop_down_dark" android:textSize="@dimen/regularTextSize" - android:textColor="@color/black" + android:textColor="?attr/highContrastTextColor" android:padding="16dp" android:text="@string/reminder_off" /> @@ -291,7 +293,7 @@ android:layout_marginStart="8dp" android:layout_marginTop="-17dp" android:layout_marginBottom="-4dp" - android:background="@color/white" + android:background="?attr/highContrastReverseTextColor" android:textSize="@dimen/smallTextSize" android:paddingStart="8dp" android:paddingEnd="8dp" @@ -302,7 +304,7 @@ android:layout_height="wrap_content" android:background="@color/transparent" android:textSize="@dimen/regularTextSize" - android:textColor="@color/black" + android:textColor="?attr/highContrastTextColor" android:padding="16dp" android:hint="(Optional)" /> diff --git a/android/uhabits-android/src/main/res/values/styles.xml b/android/uhabits-android/src/main/res/values/styles.xml index 0e7b5a5a0..2de23441c 100644 --- a/android/uhabits-android/src/main/res/values/styles.xml +++ b/android/uhabits-android/src/main/res/values/styles.xml @@ -18,7 +18,7 @@ --> - - + + + + + + + + diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.java index 1a2912452..9714a7522 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.java @@ -61,14 +61,9 @@ public class ListHabitsMenuBehavior updateAdapterFilter(); } - public void onCreateBooleanHabit() + public void onCreateHabit() { - screen.showCreateBooleanHabitScreen(); - } - - public void onCreateNumericalHabit() - { - screen.showCreateNumericalHabitScreen(); + screen.showSelectHabitTypeDialog(); } public void onViewFAQ() @@ -150,12 +145,10 @@ public class ListHabitsMenuBehavior void showAboutScreen(); - void showCreateBooleanHabitScreen(); - - void showCreateNumericalHabitScreen(); - void showFAQScreen(); void showSettingsScreen(); + + void showSelectHabitTypeDialog(); } } From 309b6cbcafb127928e1e7e5166db59e1ba8e0a24 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Thu, 18 Jun 2020 07:43:58 -0500 Subject: [PATCH 05/12] Implement reminder time picker; customize picker color --- .../datetimepicker/time/AmPmCirclesView.java | 12 +- .../time/RadialPickerLayout.java | 8 + .../time/RadialSelectorView.java | 8 +- .../datetimepicker/time/TimePickerDialog.java | 314 ++++++++----- .../main/res/layout/time_picker_dialog.xml | 16 +- .../habits/edit/EditHabitActivity.kt | 51 ++- .../habits/edit/EditHabitDialog.java | 3 +- .../SnoozeDelayPickerActivity.java | 4 +- .../main/res/layout/activity_edit_habit.xml | 420 +++++++++--------- .../src/main/res/values/strings.xml | 2 + 10 files changed, 474 insertions(+), 364 deletions(-) diff --git a/android/android-pickers/src/main/java/com/android/datetimepicker/time/AmPmCirclesView.java b/android/android-pickers/src/main/java/com/android/datetimepicker/time/AmPmCirclesView.java index f310a1d85..3c6316521 100644 --- a/android/android-pickers/src/main/java/com/android/datetimepicker/time/AmPmCirclesView.java +++ b/android/android-pickers/src/main/java/com/android/datetimepicker/time/AmPmCirclesView.java @@ -41,8 +41,8 @@ public class AmPmCirclesView extends View { private final Paint mPaint = new Paint(); private int mSelectedAlpha; private int mUnselectedColor; - private int mAmPmTextColor; - private int mSelectedColor; + protected int mAmPmTextColor = Color.WHITE; + protected int mSelectedColor = Color.BLUE; private float mCircleRadiusMultiplier; private float mAmPmCircleRadiusMultiplier; private String mAmText; @@ -73,8 +73,8 @@ public class AmPmCirclesView extends View { Resources res = context.getResources(); mUnselectedColor = res.getColor(R.color.white); - mSelectedColor = res.getColor(R.color.blue); - mAmPmTextColor = res.getColor(R.color.ampm_text_color); + //mSelectedColor = res.getColor(R.color.blue); + //mAmPmTextColor = res.getColor(R.color.ampm_text_color); mSelectedAlpha = SELECTED_ALPHA; String typefaceFamily = res.getString(R.string.sans_serif); Typeface tf = Typeface.create(typefaceFamily, Typeface.NORMAL); @@ -105,8 +105,8 @@ public class AmPmCirclesView extends View { mSelectedAlpha = SELECTED_ALPHA_THEME_DARK; } else { mUnselectedColor = res.getColor(R.color.white); - mSelectedColor = res.getColor(R.color.blue); - mAmPmTextColor = res.getColor(R.color.ampm_text_color); + //mSelectedColor = res.getColor(R.color.blue); + //mAmPmTextColor = res.getColor(R.color.ampm_text_color); mSelectedAlpha = SELECTED_ALPHA; } } diff --git a/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialPickerLayout.java b/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialPickerLayout.java index 265b98cf8..307424a3e 100644 --- a/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialPickerLayout.java +++ b/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialPickerLayout.java @@ -84,6 +84,14 @@ public class RadialPickerLayout extends FrameLayout implements OnTouchListener { private AnimatorSet mTransition; private Handler mHandler = new Handler(); + public void setColor(int selectedColor) + { + mHourRadialSelectorView.mPaint.setColor(selectedColor); + mMinuteRadialSelectorView.mPaint.setColor(selectedColor); + mAmPmCirclesView.mSelectedColor = selectedColor; + mAmPmCirclesView.mAmPmTextColor = selectedColor; + } + public interface OnValueSelectedListener { void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance); } diff --git a/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialSelectorView.java b/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialSelectorView.java index 48e4385b5..018147efa 100644 --- a/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialSelectorView.java +++ b/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialSelectorView.java @@ -40,7 +40,7 @@ public class RadialSelectorView extends View { // Alpha level for the line. private static final int FULL_ALPHA = Utils.FULL_ALPHA; - private final Paint mPaint = new Paint(); + protected final Paint mPaint = new Paint(); private boolean mIsInitialized; private boolean mDrawValuesReady; @@ -96,8 +96,6 @@ public class RadialSelectorView extends View { Resources res = context.getResources(); - int blue = res.getColor(R.color.blue); - mPaint.setColor(blue); mPaint.setAntiAlias(true); mSelectionAlpha = SELECTED_ALPHA; @@ -139,15 +137,11 @@ public class RadialSelectorView extends View { /* package */ void setTheme(Context context, boolean themeDark) { Resources res = context.getResources(); - int color; if (themeDark) { - color = res.getColor(R.color.red); mSelectionAlpha = SELECTED_ALPHA_THEME_DARK; } else { - color = res.getColor(R.color.blue); mSelectionAlpha = SELECTED_ALPHA; } - mPaint.setColor(color); } /** diff --git a/android/android-pickers/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java b/android/android-pickers/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java index 8863f7207..972241231 100644 --- a/android/android-pickers/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java +++ b/android/android-pickers/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java @@ -23,7 +23,9 @@ import android.app.*; import android.content.*; import android.content.res.*; import android.os.*; + import androidx.appcompat.app.*; + import android.util.*; import android.view.*; import android.view.View.*; @@ -39,7 +41,8 @@ import java.util.*; /** * Dialog to set a time. */ -public class TimePickerDialog extends AppCompatDialogFragment implements OnValueSelectedListener{ +public class TimePickerDialog extends AppCompatDialogFragment implements OnValueSelectedListener +{ private static final String TAG = "TimePickerDialog"; private static final String KEY_HOUR_OF_DAY = "hour_of_day"; @@ -108,37 +111,50 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue * The callback interface used to indicate the user is done filling in * the time (they clicked on the 'Set' button). */ - public interface OnTimeSetListener { + public interface OnTimeSetListener + { /** - * @param view The view associated with this listener. + * @param view The view associated with this listener. * @param hourOfDay The hour that was set. - * @param minute The minute that was set. + * @param minute The minute that was set. */ void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute); - - default void onTimeCleared(RadialPickerLayout view) {} + + default void onTimeCleared(RadialPickerLayout view) + { + } } - public TimePickerDialog() { + public TimePickerDialog() + { // Empty constructor required for dialog fragment. } @SuppressLint("Java") public TimePickerDialog(Context context, int theme, OnTimeSetListener callback, - int hourOfDay, int minute, boolean is24HourMode) { + int hourOfDay, int minute, boolean is24HourMode) + { // Empty constructor required for dialog fragment. } public static TimePickerDialog newInstance(OnTimeSetListener callback, - int hourOfDay, int minute, boolean is24HourMode) { + int hourOfDay, + int minute, + boolean is24HourMode, + int color) + { TimePickerDialog ret = new TimePickerDialog(); - ret.initialize(callback, hourOfDay, minute, is24HourMode); + ret.initialize(callback, hourOfDay, minute, is24HourMode, color); return ret; } public void initialize(OnTimeSetListener callback, - int hourOfDay, int minute, boolean is24HourMode) { + int hourOfDay, + int minute, + boolean is24HourMode, + int color) + { mCallback = callback; mInitialHourOfDay = hourOfDay; @@ -146,35 +162,41 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue mIs24HourMode = is24HourMode; mInKbMode = false; mThemeDark = false; + mSelectedColor = color; } /** * Set a dark or light theme. NOTE: this will only take effect for the next onCreateView. */ - public void setThemeDark(boolean dark) { + public void setThemeDark(boolean dark) + { mThemeDark = dark; } - public boolean isThemeDark() { + public boolean isThemeDark() + { return mThemeDark; } - public void setOnTimeSetListener(OnTimeSetListener callback) { + public void setOnTimeSetListener(OnTimeSetListener callback) + { mCallback = callback; } - public void setStartTime(int hourOfDay, int minute) { + public void setStartTime(int hourOfDay, int minute) + { mInitialHourOfDay = hourOfDay; mInitialMinute = minute; mInKbMode = false; } @Override - public void onCreate(Bundle savedInstanceState) { + public void onCreate(Bundle savedInstanceState) + { super.onCreate(savedInstanceState); if (savedInstanceState != null && savedInstanceState.containsKey(KEY_HOUR_OF_DAY) - && savedInstanceState.containsKey(KEY_MINUTE) - && savedInstanceState.containsKey(KEY_IS_24_HOUR_VIEW)) { + && savedInstanceState.containsKey(KEY_MINUTE) + && savedInstanceState.containsKey(KEY_IS_24_HOUR_VIEW)) { mInitialHourOfDay = savedInstanceState.getInt(KEY_HOUR_OF_DAY); mInitialMinute = savedInstanceState.getInt(KEY_MINUTE); mIs24HourMode = savedInstanceState.getBoolean(KEY_IS_24_HOUR_VIEW); @@ -191,7 +213,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { + Bundle savedInstanceState) + { getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE); View view = inflater.inflate(R.layout.time_picker_dialog, null); @@ -203,8 +226,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue mSelectHours = res.getString(R.string.select_hours); mMinutePickerDescription = res.getString(R.string.minute_picker_description); mSelectMinutes = res.getString(R.string.select_minutes); - mSelectedColor = res.getColor(mThemeDark? R.color.red : R.color.blue); - mUnselectedColor = res.getColor(mThemeDark? R.color.white : R.color.numbers_text_color); + //mSelectedColor = res.getColor(mThemeDark ? R.color.red : R.color.blue); + mUnselectedColor = res.getColor(mThemeDark ? R.color.white : R.color.numbers_text_color); mHourView = (TextView) view.findViewById(R.id.hours); mHourView.setOnKeyListener(keyboardListener); @@ -223,8 +246,9 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue mTimePicker = (RadialPickerLayout) view.findViewById(R.id.time_picker); mTimePicker.setOnValueSelectedListener(this); mTimePicker.setOnKeyListener(keyboardListener); + mTimePicker.setColor(mSelectedColor); mTimePicker.initialize(getActivity(), mHapticFeedbackController, mInitialHourOfDay, - mInitialMinute, mIs24HourMode); + mInitialMinute, mIs24HourMode); int currentItemShowing = HOUR_INDEX; if (savedInstanceState != null && @@ -234,25 +258,31 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue setCurrentItemShowing(currentItemShowing, false, true, true); mTimePicker.invalidate(); - mHourView.setOnClickListener(new OnClickListener() { + mHourView.setOnClickListener(new OnClickListener() + { @Override - public void onClick(View v) { + public void onClick(View v) + { setCurrentItemShowing(HOUR_INDEX, true, false, true); tryVibrate(); } }); - mMinuteView.setOnClickListener(new OnClickListener() { + mMinuteView.setOnClickListener(new OnClickListener() + { @Override - public void onClick(View v) { + public void onClick(View v) + { setCurrentItemShowing(MINUTE_INDEX, true, false, true); tryVibrate(); } }); mDoneButton = (TextView) view.findViewById(R.id.done_button); - mDoneButton.setOnClickListener(new OnClickListener() { + mDoneButton.setOnClickListener(new OnClickListener() + { @Override - public void onClick(View v) { + public void onClick(View v) + { if (mInKbMode && isTypedTimeFullyLegal()) { finishKbMode(false); } else { @@ -260,25 +290,25 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } if (mCallback != null) { mCallback.onTimeSet(mTimePicker, - mTimePicker.getHours(), mTimePicker.getMinutes()); + mTimePicker.getHours(), mTimePicker.getMinutes()); } dismiss(); } }); mDoneButton.setOnKeyListener(keyboardListener); - + mClearButton = (TextView) view.findViewById(R.id.clear_button); mClearButton.setOnClickListener(new OnClickListener() - { - @Override - public void onClick(View v) - { - if(mCallback != null) { - mCallback.onTimeCleared(mTimePicker); - } - dismiss(); - } - }); + { + @Override + public void onClick(View v) + { + if (mCallback != null) { + mCallback.onTimeCleared(mTimePicker); + } + dismiss(); + } + }); mClearButton.setOnKeyListener(keyboardListener); // Enable or disable the AM/PM view. @@ -293,15 +323,17 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue separatorView.setLayoutParams(paramsSeparator); } else { mAmPmTextView.setVisibility(View.VISIBLE); - updateAmPmDisplay(mInitialHourOfDay < 12? AM : PM); - mAmPmHitspace.setOnClickListener(new OnClickListener() { + updateAmPmDisplay(mInitialHourOfDay < 12 ? AM : PM); + mAmPmHitspace.setOnClickListener(new OnClickListener() + { @Override - public void onClick(View v) { + public void onClick(View v) + { tryVibrate(); int amOrPm = mTimePicker.getIsCurrentlyAmOrPm(); if (amOrPm == AM) { amOrPm = PM; - } else if (amOrPm == PM){ + } else if (amOrPm == PM) { amOrPm = AM; } updateAmPmDisplay(amOrPm); @@ -328,56 +360,61 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue mTypedTimes = new ArrayList(); } - // Set the theme at the end so that the initialize()s above don't counteract the theme. - mTimePicker.setTheme(getActivity().getApplicationContext(), mThemeDark); - // Prepare some palette to use. - int white = res.getColor(R.color.white); - int circleBackground = res.getColor(R.color.circle_background); - int line = res.getColor(R.color.line_background); - int timeDisplay = res.getColor(R.color.numbers_text_color); - ColorStateList doneTextColor = res.getColorStateList(R.color.done_text_color); - int doneBackground = R.drawable.done_background_color; - int darkGray = res.getColor(R.color.dark_gray); - int lightGray = res.getColor(R.color.light_gray); - int darkLine = res.getColor(R.color.line_dark); - ColorStateList darkDoneTextColor = res.getColorStateList(R.color.done_text_color_dark); - int darkDoneBackground = R.drawable.done_background_color_dark; +// // Set the theme at the end so that the initialize()s above don't counteract the theme. +// mTimePicker.setTheme(getActivity().getApplicationContext(), mThemeDark); +// // Prepare some palette to use. +// int white = res.getColor(R.color.white); +// int circleBackground = res.getColor(R.color.circle_background); +// int line = res.getColor(R.color.line_background); +// int timeDisplay = res.getColor(R.color.numbers_text_color); +// ColorStateList doneTextColor = res.getColorStateList(R.color.done_text_color); +// int doneBackground = R.drawable.done_background_color; +// +// int darkGray = res.getColor(R.color.dark_gray); +// int lightGray = res.getColor(R.color.light_gray); +// int darkLine = res.getColor(R.color.line_dark); +// ColorStateList darkDoneTextColor = res.getColorStateList(R.color.done_text_color_dark); +// int darkDoneBackground = R.drawable.done_background_color_dark; // Set the palette for each view based on the theme. - view.findViewById(R.id.time_display_background).setBackgroundColor(mThemeDark? darkGray : white); - view.findViewById(R.id.time_display).setBackgroundColor(mThemeDark? darkGray : white); - ((TextView) view.findViewById(R.id.separator)).setTextColor(mThemeDark? white : timeDisplay); - ((TextView) view.findViewById(R.id.ampm_label)).setTextColor(mThemeDark? white : timeDisplay); - view.findViewById(R.id.line).setBackgroundColor(mThemeDark? darkLine : line); - mDoneButton.setTextColor(mThemeDark? darkDoneTextColor : doneTextColor); - mTimePicker.setBackgroundColor(mThemeDark? lightGray : circleBackground); - mDoneButton.setBackgroundResource(mThemeDark? darkDoneBackground : doneBackground); +// view.findViewById(R.id.time_display_background).setBackgroundColor(mThemeDark? darkGray : white); +// view.findViewById(R.id.time_display).setBackgroundColor(mThemeDark? darkGray : white); +// ((TextView) view.findViewById(R.id.separator)).setTextColor(mThemeDark? white : timeDisplay); +// ((TextView) view.findViewById(R.id.ampm_label)).setTextColor(mThemeDark? white : timeDisplay); +// view.findViewById(R.id.line).setBackgroundColor(mThemeDark? darkLine : line); +// mDoneButton.setTextColor(mThemeDark? darkDoneTextColor : doneTextColor); +// mTimePicker.setBackgroundColor(mThemeDark? lightGray : circleBackground); +// mDoneButton.setBackgroundResource(mThemeDark? darkDoneBackground : doneBackground); return view; } @Override - public void onResume() { + public void onResume() + { super.onResume(); mHapticFeedbackController.start(); } @Override - public void onPause() { + public void onPause() + { super.onPause(); mHapticFeedbackController.stop(); } - public void tryVibrate() { + public void tryVibrate() + { mHapticFeedbackController.tryVibrate(); } - private void updateAmPmDisplay(int amOrPm) { + private void updateAmPmDisplay(int amOrPm) + { if (amOrPm == AM) { mAmPmTextView.setText(mAmText); Utils.tryAccessibilityAnnounce(mTimePicker, mAmText); mAmPmHitspace.setContentDescription(mAmText); - } else if (amOrPm == PM){ + } else if (amOrPm == PM) { mAmPmTextView.setText(mPmText); Utils.tryAccessibilityAnnounce(mTimePicker, mPmText); mAmPmHitspace.setContentDescription(mPmText); @@ -387,7 +424,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } @Override - public void onSaveInstanceState(Bundle outState) { + public void onSaveInstanceState(Bundle outState) + { if (mTimePicker != null) { outState.putInt(KEY_HOUR_OF_DAY, mTimePicker.getHours()); outState.putInt(KEY_MINUTE, mTimePicker.getMinutes()); @@ -405,7 +443,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue * Called by the picker for updating the header display. */ @Override - public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) { + public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) + { if (pickerIndex == HOUR_INDEX) { setHour(newValue, false); String announcement = String.format("%d", newValue); @@ -417,7 +456,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } Utils.tryAccessibilityAnnounce(mTimePicker, announcement); - } else if (pickerIndex == MINUTE_INDEX){ + } else if (pickerIndex == MINUTE_INDEX) { setMinute(newValue); mTimePicker.setContentDescription(mMinutePickerDescription + ": " + newValue); } else if (pickerIndex == AMPM_INDEX) { @@ -430,7 +469,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } } - private void setHour(int value, boolean announce) { + private void setHour(int value, boolean announce) + { String format; if (mIs24HourMode) { format = "%02d"; @@ -450,7 +490,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } } - private void setMinute(int value) { + private void setMinute(int value) + { if (value == 60) { value = 0; } @@ -462,7 +503,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue // Show either Hours or Minutes. private void setCurrentItemShowing(int index, boolean animateCircle, boolean delayLabelAnimate, - boolean announce) { + boolean announce) + { mTimePicker.setCurrentItemShowing(index, animateCircle); TextView labelToAnimate; @@ -485,8 +527,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue labelToAnimate = mMinuteView; } - int hourColor = (index == HOUR_INDEX)? mSelectedColor : mUnselectedColor; - int minuteColor = (index == MINUTE_INDEX)? mSelectedColor : mUnselectedColor; + int hourColor = (index == HOUR_INDEX) ? mSelectedColor : mUnselectedColor; + int minuteColor = (index == MINUTE_INDEX) ? mSelectedColor : mUnselectedColor; mHourView.setTextColor(hourColor); mMinuteView.setTextColor(minuteColor); @@ -499,15 +541,17 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue /** * For keyboard mode, processes key events. + * * @param keyCode the pressed key. * @return true if the key was successfully processed, false otherwise. */ - private boolean processKeyUp(int keyCode) { + private boolean processKeyUp(int keyCode) + { if (keyCode == KeyEvent.KEYCODE_ESCAPE || keyCode == KeyEvent.KEYCODE_BACK) { dismiss(); return true; } else if (keyCode == KeyEvent.KEYCODE_TAB) { - if(mInKbMode) { + if (mInKbMode) { if (isTypedTimeFullyLegal()) { finishKbMode(true); } @@ -522,7 +566,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } if (mCallback != null) { mCallback.onTimeSet(mTimePicker, - mTimePicker.getHours(), mTimePicker.getMinutes()); + mTimePicker.getHours(), mTimePicker.getMinutes()); } dismiss(); return true; @@ -539,7 +583,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue deletedKeyStr = String.format("%d", getValFromKeyCode(deleted)); } Utils.tryAccessibilityAnnounce(mTimePicker, - String.format(mDeletedKeyFormat, deletedKeyStr)); + String.format(mDeletedKeyFormat, deletedKeyStr)); updateDisplay(true); } } @@ -549,7 +593,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue || keyCode == KeyEvent.KEYCODE_6 || keyCode == KeyEvent.KEYCODE_7 || keyCode == KeyEvent.KEYCODE_8 || keyCode == KeyEvent.KEYCODE_9 || (!mIs24HourMode && - (keyCode == getAmOrPmKeyCode(AM) || keyCode == getAmOrPmKeyCode(PM)))) { + (keyCode == getAmOrPmKeyCode(AM) || keyCode == getAmOrPmKeyCode(PM)))) { if (!mInKbMode) { if (mTimePicker == null) { // Something's wrong, because time picker should definitely not be null. @@ -572,11 +616,13 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue /** * Try to start keyboard mode with the specified key, as long as the timepicker is not in the * middle of a touch-event. + * * @param keyCode The key to use as the first press. Keyboard mode will not be started if the - * key is not legal to start with. Or, pass in -1 to get into keyboard mode without a starting - * key. + * key is not legal to start with. Or, pass in -1 to get into keyboard mode without a starting + * key. */ - private void tryStartingKbMode(int keyCode) { + private void tryStartingKbMode(int keyCode) + { if (mTimePicker.trySettingInputEnabled(false) && (keyCode == -1 || addKeyIfLegal(keyCode))) { mInKbMode = true; @@ -585,7 +631,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } } - private boolean addKeyIfLegal(int keyCode) { + private boolean addKeyIfLegal(int keyCode) + { // If we're in 24hour mode, we'll need to check if the input is full. If in AM/PM mode, // we'll need to see if AM/PM have been typed. if ((mIs24HourMode && mTypedTimes.size() == 4) || @@ -617,7 +664,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue * Traverse the tree to see if the keys that have been typed so far are legal as is, * or may become legal as more keys are typed (excluding backspace). */ - private boolean isTypedTimeLegalSoFar() { + private boolean isTypedTimeLegalSoFar() + { Node node = mLegalTimesTree; for (int keyCode : mTypedTimes) { node = node.canReach(keyCode); @@ -631,7 +679,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue /** * Check if the time that has been typed so far is completely legal, as is. */ - private boolean isTypedTimeFullyLegal() { + private boolean isTypedTimeFullyLegal() + { if (mIs24HourMode) { // For 24-hour mode, the time is legal if the hours and minutes are each legal. Note: // getEnteredTime() will ONLY call isTypedTimeFullyLegal() when NOT in 24hour mode. @@ -645,7 +694,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } } - private int deleteLastTypedKey() { + private int deleteLastTypedKey() + { int deleted = mTypedTimes.remove(mTypedTimes.size() - 1); if (!isTypedTimeFullyLegal()) { mDoneButton.setEnabled(false); @@ -655,9 +705,11 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue /** * Get out of keyboard mode. If there is nothing in typedTimes, revert to TimePicker's time. + * * @param changeDisplays If true, update the displays with the relevant time. */ - private void finishKbMode(boolean updateDisplays) { + private void finishKbMode(boolean updateDisplays) + { mInKbMode = false; if (!mTypedTimes.isEmpty()) { int values[] = getEnteredTime(null); @@ -677,29 +729,31 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue * Update the hours, minutes, and AM/PM displays with the typed times. If the typedTimes is * empty, either show an empty display (filled with the placeholder text), or update from the * timepicker's values. + * * @param allowEmptyDisplay if true, then if the typedTimes is empty, use the placeholder text. - * Otherwise, revert to the timepicker's values. + * Otherwise, revert to the timepicker's values. */ - private void updateDisplay(boolean allowEmptyDisplay) { + private void updateDisplay(boolean allowEmptyDisplay) + { if (!allowEmptyDisplay && mTypedTimes.isEmpty()) { int hour = mTimePicker.getHours(); int minute = mTimePicker.getMinutes(); setHour(hour, true); setMinute(minute); if (!mIs24HourMode) { - updateAmPmDisplay(hour < 12? AM : PM); + updateAmPmDisplay(hour < 12 ? AM : PM); } setCurrentItemShowing(mTimePicker.getCurrentItemShowing(), true, true, true); mDoneButton.setEnabled(true); } else { Boolean[] enteredZeros = {false, false}; int[] values = getEnteredTime(enteredZeros); - String hourFormat = enteredZeros[0]? "%02d" : "%2d"; - String minuteFormat = (enteredZeros[1])? "%02d" : "%2d"; - String hourStr = (values[0] == -1)? mDoublePlaceholderText : - String.format(hourFormat, values[0]).replace(' ', mPlaceholderText); - String minuteStr = (values[1] == -1)? mDoublePlaceholderText : - String.format(minuteFormat, values[1]).replace(' ', mPlaceholderText); + String hourFormat = enteredZeros[0] ? "%02d" : "%2d"; + String minuteFormat = (enteredZeros[1]) ? "%02d" : "%2d"; + String hourStr = (values[0] == -1) ? mDoublePlaceholderText : + String.format(hourFormat, values[0]).replace(' ', mPlaceholderText); + String minuteStr = (values[1] == -1) ? mDoublePlaceholderText : + String.format(minuteFormat, values[1]).replace(' ', mPlaceholderText); mHourView.setText(hourStr); mHourSpaceView.setText(hourStr); mHourView.setTextColor(mUnselectedColor); @@ -712,7 +766,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } } - private static int getValFromKeyCode(int keyCode) { + private static int getValFromKeyCode(int keyCode) + { switch (keyCode) { case KeyEvent.KEYCODE_0: return 0; @@ -741,20 +796,22 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue /** * Get the currently-entered time, as integer values of the hours and minutes typed. + * * @param enteredZeros A size-2 boolean array, which the caller should initialize, and which - * may then be used for the caller to know whether zeros had been explicitly entered as either - * hours of minutes. This is helpful for deciding whether to show the dashes, or actual 0's. + * may then be used for the caller to know whether zeros had been explicitly entered as either + * hours of minutes. This is helpful for deciding whether to show the dashes, or actual 0's. * @return A size-3 int array. The first value will be the hours, the second value will be the * minutes, and the third will be either TimePickerDialog.AM or TimePickerDialog.PM. */ - private int[] getEnteredTime(Boolean[] enteredZeros) { + private int[] getEnteredTime(Boolean[] enteredZeros) + { int amOrPm = -1; int startIndex = 1; if (!mIs24HourMode && isTypedTimeFullyLegal()) { int keyCode = mTypedTimes.get(mTypedTimes.size() - 1); if (keyCode == getAmOrPmKeyCode(AM)) { amOrPm = AM; - } else if (keyCode == getAmOrPmKeyCode(PM)){ + } else if (keyCode == getAmOrPmKeyCode(PM)) { amOrPm = PM; } startIndex = 2; @@ -765,15 +822,15 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue int val = getValFromKeyCode(mTypedTimes.get(mTypedTimes.size() - i)); if (i == startIndex) { minute = val; - } else if (i == startIndex+1) { - minute += 10*val; + } else if (i == startIndex + 1) { + minute += 10 * val; if (enteredZeros != null && val == 0) { enteredZeros[1] = true; } - } else if (i == startIndex+2) { + } else if (i == startIndex + 2) { hour = val; - } else if (i == startIndex+3) { - hour += 10*val; + } else if (i == startIndex + 3) { + hour += 10 * val; if (enteredZeros != null && val == 0) { enteredZeros[0] = true; } @@ -787,7 +844,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue /** * Get the keycode value for AM and PM in the current language. */ - private int getAmOrPmKeyCode(int amOrPm) { + private int getAmOrPmKeyCode(int amOrPm) + { // Cache the codes. if (mAmKeyCode == -1 || mPmKeyCode == -1) { // Find the first character in the AM/PM text that is unique. @@ -822,7 +880,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue /** * Create a tree for deciding what keys can legally be typed. */ - private void generateLegalTimesTree() { + private void generateLegalTimesTree() + { // Create a quick cache of numbers to their keycodes. int k0 = KeyEvent.KEYCODE_0; int k1 = KeyEvent.KEYCODE_1; @@ -955,20 +1014,24 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue * mLegalKeys represents the keys that can be typed to get to the node. * mChildren are the children that can be reached from this node. */ - private class Node { + private class Node + { private int[] mLegalKeys; private ArrayList mChildren; - public Node(int... legalKeys) { + public Node(int... legalKeys) + { mLegalKeys = legalKeys; mChildren = new ArrayList(); } - public void addChild(Node child) { + public void addChild(Node child) + { mChildren.add(child); } - public boolean containsKey(int key) { + public boolean containsKey(int key) + { for (int i = 0; i < mLegalKeys.length; i++) { if (mLegalKeys[i] == key) { return true; @@ -977,7 +1040,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue return false; } - public Node canReach(int key) { + public Node canReach(int key) + { if (mChildren == null) { return null; } @@ -990,9 +1054,11 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } } - private class KeyboardListener implements OnKeyListener { + private class KeyboardListener implements OnKeyListener + { @Override - public boolean onKey(View v, int keyCode, KeyEvent event) { + public boolean onKey(View v, int keyCode, KeyEvent event) + { if (event.getAction() == KeyEvent.ACTION_UP) { return processKeyUp(keyCode); } @@ -1000,14 +1066,16 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } } - public void setDismissListener( DialogInterface.OnDismissListener listener ) { + public void setDismissListener(DialogInterface.OnDismissListener listener) + { dismissListener = listener; } @Override - public void onDismiss(DialogInterface dialog) { + public void onDismiss(DialogInterface dialog) + { super.onDismiss(dialog); - if( dismissListener != null ) + if (dismissListener != null) dismissListener.onDismiss(dialog); } } diff --git a/android/android-pickers/src/main/res/layout/time_picker_dialog.xml b/android/android-pickers/src/main/res/layout/time_picker_dialog.xml index 44393dca6..cefb56099 100644 --- a/android/android-pickers/src/main/res/layout/time_picker_dialog.xml +++ b/android/android-pickers/src/main/res/layout/time_picker_dialog.xml @@ -49,33 +49,33 @@ android:layout_height="1dip" android:background="@color/line_background" /> - -