diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 42f70db..3d0a176 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -386,14 +386,14 @@ SPEC CHECKSUMS: GoogleAppMeasurement: 1e718274b7e015cefd846ac1fcf7820c70dc017d GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 - image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a + image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326 libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 no_screenshot: 6d183496405a3ab709a67a54e5cd0f639e94729e package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 - path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 + path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880 permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 restart_app: 9cda5378aacc5000e3f66ee76a9201534e7d3ecf @@ -401,14 +401,14 @@ SPEC CHECKSUMS: SDWebImage: 16309af6d214ba3f77a7c6f6fdda888cb313a50a SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a - shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 + shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 sqlite3: 73513155ec6979715d3904ef53a8d68892d4032b sqlite3_flutter_libs: 83f8e9f5b6554077f1d93119fe20ebaa5f3a9ef1 SwiftProtobuf: 81e341191afbddd64aa031bd12862dccfab2f639 - url_launcher_ios: 694010445543906933d732453a59da0a173ae33d + url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b video_compress: f2133a07762889d67f0711ac831faa26f956980e - video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b + video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a video_thumbnail: b637e0ad5f588ca9945f6e2c927f73a69a661140 PODFILE CHECKSUM: 47470fbd5b59affa461eaf943ac57acce81e0ee8 diff --git a/lib/app.dart b/lib/app.dart index bc9f76b..acd726c 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -1,6 +1,9 @@ import 'dart:async'; +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:path/path.dart' show join; +import 'package:path_provider/path_provider.dart'; import 'package:provider/provider.dart'; import 'package:twonly/globals.dart'; import 'package:twonly/src/localization/generated/app_localizations.dart'; @@ -11,6 +14,7 @@ import 'package:twonly/src/views/components/app_outdated.dart'; import 'package:twonly/src/views/home.view.dart'; import 'package:twonly/src/views/onboarding/onboarding.view.dart'; import 'package:twonly/src/views/onboarding/register.view.dart'; +import 'package:twonly/src/views/updates/62_database_migration.view.dart'; class App extends StatefulWidget { const App({super.key}); @@ -144,36 +148,60 @@ class AppMainWidget extends StatefulWidget { } class _AppMainWidgetState extends State { - Future userCreated = isUserCreated(); - bool showOnboarding = true; + bool _isUserCreated = false; + bool _showDatabaseMigration = false; + bool _showOnboarding = true; + bool _isLoaded = false; + + @override + void initState() { + initAsync(); + super.initState(); + } + + Future initAsync() async { + _showDatabaseMigration = File( + join( + (await getApplicationSupportDirectory()).path, + 'twonly_database.sqlite', + ), + ).existsSync(); + + _isUserCreated = await isUserCreated(); + setState(() { + _isLoaded = true; + }); + } @override Widget build(BuildContext context) { + if (!_isLoaded) { + return Center(child: Container()); + } + + late Widget child; + + if (_showDatabaseMigration) { + child = const DatabaseMigrationView(); + } else if (_isUserCreated) { + child = HomeView( + initialPage: widget.initialPage, + ); + } else if (_showOnboarding) { + child = OnboardingView( + callbackOnSuccess: () => setState(() { + _showOnboarding = false; + }), + ); + } else { + child = RegisterView( + callbackOnSuccess: initAsync, + ); + } + return Stack( children: [ - FutureBuilder( - future: userCreated, - builder: (context, snapshot) { - if (!snapshot.hasData) { - return Center(child: Container()); - } else if (snapshot.data!) { - return HomeView( - initialPage: widget.initialPage, - ); - } else if (showOnboarding) { - return OnboardingView( - callbackOnSuccess: () => setState(() { - showOnboarding = false; - }), - ); - } - return RegisterView( - callbackOnSuccess: () => setState(() { - userCreated = isUserCreated(); - }), - ); - }, - ), + child, const AppOutdated(), ], ); diff --git a/lib/main.dart b/lib/main.dart index 19fee5c..c182e2c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,3 @@ -import 'dart:async'; - import 'package:camera/camera.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -12,7 +10,6 @@ import 'package:twonly/src/providers/settings.provider.dart'; import 'package:twonly/src/services/api.service.dart'; import 'package:twonly/src/services/api/mediafiles/media_background.service.dart'; import 'package:twonly/src/services/fcm.service.dart'; -import 'package:twonly/src/services/notifications/setup.notifications.dart'; import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/storage.dart'; @@ -27,9 +24,6 @@ void main() async { final user = await getUser(); if (user != null) { gUser = user; - if (user.isDemoUser) { - await deleteLocalUserData(); - } } final settingsController = SettingsChangeProvider(); @@ -37,7 +31,7 @@ void main() async { await settingsController.loadSettings(); await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); - unawaited(setupPushNotification()); + // unawaited(setupPushNotification()); gCameras = await availableCameras(); diff --git a/lib/src/database/daos/groups.dao.dart b/lib/src/database/daos/groups.dao.dart index cfd2157..3de814b 100644 --- a/lib/src/database/daos/groups.dao.dart +++ b/lib/src/database/daos/groups.dao.dart @@ -1,4 +1,5 @@ import 'package:drift/drift.dart'; +import 'package:hashlib/random.dart'; import 'package:twonly/src/database/tables/groups.table.dart'; import 'package:twonly/src/database/twonly.db.dart'; @@ -33,7 +34,11 @@ class GroupsDao extends DatabaseAccessor with _$GroupsDaoMixin { } Future insertGroup(GroupsCompanion group) async { - await into(groups).insert(group); + await into(groups).insert( + group.copyWith( + groupId: Value(uuid.v4()), + ), + ); } Future> getGroupContact(String groupId) async { diff --git a/lib/src/database/daos/mediafiles.dao.dart b/lib/src/database/daos/mediafiles.dao.dart index 872f73c..30e82a7 100644 --- a/lib/src/database/daos/mediafiles.dao.dart +++ b/lib/src/database/daos/mediafiles.dao.dart @@ -1,4 +1,5 @@ import 'package:drift/drift.dart'; +import 'package:hashlib/random.dart'; import 'package:twonly/src/database/tables/mediafiles.table.dart'; import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/utils/log.dart'; @@ -15,7 +16,11 @@ class MediaFilesDao extends DatabaseAccessor Future insertMedia(MediaFilesCompanion mediaFile) async { try { - final rowId = await into(mediaFiles).insert(mediaFile); + final rowId = await into(mediaFiles).insert( + mediaFile.copyWith( + mediaId: Value(uuid.v7()), + ), + ); return await (select(mediaFiles)..where((t) => t.rowId.equals(rowId))) .getSingle(); diff --git a/lib/src/database/daos/messages.dao.dart b/lib/src/database/daos/messages.dao.dart index 9a7829a..f892173 100644 --- a/lib/src/database/daos/messages.dao.dart +++ b/lib/src/database/daos/messages.dao.dart @@ -1,4 +1,5 @@ import 'package:drift/drift.dart'; +import 'package:hashlib/random.dart'; import 'package:twonly/globals.dart'; import 'package:twonly/src/database/tables/contacts.table.dart'; import 'package:twonly/src/database/tables/groups.table.dart'; @@ -290,7 +291,11 @@ class MessagesDao extends DatabaseAccessor with _$MessagesDaoMixin { Future insertMessage(MessagesCompanion message) async { try { - final rowId = await into(messages).insert(message); + final rowId = await into(messages).insert( + message.copyWith( + messageId: Value(uuid.v7()), + ), + ); await twonlyDB.groupsDao.updateGroup( message.groupId.value, diff --git a/lib/src/database/daos/receipts.dao.dart b/lib/src/database/daos/receipts.dao.dart index 01df2f9..03453e2 100644 --- a/lib/src/database/daos/receipts.dao.dart +++ b/lib/src/database/daos/receipts.dao.dart @@ -1,4 +1,5 @@ import 'package:drift/drift.dart'; +import 'package:hashlib/random.dart'; import 'package:twonly/src/database/tables/messages.table.dart'; import 'package:twonly/src/database/tables/receipts.table.dart'; import 'package:twonly/src/database/twonly.db.dart'; @@ -51,7 +52,11 @@ class ReceiptsDao extends DatabaseAccessor with _$ReceiptsDaoMixin { Future insertReceipt(ReceiptsCompanion entry) async { try { - final id = await into(receipts).insert(entry); + final id = await into(receipts).insert( + entry.copyWith( + receiptId: Value(uuid.v4()), + ), + ); return await (select(receipts)..where((t) => t.rowId.equals(id))) .getSingle(); } catch (e) { diff --git a/lib/src/database/tables/groups.table.dart b/lib/src/database/tables/groups.table.dart index 674f2ac..bd1ad71 100644 --- a/lib/src/database/tables/groups.table.dart +++ b/lib/src/database/tables/groups.table.dart @@ -1,10 +1,9 @@ import 'package:drift/drift.dart'; -import 'package:hashlib/random.dart'; import 'package:twonly/src/database/tables/contacts.table.dart'; @DataClassName('Group') class Groups extends Table { - TextColumn get groupId => text().clientDefault(() => uuid.v4())(); + TextColumn get groupId => text()(); BoolColumn get isGroupAdmin => boolean()(); BoolColumn get isDirectChat => boolean()(); diff --git a/lib/src/database/tables/mediafiles.table.dart b/lib/src/database/tables/mediafiles.table.dart index 26b9a8d..15ba964 100644 --- a/lib/src/database/tables/mediafiles.table.dart +++ b/lib/src/database/tables/mediafiles.table.dart @@ -1,7 +1,5 @@ import 'dart:convert'; - import 'package:drift/drift.dart'; -import 'package:hashlib/random.dart'; enum MediaType { image, @@ -36,7 +34,7 @@ enum DownloadState { @DataClassName('MediaFile') class MediaFiles extends Table { - TextColumn get mediaId => text().clientDefault(() => uuid.v7())(); + TextColumn get mediaId => text()(); TextColumn get type => textEnum()(); diff --git a/lib/src/database/tables/messages.table.dart b/lib/src/database/tables/messages.table.dart index 0e1c70d..cff2f6d 100644 --- a/lib/src/database/tables/messages.table.dart +++ b/lib/src/database/tables/messages.table.dart @@ -1,5 +1,4 @@ import 'package:drift/drift.dart'; -import 'package:hashlib/random.dart'; import 'package:twonly/src/database/tables/contacts.table.dart'; import 'package:twonly/src/database/tables/groups.table.dart'; import 'package:twonly/src/database/tables/mediafiles.table.dart'; @@ -10,7 +9,7 @@ enum MessageType { media, text } class Messages extends Table { TextColumn get groupId => text().references(Groups, #groupId, onDelete: KeyAction.cascade)(); - TextColumn get messageId => text().clientDefault(() => uuid.v7())(); + TextColumn get messageId => text()(); // in case senderId is null, it was send by user itself IntColumn get senderId => diff --git a/lib/src/database/tables/receipts.table.dart b/lib/src/database/tables/receipts.table.dart index c0fa4e6..997b208 100644 --- a/lib/src/database/tables/receipts.table.dart +++ b/lib/src/database/tables/receipts.table.dart @@ -1,11 +1,10 @@ import 'package:drift/drift.dart'; -import 'package:hashlib/random.dart'; import 'package:twonly/src/database/tables/contacts.table.dart'; import 'package:twonly/src/database/tables/messages.table.dart'; @DataClassName('Receipt') class Receipts extends Table { - TextColumn get receiptId => text().clientDefault(() => uuid.v4())(); + TextColumn get receiptId => text()(); IntColumn get contactId => integer().references(Contacts, #userId, onDelete: KeyAction.cascade)(); diff --git a/lib/src/database/twonly.db.g.dart b/lib/src/database/twonly.db.g.dart index de4a722..0a25803 100644 --- a/lib/src/database/twonly.db.g.dart +++ b/lib/src/database/twonly.db.g.dart @@ -606,9 +606,7 @@ class $GroupsTable extends Groups with TableInfo<$GroupsTable, Group> { @override late final GeneratedColumn groupId = GeneratedColumn( 'group_id', aliasedName, false, - type: DriftSqlType.string, - requiredDuringInsert: false, - clientDefault: () => uuid.v4()); + type: DriftSqlType.string, requiredDuringInsert: true); static const VerificationMeta _isGroupAdminMeta = const VerificationMeta('isGroupAdmin'); @override @@ -759,6 +757,8 @@ class $GroupsTable extends Groups with TableInfo<$GroupsTable, Group> { if (data.containsKey('group_id')) { context.handle(_groupIdMeta, groupId.isAcceptableOrUnknown(data['group_id']!, _groupIdMeta)); + } else if (isInserting) { + context.missing(_groupIdMeta); } if (data.containsKey('is_group_admin')) { context.handle( @@ -1239,7 +1239,7 @@ class GroupsCompanion extends UpdateCompanion { this.rowid = const Value.absent(), }); GroupsCompanion.insert({ - this.groupId = const Value.absent(), + required String groupId, required bool isGroupAdmin, required bool isDirectChat, this.pinned = const Value.absent(), @@ -1256,7 +1256,8 @@ class GroupsCompanion extends UpdateCompanion { this.flameCounter = const Value.absent(), this.lastMessageExchange = const Value.absent(), this.rowid = const Value.absent(), - }) : isGroupAdmin = Value(isGroupAdmin), + }) : groupId = Value(groupId), + isGroupAdmin = Value(isGroupAdmin), isDirectChat = Value(isDirectChat), groupName = Value(groupName); static Insertable custom({ @@ -1442,9 +1443,7 @@ class $MediaFilesTable extends MediaFiles @override late final GeneratedColumn mediaId = GeneratedColumn( 'media_id', aliasedName, false, - type: DriftSqlType.string, - requiredDuringInsert: false, - clientDefault: () => uuid.v7()); + type: DriftSqlType.string, requiredDuringInsert: true); @override late final GeneratedColumnWithTypeConverter type = GeneratedColumn('type', aliasedName, false, @@ -1566,6 +1565,8 @@ class $MediaFilesTable extends MediaFiles if (data.containsKey('media_id')) { context.handle(_mediaIdMeta, mediaId.isAcceptableOrUnknown(data['media_id']!, _mediaIdMeta)); + } else if (isInserting) { + context.missing(_mediaIdMeta); } if (data.containsKey('requires_authentication')) { context.handle( @@ -2020,7 +2021,7 @@ class MediaFilesCompanion extends UpdateCompanion { this.rowid = const Value.absent(), }); MediaFilesCompanion.insert({ - this.mediaId = const Value.absent(), + required String mediaId, required MediaType type, this.uploadState = const Value.absent(), this.downloadState = const Value.absent(), @@ -2035,7 +2036,8 @@ class MediaFilesCompanion extends UpdateCompanion { this.encryptionNonce = const Value.absent(), this.createdAt = const Value.absent(), this.rowid = const Value.absent(), - }) : type = Value(type); + }) : mediaId = Value(mediaId), + type = Value(type); static Insertable custom({ Expression? mediaId, Expression? type, @@ -2212,9 +2214,7 @@ class $MessagesTable extends Messages with TableInfo<$MessagesTable, Message> { @override late final GeneratedColumn messageId = GeneratedColumn( 'message_id', aliasedName, false, - type: DriftSqlType.string, - requiredDuringInsert: false, - clientDefault: () => uuid.v7()); + type: DriftSqlType.string, requiredDuringInsert: true); static const VerificationMeta _senderIdMeta = const VerificationMeta('senderId'); @override @@ -2334,6 +2334,8 @@ class $MessagesTable extends Messages with TableInfo<$MessagesTable, Message> { if (data.containsKey('message_id')) { context.handle(_messageIdMeta, messageId.isAcceptableOrUnknown(data['message_id']!, _messageIdMeta)); + } else if (isInserting) { + context.missing(_messageIdMeta); } if (data.containsKey('sender_id')) { context.handle(_senderIdMeta, @@ -2714,7 +2716,7 @@ class MessagesCompanion extends UpdateCompanion { }); MessagesCompanion.insert({ required String groupId, - this.messageId = const Value.absent(), + required String messageId, this.senderId = const Value.absent(), required MessageType type, this.content = const Value.absent(), @@ -2728,6 +2730,7 @@ class MessagesCompanion extends UpdateCompanion { this.modifiedAt = const Value.absent(), this.rowid = const Value.absent(), }) : groupId = Value(groupId), + messageId = Value(messageId), type = Value(type); static Insertable custom({ Expression? groupId, @@ -3744,9 +3747,7 @@ class $ReceiptsTable extends Receipts with TableInfo<$ReceiptsTable, Receipt> { @override late final GeneratedColumn receiptId = GeneratedColumn( 'receipt_id', aliasedName, false, - type: DriftSqlType.string, - requiredDuringInsert: false, - clientDefault: () => uuid.v4()); + type: DriftSqlType.string, requiredDuringInsert: true); static const VerificationMeta _contactIdMeta = const VerificationMeta('contactId'); @override @@ -3834,6 +3835,8 @@ class $ReceiptsTable extends Receipts with TableInfo<$ReceiptsTable, Receipt> { if (data.containsKey('receipt_id')) { context.handle(_receiptIdMeta, receiptId.isAcceptableOrUnknown(data['receipt_id']!, _receiptIdMeta)); + } else if (isInserting) { + context.missing(_receiptIdMeta); } if (data.containsKey('contact_id')) { context.handle(_contactIdMeta, @@ -4119,7 +4122,7 @@ class ReceiptsCompanion extends UpdateCompanion { this.rowid = const Value.absent(), }); ReceiptsCompanion.insert({ - this.receiptId = const Value.absent(), + required String receiptId, required int contactId, this.messageId = const Value.absent(), required Uint8List message, @@ -4129,7 +4132,8 @@ class ReceiptsCompanion extends UpdateCompanion { this.lastRetry = const Value.absent(), this.createdAt = const Value.absent(), this.rowid = const Value.absent(), - }) : contactId = Value(contactId), + }) : receiptId = Value(receiptId), + contactId = Value(contactId), message = Value(message); static Insertable custom({ Expression? receiptId, @@ -6992,7 +6996,7 @@ typedef $$ContactsTableProcessedTableManager = ProcessedTableManager< bool signalContactPreKeysRefs, bool signalContactSignedPreKeysRefs})>; typedef $$GroupsTableCreateCompanionBuilder = GroupsCompanion Function({ - Value groupId, + required String groupId, required bool isGroupAdmin, required bool isDirectChat, Value pinned, @@ -7346,7 +7350,7 @@ class $$GroupsTableTableManager extends RootTableManager< rowid: rowid, ), createCompanionCallback: ({ - Value groupId = const Value.absent(), + required String groupId, required bool isGroupAdmin, required bool isDirectChat, Value pinned = const Value.absent(), @@ -7425,7 +7429,7 @@ typedef $$GroupsTableProcessedTableManager = ProcessedTableManager< Group, PrefetchHooks Function({bool messagesRefs})>; typedef $$MediaFilesTableCreateCompanionBuilder = MediaFilesCompanion Function({ - Value mediaId, + required String mediaId, required MediaType type, Value uploadState, Value downloadState, @@ -7758,7 +7762,7 @@ class $$MediaFilesTableTableManager extends RootTableManager< rowid: rowid, ), createCompanionCallback: ({ - Value mediaId = const Value.absent(), + required String mediaId, required MediaType type, Value uploadState = const Value.absent(), Value downloadState = const Value.absent(), @@ -7838,7 +7842,7 @@ typedef $$MediaFilesTableProcessedTableManager = ProcessedTableManager< PrefetchHooks Function({bool messagesRefs})>; typedef $$MessagesTableCreateCompanionBuilder = MessagesCompanion Function({ required String groupId, - Value messageId, + required String messageId, Value senderId, required MessageType type, Value content, @@ -8587,7 +8591,7 @@ class $$MessagesTableTableManager extends RootTableManager< ), createCompanionCallback: ({ required String groupId, - Value messageId = const Value.absent(), + required String messageId, Value senderId = const Value.absent(), required MessageType type, Value content = const Value.absent(), @@ -9647,7 +9651,7 @@ typedef $$GroupMembersTableProcessedTableManager = ProcessedTableManager< GroupMember, PrefetchHooks Function({bool contactId})>; typedef $$ReceiptsTableCreateCompanionBuilder = ReceiptsCompanion Function({ - Value receiptId, + required String receiptId, required int contactId, Value messageId, required Uint8List message, @@ -9969,7 +9973,7 @@ class $$ReceiptsTableTableManager extends RootTableManager< rowid: rowid, ), createCompanionCallback: ({ - Value receiptId = const Value.absent(), + required String receiptId, required int contactId, Value messageId = const Value.absent(), required Uint8List message, diff --git a/lib/src/model/json/userdata.dart b/lib/src/model/json/userdata.dart index 00614b0..98a9cd9 100644 --- a/lib/src/model/json/userdata.dart +++ b/lib/src/model/json/userdata.dart @@ -9,16 +9,12 @@ class UserData { required this.username, required this.displayName, required this.subscriptionPlan, - required this.isDemoUser, }); factory UserData.fromJson(Map json) => _$UserDataFromJson(json); final int userId; - @JsonKey(defaultValue: false) - bool isDemoUser = false; - // -- USER PROFILE -- String username; diff --git a/lib/src/model/json/userdata.g.dart b/lib/src/model/json/userdata.g.dart index dd475e8..9336cdf 100644 --- a/lib/src/model/json/userdata.g.dart +++ b/lib/src/model/json/userdata.g.dart @@ -11,7 +11,6 @@ UserData _$UserDataFromJson(Map json) => UserData( username: json['username'] as String, displayName: json['displayName'] as String, subscriptionPlan: json['subscriptionPlan'] as String? ?? 'Free', - isDemoUser: json['isDemoUser'] as bool? ?? false, ) ..avatarSvg = json['avatarSvg'] as String? ..avatarJson = json['avatarJson'] as String? @@ -74,7 +73,6 @@ UserData _$UserDataFromJson(Map json) => UserData( Map _$UserDataToJson(UserData instance) => { 'userId': instance.userId, - 'isDemoUser': instance.isDemoUser, 'username': instance.username, 'displayName': instance.displayName, 'avatarSvg': instance.avatarSvg, diff --git a/lib/src/services/api.service.dart b/lib/src/services/api.service.dart index a30e8cc..79a9dc3 100644 --- a/lib/src/services/api.service.dart +++ b/lib/src/services/api.service.dart @@ -157,7 +157,7 @@ class ApiService { reconnectionTimer?.cancel(); reconnectionTimer = null; final user = await getUser(); - if (user != null && user.isDemoUser) { + if (user != null) { globalCallbackConnectionState(isConnected: true); return false; } diff --git a/lib/src/services/twonly_safe/create_backup.twonly_safe.dart b/lib/src/services/twonly_safe/create_backup.twonly_safe.dart index 138c623..42bc911 100644 --- a/lib/src/services/twonly_safe/create_backup.twonly_safe.dart +++ b/lib/src/services/twonly_safe/create_backup.twonly_safe.dart @@ -23,7 +23,7 @@ import 'package:twonly/src/views/settings/backup/backup.view.dart'; Future performTwonlySafeBackup({bool force = false}) async { final user = await getUser(); - if (user == null || user.twonlySafeBackup == null || user.isDemoUser) { + if (user == null || user.twonlySafeBackup == null) { return; } diff --git a/lib/src/views/onboarding/register.view.dart b/lib/src/views/onboarding/register.view.dart index 8e8d2af..7f6dd27 100644 --- a/lib/src/views/onboarding/register.view.dart +++ b/lib/src/views/onboarding/register.view.dart @@ -84,7 +84,6 @@ class _RegisterViewState extends State { username: username, displayName: username, subscriptionPlan: 'Preview', - isDemoUser: false, ); await const FlutterSecureStorage() diff --git a/lib/src/views/updates/62_database_migration.view.dart b/lib/src/views/updates/62_database_migration.view.dart new file mode 100644 index 0000000..6e8e663 --- /dev/null +++ b/lib/src/views/updates/62_database_migration.view.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class DatabaseMigrationView extends StatefulWidget { + const DatabaseMigrationView({super.key}); + + @override + State createState() => _DatabaseMigrationViewState(); +} + +class _DatabaseMigrationViewState extends State { + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} diff --git a/pubspec.lock b/pubspec.lock index 7c121f6..99827f9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -101,18 +101,18 @@ packages: dependency: transitive description: name: build_daemon - sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" + sha256: "409002f1adeea601018715d613115cfaf0e31f512cb80ae4534c79867ae2363d" url: "https://pub.dev" source: hosted - version: "4.0.4" + version: "4.1.0" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "4e54dbeefdc70691ba80b3bce3976af63b5425c8c07dface348dfee664a0edc1" + sha256: a9461b8e586bf018dd4afd2e13b49b08c6a844a4b226c8d1d10f3a723cdd78c3 url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.1" built_collection: dependency: transitive description: @@ -157,10 +157,10 @@ packages: dependency: "direct main" description: name: camera - sha256: d6ec2cbdbe2fa8f5e0d07d8c06368fe4effa985a4a5ddade9cc58a8cd849557d + sha256: "87a27e0553e3432119c1c2f6e4b9a1bbf7d2c660552b910bfa59185a9facd632" url: "https://pub.dev" source: hosted - version: "0.11.2" + version: "0.11.2+1" camera_android_camerax: dependency: "direct overridden" description: @@ -174,10 +174,10 @@ packages: dependency: transitive description: name: camera_avfoundation - sha256: "397f44f8a63c8c0a474668d500f9739d4f2bc45ac2b21801194b7d29260f03ee" + sha256: "34bcd5db30e52414f1f0783c5e3f566909fab14141a21b3b576c78bd35382bf6" url: "https://pub.dev" source: hosted - version: "0.9.22+1" + version: "0.9.22+4" camera_platform_interface: dependency: transitive description: @@ -334,10 +334,10 @@ packages: dependency: "direct main" description: name: device_info_plus - sha256: "49413c8ca514dea7633e8def233b25efdf83ec8522955cc2c0e3ad802927e7c6" + sha256: dd0e8e02186b2196c7848c9d394a5fd6e5b57a43a546082c5820b1ec72317e33 url: "https://pub.dev" source: hosted - version: "12.1.0" + version: "12.2.0" device_info_plus_platform_interface: dependency: transitive description: @@ -358,18 +358,18 @@ packages: dependency: "direct main" description: name: drift - sha256: "540cf382a3bfa99b76e51514db5b0ebcd81ce3679b7c1c9cb9478ff3735e47a1" + sha256: "83290a32ae006a7535c5ecf300722cb77177250d9df4ee2becc5fa8a36095114" url: "https://pub.dev" source: hosted - version: "2.28.2" + version: "2.29.0" drift_dev: dependency: "direct dev" description: name: drift_dev - sha256: "4db0eeedc7e8bed117a9f22d867ab7a3a294300fed5c269aac90d0b3545967ca" + sha256: "6019f827544e77524ffd5134ae0cb75dfd92ef5ef3e269872af92840c929cd43" url: "https://pub.dev" source: hosted - version: "2.28.3" + version: "2.29.0" drift_flutter: dependency: "direct main" description: @@ -422,10 +422,10 @@ packages: dependency: transitive description: name: file_selector_macos - sha256: "19124ff4a3d8864fdc62072b6a2ef6c222d55a3404fe14893a3c02744907b60c" + sha256: "88707a3bec4b988aaed3b4df5d7441ee4e987f20b286cddca5d6a8270cab23f2" url: "https://pub.dev" source: hosted - version: "0.9.4+4" + version: "0.9.4+5" file_selector_platform_interface: dependency: transitive description: @@ -738,10 +738,10 @@ packages: dependency: "direct main" description: name: font_awesome_flutter - sha256: "27af5982e6c510dec1ba038eff634fa284676ee84e3fd807225c80c4ad869177" + sha256: b9011df3a1fa02993630b8fb83526368cf2206a711259830325bab2f1d2a4eb0 url: "https://pub.dev" source: hosted - version: "10.10.0" + version: "10.12.0" gal: dependency: "direct main" description: @@ -866,10 +866,10 @@ packages: dependency: transitive description: name: image_picker_ios - sha256: eb06fe30bab4c4497bad449b66448f50edcc695f1c59408e78aa3a8059eb8f0e + sha256: e675c22790bcc24e9abd455deead2b7a88de4b79f7327a281812f14de1a56f58 url: "https://pub.dev" source: hosted - version: "0.8.13" + version: "0.8.13+1" image_picker_linux: dependency: transitive description: @@ -882,18 +882,18 @@ packages: dependency: transitive description: name: image_picker_macos - sha256: d58cd9d67793d52beefd6585b12050af0a7663c0c2a6ece0fb110a35d6955e04 + sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" url: "https://pub.dev" source: hosted - version: "0.2.2" + version: "0.2.2+1" image_picker_platform_interface: dependency: transitive description: name: image_picker_platform_interface - sha256: "9f143b0dba3e459553209e20cc425c9801af48e6dfa4f01a0fcf927be3f41665" + sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.11.1" image_picker_windows: dependency: transitive description: @@ -1186,10 +1186,10 @@ packages: dependency: transitive description: name: path_provider_foundation - sha256: "16eef174aacb07e09c351502740fa6254c165757638eba1e9116b0a781201bbd" + sha256: efaec349ddfc181528345c56f8eda9d6cccd71c177511b132c6a0ddaefaa2738 url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.3" path_provider_linux: dependency: transitive description: @@ -1403,10 +1403,10 @@ packages: dependency: "direct main" description: name: share_plus - sha256: "3424e9d5c22fd7f7590254ba09465febd6f8827c8b19a44350de4ac31d92d3a6" + sha256: "14c8860d4de93d3a7e53af51bff479598c4e999605290756bbbe45cf65b37840" url: "https://pub.dev" source: hosted - version: "12.0.0" + version: "12.0.1" share_plus_platform_interface: dependency: transitive description: @@ -1435,10 +1435,10 @@ packages: dependency: transitive description: name: shared_preferences_foundation - sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" + sha256: "1c33a907142607c40a7542768ec9badfd16293bac51da3a4482623d15845f88b" url: "https://pub.dev" source: hosted - version: "2.5.4" + version: "2.5.5" shared_preferences_linux: dependency: transitive description: @@ -1584,10 +1584,10 @@ packages: dependency: transitive description: name: sqlparser - sha256: "57090342af1ce32bb499aa641f4ecdd2d6231b9403cea537ac059e803cc20d67" + sha256: "54eea43e36dd3769274c3108625f9ea1a382f8d2ac8b16f3e4589d9bd9b0e16c" url: "https://pub.dev" source: hosted - version: "0.41.2" + version: "0.42.0" stack_trace: dependency: transitive description: @@ -1688,10 +1688,10 @@ packages: dependency: transitive description: name: url_launcher_ios - sha256: d80b3f567a617cb923546034cc94bfe44eb15f989fe670b37f26abdb9d939cb7 + sha256: "6b63f1441e4f653ae799166a72b50b1767321ecc263a57aadf825a7a2a5477d9" url: "https://pub.dev" source: hosted - version: "6.3.4" + version: "6.3.5" url_launcher_linux: dependency: transitive description: @@ -1704,10 +1704,10 @@ packages: dependency: transitive description: name: url_launcher_macos - sha256: c043a77d6600ac9c38300567f33ef12b0ef4f4783a2c1f00231d2b1941fea13f + sha256: "8262208506252a3ed4ff5c0dc1e973d2c0e0ef337d0a074d35634da5d44397c9" url: "https://pub.dev" source: hosted - version: "3.2.3" + version: "3.2.4" url_launcher_platform_interface: dependency: transitive description: @@ -1808,10 +1808,10 @@ packages: dependency: transitive description: name: video_player_avfoundation - sha256: f9a780aac57802b2892f93787e5ea53b5f43cc57dc107bee9436458365be71cd + sha256: "19ed1162a7a5520e7d7791e0b7b73ba03161b6a69428b82e4689e435b325432d" url: "https://pub.dev" source: hosted - version: "2.8.4" + version: "2.8.5" video_player_platform_interface: dependency: transitive description: