diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 33eb738..7ff828b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,6 +17,11 @@ android:supportsRtl="true" android:theme="@style/Theme.DeadHash" tools:ignore="GoogleAppIndexingWarning"> + dialog.cancel()); + + final AlertDialog alert = builder.create(); + alert.show(); + } } diff --git a/app/src/main/java/com/codedead/deadhash/domain/utils/LocaleHelper.java b/app/src/main/java/com/codedead/deadhash/domain/utils/LocaleHelper.java index b09fc51..64c844c 100644 --- a/app/src/main/java/com/codedead/deadhash/domain/utils/LocaleHelper.java +++ b/app/src/main/java/com/codedead/deadhash/domain/utils/LocaleHelper.java @@ -5,8 +5,6 @@ import android.content.res.Configuration; import android.content.res.Resources; -import androidx.preference.PreferenceManager; - import java.util.Locale; public final class LocaleHelper { @@ -42,7 +40,6 @@ public static Context onAttach(final Context context, final String defaultLangua * @return The Context that contains the correct locale */ public static Context setLocale(final Context context, final String language) { - persist(context, language); return updateResourcesLegacy(context, language); } @@ -58,20 +55,6 @@ private static String getPersistedData(final Context context, final String defau return preferences.getString("language", defaultLanguage); } - /** - * Persist the language code - * - * @param context The Context that can be used to persist the data - * @param language The language code that should be persisted - */ - private static void persist(final Context context, final String language) { - final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); - SharedPreferences.Editor editor = preferences.edit(); - - editor.putString("language", language); - editor.apply(); - } - /** * Update the resources of a specific Context * @@ -86,7 +69,7 @@ private static Context updateResourcesLegacy(final Context context, final String final Resources resources = context.getResources(); final Configuration configuration = resources.getConfiguration(); - configuration.locale = locale; + configuration.setLocale(locale); resources.updateConfiguration(configuration, resources.getDisplayMetrics()); diff --git a/app/src/main/java/com/codedead/deadhash/gui/MainActivity.java b/app/src/main/java/com/codedead/deadhash/gui/MainActivity.java index 062e581..455a2bc 100644 --- a/app/src/main/java/com/codedead/deadhash/gui/MainActivity.java +++ b/app/src/main/java/com/codedead/deadhash/gui/MainActivity.java @@ -35,16 +35,14 @@ import android.os.Looper; import android.text.method.LinkMovementMethod; +import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.Button; -import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ProgressBar; -import android.widget.RadioButton; -import android.widget.RadioGroup; -import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import android.widget.ViewFlipper; @@ -94,25 +92,18 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On private boolean paused; - private Spinner spnLanguages; - private RadioButton rdbLightTheme; - private RadioButton rdbDarkTheme; - private RadioButton rdbDefaultTheme; - private CheckBox ChbMD5; - private CheckBox ChbSHA1; - private CheckBox ChbSHA224; - private CheckBox ChbSHA256; - private CheckBox ChbSHA384; - private CheckBox ChbSHA512; - private CheckBox ChbCRC32; - private final String tmpFile = "tmpFile"; + private String lastLanguage; + private ActivityResultLauncher activityResultLauncher; @Override protected void onCreate(final Bundle savedInstanceState) { settingsContainer.loadSettings(getApplicationContext()); LocaleHelper.setLocale(this, settingsContainer.getLanguageCode()); + lastLanguage = settingsContainer.getLanguageCode(); + + loadTheme(); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); @@ -146,23 +137,11 @@ protected void onCreate(final Bundle savedInstanceState) { navigationView.setCheckedItem(navigationView.getMenu().getItem(0).getSubMenu().getItem(0).getItemId()); deleteTempFile(); } - spnLanguages = findViewById(R.id.SpnLanguages); - rdbLightTheme = findViewById(R.id.RdbLightTheme); - rdbDarkTheme = findViewById(R.id.RdbDarkTheme); - rdbDefaultTheme = findViewById(R.id.RdbDefaultTheme); - ChbMD5 = findViewById(R.id.ChbMD5); - ChbSHA1 = findViewById(R.id.ChbSHA1); - ChbSHA224 = findViewById(R.id.ChbSHA224); - ChbSHA256 = findViewById(R.id.ChbSHA256); - ChbSHA384 = findViewById(R.id.ChbSHA384); - ChbSHA512 = findViewById(R.id.ChbSHA512); - ChbCRC32 = findViewById(R.id.ChbCRC32); loadFileHashContent(savedInstanceState); loadTextHashContent(savedInstanceState); loadHelpContent(); loadAboutContent(); - loadSettingsContent(); loadAlertContent(); @@ -196,6 +175,39 @@ protected void onCreate(final Bundle savedInstanceState) { }); } + /** + * Load the current theme + */ + private void loadTheme() { + switch (settingsContainer.getTheme()) { + case "0": + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + break; + case "1": + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); + break; + case "2": + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + break; + } + } + + @Override + public boolean onCreateOptionsMenu(final Menu menu) { + final MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.top_menu, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(final MenuItem item) { + final int itemId = item.getItemId(); + if (itemId == R.id.nav_scan_settings) { + startActivity(new Intent(this, SettingsActivity.class)); + } + return super.onOptionsItemSelected(item); + } + /** * Delete the temporary file to save storage */ @@ -271,6 +283,17 @@ private void addReview(final boolean done) { @Override protected void onResume() { paused = false; + + settingsContainer.loadSettings(getApplicationContext()); + + final String selectedLanguage = settingsContainer.getLanguageCode(); + if (!lastLanguage.equals(selectedLanguage)) { + LocaleHelper.setLocale(getApplicationContext(), selectedLanguage); + recreate(); + } + + loadTheme(); + super.onResume(); } @@ -510,146 +533,6 @@ private void loadAboutContent() { txtAbout.setMovementMethod(LinkMovementMethod.getInstance()); } - /** - * Load the settings into the view - */ - private void loadSettings() { - switch (settingsContainer.getLanguageCode()) { - default: - case "en": - spnLanguages.setSelection(0); - break; - case "nl": - spnLanguages.setSelection(1); - break; - case "fr": - spnLanguages.setSelection(2); - break; - case "de": - spnLanguages.setSelection(3); - break; - case "it": - spnLanguages.setSelection(4); - break; - case "pt": - spnLanguages.setSelection(5); - break; - case "ru": - spnLanguages.setSelection(6); - break; - } - - getDelegate().applyDayNight(); - - switch (settingsContainer.getTheme()) { - case 0: - rdbDefaultTheme.setChecked(true); - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); - break; - case 1: - rdbLightTheme.setChecked(true); - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); - break; - case 2: - rdbDarkTheme.setChecked(true); - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); - break; - } - - ChbMD5.setChecked(settingsContainer.isCalculateMd5()); - ChbSHA1.setChecked(settingsContainer.isCalculateSha1()); - ChbSHA224.setChecked(settingsContainer.isCalculateSha224()); - ChbSHA256.setChecked(settingsContainer.isCalculateSha256()); - ChbSHA384.setChecked(settingsContainer.isCalculateSha384()); - ChbSHA512.setChecked(settingsContainer.isCalculateSha512()); - ChbCRC32.setChecked(settingsContainer.isCalculateCrc32()); - } - - /** - * Load the content and logic for the settings view - */ - private void loadSettingsContent() { - final Button btnReset = findViewById(R.id.BtnResetSettings); - final Button btnSave = findViewById(R.id.BtnSaveSettings); - loadSettings(); - - final RadioGroup group = findViewById(R.id.RgrThemes); - - btnReset.setOnClickListener(v -> { - saveSettings("en", true, true, true, true, true, true, true, 0); - final Context c = LocaleHelper.setLocale(getApplicationContext(), settingsContainer.getLanguageCode()); - Toast.makeText(MainActivity.this, c.getString(R.string.toast_settings_reset), Toast.LENGTH_SHORT).show(); - recreate(); - loadSettings(); - }); - - btnSave.setOnClickListener(v -> { - String lang; - switch (spnLanguages.getSelectedItemPosition()) { - default: - lang = "en"; - break; - case 1: - lang = "nl"; - break; - case 2: - lang = "fr"; - break; - case 3: - lang = "de"; - break; - case 4: - lang = "it"; - break; - case 5: - lang = "pt"; - break; - case 6: - lang = "ru"; - } - - final int checkedRadioButtonId = group.getCheckedRadioButtonId(); - int themeIndex = 0; - if (checkedRadioButtonId == R.id.RdbLightTheme) { - themeIndex = 1; - } else if (checkedRadioButtonId == R.id.RdbDarkTheme) { - themeIndex = 2; - } - - saveSettings(lang, ChbMD5.isChecked(), ChbSHA1.isChecked(), ChbSHA224.isChecked(), ChbSHA256.isChecked(), ChbSHA384.isChecked(), ChbSHA512.isChecked(), ChbCRC32.isChecked(), themeIndex); - final Context c = LocaleHelper.setLocale(getApplicationContext(), settingsContainer.getLanguageCode()); - Toast.makeText(MainActivity.this, c.getString(R.string.toast_settings_save), Toast.LENGTH_SHORT).show(); - recreate(); - loadSettings(); - }); - } - - /** - * Save the user preferences - * - * @param lang The language code - * @param md5 Whether or not MD5 hashes should be calculated - * @param sha1 Whether or not SHA1 hashes should be calculated - * @param sha224 Whether or not SHA224 hashes should be calculated - * @param sha256 Whether or not SHA256 hashes should be calculated - * @param sha384 Whether or not SHA384 hashes should be calculated - * @param sha512 Whether or not SHA512 hashes should be calculated - * @param crc32 Whether or not CRC32 values should be calculated - */ - private void saveSettings(final String lang, final boolean md5, final boolean sha1, final boolean sha224, final boolean sha256, final boolean sha384, final boolean sha512, final boolean crc32, final int theme) { - settingsContainer.setLanguageCode(lang); - settingsContainer.setCalculateMd5(md5); - settingsContainer.setCalculateSha1(sha1); - settingsContainer.setCalculateSha224(sha224); - settingsContainer.setCalculateSha256(sha256); - settingsContainer.setCalculateSha384(sha384); - settingsContainer.setCalculateSha512(sha512); - settingsContainer.setCalculateCrc32(crc32); - settingsContainer.setTheme(theme); - - settingsContainer.saveSettings(getApplicationContext()); - } - @Override public void onSaveInstanceState(final Bundle savedInstanceState) { savedInstanceState.putInt("TAB_NUMBER", viewFlipper.getDisplayedChild()); @@ -703,8 +586,6 @@ public boolean onNavigationItemSelected(@NonNull final MenuItem item) { page = 2; } else if (itemId == R.id.nav_about) { page = 3; - } else if (itemId == R.id.nav_manage) { - page = 4; } viewFlipper.setDisplayedChild(page); diff --git a/app/src/main/java/com/codedead/deadhash/gui/SettingsActivity.java b/app/src/main/java/com/codedead/deadhash/gui/SettingsActivity.java new file mode 100644 index 0000000..d75a41e --- /dev/null +++ b/app/src/main/java/com/codedead/deadhash/gui/SettingsActivity.java @@ -0,0 +1,112 @@ +package com.codedead.deadhash.gui; + +import static android.content.pm.PackageManager.GET_META_DATA; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.os.Bundle; +import android.view.MenuItem; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.appcompat.widget.Toolbar; +import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.PreferenceManager; + +import com.codedead.deadhash.R; +import com.codedead.deadhash.domain.utils.IntentUtils; +import com.codedead.deadhash.domain.utils.LocaleHelper; + +public class SettingsActivity extends AppCompatActivity { + + @Override + protected void onCreate(final Bundle savedInstanceState) { + final SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + + sharedPreferences.registerOnSharedPreferenceChangeListener(listener); + LocaleHelper.setLocale(this, sharedPreferences.getString("language", "en")); + + resetTitle(); + super.onCreate(savedInstanceState); + setContentView(R.layout.settings_activity); + + final Toolbar toolbar = findViewById(R.id.toolbar_settings); + setSupportActionBar(toolbar); + + if (savedInstanceState == null) { + getSupportFragmentManager() + .beginTransaction() + .replace(R.id.settings, new SettingsFragment()) + .commit(); + } + + final ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + } + } + + private final SharedPreferences.OnSharedPreferenceChangeListener listener = (prefs, key) -> { + if (key.equals("language")) { + LocaleHelper.setLocale(getApplicationContext(), prefs.getString("language", "en")); + recreate(); + } else if (key.equals("theme")) { + final String theme = prefs.getString("theme", "0"); + switch (theme) { + case "0": + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + break; + case "1": + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); + break; + case "2": + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + break; + } + } + }; + + /** + * Reset the title of the activity + */ + private void resetTitle() { + try { + final int label = getPackageManager().getActivityInfo(getComponentName(), GET_META_DATA).labelRes; + if (label != 0) { + setTitle(label); + } + } catch (final PackageManager.NameNotFoundException ex) { + IntentUtils.showAlert(this, ex.getMessage()); + } + } + + @Override + public boolean onOptionsItemSelected(final MenuItem item) { + if (item.getItemId() == android.R.id.home) { + finish(); + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onConfigurationChanged(@NonNull final Configuration newConfig) { + super.onConfigurationChanged(newConfig); + LocaleHelper.onAttach(getBaseContext()); + } + + @Override + protected void attachBaseContext(final Context base) { + super.attachBaseContext(LocaleHelper.onAttach(base)); + } + + public static class SettingsFragment extends PreferenceFragmentCompat { + @Override + public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { + setPreferencesFromResource(R.xml.root_preferences, rootKey); + } + } +} diff --git a/app/src/main/res/drawable-hdpi/ic_settings_black_24dp.xml b/app/src/main/res/drawable-hdpi/ic_settings_black_24dp.xml new file mode 100644 index 0000000..6055510 --- /dev/null +++ b/app/src/main/res/drawable-hdpi/ic_settings_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_menu_manage.xml b/app/src/main/res/drawable/ic_menu_manage.xml deleted file mode 100644 index 24a5623..0000000 --- a/app/src/main/res/drawable/ic_menu_manage.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/side_nav_bar.xml b/app/src/main/res/drawable/side_nav_bar.xml index 5840463..12d9779 100644 --- a/app/src/main/res/drawable/side_nav_bar.xml +++ b/app/src/main/res/drawable/side_nav_bar.xml @@ -6,4 +6,4 @@ android:endColor="@color/purple_500" android:startColor="@color/purple_500" android:type="linear" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml index 0a4a6ad..b66bc33 100644 --- a/app/src/main/res/layout/app_bar_main.xml +++ b/app/src/main/res/layout/app_bar_main.xml @@ -33,8 +33,6 @@ - - diff --git a/app/src/main/res/layout/content_about.xml b/app/src/main/res/layout/content_about.xml index ede468c..f175bd6 100644 --- a/app/src/main/res/layout/content_about.xml +++ b/app/src/main/res/layout/content_about.xml @@ -73,4 +73,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/content_file.xml b/app/src/main/res/layout/content_file.xml index 374552e..aa42b29 100644 --- a/app/src/main/res/layout/content_file.xml +++ b/app/src/main/res/layout/content_file.xml @@ -22,7 +22,6 @@ - + - \ No newline at end of file + diff --git a/app/src/main/res/layout/content_help.xml b/app/src/main/res/layout/content_help.xml index 6eb04bf..e592954 100644 --- a/app/src/main/res/layout/content_help.xml +++ b/app/src/main/res/layout/content_help.xml @@ -48,4 +48,4 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/content_settings.xml b/app/src/main/res/layout/content_settings.xml deleted file mode 100644 index c14bcdf..0000000 --- a/app/src/main/res/layout/content_settings.xml +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -