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 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/content_text.xml b/app/src/main/res/layout/content_text.xml
index ff2c54d..e5c9283 100644
--- a/app/src/main/res/layout/content_text.xml
+++ b/app/src/main/res/layout/content_text.xml
@@ -14,33 +14,23 @@
android:orientation="vertical"
android:padding="10dp">
-
-
-
-
-
-
-
+ android:layout_height="wrap_content"
+ android:hint="@string/text_content_hint"
+ android:importantForAutofill="no"
+ android:inputType="text" />
+ android:layout_below="@+id/EdtText_Content"
+ android:paddingTop="5dp">
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/filerecycler_item_row.xml b/app/src/main/res/layout/filerecycler_item_row.xml
index b117301..dc4548c 100644
--- a/app/src/main/res/layout/filerecycler_item_row.xml
+++ b/app/src/main/res/layout/filerecycler_item_row.xml
@@ -53,4 +53,4 @@
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/settings_activity.xml b/app/src/main/res/layout/settings_activity.xml
new file mode 100644
index 0000000..3faf2f6
--- /dev/null
+++ b/app/src/main/res/layout/settings_activity.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml
index 092e9e4..2f9eccd 100644
--- a/app/src/main/res/menu/activity_main_drawer.xml
+++ b/app/src/main/res/menu/activity_main_drawer.xml
@@ -5,11 +5,8 @@
android:checkable="false"
android:title="@string/nav_tools">