Load settings subscreens from separate files

This commit is contained in:
xynngh
2020-11-02 22:30:11 +04:00
parent ac65bc7fd0
commit 05fcd48d87
6 changed files with 136 additions and 81 deletions

View File

@@ -30,6 +30,11 @@ public class AdvancedSettingsFragment extends BaseSettingsFragment {
return PREF_SCREEN_ADVANCED; return PREF_SCREEN_ADVANCED;
} }
@Override
protected int getPreferencesResId() {
return R.xml.advanced_preferences;
}
@Override @Override
protected void initScreen() { protected void initScreen() {
String countryCodesExplanationSummary = getString(R.string.country_codes_info_summary) String countryCodesExplanationSummary = getString(R.string.country_codes_info_summary)

View File

@@ -4,6 +4,9 @@ import android.os.Bundle;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.annotation.NonNull; 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.Preference;
import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceGroup;
@@ -12,7 +15,8 @@ import androidx.preference.PreferenceScreen;
import java.util.Objects; import java.util.Objects;
public abstract class BaseSettingsFragment extends PreferenceFragmentCompat public abstract class BaseSettingsFragment extends PreferenceFragmentCompat
implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback { implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback,
PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
@Override @Override
public void onStart() { public void onStart() {
@@ -25,9 +29,9 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
checkScreenKey(rootKey); checkScreenKey(rootKey);
getPreferenceManager().setStorageDeviceProtected(); switchToDeviceProtectedStorage();
setPreferencesFromResource(R.xml.root_preferences, rootKey); setPreferencesFromResource(rootKey);
initScreen(); initScreen();
@@ -44,6 +48,17 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat
protected abstract String getScreenKey(); 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 initScreen() {}
protected void disablePreferenceIcons() { protected void disablePreferenceIcons() {
@@ -66,16 +81,37 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat
@Override @Override
public boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, public boolean onPreferenceStartScreen(PreferenceFragmentCompat caller,
PreferenceScreen pref) { PreferenceScreen pref) {
String key = pref.getKey(); return switchToFragment(getFragmentForPreferenceScreen(caller, pref), pref.getKey());
}
PreferenceFragmentCompat fragment = getSubscreenFragment(key); @Override
if (fragment == null) return false; 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(); Bundle args = new Bundle();
args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, key); args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, pref.getKey());
fragment.setArguments(args); fragment.setArguments(args);
getParentFragmentManager() return fragment;
}
protected boolean switchToFragment(Fragment fragment, String key) {
if (fragment == null) return false;
requireActivity().getSupportFragmentManager()
.beginTransaction() .beginTransaction()
.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, .setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left,
R.anim.enter_from_left, R.anim.exit_to_right) R.anim.enter_from_left, R.anim.exit_to_right)
@@ -86,10 +122,6 @@ public abstract class BaseSettingsFragment extends PreferenceFragmentCompat
return true; return true;
} }
protected PreferenceFragmentCompat getSubscreenFragment(String key) {
return null;
}
protected void setPrefChangeListener(@NonNull CharSequence key, protected void setPrefChangeListener(@NonNull CharSequence key,
Preference.OnPreferenceChangeListener listener) { Preference.OnPreferenceChangeListener listener) {
requirePreference(key).setOnPreferenceChangeListener(listener); requirePreference(key).setOnPreferenceChangeListener(listener);

View File

@@ -9,7 +9,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.SwitchPreferenceCompat; import androidx.preference.SwitchPreferenceCompat;
import dummydomain.yetanothercallblocker.utils.PackageManagerUtils; 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 = "categoryNotifications";
private static final String PREF_CATEGORY_NOTIFICATIONS_LEGACY = "categoryNotificationsLegacy"; private static final String PREF_CATEGORY_NOTIFICATIONS_LEGACY = "categoryNotificationsLegacy";
private static final String PREF_NOTIFICATIONS_BLOCKED_NON_PERSISTENT = "showNotificationsForBlockedCallsNonPersistent"; 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"; private static final String STATE_REQUEST_TOKEN = "STATE_REQUEST_TOKEN";
@@ -89,6 +87,11 @@ public class RootSettingsFragment extends BaseSettingsFragment {
return PREF_SCREEN_ROOT; return PREF_SCREEN_ROOT;
} }
@Override
protected int getPreferencesResId() {
return R.xml.root_preferences;
}
@Override @Override
protected void initScreen() { protected void initScreen() {
setPrefChangeListener(Settings.PREF_INCOMING_CALL_NOTIFICATIONS, (pref, newValue) -> { setPrefChangeListener(Settings.PREF_INCOMING_CALL_NOTIFICATIONS, (pref, newValue) -> {
@@ -217,9 +220,4 @@ public class RootSettingsFragment extends BaseSettingsFragment {
.setChecked(App.getSettings().getNotificationsForBlockedCalls()); .setChecked(App.getSettings().getNotificationsForBlockedCalls());
} }
@Override
protected PreferenceFragmentCompat getSubscreenFragment(String key) {
return PREF_SCREEN_ADVANCED.equals(key) ? new AdvancedSettingsFragment() : null;
}
} }

View File

@@ -4,12 +4,15 @@ import android.os.Bundle;
import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.core.util.Predicate;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
public class SettingsActivity extends AppCompatActivity public class SettingsActivity extends AppCompatActivity
implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback { implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback,
PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -30,18 +33,25 @@ public class SettingsActivity extends AppCompatActivity
} }
@Override @Override
public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragmentCompat, public boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, PreferenceScreen pref) {
PreferenceScreen preferenceScreen) { return applyToBaseSettingsFragment(f -> f.onPreferenceStartScreen(caller, pref));
}
@Override
public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) {
return applyToBaseSettingsFragment(f -> f.onPreferenceStartFragment(caller, pref));
}
private boolean applyToBaseSettingsFragment(Predicate<BaseSettingsFragment> predicate) {
return applyToFragments(f -> f instanceof BaseSettingsFragment
&& predicate.test((BaseSettingsFragment) f));
}
private boolean applyToFragments(Predicate<Fragment> predicate) {
for (Fragment fragment : getSupportFragmentManager().getFragments()) { for (Fragment fragment : getSupportFragmentManager().getFragments()) {
if (fragment instanceof BaseSettingsFragment) { if (predicate.test(fragment)) return true;
if (((BaseSettingsFragment) fragment)
.onPreferenceStartScreen(preferenceFragmentCompat, preferenceScreen)) {
return true;
} }
} return false;
}
return true;
} }
} }

View File

@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:key="screenAdvanced"
app:title="@string/settings_screen_advanced">
<Preference
app:key="dbManagement"
app:persistent="false"
app:title="@string/open_db_management_activity">
<intent
android:targetClass="dummydomain.yetanothercallblocker.DbManagementActivity"
android:targetPackage="@string/app_id" />
</Preference>
<PreferenceCategory
app:key="categoryCountryCodes"
app:title="@string/settings_category_country_codes">
<Preference
app:key="countryCodesInfo"
app:persistent="false"
app:summary="@string/country_codes_info_summary"
app:title="@string/country_codes_info" />
<EditTextPreference
app:key="countryCodeOverride"
app:summary="@string/country_code_override_summary"
app:title="@string/country_code_override" />
<EditTextPreference
app:key="countryCodeForReviewsOverride"
app:summary="@string/country_code_for_reviews_override_summary"
app:title="@string/country_code_for_reviews_override" />
</PreferenceCategory>
<EditTextPreference
app:key="databaseDownloadUrl"
app:title="@string/database_download_url" />
<PreferenceCategory
app:key="categoryDebugging"
app:title="@string/settings_category_debugging">
<Preference
app:key="exportLogcat"
app:persistent="false"
app:summary="@string/export_logcat_summary"
app:title="@string/export_logcat" />
<SwitchPreferenceCompat
app:key="saveCrashesToExternalStorage"
app:summary="@string/save_crashes_to_external_storage_summary"
app:title="@string/save_crashes_to_external_storage" />
<SwitchPreferenceCompat
app:key="saveLogcatOnCrash"
app:summary="@string/save_logcat_on_crash_summary"
app:title="@string/save_logcat_on_crash" />
</PreferenceCategory>
</PreferenceScreen>

View File

@@ -1,5 +1,4 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" <PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:title="@string/title_settings_activity"> app:title="@string/title_settings_activity">
<PreferenceCategory app:title="@string/settings_category_main"> <PreferenceCategory app:title="@string/settings_category_main">
@@ -87,55 +86,10 @@
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory app:title="@string/settings_screen_advanced"> <PreferenceCategory app:title="@string/settings_screen_advanced">
<PreferenceScreen <Preference
app:fragment="dummydomain.yetanothercallblocker.AdvancedSettingsFragment"
app:key="screenAdvanced" app:key="screenAdvanced"
app:title="@string/settings_screen_advanced"> app:title="@string/settings_screen_advanced" />
<Preference
app:key="dbManagement"
app:persistent="false"
app:title="@string/open_db_management_activity">
<intent
android:targetClass="dummydomain.yetanothercallblocker.DbManagementActivity"
android:targetPackage="@string/app_id" />
</Preference>
<PreferenceCategory
app:key="categoryCountryCodes"
app:title="@string/settings_category_country_codes">
<Preference
app:key="countryCodesInfo"
app:persistent="false"
app:summary="@string/country_codes_info_summary"
app:title="@string/country_codes_info" />
<EditTextPreference
app:key="countryCodeOverride"
app:summary="@string/country_code_override_summary"
app:title="@string/country_code_override" />
<EditTextPreference
app:key="countryCodeForReviewsOverride"
app:summary="@string/country_code_for_reviews_override_summary"
app:title="@string/country_code_for_reviews_override" />
</PreferenceCategory>
<EditTextPreference
app:key="databaseDownloadUrl"
app:title="@string/database_download_url" />
<PreferenceCategory
app:key="categoryDebugging"
app:title="@string/settings_category_debugging">
<Preference
app:key="exportLogcat"
app:persistent="false"
app:summary="@string/export_logcat_summary"
app:title="@string/export_logcat" />
<SwitchPreferenceCompat
app:key="saveCrashesToExternalStorage"
app:summary="@string/save_crashes_to_external_storage_summary"
app:title="@string/save_crashes_to_external_storage" />
<SwitchPreferenceCompat
app:key="saveLogcatOnCrash"
app:summary="@string/save_logcat_on_crash_summary"
app:title="@string/save_logcat_on_crash" />
</PreferenceCategory>
</PreferenceScreen>
</PreferenceCategory> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>