Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
lib/core/storage/schemas/**/drift_schema_v*.json linguist-generated
lib/core/storage/*.steps.dart linguist-generated
test/migrations_test/**/generated/*.dart linguist-generated
22 changes: 21 additions & 1 deletion lib/core/core_locator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import 'package:bb_mobile/core/ledger/ledger_locator.dart';
import 'package:bb_mobile/core/mempool/mempool_locator.dart';
import 'package:bb_mobile/core/recoverbull/recoverbull_locator.dart';
import 'package:bb_mobile/core/seed/seed_locator.dart';
import 'package:bb_mobile/core/settings/domain/repositories/settings_repository.dart'
as settings;
import 'package:bb_mobile/core/settings/settings_locator.dart';
import 'package:bb_mobile/core/storage/sqlite_database.dart';
import 'package:bb_mobile/core/storage/storage_locator.dart';
Expand Down Expand Up @@ -55,7 +57,25 @@ class CoreLocator {
}

static Future<void> registerRepositories(GetIt locator) async {
bull_tor.TorLocator.registerRepositories(locator);
await SettingsLocator.registerRepositories(locator);
final settingsRepository = locator<settings.SettingsRepository>();
final appSettings = await settingsRepository.fetch();
bull_tor.TorLocator.registerRepositories(
locator,
initialMode: appSettings.torTransportMode,
lastSuccessfulTransport: appSettings.lastSuccessfulTorTransport,
onSuccessfulTransport: (transport) async {
try {
await settingsRepository.setLastSuccessfulTorTransport(transport);
} catch (error, stackTrace) {
log.warning(
'Could not persist the successful Tor transport',
error: error,
trace: stackTrace,
);
}
},
);
BlockchainLocator.registerRepositories(locator);
ElectrumLocator.registerRepositories(locator);
ExchangeLocator.registerRepositories(locator);
Expand Down
16 changes: 16 additions & 0 deletions lib/core/settings/data/settings_datasource.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:bb_mobile/core/settings/data/settings_model.dart';
import 'package:bb_mobile/core/settings/domain/settings_entity.dart';
import 'package:bb_mobile/core/storage/sqlite_database.dart';
import 'package:drift/drift.dart';
import 'package:bull_tor/tor.dart';

class SettingsDatasource {
final SqliteDatabase _sqlite;
Expand Down Expand Up @@ -73,6 +74,21 @@ class SettingsDatasource {
);
}

Future<void> setTorTransportMode(TorTransportMode mode) async {
await _sqlite.managers.settings.update(
(f) => f(id: const Value(1), torTransportMode: Value(mode.name)),
);
}

Future<void> setLastSuccessfulTorTransport(TorTransport transport) async {
await _sqlite.managers.settings.update(
(f) => f(
id: const Value(1),
lastSuccessfulTorTransport: Value(transport.name),
),
);
}

Future<void> setThemeMode(AppThemeMode themeMode) async {
await _sqlite.managers.settings.update(
(f) => f(id: const Value(1), themeMode: Value(themeMode.name)),
Expand Down
16 changes: 16 additions & 0 deletions lib/core/settings/data/settings_model.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:bb_mobile/core/settings/domain/settings_entity.dart';
import 'package:bb_mobile/core/storage/sqlite_database.dart';
import 'package:bull_tor/tor.dart';

class SettingsModel {
final int id;
Expand All @@ -12,6 +13,8 @@ class SettingsModel {
final bool isDevModeEnabled;
final bool useTorProxy;
final int torProxyPort;
final TorTransportMode torTransportMode;
final TorTransport? lastSuccessfulTorTransport;
final AppThemeMode themeMode;
final bool isErrorReportingEnabled;
final String? exchangeTestnetBasicAuthUsername;
Expand All @@ -28,6 +31,8 @@ class SettingsModel {
required this.isDevModeEnabled,
required this.useTorProxy,
required this.torProxyPort,
required this.torTransportMode,
this.lastSuccessfulTorTransport,
required this.themeMode,
required this.isErrorReportingEnabled,
this.exchangeTestnetBasicAuthUsername,
Expand All @@ -46,6 +51,8 @@ class SettingsModel {
isDevModeEnabled: isDevModeEnabled,
useTorProxy: useTorProxy,
torProxyPort: torProxyPort,
torTransportMode: torTransportMode.name,
lastSuccessfulTorTransport: lastSuccessfulTorTransport?.name,
themeMode: themeMode.name,
isErrorReportingEnabled: isErrorReportingEnabled,
exchangeTestnetBasicAuthUsername: exchangeTestnetBasicAuthUsername,
Expand All @@ -65,6 +72,15 @@ class SettingsModel {
isDevModeEnabled: row.isDevModeEnabled,
useTorProxy: row.useTorProxy,
torProxyPort: row.torProxyPort,
torTransportMode: TorTransportMode.values.firstWhere(
(mode) => mode.name == row.torTransportMode,
orElse: () => TorTransportMode.automatic,
),
lastSuccessfulTorTransport: switch (row.lastSuccessfulTorTransport) {
'direct' => TorTransport.direct,
'snowflake' => TorTransport.snowflake,
_ => null,
},
themeMode: AppThemeMode.fromName(row.themeMode),
isErrorReportingEnabled: row.isErrorReportingEnabled,
exchangeTestnetBasicAuthUsername: row.exchangeTestnetBasicAuthUsername,
Expand Down
17 changes: 17 additions & 0 deletions lib/core/settings/data/settings_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:bb_mobile/core/settings/domain/repositories/settings_repository.
as domain;
import 'package:bb_mobile/core/settings/domain/settings_entity.dart';
import 'package:bb_mobile/core/utils/report.dart';
import 'package:bull_tor/tor.dart';

class SettingsRepository implements domain.SettingsRepository {
final SettingsDatasource _settingsDatasource;
Expand Down Expand Up @@ -34,6 +35,8 @@ class SettingsRepository implements domain.SettingsRepository {
required bool isDevModeEnabled,
required bool useTorProxy,
required int torProxyPort,
TorTransportMode torTransportMode = TorTransportMode.automatic,
TorTransport? lastSuccessfulTorTransport,
AppThemeMode themeMode = AppThemeMode.system,
bool isErrorReportingEnabled = false,
String? exchangeTestnetBasicAuthUsername,
Expand All @@ -51,6 +54,8 @@ class SettingsRepository implements domain.SettingsRepository {
isDevModeEnabled: isDevModeEnabled,
useTorProxy: useTorProxy,
torProxyPort: torProxyPort,
torTransportMode: torTransportMode,
lastSuccessfulTorTransport: lastSuccessfulTorTransport,
themeMode: themeMode,
isErrorReportingEnabled: isErrorReportingEnabled,
exchangeTestnetBasicAuthUsername: exchangeTestnetBasicAuthUsername,
Expand All @@ -73,6 +78,8 @@ class SettingsRepository implements domain.SettingsRepository {
isDevModeEnabled: s.isDevModeEnabled,
useTorProxy: s.useTorProxy,
torProxyPort: s.torProxyPort,
torTransportMode: s.torTransportMode,
lastSuccessfulTorTransport: s.lastSuccessfulTorTransport,
themeMode: s.themeMode,
isErrorReportingEnabled: s.isErrorReportingEnabled,
exchangeTestnetBasicAuthUsername: s.exchangeTestnetBasicAuthUsername,
Expand Down Expand Up @@ -126,6 +133,16 @@ class SettingsRepository implements domain.SettingsRepository {
await _settingsDatasource.setTorProxyPort(port);
}

@override
Future<void> setTorTransportMode(TorTransportMode mode) async {
await _settingsDatasource.setTorTransportMode(mode);
}

@override
Future<void> setLastSuccessfulTorTransport(TorTransport transport) async {
await _settingsDatasource.setLastSuccessfulTorTransport(transport);
}

@override
Future<void> setThemeMode(AppThemeMode themeMode) async {
await _settingsDatasource.setThemeMode(themeMode);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:async';

import 'package:bb_mobile/core/settings/domain/settings_entity.dart';
import 'package:bull_tor/tor.dart';

abstract class SettingsRepository {
Stream<String> get currencyChangeStream;
Expand All @@ -18,6 +19,8 @@ abstract class SettingsRepository {
required bool isDevModeEnabled,
required bool useTorProxy,
required int torProxyPort,
TorTransportMode torTransportMode = TorTransportMode.automatic,
TorTransport? lastSuccessfulTorTransport,
AppThemeMode themeMode = AppThemeMode.system,
bool isErrorReportingEnabled = false,
String? exchangeTestnetBasicAuthUsername,
Expand All @@ -44,6 +47,10 @@ abstract class SettingsRepository {

Future<void> setTorProxyPort(int port);

Future<void> setTorTransportMode(TorTransportMode mode);

Future<void> setLastSuccessfulTorTransport(TorTransport transport);

Future<void> setThemeMode(AppThemeMode themeMode);

Future<void> setErrorReportingEnabled(bool enabled);
Expand Down
3 changes: 3 additions & 0 deletions lib/core/settings/domain/settings_entity.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'dart:ui';
import 'package:bb_mobile/core/utils/logger.dart';
import 'package:flutter/material.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:bull_tor/tor.dart';

part 'settings_entity.freezed.dart';

Expand Down Expand Up @@ -141,6 +142,8 @@ abstract class SettingsEntity with _$SettingsEntity {
bool? isDevModeEnabled,
@Default(false) bool useTorProxy,
@Default(9050) int torProxyPort,
@Default(TorTransportMode.automatic) TorTransportMode torTransportMode,
TorTransport? lastSuccessfulTorTransport,
@Default(AppThemeMode.system) AppThemeMode themeMode,
@Default(false) bool isErrorReportingEnabled,
String? exchangeTestnetBasicAuthUsername,
Expand Down
1 change: 1 addition & 0 deletions lib/core/storage/database_seeds.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class DatabaseSeeds {
isDevModeEnabled: false,
useTorProxy: false,
torProxyPort: 9050,
torTransportMode: 'automatic',
themeMode: 'system',
isErrorReportingEnabled: false,
),
Expand Down
1 change: 1 addition & 0 deletions lib/core/storage/migrations/migrations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ export 'package:bb_mobile/core/storage/migrations/schema_10_to_11.dart';
export 'package:bb_mobile/core/storage/migrations/schema_11_to_12.dart';
export 'package:bb_mobile/core/storage/migrations/schema_12_to_13.dart';
export 'package:bb_mobile/core/storage/migrations/schema_13_to_14.dart';
export 'package:bb_mobile/core/storage/migrations/schema_14_to_15.dart';
export 'package:bb_mobile/core/storage/migrations/schema_1_to_2.dart';
export 'package:bb_mobile/core/storage/migrations/schema_2_to_3.dart';
export 'package:bb_mobile/core/storage/migrations/schema_3_to_4.dart';
Expand Down
10 changes: 5 additions & 5 deletions lib/core/storage/migrations/schema_13_to_14.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ import 'package:drift/drift.dart';
/// - Records which home announcements the user has dismissed (announcement id
/// + dismissal timestamp). New table, created empty.
///
/// Schema 14 also briefly carried the Payjoin policy columns on `settings` and
/// an `is_aborted` flag on the payjoin tables. Payjoin now owns its own
/// database (payjoin.sqlite, see the bull_payjoin package), and 14 was never
/// released — every tag up to v6.12.5 ships schema 13 — so those columns were
/// folded out of this step rather than added and then migrated away.
/// During development, schema 14 briefly carried the Payjoin policy columns on
/// `settings` and an `is_aborted` flag on the payjoin tables. Payjoin now owns
/// its own database (payjoin.sqlite, see the bull_payjoin package), so those
/// columns were folded out before schema 14 shipped in v6.13.0 rather than
/// added and then migrated away.
///
/// Adds the order_swaps table and indexes for crash-safe Exchange transfers.
/// The table includes the nullable quoted_amount_sat column used to validate
Expand Down
15 changes: 15 additions & 0 deletions lib/core/storage/migrations/schema_14_to_15.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import 'package:bb_mobile/core/storage/sqlite_database.steps.dart';
import 'package:drift/drift.dart';

/// Migration from version 14 to 15.
///
/// Adds the persisted Tor transport preferences to the settings table.
class Schema14To15 {
static Future<void> migrate(Migrator m, Schema15 schema15) async {
await m.addColumn(schema15.settings, schema15.settings.torTransportMode);
await m.addColumn(
schema15.settings,
schema15.settings.lastSuccessfulTorTransport,
);
}
}
Loading
Loading