From 05fcd48d877252581db24baf2e7c36eaa8cdfce6 Mon Sep 17 00:00:00 2001 From: xynngh Date: Mon, 2 Nov 2020 22:30:11 +0400 Subject: [PATCH] Load settings subscreens from separate files --- .../AdvancedSettingsFragment.java | 5 ++ .../BaseSettingsFragment.java | 56 +++++++++++++++---- .../RootSettingsFragment.java | 12 ++-- .../SettingsActivity.java | 34 +++++++---- app/src/main/res/xml/advanced_preferences.xml | 56 +++++++++++++++++++ app/src/main/res/xml/root_preferences.xml | 54 ++---------------- 6 files changed, 136 insertions(+), 81 deletions(-) create mode 100644 app/src/main/res/xml/advanced_preferences.xml diff --git a/app/src/main/java/dummydomain/yetanothercallblocker/AdvancedSettingsFragment.java b/app/src/main/java/dummydomain/yetanothercallblocker/AdvancedSettingsFragment.java index 48a0f45..09a0a06 100644 --- a/app/src/main/java/dummydomain/yetanothercallblocker/AdvancedSettingsFragment.java +++ b/app/src/main/java/dummydomain/yetanothercallblocker/AdvancedSettingsFragment.java @@ -30,6 +30,11 @@ public class AdvancedSettingsFragment extends BaseSettingsFragment { return PREF_SCREEN_ADVANCED; } + @Override + protected int getPreferencesResId() { + return R.xml.advanced_preferences; + } + @Override protected void initScreen() { String countryCodesExplanationSummary = getString(R.string.country_codes_info_summary) diff --git a/app/src/main/java/dummydomain/yetanothercallblocker/BaseSettingsFragment.java b/app/src/main/java/dummydomain/yetanothercallblocker/BaseSettingsFragment.java index 18dc384..8d5645b 100644 --- a/app/src/main/java/dummydomain/yetanothercallblocker/BaseSettingsFragment.java +++ b/app/src/main/java/dummydomain/yetanothercallblocker/BaseSettingsFragment.java @@ -4,6 +4,9 @@ import android.os.Bundle; import android.text.TextUtils; import androidx.annotation.NonNull; +import androidx.annotation.XmlRes; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceGroup; @@ -12,7 +15,8 @@ import androidx.preference.PreferenceScreen; import java.util.Objects; public abstract class BaseSettingsFragment extends PreferenceFragmentCompat - implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback { + implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback, + PreferenceFragmentCompat.OnPreferenceStartFragmentCallback { @Override public void onStart() { @@ -25,9 +29,9 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { checkScreenKey(rootKey); - getPreferenceManager().setStorageDeviceProtected(); + switchToDeviceProtectedStorage(); - setPreferencesFromResource(R.xml.root_preferences, rootKey); + setPreferencesFromResource(rootKey); initScreen(); @@ -44,6 +48,17 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat protected abstract String getScreenKey(); + protected void switchToDeviceProtectedStorage() { + getPreferenceManager().setStorageDeviceProtected(); + } + + protected void setPreferencesFromResource(String rootKey) { + setPreferencesFromResource(getPreferencesResId(), rootKey); + } + + @XmlRes + protected abstract int getPreferencesResId(); + protected void initScreen() {} protected void disablePreferenceIcons() { @@ -66,16 +81,37 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat @Override public boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, PreferenceScreen pref) { - String key = pref.getKey(); + return switchToFragment(getFragmentForPreferenceScreen(caller, pref), pref.getKey()); + } - PreferenceFragmentCompat fragment = getSubscreenFragment(key); - if (fragment == null) return false; + @Override + public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) { + return switchToFragment(getFragmentForPreferenceFragment(caller, pref), pref.getKey()); + } + + protected Fragment getFragmentForPreferenceScreen(PreferenceFragmentCompat caller, + PreferenceScreen pref) { + return null; // should be overridden if needed + } + + protected Fragment getFragmentForPreferenceFragment(PreferenceFragmentCompat caller, + Preference pref) { + FragmentActivity activity = requireActivity(); + + Fragment fragment = activity.getSupportFragmentManager().getFragmentFactory() + .instantiate(activity.getClassLoader(), pref.getFragment()); Bundle args = new Bundle(); - args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, key); + args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, pref.getKey()); fragment.setArguments(args); - getParentFragmentManager() + return fragment; + } + + protected boolean switchToFragment(Fragment fragment, String key) { + if (fragment == null) return false; + + requireActivity().getSupportFragmentManager() .beginTransaction() .setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right) @@ -86,10 +122,6 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat return true; } - protected PreferenceFragmentCompat getSubscreenFragment(String key) { - return null; - } - protected void setPrefChangeListener(@NonNull CharSequence key, Preference.OnPreferenceChangeListener listener) { requirePreference(key).setOnPreferenceChangeListener(listener); diff --git a/app/src/main/java/dummydomain/yetanothercallblocker/RootSettingsFragment.java b/app/src/main/java/dummydomain/yetanothercallblocker/RootSettingsFragment.java index 2bf9ebe..c4aeda1 100644 --- a/app/src/main/java/dummydomain/yetanothercallblocker/RootSettingsFragment.java +++ b/app/src/main/java/dummydomain/yetanothercallblocker/RootSettingsFragment.java @@ -9,7 +9,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; -import androidx.preference.PreferenceFragmentCompat; import androidx.preference.SwitchPreferenceCompat; import dummydomain.yetanothercallblocker.utils.PackageManagerUtils; @@ -24,7 +23,6 @@ public class RootSettingsFragment extends BaseSettingsFragment { private static final String PREF_CATEGORY_NOTIFICATIONS = "categoryNotifications"; private static final String PREF_CATEGORY_NOTIFICATIONS_LEGACY = "categoryNotificationsLegacy"; private static final String PREF_NOTIFICATIONS_BLOCKED_NON_PERSISTENT = "showNotificationsForBlockedCallsNonPersistent"; - private static final String PREF_SCREEN_ADVANCED = "screenAdvanced"; private static final String STATE_REQUEST_TOKEN = "STATE_REQUEST_TOKEN"; @@ -89,6 +87,11 @@ public class RootSettingsFragment extends BaseSettingsFragment { return PREF_SCREEN_ROOT; } + @Override + protected int getPreferencesResId() { + return R.xml.root_preferences; + } + @Override protected void initScreen() { setPrefChangeListener(Settings.PREF_INCOMING_CALL_NOTIFICATIONS, (pref, newValue) -> { @@ -217,9 +220,4 @@ public class RootSettingsFragment extends BaseSettingsFragment { .setChecked(App.getSettings().getNotificationsForBlockedCalls()); } - @Override - protected PreferenceFragmentCompat getSubscreenFragment(String key) { - return PREF_SCREEN_ADVANCED.equals(key) ? new AdvancedSettingsFragment() : null; - } - } diff --git a/app/src/main/java/dummydomain/yetanothercallblocker/SettingsActivity.java b/app/src/main/java/dummydomain/yetanothercallblocker/SettingsActivity.java index 9d65f19..2573c39 100644 --- a/app/src/main/java/dummydomain/yetanothercallblocker/SettingsActivity.java +++ b/app/src/main/java/dummydomain/yetanothercallblocker/SettingsActivity.java @@ -4,12 +4,15 @@ import android.os.Bundle; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.util.Predicate; import androidx.fragment.app.Fragment; +import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceScreen; public class SettingsActivity extends AppCompatActivity - implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback { + implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback, + PreferenceFragmentCompat.OnPreferenceStartFragmentCallback { @Override protected void onCreate(Bundle savedInstanceState) { @@ -30,18 +33,25 @@ public class SettingsActivity extends AppCompatActivity } @Override - public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragmentCompat, - PreferenceScreen preferenceScreen) { - for (Fragment fragment : getSupportFragmentManager().getFragments()) { - if (fragment instanceof BaseSettingsFragment) { - if (((BaseSettingsFragment) fragment) - .onPreferenceStartScreen(preferenceFragmentCompat, preferenceScreen)) { - return true; - } - } - } + public boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, PreferenceScreen pref) { + return applyToBaseSettingsFragment(f -> f.onPreferenceStartScreen(caller, pref)); + } - return true; + @Override + public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) { + return applyToBaseSettingsFragment(f -> f.onPreferenceStartFragment(caller, pref)); + } + + private boolean applyToBaseSettingsFragment(Predicate predicate) { + return applyToFragments(f -> f instanceof BaseSettingsFragment + && predicate.test((BaseSettingsFragment) f)); + } + + private boolean applyToFragments(Predicate predicate) { + for (Fragment fragment : getSupportFragmentManager().getFragments()) { + if (predicate.test(fragment)) return true; + } + return false; } } diff --git a/app/src/main/res/xml/advanced_preferences.xml b/app/src/main/res/xml/advanced_preferences.xml new file mode 100644 index 0000000..a847a2c --- /dev/null +++ b/app/src/main/res/xml/advanced_preferences.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index 9ddbbc1..73afa83 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -1,5 +1,4 @@ - @@ -87,55 +86,10 @@ - - - - - - - - - - - - - - - - + app:title="@string/settings_screen_advanced" />