diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/base/BasePreferenceFragment.java b/app/src/main/java/com/topjohnwu/magisk/ui/base/BasePreferenceFragment.java deleted file mode 100644 index aff051778..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/ui/base/BasePreferenceFragment.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.topjohnwu.magisk.ui.base; - -import android.annotation.SuppressLint; -import android.content.SharedPreferences; -import android.os.Build; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.topjohnwu.magisk.App; -import com.topjohnwu.magisk.R; - -import androidx.preference.Preference; -import androidx.preference.PreferenceCategory; -import androidx.preference.PreferenceFragmentCompat; -import androidx.preference.PreferenceGroupAdapter; -import androidx.preference.PreferenceScreen; -import androidx.preference.PreferenceViewHolder; -import androidx.recyclerview.widget.RecyclerView; - -public abstract class BasePreferenceFragment extends PreferenceFragmentCompat - implements SharedPreferences.OnSharedPreferenceChangeListener { - - public App app = App.self; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View v = super.onCreateView(inflater, container, savedInstanceState); - app.getPrefs().registerOnSharedPreferenceChangeListener(this); - return v; - } - - @Override - public void onDestroyView() { - app.getPrefs().unregisterOnSharedPreferenceChangeListener(this); - super.onDestroyView(); - } - - @Override - protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) { - return new PreferenceGroupAdapter(preferenceScreen) { - @SuppressLint("RestrictedApi") - @Override - public void onBindViewHolder(PreferenceViewHolder holder, int position) { - super.onBindViewHolder(holder, position); - Preference preference = getItem(position); - if (preference instanceof PreferenceCategory) - setZeroPaddingToLayoutChildren(holder.itemView); - else { - View iconFrame = holder.itemView.findViewById(R.id.icon_frame); - if (iconFrame != null) { - iconFrame.setVisibility(preference.getIcon() == null ? View.GONE : View.VISIBLE); - } - } - } - }; - } - - private void setZeroPaddingToLayoutChildren(View view) { - if (!(view instanceof ViewGroup)) - return; - ViewGroup viewGroup = (ViewGroup) view; - int childCount = viewGroup.getChildCount(); - for (int i = 0; i < childCount; i++) { - setZeroPaddingToLayoutChildren(viewGroup.getChildAt(i)); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) - viewGroup.setPaddingRelative(0, viewGroup.getPaddingTop(), viewGroup.getPaddingEnd(), viewGroup.getPaddingBottom()); - else - viewGroup.setPadding(0, viewGroup.getPaddingTop(), viewGroup.getPaddingRight(), viewGroup.getPaddingBottom()); - } - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/base/BasePreferenceFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/BasePreferenceFragment.kt new file mode 100644 index 000000000..f0df3eee7 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/BasePreferenceFragment.kt @@ -0,0 +1,67 @@ +package com.topjohnwu.magisk.ui.base + +import android.annotation.SuppressLint +import android.content.SharedPreferences +import android.os.Build +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.view.children +import androidx.core.view.isVisible +import androidx.preference.* +import androidx.recyclerview.widget.RecyclerView +import com.topjohnwu.magisk.App +import com.topjohnwu.magisk.R +import com.topjohnwu.magisk.data.database.MagiskDB +import com.topjohnwu.magisk.data.database.RepoDatabaseHelper +import org.koin.android.ext.android.inject + +abstract class BasePreferenceFragment : PreferenceFragmentCompat(), + SharedPreferences.OnSharedPreferenceChangeListener { + + protected val prefs: SharedPreferences by inject() + protected val app: App by inject() + protected val database: MagiskDB by inject() + protected val repoDB: RepoDatabaseHelper by inject() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val v = super.onCreateView(inflater, container, savedInstanceState) + prefs.registerOnSharedPreferenceChangeListener(this) + return v + } + + override fun onDestroyView() { + prefs.unregisterOnSharedPreferenceChangeListener(this) + super.onDestroyView() + } + + override fun onCreateAdapter(preferenceScreen: PreferenceScreen): RecyclerView.Adapter<*> { + return object : PreferenceGroupAdapter(preferenceScreen) { + @SuppressLint("RestrictedApi") + override fun onBindViewHolder(holder: PreferenceViewHolder, position: Int) { + super.onBindViewHolder(holder, position) + when (val preference = getItem(position)) { + is PreferenceCategory -> setZeroPaddingToLayoutChildren(holder.itemView) + else -> holder.itemView.findViewById(R.id.icon_frame)?.isVisible = + preference.icon != null + } + } + } + } + + private fun setZeroPaddingToLayoutChildren(view: View) { + (view as? ViewGroup)?.children?.forEach { + setZeroPaddingToLayoutChildren(it) + } ?: return + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) + view.setPaddingRelative(0, view.paddingTop, view.paddingEnd, view.paddingBottom) + else + view.setPadding(0, view.paddingTop, view.paddingRight, view.paddingBottom) + } +} diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.java b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.java index 298cdb5e4..d9bed6f63 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.java @@ -36,25 +36,57 @@ import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; import kotlin.Pair; -public class SettingsFragment extends BasePreferenceFragment { +public final class SettingsFragment extends BasePreferenceFragment { private ListPreference updateChannel, autoRes, suNotification, requestTimeout, rootConfig, multiuserConfig, nsConfig; + @SuppressWarnings("ResultOfMethodCallIgnored") + @SuppressLint("CheckResult") + private static void setLocalePreference(ListPreference lp) { + lp.setSummary("Loading"); + lp.setEnabled(false); + LocaleManager.getAvailableLocales() + .flattenAsFlowable(locales -> locales) + .map(locale -> new Pair<>(locale.getDisplayName(locale), LocaleManager.toLanguageTag(locale))) + .toList() + .map(list -> { + CharSequence[] names = new CharSequence[list.size() + 1]; + CharSequence[] values = new CharSequence[list.size() + 1]; + + names[0] = LocaleManager.getString(LocaleManager.getDefaultLocale(), R.string.system_default); + values[0] = ""; + int i = 1; + for (Pair item : list) { + names[i] = item.getFirst(); + values[i++] = item.getSecond(); + } + return new Pair<>(names, values); + }) + .subscribeOn(Schedulers.computation()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(it -> { + lp.setEnabled(true); + lp.setEntries(it.getFirst()); + lp.setEntryValues(it.getSecond()); + lp.setSummary(LocaleManager.getLocale().getDisplayName(LocaleManager.getLocale())); + }, Throwable::printStackTrace); + } + @Override - public void onStart() { + public final void onStart() { super.onStart(); setHasOptionsMenu(true); requireActivity().setTitle(R.string.settings); } @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + public final void onCreatePreferences(Bundle savedInstanceState, String rootKey) { getPreferenceManager().setStorageDeviceProtected(); setPreferencesFromResource(R.xml.app_settings, rootKey); boolean showSuperuser = Utils.showSuperUser(); - app.getPrefs().edit() + getPrefs().edit() .putBoolean(Config.Key.SU_FINGERPRINT, FingerprintHelper.useFingerprint()) .apply(); @@ -74,8 +106,8 @@ public class SettingsFragment extends BasePreferenceFragment { return true; }); findPreference("clear").setOnPreferenceClickListener(pref -> { - app.getPrefs().edit().remove(Config.Key.ETAG_KEY).apply(); - app.getRepoDB().clearRepo(); + getPrefs().edit().remove(Config.Key.ETAG_KEY).apply(); + getRepoDB().clearRepo(); Utils.toast(R.string.repo_cache_cleared, Toast.LENGTH_SHORT); return true; }); @@ -102,7 +134,7 @@ public class SettingsFragment extends BasePreferenceFragment { if (channel == Config.Value.CUSTOM_CHANNEL) { View v = LayoutInflater.from(requireActivity()).inflate(R.layout.custom_channel_dialog, null); EditText url = v.findViewById(R.id.custom_url); - url.setText(app.getPrefs().getString(Config.Key.CUSTOM_CHANNEL, "")); + url.setText(getPrefs().getString(Config.Key.CUSTOM_CHANNEL, "")); new AlertDialog.Builder(requireActivity()) .setTitle(R.string.settings_update_custom) .setView(v) @@ -150,11 +182,12 @@ public class SettingsFragment extends BasePreferenceFragment { } if (Shell.rootAccess() && Const.USER_ID == 0) { - if (app.getPackageName().equals(BuildConfig.APPLICATION_ID)) { + if (getApp().getPackageName().equals(BuildConfig.APPLICATION_ID)) { generalCatagory.removePreference(restoreManager); } else { - if (!Networking.checkNetworkStatus(app)) + if (!Networking.checkNetworkStatus(requireContext())) { generalCatagory.removePreference(restoreManager); + } generalCatagory.removePreference(hideManager); } } else { @@ -172,45 +205,13 @@ public class SettingsFragment extends BasePreferenceFragment { } } - @SuppressWarnings("ResultOfMethodCallIgnored") - @SuppressLint("CheckResult") - private void setLocalePreference(ListPreference lp) { - lp.setSummary("Loading"); - lp.setEnabled(false); - LocaleManager.getAvailableLocales() - .flattenAsFlowable(locales -> locales) - .map(locale -> new Pair<>(locale.getDisplayName(locale), LocaleManager.toLanguageTag(locale))) - .toList() - .map(list -> { - CharSequence[] names = new CharSequence[list.size() + 1]; - CharSequence[] values = new CharSequence[list.size() + 1]; - - names[0] = LocaleManager.getString(LocaleManager.getDefaultLocale(), R.string.system_default); - values[0] = ""; - int i = 1; - for (Pair item : list) { - names[i] = item.getFirst(); - values[i++] = item.getSecond(); - } - return new Pair<>(names, values); - }) - .subscribeOn(Schedulers.computation()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(it -> { - lp.setEnabled(true); - lp.setEntries(it.getFirst()); - lp.setEntryValues(it.getSecond()); - lp.setSummary(LocaleManager.getLocale().getDisplayName(LocaleManager.getLocale())); - }, Throwable::printStackTrace); - } - @Override - public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { + public final void onSharedPreferenceChanged(SharedPreferences prefs, String key) { switch (key) { case Config.Key.ROOT_ACCESS: case Config.Key.SU_MULTIUSER_MODE: case Config.Key.SU_MNT_NS: - app.getDB().setSettings(key, Utils.getPrefsInt(prefs, key)); + getDatabase().setSettings(key, Utils.getPrefsInt(prefs, key)); break; case Config.Key.DARK_THEME: requireActivity().recreate(); @@ -234,7 +235,7 @@ public class SettingsFragment extends BasePreferenceFragment { } break; case Config.Key.LOCALE: - LocaleManager.setLocale(app); + LocaleManager.setLocale(getApp()); requireActivity().recreate(); break; case Config.Key.UPDATE_CHANNEL: @@ -249,7 +250,7 @@ public class SettingsFragment extends BasePreferenceFragment { } @Override - public boolean onPreferenceTreeClick(Preference preference) { + public final boolean onPreferenceTreeClick(Preference preference) { String key = preference.getKey(); switch (key) { case Config.Key.SU_FINGERPRINT: