From fd8c10350c67bacf92054af469ad72684c7a52f0 Mon Sep 17 00:00:00 2001 From: Parker Roth Date: Sun, 14 Jan 2018 14:29:03 +0100 Subject: [PATCH 1/7] Increase compile version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index b5e0f2a..4428682 100644 --- a/gradle.properties +++ b/gradle.properties @@ -34,4 +34,4 @@ POM_DEVELOPER_NAME=Phil Bayfield ANDROID_BUILD_MIN_SDK_VERSION=11 ANDROID_BUILD_TARGET_SDK_VERSION=25 ANDROID_BUILD_TOOLS_VERSION=25.0.2 -ANDROID_BUILD_SDK_VERSION=25 \ No newline at end of file +ANDROID_BUILD_SDK_VERSION=27 \ No newline at end of file From 6bcbcdb73e9affc6ed9986c28d357f8ab6601d83 Mon Sep 17 00:00:00 2001 From: Parker Roth Date: Sun, 14 Jan 2018 18:49:54 +0100 Subject: [PATCH 2/7] First pass at DatePickerPreferenceDialog. --- .idea/gradle.xml | 19 ++ .idea/misc.xml | 28 +++ .idea/runConfigurations.xml | 12 ++ .idea/vcs.xml | 7 + .../v7/preference/DatePickerPreference.java | 199 ++++++++++++++++++ ...ePickerPreferenceDialogFragmentCompat.java | 43 ++++ library/src/main/res/values-v14/styles.xml | 4 + library/src/main/res/values/attrs.xml | 12 ++ library/src/main/res/values/styles.xml | 2 + 9 files changed, 326 insertions(+) create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 .idea/vcs.xml create mode 100644 library/src/main/java/android/support/v7/preference/DatePickerPreference.java create mode 100644 library/src/main/java/android/support/v7/preference/DatePickerPreferenceDialogFragmentCompat.java diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..d35a3ac --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..d1817bf --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..8306744 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/library/src/main/java/android/support/v7/preference/DatePickerPreference.java b/library/src/main/java/android/support/v7/preference/DatePickerPreference.java new file mode 100644 index 0000000..9faf718 --- /dev/null +++ b/library/src/main/java/android/support/v7/preference/DatePickerPreference.java @@ -0,0 +1,199 @@ +package android.support.v7.preference; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.AttributeSet; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import me.philio.preferencecompatextended.R; + +import static android.text.format.DateFormat.getTimeFormat; + +public class DatePickerPreference extends DialogPreference { + + public static final int DATE_FORMAT_INHERIT = 0; + public static final int DATE_FORMAT_MONTH_DAY_YEAR = 1; + public static final int DATE_FORMAT_DAY_MONTH_YEAR = 2; + + private boolean dateAsSummary; + private int dateFormat; + private int defaultDayOfMonth; + private int defaultMonthOfYear; + private int defaultYear; + private int value; + + public DatePickerPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DatePickerPreference, defStyleAttr, defStyleRes); + dateAsSummary = typedArray.getBoolean(R.styleable.DatePickerPreference_dateAsSummary, true); + defaultYear = typedArray.getInt(R.styleable.DatePickerPreference_defaultYear, -1); + defaultMonthOfYear = typedArray.getInt(R.styleable.DatePickerPreference_defaultMonthOfYear, -1); + defaultDayOfMonth = typedArray.getInt(R.styleable.DatePickerPreference_defaultDayOfMonth, -1); + dateFormat = typedArray.getInt(R.styleable.DatePickerPreference_dateFormat, DATE_FORMAT_INHERIT); + } + + public DatePickerPreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public DatePickerPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public DatePickerPreference(Context context) { + super(context); + } + + public static int calculateValue(int year, int monthOfYear, int dayOfMonth) { + Calendar cal = Calendar.getInstance(); + cal.set(year, monthOfYear, dayOfMonth); + return (int) cal.getTimeInMillis() / 1000; + } + + public int getYear() { + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date(value)); + return cal.get(Calendar.YEAR); + } + + public int getMonthOfYear() { + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date(value)); + return cal.get(Calendar.MONTH); + } + + public int getDayOfMonth() { + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date(value)); + return cal.get(Calendar.DAY_OF_MONTH); + } + + public void setValue(int year, int monthOfYear, int dayOfMonth) { + setValue(calculateValue(year, monthOfYear, dayOfMonth)); + } + + public void setValue(int value) { + this.value = value; + if (dateAsSummary) { + DateFormat format; + switch (dateFormat) { + case DATE_FORMAT_MONTH_DAY_YEAR: + format = new SimpleDateFormat("MMM d YYYY"); + break; + case DATE_FORMAT_DAY_MONTH_YEAR: + format = new SimpleDateFormat("d MMM YYYY"); + break; + case DATE_FORMAT_INHERIT: + default: + format = getTimeFormat(getContext()); + break; + } + Date date = new Date(value * 1000); + String time = format.format(date); + setSummary(time); + } + persistInt(value); + } + + @Override + protected Object onGetDefaultValue(TypedArray a, int index) { + int defaultValue = 0; + if (defaultYear > -1 && defaultMonthOfYear > -1 && defaultDayOfMonth > -1) { + Calendar cal = Calendar.getInstance(); + cal.set(defaultYear, defaultMonthOfYear, defaultDayOfMonth); + defaultValue = (int) cal.getTimeInMillis() / 1000; + } + return a.getInt(index, defaultValue); + } + + @Override + protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) { + setValue(restorePersistedValue ? getPersistedInt(value) : (Integer) defaultValue); + } + + @Override + protected Parcelable onSaveInstanceState() { + final Parcelable superState = super.onSaveInstanceState(); + if (isPersistent()) { + return superState; + } + final SavedState savedState = new SavedState(superState); + savedState.dateAsSummary = dateAsSummary; + savedState.dateFormat = dateFormat; + savedState.defaultDayOfMonth = defaultDayOfMonth; + savedState.defaultMonthOfYear = defaultMonthOfYear; + savedState.defaultYear = defaultYear; + savedState.value = value; + return savedState; + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + if (state == null || !state.getClass().equals(SavedState.class)) { + super.onRestoreInstanceState(state); + return; + } + SavedState savedState = (SavedState) state; + super.onRestoreInstanceState(savedState.getSuperState()); + dateAsSummary = savedState.dateAsSummary; + dateFormat = savedState.dateFormat; + defaultDayOfMonth = savedState.defaultDayOfMonth; + defaultMonthOfYear = savedState.defaultMonthOfYear; + defaultYear = savedState.defaultYear; + value = savedState.value; + } + + private static class SavedState extends BaseSavedState { + + private boolean dateAsSummary; + private int dateFormat; + private int defaultDayOfMonth; + private int defaultMonthOfYear; + private int defaultYear; + private int value; + + @SuppressLint("ParcelClassLoader") + SavedState(Parcel source) { + super(source); + dateAsSummary = (boolean) source.readValue(null); + dateFormat = source.readInt(); + defaultDayOfMonth = source.readInt(); + defaultMonthOfYear = source.readInt(); + defaultYear = source.readInt(); + value = source.readInt(); + } + + SavedState(Parcelable superState) { + super(superState); + } + + @Override public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + dest.writeValue(dateAsSummary); + dest.writeInt(dateFormat); + dest.writeInt(defaultDayOfMonth); + dest.writeInt(defaultMonthOfYear); + dest.writeInt(defaultYear); + dest.writeInt(value); + } + + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() { + @Override public SavedState createFromParcel(Parcel source) { + return new SavedState(source); + } + + @Override public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } +} diff --git a/library/src/main/java/android/support/v7/preference/DatePickerPreferenceDialogFragmentCompat.java b/library/src/main/java/android/support/v7/preference/DatePickerPreferenceDialogFragmentCompat.java new file mode 100644 index 0000000..c5785ce --- /dev/null +++ b/library/src/main/java/android/support/v7/preference/DatePickerPreferenceDialogFragmentCompat.java @@ -0,0 +1,43 @@ +package android.support.v7.preference; + +import android.app.DatePickerDialog; +import android.app.Dialog; +import android.app.TimePickerDialog; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.widget.DatePicker; + +/** + * Created by parkeroth on 1/14/18. + */ + +public class DatePickerPreferenceDialogFragmentCompat extends PreferenceDialogFragmentCompat implements DatePickerDialog.OnDateSetListener { + + public static DatePickerPreferenceDialogFragmentCompat newInstance(String key) { + DatePickerPreferenceDialogFragmentCompat fragment = new DatePickerPreferenceDialogFragmentCompat(); + Bundle args = new Bundle(1); + args.putString(ARG_KEY, key); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onDateSet(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) { + DatePickerPreference preference = (DatePickerPreference) getPreference(); + if (preference.callChangeListener(DatePickerPreference.calculateValue(year, monthOfYear, dayOfMonth))) { + preference.setValue(year, monthOfYear, dayOfMonth); + } + } + + @Override + public void onDialogClosed(boolean positiveResult) { + // Not needed, as handled by onTimeSet + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + DatePickerPreference preference = (DatePickerPreference) getPreference(); + return new DatePickerDialog(getActivity(), this, preference.getYear(), preference.getMonthOfYear(), preference.getDayOfMonth()); + } +} diff --git a/library/src/main/res/values-v14/styles.xml b/library/src/main/res/values-v14/styles.xml index e40931d..b2ba16c 100644 --- a/library/src/main/res/values-v14/styles.xml +++ b/library/src/main/res/values-v14/styles.xml @@ -14,4 +14,8 @@ @layout/preference_material + + \ No newline at end of file diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml index 4fced6a..9c3d4d0 100644 --- a/library/src/main/res/values/attrs.xml +++ b/library/src/main/res/values/attrs.xml @@ -38,4 +38,16 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/library/src/main/res/values/styles.xml b/library/src/main/res/values/styles.xml index 6338a38..add6cb6 100644 --- a/library/src/main/res/values/styles.xml +++ b/library/src/main/res/values/styles.xml @@ -12,4 +12,6 @@