diff --git a/app/build.gradle b/app/build.gradle index 4f4b0efe..b6c9062a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -58,6 +58,7 @@ android { dependencies { implementation "joda-time:joda-time:$jodaTimeVersion" implementation "androidx.appcompat:appcompat:$appCompatVersion" + implementation "androidx.preference:preference:$preferenceVersion" implementation project(':colorpicker') androidTestImplementation "junit:junit:$junitVersion" diff --git a/app/src/main/java/org/andstatus/todoagenda/WidgetConfigurationActivity.java b/app/src/main/java/org/andstatus/todoagenda/WidgetConfigurationActivity.java index d1baaf9c..fa0763a0 100644 --- a/app/src/main/java/org/andstatus/todoagenda/WidgetConfigurationActivity.java +++ b/app/src/main/java/org/andstatus/todoagenda/WidgetConfigurationActivity.java @@ -7,15 +7,20 @@ import android.os.Bundle; import android.os.Handler; import android.os.ParcelFileDescriptor; -import android.preference.PreferenceActivity; import android.util.Log; import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentTransaction; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; import org.andstatus.todoagenda.prefs.AllSettings; import org.andstatus.todoagenda.prefs.ApplicationPreferences; import org.andstatus.todoagenda.prefs.InstanceSettings; +import org.andstatus.todoagenda.prefs.RootFragment; import org.andstatus.todoagenda.provider.WidgetData; import org.andstatus.todoagenda.util.PermissionsUtil; import org.json.JSONException; @@ -26,14 +31,15 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; -import java.util.List; +import java.nio.charset.StandardCharsets; -public class WidgetConfigurationActivity extends PreferenceActivity { +public class WidgetConfigurationActivity extends AppCompatActivity implements + PreferenceFragmentCompat.OnPreferenceStartFragmentCallback { private static final String TAG = WidgetConfigurationActivity.class.getSimpleName(); + public static final String FRAGMENT_TAG = "settings_fragment"; public static final int REQUEST_ID_RESTORE_SETTINGS = 1; public static final int REQUEST_ID_BACKUP_SETTINGS = 2; - private static final String PREFERENCES_PACKAGE_NAME = "org.andstatus.todoagenda.prefs"; private int widgetId = 0; private boolean saveOnPause = true; @@ -63,11 +69,32 @@ protected void onResume() { @Override protected void onCreate(Bundle savedInstanceState) { - if (openThisActivity(getIntent())) { - super.onCreate(savedInstanceState); + if (!openThisActivity(getIntent())) return; + + setContentView(R.layout.activity_settings); + super.onCreate(savedInstanceState); + + setTitle(ApplicationPreferences.getWidgetInstanceName(this)); + + if (savedInstanceState == null) { + // Create the fragment only when the activity is created for the first time. + // ie. not after orientation changes + Fragment fragment = getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG); + if (fragment == null) { + fragment = new RootFragment(); + } + + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); + ft.replace(R.id.settings_container, fragment, FRAGMENT_TAG); + ft.commit(); } } + @Override + public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) { + return false; + } + private boolean openThisActivity(Intent newIntent) { int newWidgetId = newIntent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0); if (newWidgetId == 0) { @@ -99,20 +126,6 @@ private void restartIfNeeded() { } } - @Override - public void onBuildHeaders(List
target) { - loadHeadersFromResource(R.xml.preferences_header, target); - setTitle(ApplicationPreferences.getWidgetInstanceName(this)); - } - - @Override - protected boolean isValidFragment(String fragmentName) { - if (fragmentName.startsWith(PREFERENCES_PACKAGE_NAME)) { - return true; - } - return super.isValidFragment(fragmentName); - } - @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { @@ -194,7 +207,7 @@ private JSONObject readJson(Uri uri) { char[] buffer = new char[BUFFER_LENGTH]; StringBuilder builder = new StringBuilder(); int count; - reader = new InputStreamReader(in, "UTF-8"); + reader = new InputStreamReader(in, StandardCharsets.UTF_8); while ((count = reader.read(buffer)) != -1) { builder.append(buffer, 0, count); } diff --git a/app/src/main/java/org/andstatus/todoagenda/prefs/ApplicationPreferences.java b/app/src/main/java/org/andstatus/todoagenda/prefs/ApplicationPreferences.java index fd207aad..db6c2251 100644 --- a/app/src/main/java/org/andstatus/todoagenda/prefs/ApplicationPreferences.java +++ b/app/src/main/java/org/andstatus/todoagenda/prefs/ApplicationPreferences.java @@ -2,7 +2,7 @@ import android.content.Context; import android.content.SharedPreferences; -import android.preference.PreferenceManager; +import androidx.preference.PreferenceManager; import android.text.TextUtils; import org.andstatus.todoagenda.EndedSomeTimeAgo; diff --git a/app/src/main/java/org/andstatus/todoagenda/prefs/ColorsPreferencesFragment.java b/app/src/main/java/org/andstatus/todoagenda/prefs/ColorsPreferencesFragment.java index 925b7540..c1658fbb 100644 --- a/app/src/main/java/org/andstatus/todoagenda/prefs/ColorsPreferencesFragment.java +++ b/app/src/main/java/org/andstatus/todoagenda/prefs/ColorsPreferencesFragment.java @@ -2,24 +2,33 @@ import android.content.SharedPreferences; import android.os.Bundle; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.PreferenceCategory; -import android.preference.PreferenceFragment; -import android.preference.PreferenceScreen; + +import androidx.fragment.app.DialogFragment; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.PreferenceScreen; + +import com.rarepebble.colorpicker.ColorPreference; +import com.rarepebble.colorpicker.ColorPreferenceDialog; import org.andstatus.todoagenda.R; import org.andstatus.todoagenda.TextShading; import org.andstatus.todoagenda.widget.TimeSection; -public class ColorsPreferencesFragment extends PreferenceFragment +import static org.andstatus.todoagenda.WidgetConfigurationActivity.FRAGMENT_TAG; + +/** AndroidX version created by yvolk@yurivolkov.com + * based on this answer: https://stackoverflow.com/a/53290775/297710 + * and on the code of https://github.com/koji-1009/ChronoDialogPreference + */ +public class ColorsPreferencesFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener { private boolean hidePast; @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.preferences_colors); } @@ -62,4 +71,19 @@ private void showShading(TextShadingPref prefs) { preference.setSummary(getActivity().getString(shading.titleResId)); } } + + @Override + public void onDisplayPreferenceDialog(Preference preference) { + DialogFragment dialogFragment = null; + if (preference instanceof ColorPreference) { + dialogFragment = new ColorPreferenceDialog((ColorPreference) preference); + } + + if (dialogFragment != null) { + dialogFragment.setTargetFragment(this, 0); + dialogFragment.show(getFragmentManager(), FRAGMENT_TAG); + } else { + super.onDisplayPreferenceDialog(preference); + } + } } \ No newline at end of file diff --git a/app/src/main/java/org/andstatus/todoagenda/prefs/EventDetailsPreferencesFragment.java b/app/src/main/java/org/andstatus/todoagenda/prefs/EventDetailsPreferencesFragment.java index a2c05bd5..3013afa5 100644 --- a/app/src/main/java/org/andstatus/todoagenda/prefs/EventDetailsPreferencesFragment.java +++ b/app/src/main/java/org/andstatus/todoagenda/prefs/EventDetailsPreferencesFragment.java @@ -1,15 +1,15 @@ package org.andstatus.todoagenda.prefs; import android.os.Bundle; -import android.preference.PreferenceFragment; + +import androidx.preference.PreferenceFragmentCompat; import org.andstatus.todoagenda.R; -public class EventDetailsPreferencesFragment extends PreferenceFragment { +public class EventDetailsPreferencesFragment extends PreferenceFragmentCompat { @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.preferences_event_details); } } \ No newline at end of file diff --git a/app/src/main/java/org/andstatus/todoagenda/prefs/EventFiltersPreferencesFragment.java b/app/src/main/java/org/andstatus/todoagenda/prefs/EventFiltersPreferencesFragment.java index 837a6d26..801aed4d 100644 --- a/app/src/main/java/org/andstatus/todoagenda/prefs/EventFiltersPreferencesFragment.java +++ b/app/src/main/java/org/andstatus/todoagenda/prefs/EventFiltersPreferencesFragment.java @@ -2,18 +2,19 @@ import android.content.SharedPreferences; import android.os.Bundle; -import android.preference.EditTextPreference; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.PreferenceFragment; + +import androidx.preference.EditTextPreference; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; import org.andstatus.todoagenda.R; -public class EventFiltersPreferencesFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { +public class EventFiltersPreferencesFragment extends PreferenceFragmentCompat + implements SharedPreferences.OnSharedPreferenceChangeListener { @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.preferences_event_filters); } diff --git a/app/src/main/java/org/andstatus/todoagenda/prefs/EventSourcesPreferencesFragment.java b/app/src/main/java/org/andstatus/todoagenda/prefs/EventSourcesPreferencesFragment.java index c3ee2ec8..22cc88b2 100644 --- a/app/src/main/java/org/andstatus/todoagenda/prefs/EventSourcesPreferencesFragment.java +++ b/app/src/main/java/org/andstatus/todoagenda/prefs/EventSourcesPreferencesFragment.java @@ -1,16 +1,17 @@ package org.andstatus.todoagenda.prefs; -import android.app.Fragment; import android.graphics.LightingColorFilter; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.Preference; -import android.preference.PreferenceFragment; -import android.preference.PreferenceScreen; import android.util.Log; +import androidx.fragment.app.Fragment; +import androidx.preference.CheckBoxPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.PreferenceScreen; + import org.andstatus.todoagenda.R; import org.andstatus.todoagenda.provider.EventProviderType; @@ -18,7 +19,7 @@ import java.util.Collections; import java.util.List; -public class EventSourcesPreferencesFragment extends PreferenceFragment { +public class EventSourcesPreferencesFragment extends PreferenceFragmentCompat { private static final String TAG = EventSourcesPreferencesFragment.class.getSimpleName(); private static final String SOURCE_ID = "sourceId"; @@ -26,12 +27,10 @@ public class EventSourcesPreferencesFragment extends PreferenceFragment { List clickedSources = new ArrayList<>(); @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.preferences_event_sources); } - private void addAsPreference(EventSource source, boolean isChecked ) { CheckBoxPreference checkboxPref = new CheckBoxPreference(getActivity()); checkboxPref.setTitle((source.isAvailable ? "" : getText(R.string.not_found) + ": ") + source.getTitle()); @@ -141,7 +140,7 @@ private List getCheckedSources(PreferenceScreen preferenceScreen, i private void loadSelectedInOtherInstances() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - for (Fragment fragment: getActivity().getFragmentManager().getFragments()) { + for (Fragment fragment: getActivity().getSupportFragmentManager().getFragments()) { if (fragment instanceof EventSourcesPreferencesFragment && fragment != this) { Log.i(TAG, this.toString() + "\nFound loaded " + fragment); ((EventSourcesPreferencesFragment) fragment).loadActiveSources(); @@ -151,13 +150,13 @@ private void loadSelectedInOtherInstances() { } @Override - public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + public boolean onPreferenceTreeClick(Preference preference) { if (preference instanceof CheckBoxPreference) { EventSource source = EventSource.fromStoredString(preference.getExtras().getString(SOURCE_ID)); clickedSources.remove(source); clickedSources.add(source); // last clicked is the last in the list showAllSources(getSelectedSources()); } - return super.onPreferenceTreeClick(preferenceScreen, preference); + return super.onPreferenceTreeClick(preference); } } diff --git a/app/src/main/java/org/andstatus/todoagenda/prefs/FeedbackPreferencesFragment.java b/app/src/main/java/org/andstatus/todoagenda/prefs/FeedbackPreferencesFragment.java index 40ff3f63..a7e959bc 100644 --- a/app/src/main/java/org/andstatus/todoagenda/prefs/FeedbackPreferencesFragment.java +++ b/app/src/main/java/org/andstatus/todoagenda/prefs/FeedbackPreferencesFragment.java @@ -2,9 +2,9 @@ import android.content.Intent; import android.os.Bundle; -import android.preference.Preference; -import android.preference.PreferenceFragment; -import android.preference.PreferenceScreen; + +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; import org.andstatus.todoagenda.R; import org.andstatus.todoagenda.provider.QueryResultsStorage; @@ -14,7 +14,7 @@ import static org.andstatus.todoagenda.WidgetConfigurationActivity.REQUEST_ID_RESTORE_SETTINGS; import static org.andstatus.todoagenda.util.DateUtil.formatLogDateTime; -public class FeedbackPreferencesFragment extends PreferenceFragment { +public class FeedbackPreferencesFragment extends PreferenceFragmentCompat { private static final String TAG = FeedbackPreferencesFragment.class.getSimpleName(); private static final String KEY_SHARE_EVENTS_FOR_DEBUGGING = "shareEventsForDebugging"; @@ -22,7 +22,7 @@ public class FeedbackPreferencesFragment extends PreferenceFragment { private static final String KEY_RESTORE_SETTINGS = "restoreSettings"; @Override - public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + public boolean onPreferenceTreeClick(Preference preference) { int widgetId = ApplicationPreferences.getWidgetId(getActivity()); ApplicationPreferences.save(getActivity(), widgetId); switch (preference.getKey()) { @@ -53,12 +53,11 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen default: break; } - return super.onPreferenceTreeClick(preferenceScreen, preference); + return super.onPreferenceTreeClick(preference); } @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.preferences_feedback); } } \ No newline at end of file diff --git a/app/src/main/java/org/andstatus/todoagenda/prefs/LayoutPreferencesFragment.java b/app/src/main/java/org/andstatus/todoagenda/prefs/LayoutPreferencesFragment.java index 2a9a2b6c..4c6fe647 100644 --- a/app/src/main/java/org/andstatus/todoagenda/prefs/LayoutPreferencesFragment.java +++ b/app/src/main/java/org/andstatus/todoagenda/prefs/LayoutPreferencesFragment.java @@ -2,17 +2,17 @@ import android.content.SharedPreferences; import android.os.Bundle; -import android.preference.Preference; -import android.preference.PreferenceFragment; + +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; import org.andstatus.todoagenda.R; -public class LayoutPreferencesFragment extends PreferenceFragment +public class LayoutPreferencesFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener { @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.preferences_layout); } diff --git a/app/src/main/java/org/andstatus/todoagenda/prefs/MultilineCheckBoxPreference.java b/app/src/main/java/org/andstatus/todoagenda/prefs/MultilineCheckBoxPreference.java index 03a67591..76046630 100644 --- a/app/src/main/java/org/andstatus/todoagenda/prefs/MultilineCheckBoxPreference.java +++ b/app/src/main/java/org/andstatus/todoagenda/prefs/MultilineCheckBoxPreference.java @@ -1,11 +1,12 @@ package org.andstatus.todoagenda.prefs; import android.content.Context; -import android.preference.CheckBoxPreference; import android.util.AttributeSet; -import android.view.View; import android.widget.TextView; +import androidx.preference.CheckBoxPreference; +import androidx.preference.PreferenceViewHolder; + /** * See http://stackoverflow.com/questions/9220039/android-preferencescreen-title-in-two-lines */ @@ -24,9 +25,9 @@ public MultilineCheckBoxPreference(Context context, AttributeSet attrs, int defS } @Override - protected void onBindView(View view) { - super.onBindView(view); - TextView textView = (TextView) view.findViewById(android.R.id.title); + public void onBindViewHolder(PreferenceViewHolder viewHolder) { + super.onBindViewHolder(viewHolder); + TextView textView = (TextView) viewHolder.findViewById(android.R.id.title); if (textView != null) { textView.setSingleLine(false); } diff --git a/app/src/main/java/org/andstatus/todoagenda/prefs/OtherPreferencesFragment.java b/app/src/main/java/org/andstatus/todoagenda/prefs/OtherPreferencesFragment.java index a4a466a2..b6a40c56 100644 --- a/app/src/main/java/org/andstatus/todoagenda/prefs/OtherPreferencesFragment.java +++ b/app/src/main/java/org/andstatus/todoagenda/prefs/OtherPreferencesFragment.java @@ -2,12 +2,12 @@ import android.content.SharedPreferences; import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.EditTextPreference; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.PreferenceFragment; -import android.preference.PreferenceScreen; + +import androidx.preference.CheckBoxPreference; +import androidx.preference.EditTextPreference; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; import org.andstatus.todoagenda.MainActivity; import org.andstatus.todoagenda.R; @@ -18,14 +18,13 @@ import java.util.TimeZone; -public class OtherPreferencesFragment extends PreferenceFragment +public class OtherPreferencesFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener { @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.preferences_other); - } + } @Override public void onResume() { @@ -116,7 +115,7 @@ private void showRefreshPeriod() { } @Override - public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + public boolean onPreferenceTreeClick(Preference preference) { switch (preference.getKey()) { case InstanceSettings.PREF_LOCK_TIME_ZONE: if (preference instanceof CheckBoxPreference) { @@ -129,7 +128,7 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen default: break; } - return super.onPreferenceTreeClick(preferenceScreen, preference); + return super.onPreferenceTreeClick(preference); } @Override diff --git a/app/src/main/java/org/andstatus/todoagenda/prefs/RootFragment.java b/app/src/main/java/org/andstatus/todoagenda/prefs/RootFragment.java new file mode 100644 index 00000000..22925d47 --- /dev/null +++ b/app/src/main/java/org/andstatus/todoagenda/prefs/RootFragment.java @@ -0,0 +1,15 @@ +package org.andstatus.todoagenda.prefs; + +import android.os.Bundle; + +import androidx.preference.PreferenceFragmentCompat; + +import org.andstatus.todoagenda.R; + +public class RootFragment extends PreferenceFragmentCompat { + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + addPreferencesFromResource(R.xml.preferences_root); + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml new file mode 100644 index 00000000..b1d0450b --- /dev/null +++ b/app/src/main/res/layout/activity_settings.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/app/src/main/res/values-v14/dimens.xml b/app/src/main/res/values-v14/dimens.xml deleted file mode 100644 index 7a411637..00000000 --- a/app/src/main/res/values-v14/dimens.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - 0dp - - \ No newline at end of file diff --git a/app/src/main/res/values-v21/themes.xml b/app/src/main/res/values-v21/themes.xml deleted file mode 100644 index 5231ea53..00000000 --- a/app/src/main/res/values-v21/themes.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 8e7b68a2..94db6b29 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,7 +1,7 @@ - 8dp + 0dp 14dp 8dp 14dp diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index dc4b7cc5..8d890ef2 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,13 +1,15 @@ - + - + - - - -