Migrate setting to be repo specific

Each attribute of the settings is prefixed with the "id" of the repo.
This commit is contained in:
Vishesh Handa
2020-10-23 15:25:12 +02:00
parent a9abf5d9b3
commit 07d0bdb7d8
3 changed files with 139 additions and 44 deletions

View File

@ -44,7 +44,7 @@ class JournalApp extends StatefulWidget {
gitBaseDir: gitBaseDirectory,
cacheDir: cacheDir,
pref: pref,
id: "0",
id: DEFAULT_ID,
);
Widget app = ChangeNotifierProvider.value(

View File

@ -10,6 +10,8 @@ import 'package:gitjournal/folder_views/common.dart';
import 'package:gitjournal/screens/note_editor.dart';
import 'package:uuid/uuid.dart';
const DEFAULT_ID = "0";
class Settings extends ChangeNotifier {
Settings(this.id);
@ -40,7 +42,7 @@ class Settings extends ChangeNotifier {
SettingsFolderViewType defaultView = SettingsFolderViewType.Default;
bool showNoteSummary = true;
String folderViewHeaderType = "TitleGenerated";
int version = 1;
int version = 2;
SettingsHomeScreen homeScreen = SettingsHomeScreen.Default;
@ -69,78 +71,95 @@ class Settings extends ChangeNotifier {
String sshPassword = "";
void load(SharedPreferences pref) {
gitAuthor = pref.getString("gitAuthor") ?? gitAuthor;
gitAuthorEmail = pref.getString("gitAuthorEmail") ?? gitAuthorEmail;
gitAuthor = _getString(pref, "gitAuthor") ?? gitAuthor;
gitAuthorEmail = _getString(pref, "gitAuthorEmail") ?? gitAuthorEmail;
noteFileNameFormat = NoteFileNameFormat.fromInternalString(
pref.getString("noteFileNameFormat"));
_getString(pref, "noteFileNameFormat"));
journalNoteFileNameFormat = NoteFileNameFormat.fromInternalString(
pref.getString("journalNoteFileNameFormat"));
_getString(pref, "journalNoteFileNameFormat"));
yamlModifiedKey = pref.getString("yamlModifiedKey") ?? yamlModifiedKey;
yamlCreatedKey = pref.getString("yamlCreatedKey") ?? yamlCreatedKey;
yamlTagsKey = pref.getString("yamlTagsKey") ?? yamlTagsKey;
customMetaData = pref.getString("customMetaData") ?? customMetaData;
yamlModifiedKey = _getString(pref, "yamlModifiedKey") ?? yamlModifiedKey;
yamlCreatedKey = _getString(pref, "yamlCreatedKey") ?? yamlCreatedKey;
yamlTagsKey = _getString(pref, "yamlTagsKey") ?? yamlTagsKey;
customMetaData = _getString(pref, "customMetaData") ?? customMetaData;
yamlHeaderEnabled = pref.getBool("yamlHeaderEnabled") ?? yamlHeaderEnabled;
defaultNewNoteFolderSpec =
pref.getString("defaultNewNoteFolderSpec") ?? defaultNewNoteFolderSpec;
yamlHeaderEnabled =
_getBool(pref, "yamlHeaderEnabled") ?? yamlHeaderEnabled;
defaultNewNoteFolderSpec = _getString(pref, "defaultNewNoteFolderSpec") ??
defaultNewNoteFolderSpec;
journalEditordefaultNewNoteFolderSpec =
pref.getString("journalEditordefaultNewNoteFolderSpec") ??
_getString(pref, "journalEditordefaultNewNoteFolderSpec") ??
journalEditordefaultNewNoteFolderSpec;
journalEditorSingleNote =
pref.getBool("journalEditorSingleNote") ?? journalEditorSingleNote;
_getBool(pref, "journalEditorSingleNote") ?? journalEditorSingleNote;
remoteSyncFrequency = RemoteSyncFrequency.fromInternalString(
pref.getString("remoteSyncFrequency"));
_getString(pref, "remoteSyncFrequency"));
sortingField =
SortingField.fromInternalString(pref.getString("sortingField"));
SortingField.fromInternalString(_getString(pref, "sortingField"));
sortingOrder =
SortingOrder.fromInternalString(pref.getString("sortingOrder"));
defaultEditor =
SettingsEditorType.fromInternalString(pref.getString("defaultEditor"));
SortingOrder.fromInternalString(_getString(pref, "sortingOrder"));
defaultEditor = SettingsEditorType.fromInternalString(
_getString(pref, "defaultEditor"));
defaultView = SettingsFolderViewType.fromInternalString(
pref.getString("defaultView"));
_getString(pref, "defaultView"));
markdownDefaultView = SettingsMarkdownDefaultView.fromInternalString(
pref.getString("markdownDefaultView"));
_getString(pref, "markdownDefaultView"));
markdownLastUsedView = SettingsMarkdownDefaultView.fromInternalString(
pref.getString("markdownLastUsedView"));
_getString(pref, "markdownLastUsedView"));
if (markdownLastUsedView == SettingsMarkdownDefaultView.LastUsed) {
markdownLastUsedView = SettingsMarkdownDefaultView.Edit;
}
showNoteSummary = pref.getBool("showNoteSummary") ?? showNoteSummary;
showNoteSummary = _getBool(pref, "showNoteSummary") ?? showNoteSummary;
folderViewHeaderType =
pref.getString("folderViewHeaderType") ?? folderViewHeaderType;
_getString(pref, "folderViewHeaderType") ?? folderViewHeaderType;
version = pref.getInt("settingsVersion") ?? version;
emojiParser = pref.getBool("emojiParser") ?? emojiParser;
version = _getInt(pref, "settingsVersion") ?? version;
emojiParser = _getBool(pref, "emojiParser") ?? emojiParser;
homeScreen =
SettingsHomeScreen.fromInternalString(pref.getString("homeScreen"));
SettingsHomeScreen.fromInternalString(_getString(pref, "homeScreen"));
imageLocationSpec =
pref.getString("imageLocationSpec") ?? imageLocationSpec;
_getString(pref, "imageLocationSpec") ?? imageLocationSpec;
zenMode = pref.getBool("zenMode") ?? zenMode;
saveTitleInH1 = pref.getBool("saveTitleInH1") ?? saveTitleInH1;
swipeToDelete = pref.getBool("swipeToDelete") ?? swipeToDelete;
zenMode = _getBool(pref, "zenMode") ?? zenMode;
saveTitleInH1 = _getBool(pref, "saveTitleInH1") ?? saveTitleInH1;
swipeToDelete = _getBool(pref, "swipeToDelete") ?? swipeToDelete;
inlineTagPrefixes =
pref.getStringList("inlineTagPrefixes")?.toSet() ?? inlineTagPrefixes;
_getStringList(pref, "inlineTagPrefixes")?.toSet() ?? inlineTagPrefixes;
// From AppState
folderName = pref.getString("remoteGitRepoPath") ?? folderName;
folderName = _getString(pref, "remoteGitRepoPath") ?? folderName;
sshPublicKey = pref.getString("sshPublicKey") ?? sshPublicKey;
sshPrivateKey = pref.getString("sshPrivateKey") ?? sshPrivateKey;
sshPassword = pref.getString("sshPassword") ?? sshPassword;
sshPublicKey = _getString(pref, "sshPublicKey") ?? sshPublicKey;
sshPrivateKey = _getString(pref, "sshPrivateKey") ?? sshPrivateKey;
sshPassword = _getString(pref, "sshPassword") ?? sshPassword;
bottomMenuBar = pref.getBool("bottomMenuBar") ?? bottomMenuBar;
storeInternally = pref.getBool("storeInternally") ?? storeInternally;
storageLocation = pref.getString("storageLocation") ?? "";
bottomMenuBar = _getBool(pref, "bottomMenuBar") ?? bottomMenuBar;
storeInternally = _getBool(pref, "storeInternally") ?? storeInternally;
storageLocation = _getString(pref, "storageLocation") ?? "";
}
String _getString(SharedPreferences pref, String key) {
return pref.getString(id + '_' + key);
}
bool _getBool(SharedPreferences pref, String key) {
return pref.getBool(id + '_' + key);
}
List<String> _getStringList(SharedPreferences pref, String key) {
return pref.getStringList(id + '_' + key);
}
int _getInt(SharedPreferences pref, String key) {
return pref.getInt(id + '_' + key);
}
Future<void> save() async {
@ -238,6 +257,7 @@ class Settings extends ChangeNotifier {
String value,
String defaultValue,
) async {
key = id + '_' + key;
if (value == defaultValue) {
await pref.remove(key);
} else {
@ -251,6 +271,7 @@ class Settings extends ChangeNotifier {
bool value,
bool defaultValue,
) async {
key = id + '_' + key;
if (value == defaultValue) {
await pref.remove(key);
} else {
@ -264,6 +285,8 @@ class Settings extends ChangeNotifier {
Set<String> value,
Set<String> defaultValue,
) async {
key = id + '_' + key;
final eq = const SetEquality().equals;
if (eq(value, defaultValue)) {

View File

@ -1,5 +1,6 @@
import 'dart:io';
import 'package:gitjournal/settings.dart';
import 'package:path/path.dart' as p;
import 'package:shared_preferences/shared_preferences.dart';
@ -9,10 +10,7 @@ Future<void> migrateSettings(
SharedPreferences pref,
String gitBaseDir,
) async {
var version = pref.getInt('settingsVersion') ?? '-1';
if (version == -1) {
return;
}
var version = pref.getInt('settingsVersion') ?? -1;
if (version == 0) {
Log.i("Migrating settings from v0 -> v1");
@ -103,4 +101,78 @@ Future<void> migrateSettings(
version = 1;
await pref.setInt("settingsVersion", version);
}
if (version == 1) {
Log.i("Migrating settings from v1 -> v2");
var prefix = "${DEFAULT_ID}_";
var stringKeys = [
'gitAuthor',
'gitAuthorEmail',
'noteFileNameFormat',
'journalNoteFileNameFormat',
'yamlModifiedKey',
'yamlCreatedKey',
'yamlTagsKey',
'customMetaData',
'defaultNewNoteFolderSpec',
'journalEditordefaultNewNoteFolderSpec',
'remoteSyncFrequency',
'sortingField',
'sortingOrder',
'defaultEditor',
'defaultView',
'markdownDefaultView',
'markdownLastUsedView',
'folderViewHeaderType',
'homeScreen',
'imageLocationSpec',
'remoteGitRepoPath',
'sshPublicKey',
'sshPrivateKey',
'sshPassword',
'storageLocation',
];
for (var key in stringKeys) {
var value = pref.getString(key);
if (value != null) {
await pref.remove(key);
await pref.setString(prefix + key, value);
}
}
var boolKeys = [
'yamlHeaderEnabled',
'journalEditorSingleNote',
'showNoteSummary',
'emojiParser',
'zenMode',
'saveTitleInH1',
'swipeToDelete',
'bottomMenuBar',
'storeInternally',
];
for (var key in boolKeys) {
var value = pref.getBool(key);
if (value != null) {
await pref.remove(key);
await pref.setBool(prefix + key, value);
}
}
var stringListKeys = [
'inlineTagPrefixes',
];
for (var key in stringListKeys) {
var value = pref.getStringList(key);
if (value != null) {
await pref.remove(key);
await pref.setStringList(prefix + key, value);
}
}
version = 2;
await pref.remove("settingsVersion");
await pref.setInt(prefix + "settingsVersion", version);
}
}