diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index e96c20638..fa6d4d5a3 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -1,12 +1,12 @@ package protect.card_locker; +import android.app.Activity; import android.app.SearchManager; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.database.Cursor; import android.database.CursorIndexOutOfBoundsException; import android.os.Bundle; import android.util.Log; @@ -18,14 +18,6 @@ import android.view.View; import android.widget.CheckBox; import android.widget.Toast; -import com.google.android.material.floatingactionbutton.FloatingActionButton; -import com.google.android.material.tabs.TabLayout; - -import java.io.UnsupportedEncodingException; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AlertDialog; @@ -35,10 +27,19 @@ import androidx.appcompat.widget.Toolbar; import androidx.core.splashscreen.SplashScreen; import androidx.recyclerview.widget.RecyclerView; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.tabs.TabLayout; + +import java.io.UnsupportedEncodingException; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + import protect.card_locker.preferences.SettingsActivity; public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener, GestureDetector.OnGestureListener { private static final String TAG = "Catima"; + public static final String RESTART_ACTIVITY_INTENT = "restart_activity_intent"; private final DBHelper mDB = new DBHelper(this); private LoyaltyCardCursorAdapter mAdapter; @@ -56,6 +57,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard private View mNoGroupCardsText; private ActivityResultLauncher mBarcodeScannerLauncher; + private ActivityResultLauncher mSettingsLauncher; private ActionMode.Callback mCurrentActionModeCallback = new ActionMode.Callback() { @Override @@ -277,6 +279,15 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard startActivity(newIntent); } }); + + mSettingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == Activity.RESULT_OK) { + Intent intent = result.getData(); + if (intent != null && intent.getBooleanExtra(RESTART_ACTIVITY_INTENT, false)) { + recreate(); + } + } + }); } @Override @@ -528,7 +539,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard if (id == R.id.action_settings) { Intent i = new Intent(getApplicationContext(), SettingsActivity.class); - startActivity(i); + mSettingsLauncher.launch(i); return true; } diff --git a/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java b/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java index d9c6dd307..567812914 100644 --- a/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java +++ b/app/src/main/java/protect/card_locker/preferences/SettingsActivity.java @@ -1,24 +1,24 @@ package protect.card_locker.preferences; +import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.MenuItem; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - +import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.widget.Toolbar; -import androidx.core.app.ActivityCompat; import androidx.fragment.app.DialogFragment; -import androidx.fragment.app.FragmentActivity; import androidx.preference.ListPreference; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + import nl.invissvenska.numberpickerpreference.NumberDialogPreference; import nl.invissvenska.numberpickerpreference.NumberPickerPreferenceDialogFragment; import protect.card_locker.CatimaAppCompatActivity; @@ -28,6 +28,9 @@ import protect.card_locker.Utils; public class SettingsActivity extends CatimaAppCompatActivity { + private final static String RELOAD_MAIN_STATE = "mReloadMain"; + private SettingsFragment fragment; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -41,10 +44,21 @@ public class SettingsActivity extends CatimaAppCompatActivity { } // Display the fragment as the main content. - SettingsFragment fragment = new SettingsFragment(); + fragment = new SettingsFragment(); getSupportFragmentManager().beginTransaction() .replace(R.id.settings_container, fragment) .commit(); + + // restore reload main state + if (savedInstanceState != null) { + fragment.mReloadMain = savedInstanceState.getBoolean(RELOAD_MAIN_STATE); + } + } + + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(RELOAD_MAIN_STATE, fragment.mReloadMain); } @Override @@ -52,16 +66,34 @@ public class SettingsActivity extends CatimaAppCompatActivity { int id = item.getItemId(); if (id == android.R.id.home) { - finish(); + finishSettingsActivity(); return true; } return super.onOptionsItemSelected(item); } + @Override + public void onBackPressed() { + finishSettingsActivity(); + } + + private void finishSettingsActivity() { + if (fragment.mReloadMain) { + Intent intent = new Intent(); + intent.putExtra(MainActivity.RESTART_ACTIVITY_INTENT, true); + setResult(Activity.RESULT_OK, intent); + } else { + setResult(Activity.RESULT_OK); + } + finish(); + } + public static class SettingsFragment extends PreferenceFragmentCompat { private static final String DIALOG_FRAGMENT_TAG = "SettingsFragment"; + public boolean mReloadMain; + @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { // Load the preferences from an XML resource @@ -94,32 +126,29 @@ public class SettingsActivity extends CatimaAppCompatActivity { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); } - FragmentActivity activity = getActivity(); - if (activity != null) { - ActivityCompat.recreate(activity); - } return true; }); Preference colorPreference = findPreference(getResources().getString(R.string.setting_key_theme_color)); assert colorPreference != null; colorPreference.setOnPreferenceChangeListener((preference, o) -> { - FragmentActivity activity = getActivity(); - if (activity != null) { - ActivityCompat.recreate(activity); - } + refreshActivity(true); return true; }); localePreference.setOnPreferenceChangeListener((preference, newValue) -> { - // Refresh the activity - Intent intent = new Intent(getContext(), MainActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - getContext().startActivity(intent); - + refreshActivity(true); return true; }); } + private void refreshActivity(boolean reloadMain) { + mReloadMain = reloadMain || mReloadMain; + Activity activity = getActivity(); + if (activity != null) { + activity.recreate(); + } + } + @Override public void onDisplayPreferenceDialog(Preference preference) { if (preference instanceof NumberDialogPreference) {