diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,25 +47,10 @@ android:networkSecurityConfig="@xml/networks_security_config" android:roundIcon="@mipmap/ic_launcher_round" android:theme="@style/AppThemeDayNight.NoActionBar"> - - - - @@ -74,7 +59,7 @@ - + @@ -84,6 +69,22 @@ + + + + startActivity(new Intent(this, ActivityAbout.class)), R.id.nav_nearby, this::openNearbyStopsFragment + /*R.id.drawer_action_backup, () -> //this was for another action + startActivity(new Intent(this, ActivityBackup.class))*/ + ); diff --git a/app/src/main/java/it/reyboz/bustorino/ActivitySettings.java b/app/src/main/java/it/reyboz/bustorino/ActivitySettings.java --- a/app/src/main/java/it/reyboz/bustorino/ActivitySettings.java +++ b/app/src/main/java/it/reyboz/bustorino/ActivitySettings.java @@ -1,7 +1,6 @@ package it.reyboz.bustorino; import android.os.Bundle; -import android.view.ViewGroup; import androidx.appcompat.widget.Toolbar; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; @@ -9,7 +8,6 @@ import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatActivity; import android.util.Log; import it.reyboz.bustorino.fragments.SettingsFragment; import it.reyboz.bustorino.middleware.GeneralActivity; diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/BackupImportFragment.kt b/app/src/main/java/it/reyboz/bustorino/fragments/BackupImportFragment.kt --- a/app/src/main/java/it/reyboz/bustorino/fragments/BackupImportFragment.kt +++ b/app/src/main/java/it/reyboz/bustorino/fragments/BackupImportFragment.kt @@ -34,6 +34,7 @@ import de.siegmar.fastcsv.writer.CsvWriter import it.reyboz.bustorino.R import it.reyboz.bustorino.data.PreferencesHolder +import it.reyboz.bustorino.data.PreferencesHolder.PREF_FAVORITE_LINES import it.reyboz.bustorino.data.UserDB import it.reyboz.bustorino.util.ImportExport import java.io.* @@ -240,8 +241,12 @@ val pref = PreferencesHolder.getMainSharedPreferences(context) //In the future, if we move the favorite lines to a different file, // We should check here if the key is in the jsonObject, and copy it to the other file - ImportExport.importJsonToSharedPreferences(pref, jsonString, PreferencesHolder.IGNORE_KEYS_LOAD_MAIN, null, - PreferencesHolder.KEYS_MERGE_SET) + //ImportExport.importJsonToSharedPreferences(pref, jsonString, PreferencesHolder.IGNORE_KEYS_LOAD_MAIN, null, + // PreferencesHolder.KEYS_MERGE_SET) + val mSet = setOf(PREF_FAVORITE_LINES) + ImportExport.importJsonToPreferencesWhitelist(pref, jsonString, + mSet, null,mSet + ) } catch (e: Exception){ Log.e(DEBUG_TAG, "Cannot read main preferences from file") e.printStackTrace() diff --git a/app/src/main/java/it/reyboz/bustorino/util/ImportExport.kt b/app/src/main/java/it/reyboz/bustorino/util/ImportExport.kt --- a/app/src/main/java/it/reyboz/bustorino/util/ImportExport.kt +++ b/app/src/main/java/it/reyboz/bustorino/util/ImportExport.kt @@ -122,7 +122,7 @@ is JSONArray -> { // Handle arrays val set = mutableSetOf() if (mergeSetKeys.contains(key)) - sharedPreferences.getStringSet(key, mutableSetOf())?.let { set.addAll(it) } + sharedPreferences.getStringSet(key, null)?.let { set.addAll(it) } for (i in 0 until value.length()) { set.add(value.optString(i)) } @@ -140,6 +140,57 @@ return 0 } + fun importJsonToPreferencesWhitelist(sharedPreferences: SharedPreferences, + allJsonAsString: String, + desiredKeys: Set?, + desiredKeyRegex: Regex?, + mergeSetKeys: Set + ): Int { + val jsonObject = JSONObject(allJsonAsString) + + try { + val editor = sharedPreferences.edit() + jsonObject.keys().forEach { key -> + // Logica di inclusione: + // Se entrambi i filtri sono null, consideriamo tutte le chiavi desiderate. + // Altrimenti, la chiave deve trovarsi nel set oppure corrispondere alla regex. + val isDesired = when { + desiredKeys == null && desiredKeyRegex == null -> true + desiredKeys?.contains(key) == true -> true + desiredKeyRegex?.containsMatchIn(key) == true -> true + else -> false + } + + if (!isDesired) return@forEach + + val value = jsonObject.opt(key) + when (value) { + is Boolean -> editor.putBoolean(key, value) + is Int -> editor.putInt(key, value) + is Long -> editor.putLong(key, value) + is Float -> editor.putFloat(key, value) + is String -> editor.putString(key, value) + is JSONArray -> { + val set = mutableSetOf() + if (mergeSetKeys.contains(key)) { + sharedPreferences.getStringSet(key, null)?.let { set.addAll(it) } + } + for (i in 0 until value.length()) { + set.add(value.optString(i)) + } + editor.putStringSet(key, set) + } + } + } + editor.apply() + } catch (e: Exception) { + Log.e(TAG, "Cannot write sharedPreferences") + e.printStackTrace() + return -1 + } + return 0 + } + fun writeSharedPreferencesIntoJSON(sharedPreferences: SharedPreferences): JSONObject{ val allEntries: Map = sharedPreferences.all diff --git a/app/src/main/res/drawable/ic_backup_solid.xml b/app/src/main/res/drawable/ic_backup_solid.xml new file mode 100644 --- /dev/null +++ b/app/src/main/res/drawable/ic_backup_solid.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/layout/fragment_backup.xml b/app/src/main/res/layout/fragment_backup.xml --- a/app/src/main/res/layout/fragment_backup.xml +++ b/app/src/main/res/layout/fragment_backup.xml @@ -1,24 +1,28 @@ - - +