diff --git a/CHANGELOG.md b/CHANGELOG.md index 68fc393..38f720b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +**2017-10-24** + +New version: 26.1.0.3 (based on v26.1.0) + +- The attribute names use the `pref_` prefix in order to avoid name collision with other libraries +- The custom preferences call their change listeners +- Custom preferences extending `DialogPreference` can be added using `PreferenceFragmentCompat.addDialogPreference(...)` + **2017-09-24** New version: 26.1.0.2 (based on v26.1.0) diff --git a/README.md b/README.md index eaf4b9e..02cdafc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Android Support library - preference v7 bugfix -> **BREAKING CHANGE** in attribute and method names (and behavior) for summary handling of `DatePickerPreference` and `TimePickerPreference`. See the changelog for more details. +> **BREAKING CHANGE** in 26.1.0.3: The custom attribute names for extra preference types use `pref_` prefix in order to avoid name collision with other libraries. See the changelog for more details. This library is meant to fix some of the problems found in the official support preference-v7 library. Also, there are [new preference types](#extra-types) available, such as `RingtonePreference`, `DatePickerPreference`, and `TimePickerPreference`. @@ -23,12 +23,12 @@ compile 'com.android.support:preference-v14:26.1.0' ``` And **add** this single line to your gradle file: ```gradle -compile 'com.takisoft.fix:preference-v7:26.1.0.2' +compile 'com.takisoft.fix:preference-v7:26.1.0.3' ``` > Notice the versioning: the first three numbers are *always* the same as the latest official library while the last number is for own updates. I try to keep it up-to-date but if, for whatever reasons, I wouldn't notice the new support library versions, just issue a ticket. ### 2. Use the appropriate class as your fragment's base -You can use either `PreferenceFragmentCompat` or `PreferenceFragmentCompatDividers`. The former is the fixed version of the original fragment while the latter is an extended one where you can set the dividers using the divider flags. +You can use either `PreferenceFragmentCompat` or `PreferenceFragmentCompatDividers`. The former is the fixed version of the original fragment while the latter is an extended one where you can set the dividers using the divider flags. The `PreferenceFragmentCompatDividers` is the recommended approach as it uses the updated Material Design guidelines to create the appropriate divider config. #### Option 1 - `PreferenceFragmentCompat` ```java @@ -92,17 +92,17 @@ Now you can enjoy using the support preferences API without losing all your hair There are additional preferences not part of the official support library, but decided to add them to some extra libraries. You can add all of them to your project using ```gradle -compile 'com.takisoft.fix:preference-v7-extras:26.1.0.2' +compile 'com.takisoft.fix:preference-v7-extras:26.1.0.3' ``` or one or more groups: Preference | Dependency | Preview -|-|- -[`RingtonePreference`](https://github.com/Gericop/Android-Support-Preference-V7-Fix/wiki/Preference-types#ringtonepreference) | `compile 'com.takisoft.fix:preference-v7-ringtone:26.1.0.2'` | ![API 15](https://raw.githubusercontent.com/Gericop/Android-Support-Preference-V7-Fix/master/images/ringtone_api26.png) -[`DatePickerPreference`](https://github.com/Gericop/Android-Support-Preference-V7-Fix/wiki/Preference-types#datepickerpreference) | `compile 'com.takisoft.fix:preference-v7-datetimepicker:26.1.0.2'` | ![API 15](https://raw.githubusercontent.com/Gericop/Android-Support-Preference-V7-Fix/master/images/datepicker_api26.png) -[`TimePickerPreference`](https://github.com/Gericop/Android-Support-Preference-V7-Fix/wiki/Preference-types#timepickerpreference) | `compile 'com.takisoft.fix:preference-v7-datetimepicker:26.1.0.2'` | ![API 15](https://raw.githubusercontent.com/Gericop/Android-Support-Preference-V7-Fix/master/images/timepicker_api26.png) -[`ColorPickerPreference`](https://github.com/Gericop/Android-Support-Preference-V7-Fix/wiki/Preference-types#colorpickerpreference) | `compile 'com.takisoft.fix:preference-v7-colorpicker:26.1.0.2'` | ![API 15](https://raw.githubusercontent.com/Gericop/Android-Support-Preference-V7-Fix/master/images/colorpicker_api26_fixed.png) +[`RingtonePreference`](https://github.com/Gericop/Android-Support-Preference-V7-Fix/wiki/Preference-types#ringtonepreference) | `compile 'com.takisoft.fix:preference-v7-ringtone:26.1.0.3'` | ![API 15](https://raw.githubusercontent.com/Gericop/Android-Support-Preference-V7-Fix/master/images/ringtone_api26.png) +[`DatePickerPreference`](https://github.com/Gericop/Android-Support-Preference-V7-Fix/wiki/Preference-types#datepickerpreference) | `compile 'com.takisoft.fix:preference-v7-datetimepicker:26.1.0.3'` | ![API 15](https://raw.githubusercontent.com/Gericop/Android-Support-Preference-V7-Fix/master/images/datepicker_api26.png) +[`TimePickerPreference`](https://github.com/Gericop/Android-Support-Preference-V7-Fix/wiki/Preference-types#timepickerpreference) | `compile 'com.takisoft.fix:preference-v7-datetimepicker:26.1.0.3'` | ![API 15](https://raw.githubusercontent.com/Gericop/Android-Support-Preference-V7-Fix/master/images/timepicker_api26.png) +[`ColorPickerPreference`](https://github.com/Gericop/Android-Support-Preference-V7-Fix/wiki/Preference-types#colorpickerpreference) | `compile 'com.takisoft.fix:preference-v7-colorpicker:26.1.0.3'` | ![API 15](https://raw.githubusercontent.com/Gericop/Android-Support-Preference-V7-Fix/master/images/colorpicker_api26_fixed.png) --- @@ -148,7 +148,7 @@ The original implementation uses `?attr/textAppearanceSmall` as the message styl --- ## Version -The current stable version is **26.1.0.2**. +The current stable version is **26.1.0.3**. ## Notes # This demo / bugfix is set to work on API level 14+. @@ -167,45 +167,13 @@ API 15 | API 21 | API 26 ### Changelog -**2017-09-24** +**2017-10-24** -New version: 26.1.0.2 (based on v26.1.0) +New version: 26.1.0.3 (based on v26.1.0) -- Quick fix: the app won't crash if the preference XML couldn't be inflated (but it will still display as an empty screen) - -**2017-09-24** - -New version: 26.1.0.1 (based on v26.1.0) - -- Bug fix: crash on API 26 when using dividers and preferences with widgets together -- Bug fix: `ColorPickerPreference`'s column number defaults to auto (0) instead of 3 -- `PreferenceCategory`'s title view gets hidden (including its dimensions) when the title is empty (the dividers will be drawn as if the title was not hidden) -- Added 2 new flags to the custom dividers: `DIVIDER_NO_BEFORE_FIRST` and `DIVIDER_NO_AFTER_LAST` - -**2017-09-17** - -New version: 26.1.0.0 (based on v26.1.0) - -- No official support preferences related changes. -- Added new preference type: - - [`ColorPickerPreference`](https://github.com/Gericop/Android-Support-Preference-V7-Fix/wiki/Preference-types#colorpickerpreference) -- [`RingtonePreference`](https://github.com/Gericop/Android-Support-Preference-V7-Fix/wiki/Preference-types#ringtonepreference) has a new attribute: `app:summaryHasRingtone` that can be used to display the name of the selected ringone. - -- **BREAKING CHANGE** in attribute and method names (and behavior) for summary handling of `DatePickerPreference` and `TimePickerPreference`. - - The previous `summaryNoXXX` no longer exists. Use the normal `summary` instead for showing summary if no pick is made. - - The new attribute is `summaryHasXXX` which is going to be displayed if the picker has a picked value. If this is not set, the `summary` will be used instead. - -**2017-08-31** - -New version: 26.0.2.0 (based on v26.0.2) - -- No official support preferences related changes. -- Added new preference types: - - [`RingtonePreference`](https://github.com/Gericop/Android-Support-Preference-V7-Fix/wiki/Preference-types#ringtonepreference) - - [`DatePickerPreference`](https://github.com/Gericop/Android-Support-Preference-V7-Fix/wiki/Preference-types#datepickerpreference) - - [`TimePickerPreference`](https://github.com/Gericop/Android-Support-Preference-V7-Fix/wiki/Preference-types#timepickerpreference) - -See the wiki / Preference types page for more details. +- The attribute names use the `pref_` prefix in order to avoid name collision with other libraries +- The custom preferences call their change listeners +- Custom preferences extending `DialogPreference` can be added using `PreferenceFragmentCompat.addDialogPreference(...)` > For older changelogs, check out the [CHANGELOG](CHANGELOG.md) file. diff --git a/app/src/main/java/com/takisoft/preferencefix/MyPreferenceFragment.java b/app/src/main/java/com/takisoft/preferencefix/MyPreferenceFragment.java index 183a28c..9fd6e73 100644 --- a/app/src/main/java/com/takisoft/preferencefix/MyPreferenceFragment.java +++ b/app/src/main/java/com/takisoft/preferencefix/MyPreferenceFragment.java @@ -47,8 +47,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, @Nullable try { return super.onCreateView(inflater, container, savedInstanceState); } finally { - // Comment this out if you want to revert to the default divider style - setDividerPreferences(DIVIDER_CATEGORY_BEFORE_FIRST | DIVIDER_CATEGORY_BETWEEN | DIVIDER_NO_BEFORE_FIRST); + // Uncomment this if you want to change the divider style + // setDividerPreferences(DIVIDER_OFFICIAL); } } diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml index e510213..60d22c2 100644 --- a/app/src/main/res/xml/settings.xml +++ b/app/src/main/res/xml/settings.xml @@ -90,30 +90,30 @@ android:showSilent="true" android:summary="Select a nice ringtone" android:title="RingtonePreference" - app:showAdd="true" - app:summaryHasRingtone="The best ringtone: %s" /> + app:pref_showAdd="true" + app:pref_summaryHasRingtone="The best ringtone: %s" /> + app:pref_hourFormat="auto" + app:pref_pickerTime="19:35" + app:pref_summaryHasTime="Selected time: %s" /> + app:pref_minDate="08/31/2017" + app:pref_summaryHasDate="Selected date: %s" /> + app:pref_size="small" /> CREATOR = + new Parcelable.Creator() { + @Override + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } } diff --git a/preference-v7-colorpicker/src/main/java/com/takisoft/fix/support/v7/preference/ColorPickerPreferenceDialogFragmentCompat.java b/preference-v7-colorpicker/src/main/java/com/takisoft/fix/support/v7/preference/ColorPickerPreferenceDialogFragmentCompat.java index 7d1c7bb..8eceee8 100644 --- a/preference-v7-colorpicker/src/main/java/com/takisoft/fix/support/v7/preference/ColorPickerPreferenceDialogFragmentCompat.java +++ b/preference-v7-colorpicker/src/main/java/com/takisoft/fix/support/v7/preference/ColorPickerPreferenceDialogFragmentCompat.java @@ -46,7 +46,7 @@ public void onClick(DialogInterface dialog, int which) { public void onDialogClosed(boolean positiveResult) { ColorPickerPreference preference = getColorPickerPreference(); - if (positiveResult) { + if (positiveResult && preference.callChangeListener(pickedColor)) { preference.setColor(pickedColor); } } diff --git a/preference-v7-colorpicker/src/main/res/values/attrs.xml b/preference-v7-colorpicker/src/main/res/values/attrs.xml index 54e41b7..7fb7a33 100644 --- a/preference-v7-colorpicker/src/main/res/values/attrs.xml +++ b/preference-v7-colorpicker/src/main/res/values/attrs.xml @@ -1,20 +1,17 @@ - - - - + - + - + - + - + - + diff --git a/preference-v7-colorpicker/src/main/res/values/styles.xml b/preference-v7-colorpicker/src/main/res/values/styles.xml deleted file mode 100644 index a19ea4b..0000000 --- a/preference-v7-colorpicker/src/main/res/values/styles.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - \ No newline at end of file diff --git a/preference-v7-datetimepicker/build.gradle b/preference-v7-datetimepicker/build.gradle index 82d6367..317f299 100644 --- a/preference-v7-datetimepicker/build.gradle +++ b/preference-v7-datetimepicker/build.gradle @@ -44,7 +44,7 @@ ext { dependencies { implementation project(':preference-v7') - api 'com.takisoft.fix:datetimepicker:1.0.2' + api 'com.takisoft.fix:datetimepicker:1.0.3' } //apply from: 'https://raw.githubusercontent.com/numetriclabz/jcenter/master/installv.gradle' diff --git a/preference-v7-datetimepicker/src/main/java/com/takisoft/fix/support/v7/preference/DatePickerPreference.java b/preference-v7-datetimepicker/src/main/java/com/takisoft/fix/support/v7/preference/DatePickerPreference.java index 4422cd3..2e9c3ea 100644 --- a/preference-v7-datetimepicker/src/main/java/com/takisoft/fix/support/v7/preference/DatePickerPreference.java +++ b/preference-v7-datetimepicker/src/main/java/com/takisoft/fix/support/v7/preference/DatePickerPreference.java @@ -3,6 +3,8 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; +import android.os.Parcel; +import android.os.Parcelable; import android.support.annotation.IntRange; import android.support.annotation.Nullable; import android.support.annotation.StringRes; @@ -59,9 +61,9 @@ public DatePickerPreference(Context context, AttributeSet attrs, int defStyleAtt TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DatePickerPreference, defStyleAttr, 0); - String pickerDate = a.getString(R.styleable.DatePickerPreference_pickerDate); - String minDate = a.getString(R.styleable.DatePickerPreference_minDate); - String maxDate = a.getString(R.styleable.DatePickerPreference_maxDate); + String pickerDate = a.getString(R.styleable.DatePickerPreference_pref_pickerDate); + String minDate = a.getString(R.styleable.DatePickerPreference_pref_minDate); + String maxDate = a.getString(R.styleable.DatePickerPreference_pref_maxDate); if (!TextUtils.isEmpty(pickerDate)) { try { @@ -87,8 +89,8 @@ public DatePickerPreference(Context context, AttributeSet attrs, int defStyleAtt } } - summaryPattern = a.getString(R.styleable.DatePickerPreference_summaryDatePattern); - summaryHasDate = a.getText(R.styleable.DatePickerPreference_summaryHasDate); + summaryPattern = a.getString(R.styleable.DatePickerPreference_pref_summaryDatePattern); + summaryHasDate = a.getText(R.styleable.DatePickerPreference_pref_summaryHasDate); a.recycle(); summary = super.getSummary(); @@ -236,7 +238,7 @@ private void setInternalDate(@Nullable String date, boolean force) { } /** - * Returns the summary of this Preference. If no {@code summaryHasDate} is set, this will be + * Returns the summary of this Preference. If no {@code pref_summaryHasDate} is set, this will be * displayed if no date is selected; otherwise the formatted date will be used. * * @return The summary. @@ -269,7 +271,7 @@ public CharSequence getSummary() { } /** - * Sets the summary for this Preference with a CharSequence. If no {@code summaryHasDate} is + * Sets the summary for this Preference with a CharSequence. If no {@code pref_summaryHasDate} is * set, this will be displayed if no date is selected; otherwise the formatted date will be * used. * @@ -365,4 +367,74 @@ protected void onSetInitialValue(boolean restoreValue, Object defaultValueObj) { final String defaultValue = (String) defaultValueObj; setInternalDate(restoreValue ? getPersistedString(null) : (!TextUtils.isEmpty(defaultValue) ? defaultValue : null), true); } + + @Override + protected Parcelable onSaveInstanceState() { + final Parcelable superState = super.onSaveInstanceState(); + if (isPersistent()) { + // No need to save instance state since it's persistent + return superState; + } + + final SavedState myState = new SavedState(superState); + myState.date = getDate(); + return myState; + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + if (state == null || !state.getClass().equals(SavedState.class)) { + // Didn't save state for us in onSaveInstanceState + super.onRestoreInstanceState(state); + return; + } + + SavedState myState = (SavedState) state; + super.onRestoreInstanceState(myState.getSuperState()); + setDate(myState.date); + } + + private static class SavedState extends BaseSavedState { + private Date date; + + public SavedState(Parcel source) { + super(source); + date = (Date) source.readSerializable(); + } + + public SavedState(Parcelable superState) { + super(superState); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + dest.writeSerializable(date); + } + + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() { + @Override + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } + + public static class DateWrapper { + public final int year; + public final int month; + public final int day; + + public DateWrapper(int year, int month, int day) { + this.year = year; + this.month = month; + this.day = day; + } + } } diff --git a/preference-v7-datetimepicker/src/main/java/com/takisoft/fix/support/v7/preference/DatePickerPreferenceDialogFragmentCompat.java b/preference-v7-datetimepicker/src/main/java/com/takisoft/fix/support/v7/preference/DatePickerPreferenceDialogFragmentCompat.java index 0c386e7..dfa1ff9 100644 --- a/preference-v7-datetimepicker/src/main/java/com/takisoft/fix/support/v7/preference/DatePickerPreferenceDialogFragmentCompat.java +++ b/preference-v7-datetimepicker/src/main/java/com/takisoft/fix/support/v7/preference/DatePickerPreferenceDialogFragmentCompat.java @@ -75,7 +75,7 @@ public void onClick(DialogInterface dialog, int which) { public void onDialogClosed(boolean positiveResult) { DatePickerPreference preference = getDatePickerPreference(); - if (positiveResult) { + if (positiveResult && preference.callChangeListener(new DatePickerPreference.DateWrapper(pickedYear, pickedMonth, pickedDay))) { preference.setDate(pickedYear, pickedMonth, pickedDay); } } diff --git a/preference-v7-datetimepicker/src/main/java/com/takisoft/fix/support/v7/preference/TimePickerPreference.java b/preference-v7-datetimepicker/src/main/java/com/takisoft/fix/support/v7/preference/TimePickerPreference.java index e98afaa..cf5b240 100644 --- a/preference-v7-datetimepicker/src/main/java/com/takisoft/fix/support/v7/preference/TimePickerPreference.java +++ b/preference-v7-datetimepicker/src/main/java/com/takisoft/fix/support/v7/preference/TimePickerPreference.java @@ -3,6 +3,8 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; +import android.os.Parcel; +import android.os.Parcelable; import android.support.annotation.IntDef; import android.support.annotation.IntRange; import android.support.annotation.Nullable; @@ -70,11 +72,11 @@ public TimePickerPreference(Context context, AttributeSet attrs, int defStyleAtt super(context, attrs, defStyleAttr, defStyleRes); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TimePickerPreference, defStyleAttr, 0); - hourFormat = a.getInt(R.styleable.TimePickerPreference_hourFormat, FORMAT_AUTO); - summaryPattern = a.getString(R.styleable.TimePickerPreference_summaryTimePattern); - summaryHasTime = a.getText(R.styleable.TimePickerPreference_summaryHasTime); + hourFormat = a.getInt(R.styleable.TimePickerPreference_pref_hourFormat, FORMAT_AUTO); + summaryPattern = a.getString(R.styleable.TimePickerPreference_pref_summaryTimePattern); + summaryHasTime = a.getText(R.styleable.TimePickerPreference_pref_summaryHasTime); - String pickerTime = a.getString(R.styleable.TimePickerPreference_pickerTime); + String pickerTime = a.getString(R.styleable.TimePickerPreference_pref_pickerTime); if (!TextUtils.isEmpty(pickerTime)) { try { @@ -244,7 +246,7 @@ private void setInternalTime(String time, boolean force) { } /** - * Returns the summary of this Preference. If no {@code summaryHasTime} is set, this will be + * Returns the summary of this Preference. If no {@code pref_summaryHasTime} is set, this will be * displayed if no time is selected; otherwise the formatted time will be used. * * @return The summary. @@ -277,7 +279,7 @@ public CharSequence getSummary() { } /** - * Sets the summary for this Preference with a CharSequence. If no {@code summaryHasTime} is + * Sets the summary for this Preference with a CharSequence. If no {@code pref_summaryHasTime} is * set, this will be displayed if no time is selected; otherwise the formatted time will be * used. * @@ -373,4 +375,72 @@ protected void onSetInitialValue(boolean restoreValue, Object defaultValueObj) { final String defaultValue = (String) defaultValueObj; setInternalTime(restoreValue ? getPersistedString(null) : (!TextUtils.isEmpty(defaultValue) ? defaultValue : null), true); } + + @Override + protected Parcelable onSaveInstanceState() { + final Parcelable superState = super.onSaveInstanceState(); + if (isPersistent()) { + // No need to save instance state since it's persistent + return superState; + } + + final SavedState myState = new SavedState(superState); + myState.time = getTime(); + return myState; + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + if (state == null || !state.getClass().equals(SavedState.class)) { + // Didn't save state for us in onSaveInstanceState + super.onRestoreInstanceState(state); + return; + } + + SavedState myState = (SavedState) state; + super.onRestoreInstanceState(myState.getSuperState()); + setTime(myState.time); + } + + private static class SavedState extends BaseSavedState { + private Date time; + + public SavedState(Parcel source) { + super(source); + time = (Date) source.readSerializable(); + } + + public SavedState(Parcelable superState) { + super(superState); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + dest.writeSerializable(time); + } + + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() { + @Override + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } + + public static class TimeWrapper { + public final int hour; + public final int minute; + + public TimeWrapper(int hour, int minute) { + this.hour = hour; + this.minute = minute; + } + } } diff --git a/preference-v7-datetimepicker/src/main/java/com/takisoft/fix/support/v7/preference/TimePickerPreferenceDialogFragmentCompat.java b/preference-v7-datetimepicker/src/main/java/com/takisoft/fix/support/v7/preference/TimePickerPreferenceDialogFragmentCompat.java index 1c418b6..7373fe4 100644 --- a/preference-v7-datetimepicker/src/main/java/com/takisoft/fix/support/v7/preference/TimePickerPreferenceDialogFragmentCompat.java +++ b/preference-v7-datetimepicker/src/main/java/com/takisoft/fix/support/v7/preference/TimePickerPreferenceDialogFragmentCompat.java @@ -57,7 +57,7 @@ public void onClick(DialogInterface dialog, int which) { public void onDialogClosed(boolean positiveResult) { TimePickerPreference preference = getTimePickerPreference(); - if (positiveResult) { + if (positiveResult && preference.callChangeListener(new TimePickerPreference.TimeWrapper(pickedHour, pickedMinute))) { preference.setTime(pickedHour, pickedMinute); } } diff --git a/preference-v7-datetimepicker/src/main/res/values/attrs.xml b/preference-v7-datetimepicker/src/main/res/values/attrs.xml index 41b1c31..fd8e50d 100644 --- a/preference-v7-datetimepicker/src/main/res/values/attrs.xml +++ b/preference-v7-datetimepicker/src/main/res/values/attrs.xml @@ -2,10 +2,10 @@ - + - + @@ -15,20 +15,20 @@ The time format to be used in the summary. Should at least contain 'H' (or 'h' in case of 12-hour format) and 'm' to represent a meaningful value. --> - + - + - - - + + + - + - + \ No newline at end of file diff --git a/preference-v7-ringtone/src/main/java/com/takisoft/fix/support/v7/preference/RingtonePreference.java b/preference-v7-ringtone/src/main/java/com/takisoft/fix/support/v7/preference/RingtonePreference.java index d546513..bf5cbda 100644 --- a/preference-v7-ringtone/src/main/java/com/takisoft/fix/support/v7/preference/RingtonePreference.java +++ b/preference-v7-ringtone/src/main/java/com/takisoft/fix/support/v7/preference/RingtonePreference.java @@ -13,6 +13,8 @@ import android.media.RingtoneManager; import android.net.Uri; import android.os.Build; +import android.os.Parcel; +import android.os.Parcelable; import android.provider.MediaStore; import android.support.annotation.IntDef; import android.support.annotation.Nullable; @@ -86,8 +88,8 @@ public RingtonePreference(Context context, AttributeSet attrs, int defStyleAttr, showSilent = proxyPreference.getShowSilent(); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RingtonePreference, defStyleAttr, 0); - showAdd = a.getBoolean(R.styleable.RingtonePreference_showAdd, true); - summaryHasRingtone = a.getText(R.styleable.RingtonePreference_summaryHasRingtone); + showAdd = a.getBoolean(R.styleable.RingtonePreference_pref_showAdd, true); + summaryHasRingtone = a.getText(R.styleable.RingtonePreference_pref_summaryHasRingtone); a.recycle(); summary = super.getSummary(); @@ -333,7 +335,7 @@ public boolean shouldDisableDependents() { } /** - * Returns the summary of this Preference. If no {@code summaryHasRingtone} is set, this will be + * Returns the summary of this Preference. If no {@code pref_summaryHasRingtone} is set, this will be * displayed if no ringtone is selected; otherwise the ringtone title will be used. * * @return The summary. @@ -355,7 +357,7 @@ public CharSequence getSummary() { } /** - * Sets the summary for this Preference with a CharSequence. If no {@code summaryHasRingtone} is + * Sets the summary for this Preference with a CharSequence. If no {@code pref_summaryHasRingtone} is * set, this will be displayed if no ringtone is selected; otherwise the ringtone title will be * used. * @@ -461,4 +463,62 @@ public String getRingtoneTitle() { return ringtoneTitle; } + + @Override + protected Parcelable onSaveInstanceState() { + final Parcelable superState = super.onSaveInstanceState(); + if (isPersistent()) { + // No need to save instance state since it's persistent + return superState; + } + + final SavedState myState = new SavedState(superState); + myState.ringtoneUri = getRingtone(); + return myState; + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + if (state == null || !state.getClass().equals(SavedState.class)) { + // Didn't save state for us in onSaveInstanceState + super.onRestoreInstanceState(state); + return; + } + + SavedState myState = (SavedState) state; + super.onRestoreInstanceState(myState.getSuperState()); + setRingtone(myState.ringtoneUri); + } + + private static class SavedState extends BaseSavedState { + private Uri ringtoneUri; + + public SavedState(Parcel source) { + super(source); + ringtoneUri = source.readParcelable(Uri.class.getClassLoader()); + } + + public SavedState(Parcelable superState) { + super(superState); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + dest.writeParcelable(ringtoneUri, flags); + } + + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() { + @Override + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } } diff --git a/preference-v7-ringtone/src/main/res/drawable/ic_add.xml b/preference-v7-ringtone/src/main/res/drawable/ringtone_ic_add.xml similarity index 100% rename from preference-v7-ringtone/src/main/res/drawable/ic_add.xml rename to preference-v7-ringtone/src/main/res/drawable/ringtone_ic_add.xml diff --git a/preference-v7-ringtone/src/main/res/layout/add_ringtone_item.xml b/preference-v7-ringtone/src/main/res/layout/add_ringtone_item.xml index 51a062e..60a7b99 100644 --- a/preference-v7-ringtone/src/main/res/layout/add_ringtone_item.xml +++ b/preference-v7-ringtone/src/main/res/layout/add_ringtone_item.xml @@ -29,7 +29,7 @@ android:layout_marginLeft="24dp" android:layout_marginRight="24dp" android:scaleType="centerCrop" - app:srcCompat="@drawable/ic_add" /> + app:srcCompat="@drawable/ringtone_ic_add" /> - - + + \ No newline at end of file diff --git a/preference-v7/src/main/java/android/support/v7/preference/PreferenceManagerFix.java b/preference-v7/src/main/java/android/support/v7/preference/PreferenceManagerFix.java index 2919ca8..4671e85 100644 --- a/preference-v7/src/main/java/android/support/v7/preference/PreferenceManagerFix.java +++ b/preference-v7/src/main/java/android/support/v7/preference/PreferenceManagerFix.java @@ -3,7 +3,6 @@ import android.content.Context; import android.content.SharedPreferences; import android.support.v4.content.SharedPreferencesCompat; -import android.util.Log; import java.lang.reflect.Field; @@ -17,7 +16,7 @@ public class PreferenceManagerFix extends PreferenceManager { static { Field[] fields = android.support.v7.preference.PreferenceManager.class.getDeclaredFields(); for (Field field : fields) { - Log.d("FIELD", field.toString()); + //Log.d("FIELD", field.toString()); if (field.getType() == SharedPreferences.Editor.class) { editorField = field; editorField.setAccessible(true); diff --git a/preference-v7/src/main/java/com/takisoft/fix/support/v7/preference/PreferenceFragmentCompat.java b/preference-v7/src/main/java/com/takisoft/fix/support/v7/preference/PreferenceFragmentCompat.java index c8bdeaf..0983c8a 100644 --- a/preference-v7/src/main/java/com/takisoft/fix/support/v7/preference/PreferenceFragmentCompat.java +++ b/preference-v7/src/main/java/com/takisoft/fix/support/v7/preference/PreferenceFragmentCompat.java @@ -112,9 +112,9 @@ public void onDisplayPreferenceDialog(Preference preference) { } } - private static HashMap, Class> dialogPreferences = new HashMap<>(); + private static HashMap, Class> dialogPreferences = new HashMap<>(); - public static void addDialogPreference(Class dialogPrefClass, Class dialogFragmentClass) { + public static void addDialogPreference(Class dialogPrefClass, Class dialogFragmentClass) { dialogPreferences.put(dialogPrefClass, dialogFragmentClass); } } diff --git a/preference-v7/src/main/java/com/takisoft/fix/support/v7/preference/PreferenceFragmentCompatDividers.java b/preference-v7/src/main/java/com/takisoft/fix/support/v7/preference/PreferenceFragmentCompatDividers.java index 30327a0..a6f2058 100644 --- a/preference-v7/src/main/java/com/takisoft/fix/support/v7/preference/PreferenceFragmentCompatDividers.java +++ b/preference-v7/src/main/java/com/takisoft/fix/support/v7/preference/PreferenceFragmentCompatDividers.java @@ -22,9 +22,9 @@ */ abstract public class PreferenceFragmentCompatDividers extends PreferenceFragmentCompat { /** - * Draws the default divider implementation. + * Draws the divider implementation of the official support library. */ - public static final int DIVIDER_DEFAULT = -1; + public static final int DIVIDER_OFFICIAL = -1; /** * Draws no dividers. @@ -94,8 +94,13 @@ abstract public class PreferenceFragmentCompatDividers extends PreferenceFragmen */ public static final int DIVIDER_NO_AFTER_LAST = 1 << 17; + /** + * Draws the material guidelines compatible divider implementation. + */ + public static final int DIVIDER_DEFAULT = DIVIDER_CATEGORY_BEFORE_FIRST | DIVIDER_CATEGORY_BETWEEN | DIVIDER_NO_BEFORE_FIRST; + @IntDef(flag = true, value = { - DIVIDER_DEFAULT, DIVIDER_NONE, + DIVIDER_OFFICIAL, DIVIDER_DEFAULT, DIVIDER_NONE, DIVIDER_CATEGORY_BETWEEN, DIVIDER_CATEGORY_BEFORE_FIRST, DIVIDER_CATEGORY_AFTER_LAST, @@ -121,6 +126,7 @@ abstract public class PreferenceFragmentCompatDividers extends PreferenceFragmen * Sets the divider decoration flags. The values can be either *
    *
  • {@link #DIVIDER_DEFAULT}
  • + *
  • {@link #DIVIDER_OFFICIAL}
  • *
  • {@link #DIVIDER_NONE}
  • *
  • or a combination of *
      @@ -138,7 +144,7 @@ abstract public class PreferenceFragmentCompatDividers extends PreferenceFragmen * *
    *

    - * Note that you should not combine {@linkplain #DIVIDER_DEFAULT} and {@linkplain #DIVIDER_NONE} with + * Note that you should not combine {@linkplain #DIVIDER_DEFAULT}, {@linkplain #DIVIDER_OFFICIAL}, and {@linkplain #DIVIDER_NONE} with * each other nor the other flags mentioned above. * * @param flags The preferred divider drawing flags. Check {@link PreferenceFragmentCompatDividers} for possible values. @@ -173,7 +179,7 @@ void applyDividerPreference(final RecyclerView recyclerView, @DividerPrefFlags f recyclerView.removeItemDecoration(divItemDecoration); divItemDecoration = null; } - } else if (flags == DIVIDER_DEFAULT) { + } else if (flags == DIVIDER_OFFICIAL) { Drawable divider = getDividerDrawable(); setDivider(divider); @@ -210,6 +216,7 @@ Drawable getDividerDrawable() { public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + divPrefInvalid = true; setDividerPreferences(divPrefFlags); }