From ecc3fe0579e5834c614dfccc0b81d35983c37372 Mon Sep 17 00:00:00 2001 From: Maxim Date: Thu, 2 Oct 2025 16:28:22 +0300 Subject: [PATCH 1/3] Optimize pattern handling and memory management --- .../preferences/SecPreferenceFragment.java | 96 +++++++++++-------- 1 file changed, 57 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/dev/ukanth/ufirewall/preferences/SecPreferenceFragment.java b/app/src/main/java/dev/ukanth/ufirewall/preferences/SecPreferenceFragment.java index 5049aba5..b9eb19ec 100644 --- a/app/src/main/java/dev/ukanth/ufirewall/preferences/SecPreferenceFragment.java +++ b/app/src/main/java/dev/ukanth/ufirewall/preferences/SecPreferenceFragment.java @@ -460,55 +460,73 @@ public void onPause() { super.onPause(); } + @Override + public void onDestroy() { + super.onDestroy(); + globalContext = null; + enableAdminPref = null; + enableDeviceCheckPref = null; + } + @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); + if (!isAdded()) return; setupEnableAdmin(findPreference("enableAdmin")); switch (requestCode) { - case REQ_CREATE_PATTERN: { - ListPreference itemList = (ListPreference) findPreference("passSetting"); - if (resultCode == getActivity().RESULT_OK) { - char[] pattern = data.getCharArrayExtra( - EXTRA_PATTERN); - final SharedPreferences.Editor editor = G.sPrefs.edit(); - editor.putString("LockPassword", new String(pattern)); - editor.commit(); - G.enableDeviceCheck(false); - //enable - if (itemList != null) { - final ListPreference patternMaxTry = (ListPreference) findPreference("patternMax"); - final CheckBoxPreference stealthMode = (CheckBoxPreference) findPreference("stealthMode"); - if (stealthMode != null) stealthMode.setEnabled(true); - if (patternMaxTry != null) patternMaxTry.setEnabled(true); - } - - } else { - itemList = (ListPreference) findPreference("passSetting"); - if (itemList != null) { - itemList.setValueIndex(0); - } - } + handleCreatePatternResult(resultCode, data); break; } - case REQ_ENTER_PATTERN: { - ListPreference itemList = (ListPreference) findPreference("passSetting"); - if (resultCode == getActivity().RESULT_OK) { - final SharedPreferences.Editor editor = G.sPrefs.edit(); - editor.putString("LockPassword", ""); - editor.commit(); - itemList = (ListPreference) findPreference("passSetting"); - if (itemList != null) { - itemList.setValueIndex(0); - } - } else { - if (itemList != null) { - itemList.setValueIndex(2); - G.enableDeviceCheck(false); - } - } + handleEnterPatternResult(resultCode); + } + } + } + + private void handleCreatePatternResult(int resultCode, Intent data) { + ListPreference itemList = (ListPreference) findPreference("passSetting"); + if (resultCode == getActivity().RESULT_OK && data != null) { + char[] pattern = data.getCharArrayExtra(EXTRA_PATTERN); + if (pattern != null) { + savePattern(new String(pattern)); + enablePatternFeatures(); + } + } else { + resetPatternSelection(itemList); + } + } + + private void handleEnterPatternResult(int resultCode) { + ListPreference itemList = (ListPreference) findPreference("passSetting"); + if (resultCode == getActivity().RESULT_OK) { + G.sPrefs.edit().putString("LockPassword", "").apply(); + if (itemList != null) { + itemList.setValueIndex(0); + } + } else { + if (itemList != null) { + itemList.setValueIndex(2); + G.enableDeviceCheck(false); } } } + + private void savePattern(String pattern) { + G.sPrefs.edit().putString("LockPassword", pattern).apply(); + G.enableDeviceCheck(false); + } + + private void enablePatternFeatures() { + final ListPreference patternMaxTry = (ListPreference) findPreference("patternMax"); + final CheckBoxPreference stealthMode = (CheckBoxPreference) findPreference("stealthMode"); + if (stealthMode != null) stealthMode.setEnabled(true); + if (patternMaxTry != null) patternMaxTry.setEnabled(true); + } + + private void resetPatternSelection(ListPreference itemList) { + if (itemList != null) { + itemList.setValueIndex(0); + } + } } From ede467bff402069c4ac8166477af1e78fc41e69d Mon Sep 17 00:00:00 2001 From: Maxim Date: Sat, 18 Oct 2025 22:53:08 +0300 Subject: [PATCH 2/3] Add back button to PreferencesActivity --- .../dev/ukanth/ufirewall/preferences/PreferencesActivity.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/dev/ukanth/ufirewall/preferences/PreferencesActivity.java b/app/src/main/java/dev/ukanth/ufirewall/preferences/PreferencesActivity.java index 1ffd62f4..c0665039 100644 --- a/app/src/main/java/dev/ukanth/ufirewall/preferences/PreferencesActivity.java +++ b/app/src/main/java/dev/ukanth/ufirewall/preferences/PreferencesActivity.java @@ -179,6 +179,8 @@ private void prepareLayout() { mToolBar = toolbarContainer.findViewById(R.id.toolbar); mToolBar.setTitle(getTitle() + " " + getString(R.string.preferences)); + mToolBar.setNavigationIcon(androidx.appcompat.content.res.AppCompatResources.getDrawable(this, + androidx.appcompat.R.drawable.abc_ic_ab_back_material)); mToolBar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { From 309cac00795da31bbbb3497eaa404ad1a62a9f66 Mon Sep 17 00:00:00 2001 From: Maxim Date: Sat, 18 Oct 2025 23:33:14 +0300 Subject: [PATCH 3/3] Optimize PreferencesActivity structure --- .../preferences/PreferencesActivity.java | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/dev/ukanth/ufirewall/preferences/PreferencesActivity.java b/app/src/main/java/dev/ukanth/ufirewall/preferences/PreferencesActivity.java index c0665039..9a1d0a80 100644 --- a/app/src/main/java/dev/ukanth/ufirewall/preferences/PreferencesActivity.java +++ b/app/src/main/java/dev/ukanth/ufirewall/preferences/PreferencesActivity.java @@ -31,8 +31,6 @@ import android.content.res.Resources; import android.os.Build; import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; @@ -71,9 +69,6 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre private RxEvent rxEvent; private Disposable disposable; - - - private void initTheme() { switch(G.getSelectedTheme()) { case "D": @@ -113,11 +108,14 @@ protected void onCreate(Bundle savedInstanceState) { // set language Api.updateLanguage(getApplicationContext(), G.locale()); initTheme(); - super.onCreate(savedInstanceState); + prepareLayout(); subscribe(); + handleIntentExtras(); + } + private void handleIntentExtras() { Bundle bundle = getIntent().getExtras(); if (bundle != null) { Object data = bundle.get("validate"); @@ -189,7 +187,6 @@ public void onClick(View v) { }); } - @Override protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) { theme.applyStyle(resid, true); @@ -321,34 +318,43 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin rxEvent.publish(new RulesEvent("", ctx)); } + handleNotificationChanges(sharedPreferences, key, ctx); + handleLogServiceChanges(sharedPreferences, key, ctx); + handleProfileAndThemeChanges(key, ctx, isRefreshRequired); + /*if (key.equals("logDmesg")) { rxEvent.publish(new LogChangeEvent("", ctx)); }*/ + } + private void handleNotificationChanges(SharedPreferences prefs, String key, Context ctx) { if (key.equals("notification_priority")) { NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancelAll(); Api.updateNotification(Api.isEnabled(ctx), ctx); } - if(key.equals("activeNotification")) { - boolean enabled = sharedPreferences.getBoolean(key, false); - if(!enabled) { - NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.cancelAll(); + if (key.equals("activeNotification")) { + boolean enabled = prefs.getBoolean(key, false); + if (!enabled) { + NotificationManager nm = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); + nm.cancelAll(); } else { Api.updateNotification(Api.isEnabled(ctx), ctx); } } + } + private void handleLogServiceChanges(SharedPreferences prefs, String key, Context ctx) { if(key.equals("logTarget")) { // Log target changes are now handled by LogPreferenceFragment // This should not be called anymore due to the OnPreferenceChangeListener - Log.d("PreferencesActivity", "logTarget preference changed: " + sharedPreferences.getString(key, "")); + Log.d("PreferencesActivity", "logTarget preference changed: " + prefs.getString(key, "")); } + if (key.equals("enableLogService")) { if(G.logTarget() !=null && !G.logTarget().trim().isEmpty()) { - boolean enabled = sharedPreferences.getBoolean(key, false); + boolean enabled = prefs.getBoolean(key, false); if (enabled) { Toast.makeText(getApplicationContext(), getString(R.string.log_service_start), Toast.LENGTH_LONG).show(); Intent intent = new Intent(ctx, LogService.class); @@ -363,9 +369,13 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin Toast.makeText(getApplicationContext(), getString(R.string.log_service_select), Toast.LENGTH_LONG).show(); } } + } + + private void handleProfileAndThemeChanges(String key, Context ctx, boolean isRefreshRequired) { if (key.equals("enableMultiProfile")) { G.reloadProfile(); } + if (key.equals("theme")) { initTheme(); recreate(); @@ -381,7 +391,6 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin } } - @Override public void onDestroy() { if (rxEvent != null && disposable != null) { @@ -395,5 +404,4 @@ protected void attachBaseContext(Context base) { super.attachBaseContext(Api.updateBaseContextLocale(base)); } - }