Skip to content

Commit

Permalink
Merge pull request #1554 from nextcloud/refactor/neon_framework/storages
Browse files Browse the repository at this point in the history
refactor(neon_framework): introduce storage library
  • Loading branch information
Leptopoda authored Feb 1, 2024
2 parents 69d2b42 + c5c04ce commit 7a722d2
Show file tree
Hide file tree
Showing 32 changed files with 664 additions and 551 deletions.
5 changes: 5 additions & 0 deletions packages/neon/neon_dashboard/test/widget_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ void main() {
),
);

setUp(() {
final storage = MockNeonStorage();
when(() => storage.requestCache).thenReturn(null);
});

group('Widget item', () {
final item = dashboard.WidgetItem(
(b) => b
Expand Down
1 change: 1 addition & 0 deletions packages/neon/neon_files/lib/src/options.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:filesize/filesize.dart';
import 'package:neon_files/l10n/localizations.dart';
import 'package:neon_framework/settings.dart';
import 'package:neon_framework/sort_box.dart';
import 'package:neon_framework/storage.dart';

class FilesOptions extends AppImplementationOptions {
FilesOptions(super.storage) {
Expand Down
1 change: 1 addition & 0 deletions packages/neon/neon_news/lib/src/options.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:neon_framework/platform.dart';
import 'package:neon_framework/settings.dart';
import 'package:neon_framework/sort_box.dart';
import 'package:neon_framework/storage.dart';
import 'package:neon_news/l10n/localizations.dart';
import 'package:neon_news/src/blocs/articles.dart';

Expand Down
1 change: 1 addition & 0 deletions packages/neon/neon_notes/lib/src/options.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:neon_framework/settings.dart';
import 'package:neon_framework/sort_box.dart';
import 'package:neon_framework/storage.dart';
import 'package:neon_notes/l10n/localizations.dart';

class NotesOptions extends AppImplementationOptions {
Expand Down
6 changes: 2 additions & 4 deletions packages/neon_framework/lib/neon.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,11 @@ import 'package:neon_framework/src/models/account.dart';
import 'package:neon_framework/src/models/app_implementation.dart';
import 'package:neon_framework/src/models/disposable.dart';
import 'package:neon_framework/src/platform/platform.dart';
import 'package:neon_framework/src/settings/models/storage.dart';
import 'package:neon_framework/src/theme/neon.dart';
import 'package:neon_framework/src/utils/global_options.dart';
import 'package:neon_framework/src/utils/provider.dart';
import 'package:neon_framework/src/utils/request_manager.dart';
import 'package:neon_framework/src/utils/user_agent.dart';
import 'package:neon_framework/storage.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:provider/provider.dart';

Expand All @@ -35,8 +34,7 @@ Future<void> runNeon({
FlutterNativeSplash.preserve(widgetsBinding: binding);

await NeonPlatform.setup();
await RequestManager.instance.initCache();
await NeonStorage.init();
await NeonStorage().init();

final packageInfo = await PackageInfo.fromPlatform();
buildUserAgent(packageInfo);
Expand Down
1 change: 0 additions & 1 deletion packages/neon_framework/lib/settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,4 @@ export 'package:neon_framework/src/models/label_builder.dart';
export 'package:neon_framework/src/settings/models/option.dart';
export 'package:neon_framework/src/settings/models/options_category.dart';
export 'package:neon_framework/src/settings/models/options_collection.dart';
export 'package:neon_framework/src/settings/models/storage.dart' show Storable;
export 'package:neon_framework/src/settings/widgets/settings_list.dart';
23 changes: 10 additions & 13 deletions packages/neon_framework/lib/src/blocs/accounts.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,14 @@ import 'package:neon_framework/src/models/account.dart';
import 'package:neon_framework/src/models/account_cache.dart';
import 'package:neon_framework/src/models/app_implementation.dart';
import 'package:neon_framework/src/models/disposable.dart';
import 'package:neon_framework/src/settings/models/storage.dart';
import 'package:neon_framework/src/storage/keys.dart';
import 'package:neon_framework/src/utils/account_options.dart';
import 'package:neon_framework/src/utils/findable.dart';
import 'package:neon_framework/src/utils/global_options.dart';
import 'package:neon_framework/storage.dart';
import 'package:nextcloud/core.dart' as core;
import 'package:rxdart/rxdart.dart';

const _keyAccounts = 'accounts';

/// The Bloc responsible for managing the [Account]s
@sealed
abstract interface class AccountsBloc implements Disposable {
Expand Down Expand Up @@ -153,7 +152,7 @@ class _AccountsBloc extends Bloc implements AccountsBloc {
this.globalOptions,
this.allAppImplementations,
) {
const lastUsedStorage = SingleValueStorage(StorageKeys.lastUsedAccount);
final lastUsedStorage = NeonStorage().singleValueStore(StorageKeys.lastUsedAccount);

accounts
..add(loadAccounts())
Expand Down Expand Up @@ -313,7 +312,7 @@ class _AccountsBloc extends Bloc implements AccountsBloc {

@override
AccountOptions getOptionsFor(Account account) => accountsOptions[account] ??= AccountOptions(
AppStorage(StorageKeys.accounts, account.id),
NeonStorage().settingsStore(StorageKeys.accountOptions, account.id),
getAppsBlocFor(account),
);

Expand Down Expand Up @@ -369,21 +368,19 @@ class _AccountsBloc extends Bloc implements AccountsBloc {
///
/// It is not checked whether the stored information is still valid.
List<Account> loadAccounts() {
const storage = AppStorage(StorageKeys.accounts);
final storage = NeonStorage().singleValueStore(StorageKeys.accounts);

if (storage.containsKey(_keyAccounts)) {
return storage
.getStringList(_keyAccounts)!
.map((a) => Account.fromJson(json.decode(a) as Map<String, dynamic>))
.toList();
if (storage.hasValue()) {
return storage.getStringList()!.map((a) => Account.fromJson(json.decode(a) as Map<String, dynamic>)).toList();
}

return [];
}

/// Saves the given [accounts] to the storage.
Future<void> saveAccounts(List<Account> accounts) async {
const storage = AppStorage(StorageKeys.accounts);
final storage = NeonStorage().singleValueStore(StorageKeys.accounts);
final values = accounts.map((a) => json.encode(a.toJson())).toList();

await storage.setStringList(_keyAccounts, values);
await storage.setStringList(values);
}
5 changes: 3 additions & 2 deletions packages/neon_framework/lib/src/blocs/first_launch.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import 'dart:async';
import 'package:meta/meta.dart';
import 'package:neon_framework/src/bloc/bloc.dart';
import 'package:neon_framework/src/models/disposable.dart';
import 'package:neon_framework/src/settings/models/storage.dart';
import 'package:neon_framework/src/storage/keys.dart';
import 'package:neon_framework/storage.dart';
import 'package:rxdart/rxdart.dart';

/// Bloc that manages tasks that only need to run at the first launch of the app.
Expand All @@ -23,7 +24,7 @@ class _FirstLaunchBloc extends Bloc implements FirstLaunchBloc {
_FirstLaunchBloc({
bool disabled = false,
}) {
const storage = SingleValueStorage(StorageKeys.firstLaunch);
final storage = NeonStorage().singleValueStore(StorageKeys.firstLaunch);

if (!disabled && !storage.hasValue()) {
onFirstLaunch.add(null);
Expand Down
5 changes: 3 additions & 2 deletions packages/neon_framework/lib/src/blocs/push_notifications.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,11 @@ import 'package:neon_framework/src/bloc/bloc.dart';
import 'package:neon_framework/src/blocs/accounts.dart';
import 'package:neon_framework/src/models/account.dart';
import 'package:neon_framework/src/platform/platform.dart';
import 'package:neon_framework/src/settings/models/storage.dart';
import 'package:neon_framework/src/storage/keys.dart';
import 'package:neon_framework/src/utils/findable.dart';
import 'package:neon_framework/src/utils/global_options.dart';
import 'package:neon_framework/src/utils/push_utils.dart';
import 'package:neon_framework/storage.dart';
import 'package:nextcloud/notifications.dart' as notifications;
import 'package:unifiedpush/unifiedpush.dart';

Expand Down Expand Up @@ -42,7 +43,7 @@ class _PushNotificationsBloc extends Bloc implements PushNotificationsBloc {
}

final AccountsBloc accountsBloc;
late final storage = const AppStorage(StorageKeys.lastEndpoint);
late final storage = NeonStorage().settingsStore(StorageKeys.lastEndpoint);
final GlobalOptions globalOptions;

StreamSubscription<List<Account>>? accountsListener;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@ import 'package:neon_framework/src/models/account.dart';
import 'package:neon_framework/src/models/account_cache.dart';
import 'package:neon_framework/src/models/disposable.dart';
import 'package:neon_framework/src/settings/models/options_collection.dart';
import 'package:neon_framework/src/settings/models/storage.dart';
import 'package:neon_framework/src/storage/keys.dart';

import 'package:neon_framework/src/utils/findable.dart';
import 'package:neon_framework/src/utils/provider.dart';
import 'package:neon_framework/src/widgets/drawer_destination.dart';
import 'package:neon_framework/storage.dart';
import 'package:nextcloud/core.dart' as core;
import 'package:nextcloud/nextcloud.dart' show VersionCheck;
import 'package:provider/provider.dart';
Expand Down Expand Up @@ -46,9 +48,9 @@ abstract class AppImplementation<T extends Bloc, R extends AppImplementationOpti
/// Localized name of this app.
String name(BuildContext context) => nameFromLocalization(NeonLocalizations.of(context));

/// The [SettingsStorage] for this app.
/// The storage bucket for this app.
@protected
late final AppStorage storage = AppStorage(StorageKeys.apps, id);
late final SettingsStore storage = NeonStorage().settingsStore(StorageKeys.apps, id);

/// The options associated with this app.
///
Expand Down
6 changes: 3 additions & 3 deletions packages/neon_framework/lib/src/settings/models/option.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import 'package:meta/meta.dart';
import 'package:neon_framework/src/models/disposable.dart';
import 'package:neon_framework/src/models/label_builder.dart';
import 'package:neon_framework/src/settings/models/options_category.dart';
import 'package:neon_framework/src/settings/models/storage.dart';
import 'package:neon_framework/storage.dart';
import 'package:rxdart/rxdart.dart';

/// Listenable option that is persisted in the [SettingsStorage].
/// Listenable option that is persisted in the [SettingsStore].
///
/// See:
/// * [ToggleOption] for an Option<bool>
Expand Down Expand Up @@ -44,7 +44,7 @@ sealed class Option<T> extends ChangeNotifier implements ValueListenable<T>, Dis
}

/// Storage to persist the state.
final SettingsStorage storage;
final SettingsStore storage;

/// Storage key to save the state at.
final Storable key;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:neon_framework/src/models/disposable.dart';
import 'package:neon_framework/src/settings/models/exportable.dart';
import 'package:neon_framework/src/settings/models/option.dart';
import 'package:neon_framework/src/settings/models/options_category.dart';
import 'package:neon_framework/src/settings/models/storage.dart';
import 'package:neon_framework/storage.dart';

/// Collection of [Option]s.
abstract class OptionsCollection implements Exportable, Disposable {
Expand All @@ -12,7 +12,7 @@ abstract class OptionsCollection implements Exportable, Disposable {

/// Storage backend to use.
@protected
final AppStorage storage;
final SettingsStore storage;

/// Collection of options.
@protected
Expand Down
Loading

0 comments on commit 7a722d2

Please sign in to comment.