diff --git a/lib/app.dart b/lib/app.dart index 67b06e5..7831a05 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:provider/provider.dart'; @@ -157,11 +158,13 @@ class _AppMainWidgetState extends State { bool _showOnboarding = true; bool _isLoaded = false; bool _skipBackup = false; + int _initialPage = 0; (Future?, bool) _proofOfWork = (null, false); @override void initState() { + _initialPage = widget.initialPage; initAsync(); super.initState(); } @@ -173,6 +176,9 @@ class _AppMainWidgetState extends State { if (gUser.appVersion < 62) { _showDatabaseMigration = true; } + if (!gUser.startWithCameraOpen) { + _initialPage = 0; + } } if (!_isUserCreated && !_showDatabaseMigration) { @@ -205,7 +211,7 @@ class _AppMainWidgetState extends State { if (_showDatabaseMigration) { child = const DatabaseMigrationView(); } else if (_isUserCreated) { - if (gUser.twonlySafeBackup == null && !_skipBackup) { + if (gUser.twonlySafeBackup == null && !_skipBackup && kReleaseMode) { child = TwonlyIdentityBackupView( callBack: () { _skipBackup = true; @@ -214,7 +220,7 @@ class _AppMainWidgetState extends State { ); } else { child = HomeView( - initialPage: widget.initialPage, + initialPage: _initialPage, ); } } else if (_showOnboarding) { diff --git a/lib/src/database/twonly.db.g.dart b/lib/src/database/twonly.db.g.dart index 264a8c7..91f1ba9 100644 --- a/lib/src/database/twonly.db.g.dart +++ b/lib/src/database/twonly.db.g.dart @@ -7111,10 +7111,7 @@ class $GroupHistoriesTable extends GroupHistories @override late final GeneratedColumn affectedContactId = GeneratedColumn( 'affected_contact_id', aliasedName, true, - type: DriftSqlType.int, - requiredDuringInsert: false, - defaultConstraints: - GeneratedColumn.constraintIsAlways('REFERENCES contacts (user_id)')); + type: DriftSqlType.int, requiredDuringInsert: false); static const VerificationMeta _oldGroupNameMeta = const VerificationMeta('oldGroupName'); @override @@ -7896,6 +7893,22 @@ final class $$ContactsTableReferences return ProcessedTableManager( manager.$state.copyWith(prefetchedData: cache)); } + + static MultiTypedResultKey<$GroupHistoriesTable, List> + _groupHistoriesRefsTable(_$TwonlyDB db) => + MultiTypedResultKey.fromTable(db.groupHistories, + aliasName: $_aliasNameGenerator( + db.contacts.userId, db.groupHistories.contactId)); + + $$GroupHistoriesTableProcessedTableManager get groupHistoriesRefs { + final manager = $$GroupHistoriesTableTableManager($_db, $_db.groupHistories) + .filter( + (f) => f.contactId.userId.sqlEquals($_itemColumn('user_id')!)); + + final cache = $_typedResult.readTableOrNull(_groupHistoriesRefsTable($_db)); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache)); + } } class $$ContactsTableFilterComposer @@ -8078,6 +8091,27 @@ class $$ContactsTableFilterComposer )); return f(composer); } + + Expression groupHistoriesRefs( + Expression Function($$GroupHistoriesTableFilterComposer f) f) { + final $$GroupHistoriesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.userId, + referencedTable: $db.groupHistories, + getReferencedColumn: (t) => t.contactId, + builder: (joinBuilder, + {$addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer}) => + $$GroupHistoriesTableFilterComposer( + $db: $db, + $table: $db.groupHistories, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + )); + return f(composer); + } } class $$ContactsTableOrderingComposer @@ -8311,6 +8345,27 @@ class $$ContactsTableAnnotationComposer )); return f(composer); } + + Expression groupHistoriesRefs( + Expression Function($$GroupHistoriesTableAnnotationComposer a) f) { + final $$GroupHistoriesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.userId, + referencedTable: $db.groupHistories, + getReferencedColumn: (t) => t.contactId, + builder: (joinBuilder, + {$addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer}) => + $$GroupHistoriesTableAnnotationComposer( + $db: $db, + $table: $db.groupHistories, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + )); + return f(composer); + } } class $$ContactsTableTableManager extends RootTableManager< @@ -8330,7 +8385,8 @@ class $$ContactsTableTableManager extends RootTableManager< bool groupMembersRefs, bool receiptsRefs, bool signalContactPreKeysRefs, - bool signalContactSignedPreKeysRefs})> { + bool signalContactSignedPreKeysRefs, + bool groupHistoriesRefs})> { $$ContactsTableTableManager(_$TwonlyDB db, $ContactsTable table) : super(TableManagerState( db: db, @@ -8411,7 +8467,8 @@ class $$ContactsTableTableManager extends RootTableManager< groupMembersRefs = false, receiptsRefs = false, signalContactPreKeysRefs = false, - signalContactSignedPreKeysRefs = false}) { + signalContactSignedPreKeysRefs = false, + groupHistoriesRefs = false}) { return PrefetchHooks( db: db, explicitlyWatchedTables: [ @@ -8421,7 +8478,8 @@ class $$ContactsTableTableManager extends RootTableManager< if (receiptsRefs) db.receipts, if (signalContactPreKeysRefs) db.signalContactPreKeys, if (signalContactSignedPreKeysRefs) - db.signalContactSignedPreKeys + db.signalContactSignedPreKeys, + if (groupHistoriesRefs) db.groupHistories ], addJoins: null, getPrefetchedDataCallback: (items) async { @@ -8501,6 +8559,19 @@ class $$ContactsTableTableManager extends RootTableManager< referencedItemsForCurrentItem: (item, referencedItems) => referencedItems .where((e) => e.contactId == item.userId), + typedResults: items), + if (groupHistoriesRefs) + await $_getPrefetchedData( + currentTable: table, + referencedTable: $$ContactsTableReferences + ._groupHistoriesRefsTable(db), + managerFromTypedResult: (p0) => + $$ContactsTableReferences(db, table, p0) + .groupHistoriesRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems + .where((e) => e.contactId == item.userId), typedResults: items) ]; }, @@ -8526,7 +8597,8 @@ typedef $$ContactsTableProcessedTableManager = ProcessedTableManager< bool groupMembersRefs, bool receiptsRefs, bool signalContactPreKeysRefs, - bool signalContactSignedPreKeysRefs})>; + bool signalContactSignedPreKeysRefs, + bool groupHistoriesRefs})>; typedef $$GroupsTableCreateCompanionBuilder = GroupsCompanion Function({ required String groupId, Value isGroupAdmin, @@ -13600,21 +13672,6 @@ final class $$GroupHistoriesTableReferences return ProcessedTableManager( manager.$state.copyWith(prefetchedData: [item])); } - - static $ContactsTable _affectedContactIdTable(_$TwonlyDB db) => - db.contacts.createAlias($_aliasNameGenerator( - db.groupHistories.affectedContactId, db.contacts.userId)); - - $$ContactsTableProcessedTableManager? get affectedContactId { - final $_column = $_itemColumn('affected_contact_id'); - if ($_column == null) return null; - final manager = $$ContactsTableTableManager($_db, $_db.contacts) - .filter((f) => f.userId.sqlEquals($_column)); - final item = $_typedResult.readTableOrNull(_affectedContactIdTable($_db)); - if (item == null) return manager; - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: [item])); - } } class $$GroupHistoriesTableFilterComposer @@ -13630,6 +13687,10 @@ class $$GroupHistoriesTableFilterComposer column: $table.groupHistoryId, builder: (column) => ColumnFilters(column)); + ColumnFilters get affectedContactId => $composableBuilder( + column: $table.affectedContactId, + builder: (column) => ColumnFilters(column)); + ColumnFilters get oldGroupName => $composableBuilder( column: $table.oldGroupName, builder: (column) => ColumnFilters(column)); @@ -13688,26 +13749,6 @@ class $$GroupHistoriesTableFilterComposer )); return composer; } - - $$ContactsTableFilterComposer get affectedContactId { - final $$ContactsTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.affectedContactId, - referencedTable: $db.contacts, - getReferencedColumn: (t) => t.userId, - builder: (joinBuilder, - {$addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer}) => - $$ContactsTableFilterComposer( - $db: $db, - $table: $db.contacts, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - )); - return composer; - } } class $$GroupHistoriesTableOrderingComposer @@ -13723,6 +13764,10 @@ class $$GroupHistoriesTableOrderingComposer column: $table.groupHistoryId, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get affectedContactId => $composableBuilder( + column: $table.affectedContactId, + builder: (column) => ColumnOrderings(column)); + ColumnOrderings get oldGroupName => $composableBuilder( column: $table.oldGroupName, builder: (column) => ColumnOrderings(column)); @@ -13781,26 +13826,6 @@ class $$GroupHistoriesTableOrderingComposer )); return composer; } - - $$ContactsTableOrderingComposer get affectedContactId { - final $$ContactsTableOrderingComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.affectedContactId, - referencedTable: $db.contacts, - getReferencedColumn: (t) => t.userId, - builder: (joinBuilder, - {$addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer}) => - $$ContactsTableOrderingComposer( - $db: $db, - $table: $db.contacts, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - )); - return composer; - } } class $$GroupHistoriesTableAnnotationComposer @@ -13815,6 +13840,9 @@ class $$GroupHistoriesTableAnnotationComposer GeneratedColumn get groupHistoryId => $composableBuilder( column: $table.groupHistoryId, builder: (column) => column); + GeneratedColumn get affectedContactId => $composableBuilder( + column: $table.affectedContactId, builder: (column) => column); + GeneratedColumn get oldGroupName => $composableBuilder( column: $table.oldGroupName, builder: (column) => column); @@ -13871,26 +13899,6 @@ class $$GroupHistoriesTableAnnotationComposer )); return composer; } - - $$ContactsTableAnnotationComposer get affectedContactId { - final $$ContactsTableAnnotationComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.affectedContactId, - referencedTable: $db.contacts, - getReferencedColumn: (t) => t.userId, - builder: (joinBuilder, - {$addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer}) => - $$ContactsTableAnnotationComposer( - $db: $db, - $table: $db.contacts, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - )); - return composer; - } } class $$GroupHistoriesTableTableManager extends RootTableManager< @@ -13904,8 +13912,7 @@ class $$GroupHistoriesTableTableManager extends RootTableManager< $$GroupHistoriesTableUpdateCompanionBuilder, (GroupHistory, $$GroupHistoriesTableReferences), GroupHistory, - PrefetchHooks Function( - {bool groupId, bool contactId, bool affectedContactId})> { + PrefetchHooks Function({bool groupId, bool contactId})> { $$GroupHistoriesTableTableManager(_$TwonlyDB db, $GroupHistoriesTable table) : super(TableManagerState( db: db, @@ -13974,8 +13981,7 @@ class $$GroupHistoriesTableTableManager extends RootTableManager< $$GroupHistoriesTableReferences(db, table, e) )) .toList(), - prefetchHooksCallback: ( - {groupId = false, contactId = false, affectedContactId = false}) { + prefetchHooksCallback: ({groupId = false, contactId = false}) { return PrefetchHooks( db: db, explicitlyWatchedTables: [], @@ -14014,17 +14020,6 @@ class $$GroupHistoriesTableTableManager extends RootTableManager< .userId, ) as T; } - if (affectedContactId) { - state = state.withJoin( - currentTable: table, - currentColumn: table.affectedContactId, - referencedTable: $$GroupHistoriesTableReferences - ._affectedContactIdTable(db), - referencedColumn: $$GroupHistoriesTableReferences - ._affectedContactIdTable(db) - .userId, - ) as T; - } return state; }, @@ -14047,8 +14042,7 @@ typedef $$GroupHistoriesTableProcessedTableManager = ProcessedTableManager< $$GroupHistoriesTableUpdateCompanionBuilder, (GroupHistory, $$GroupHistoriesTableReferences), GroupHistory, - PrefetchHooks Function( - {bool groupId, bool contactId, bool affectedContactId})>; + PrefetchHooks Function({bool groupId, bool contactId})>; class $TwonlyDBManager { final _$TwonlyDB _db; diff --git a/lib/src/localization/app_de.arb b/lib/src/localization/app_de.arb index 6b1b244..4b89568 100644 --- a/lib/src/localization/app_de.arb +++ b/lib/src/localization/app_de.arb @@ -456,5 +456,6 @@ "linkFromUsernameLong": "Wenn du den Link von der Person direkt erhalten hast, kannst du den Kontakt als verifiziert markieren, da der öffentliche Schlüssel im Link mit dem bereits für diesen Benutzer gespeicherten öffentlichen Schlüssel übereinstimmt.", "gotLinkFromFriend": "Ja, der Link kommt direkt von der Person.", "couldNotVerifyUsername": "{username} konnte nicht verifiziert werden", - "linkPubkeyDoesNotMatch": "Der öffentliche Schlüssel im Link stimmt nicht mit dem für diesen Kontakt gespeicherten öffentlichen Schlüssel überein. Triff die Person persönlich und scanne den QR-Code direkt!" + "linkPubkeyDoesNotMatch": "Der öffentliche Schlüssel im Link stimmt nicht mit dem für diesen Kontakt gespeicherten öffentlichen Schlüssel überein. Triff die Person persönlich und scanne den QR-Code direkt!", + "startWithCameraOpen": "Mit geöffneter Kamera starten" } \ No newline at end of file diff --git a/lib/src/localization/app_en.arb b/lib/src/localization/app_en.arb index 8610d62..1e17c59 100644 --- a/lib/src/localization/app_en.arb +++ b/lib/src/localization/app_en.arb @@ -486,5 +486,6 @@ "linkFromUsernameLong": "If you received the link from your friend, you can mark the user as verified, as the public key in the link matches the public key already stored for that user?", "gotLinkFromFriend": "Yes, I got the link from my friend!", "couldNotVerifyUsername": "Could not verify {username}", - "linkPubkeyDoesNotMatch": "The public key in the link does not match the public key stored for this contact. Try to meet your friend in person and scan the QR code directly!" + "linkPubkeyDoesNotMatch": "The public key in the link does not match the public key stored for this contact. Try to meet your friend in person and scan the QR code directly!", + "startWithCameraOpen": "Start with camera open" } \ No newline at end of file diff --git a/lib/src/localization/generated/app_localizations.dart b/lib/src/localization/generated/app_localizations.dart index dbc4bc6..a061df1 100644 --- a/lib/src/localization/generated/app_localizations.dart +++ b/lib/src/localization/generated/app_localizations.dart @@ -2839,6 +2839,12 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'The public key in the link does not match the public key stored for this contact. Try to meet your friend in person and scan the QR code directly!'** String get linkPubkeyDoesNotMatch; + + /// No description provided for @startWithCameraOpen. + /// + /// In en, this message translates to: + /// **'Start with camera open'** + String get startWithCameraOpen; } class _AppLocalizationsDelegate diff --git a/lib/src/localization/generated/app_localizations_de.dart b/lib/src/localization/generated/app_localizations_de.dart index 2907470..0773d7a 100644 --- a/lib/src/localization/generated/app_localizations_de.dart +++ b/lib/src/localization/generated/app_localizations_de.dart @@ -1570,4 +1570,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get linkPubkeyDoesNotMatch => 'Der öffentliche Schlüssel im Link stimmt nicht mit dem für diesen Kontakt gespeicherten öffentlichen Schlüssel überein. Triff die Person persönlich und scanne den QR-Code direkt!'; + + @override + String get startWithCameraOpen => 'Mit geöffneter Kamera starten'; } diff --git a/lib/src/localization/generated/app_localizations_en.dart b/lib/src/localization/generated/app_localizations_en.dart index b47d13d..90869f3 100644 --- a/lib/src/localization/generated/app_localizations_en.dart +++ b/lib/src/localization/generated/app_localizations_en.dart @@ -1560,4 +1560,7 @@ class AppLocalizationsEn extends AppLocalizations { @override String get linkPubkeyDoesNotMatch => 'The public key in the link does not match the public key stored for this contact. Try to meet your friend in person and scan the QR code directly!'; + + @override + String get startWithCameraOpen => 'Start with camera open'; } diff --git a/lib/src/model/json/userdata.dart b/lib/src/model/json/userdata.dart index cede1c9..e4547e5 100644 --- a/lib/src/model/json/userdata.dart +++ b/lib/src/model/json/userdata.dart @@ -59,6 +59,9 @@ class UserData { @JsonKey(defaultValue: true) bool showFeedbackShortcut = true; + @JsonKey(defaultValue: true) + bool startWithCameraOpen = true; + List? preSelectedEmojies; Map>? autoDownloadOptions; diff --git a/lib/src/model/json/userdata.g.dart b/lib/src/model/json/userdata.g.dart index 4816031..7e60f22 100644 --- a/lib/src/model/json/userdata.g.dart +++ b/lib/src/model/json/userdata.g.dart @@ -32,6 +32,7 @@ UserData _$UserDataFromJson(Map json) => UserData( ..requestedAudioPermission = json['requestedAudioPermission'] as bool? ?? false ..showFeedbackShortcut = json['showFeedbackShortcut'] as bool? ?? true + ..startWithCameraOpen = json['startWithCameraOpen'] as bool? ?? true ..preSelectedEmojies = (json['preSelectedEmojies'] as List?) ?.map((e) => e as String) .toList() @@ -61,7 +62,7 @@ UserData _$UserDataFromJson(Map json) => UserData( ..lastChangeLogHash = (json['lastChangeLogHash'] as List?) ?.map((e) => (e as num).toInt()) .toList() - ..hideChangeLog = json['hideChangeLog'] as bool? ?? false + ..hideChangeLog = json['hideChangeLog'] as bool? ?? true ..updateFCMToken = json['updateFCMToken'] as bool? ?? true ..nextTimeToShowBackupNotice = json['nextTimeToShowBackupNotice'] == null ? null @@ -93,6 +94,7 @@ Map _$UserDataToJson(UserData instance) => { 'defaultShowTime': instance.defaultShowTime, 'requestedAudioPermission': instance.requestedAudioPermission, 'showFeedbackShortcut': instance.showFeedbackShortcut, + 'startWithCameraOpen': instance.startWithCameraOpen, 'preSelectedEmojies': instance.preSelectedEmojies, 'autoDownloadOptions': instance.autoDownloadOptions, 'storeMediaFilesInGallery': instance.storeMediaFilesInGallery, diff --git a/lib/src/views/home.view.dart b/lib/src/views/home.view.dart index 282dfae..bb065a4 100644 --- a/lib/src/views/home.view.dart +++ b/lib/src/views/home.view.dart @@ -230,10 +230,10 @@ class HomeViewState extends State { final notificationAppLaunchDetails = await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails(); - if (notificationAppLaunchDetails != null) { - if (notificationAppLaunchDetails.didNotificationLaunchApp) { - globalUpdateOfHomeViewPageIndex(0); - } + if (widget.initialPage == 0 || + (notificationAppLaunchDetails != null && + notificationAppLaunchDetails.didNotificationLaunchApp)) { + globalUpdateOfHomeViewPageIndex(0); } final draftMedia = await twonlyDB.mediaFilesDao.getDraftMediaFile(); diff --git a/lib/src/views/settings/appearance.view.dart b/lib/src/views/settings/appearance.view.dart index 34e0688..8f8c338 100644 --- a/lib/src/views/settings/appearance.view.dart +++ b/lib/src/views/settings/appearance.view.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:twonly/globals.dart'; import 'package:twonly/src/providers/settings.provider.dart'; import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/storage.dart'; @@ -15,20 +16,9 @@ class AppearanceView extends StatefulWidget { } class _AppearanceViewState extends State { - bool showFeedbackShortcut = false; - @override void initState() { super.initState(); - unawaited(initAsync()); - } - - Future initAsync() async { - final user = await getUser(); - if (user == null) return; - setState(() { - showFeedbackShortcut = user.showFeedbackShortcut; - }); } Future _showSelectThemeMode(BuildContext context) async { @@ -87,7 +77,19 @@ class _AppearanceViewState extends State { u.showFeedbackShortcut = !u.showFeedbackShortcut; return u; }); - await initAsync(); + setState(() { + // gUser + }); + } + + Future toggleStartWithCameraOpen() async { + await updateUserdata((u) { + u.startWithCameraOpen = !u.startWithCameraOpen; + return u; + }); + setState(() { + // gUser + }); } @override @@ -113,10 +115,18 @@ class _AppearanceViewState extends State { title: Text(context.lang.contactUsShortcut), onTap: toggleShowFeedbackIcon, trailing: Switch( - value: !showFeedbackShortcut, + value: !gUser.showFeedbackShortcut, onChanged: (a) => toggleShowFeedbackIcon(), ), ), + ListTile( + title: Text(context.lang.startWithCameraOpen), + onTap: toggleStartWithCameraOpen, + trailing: Switch( + value: gUser.startWithCameraOpen, + onChanged: (a) => toggleStartWithCameraOpen(), + ), + ), ], ), );