Merge branch 'deprecation-and-library-upgrade-fixes' into 'main'

Deprecation and library upgrade fixes

See merge request mysocialportal/relatica!59
This commit is contained in:
HankG 2024-07-26 14:27:35 +00:00
commit a5aa0b71ce
50 changed files with 702 additions and 658 deletions

View file

@ -1,35 +1,35 @@
PODS:
- device_info_plus (0.0.1):
- Flutter
- DKImagePickerController/Core (4.3.4):
- DKImagePickerController/Core (4.3.9):
- DKImagePickerController/ImageDataManager
- DKImagePickerController/Resource
- DKImagePickerController/ImageDataManager (4.3.4)
- DKImagePickerController/PhotoGallery (4.3.4):
- DKImagePickerController/ImageDataManager (4.3.9)
- DKImagePickerController/PhotoGallery (4.3.9):
- DKImagePickerController/Core
- DKPhotoGallery
- DKImagePickerController/Resource (4.3.4)
- DKPhotoGallery (0.0.17):
- DKPhotoGallery/Core (= 0.0.17)
- DKPhotoGallery/Model (= 0.0.17)
- DKPhotoGallery/Preview (= 0.0.17)
- DKPhotoGallery/Resource (= 0.0.17)
- DKImagePickerController/Resource (4.3.9)
- DKPhotoGallery (0.0.19):
- DKPhotoGallery/Core (= 0.0.19)
- DKPhotoGallery/Model (= 0.0.19)
- DKPhotoGallery/Preview (= 0.0.19)
- DKPhotoGallery/Resource (= 0.0.19)
- SDWebImage
- SwiftyGif
- DKPhotoGallery/Core (0.0.17):
- DKPhotoGallery/Core (0.0.19):
- DKPhotoGallery/Model
- DKPhotoGallery/Preview
- SDWebImage
- SwiftyGif
- DKPhotoGallery/Model (0.0.17):
- DKPhotoGallery/Model (0.0.19):
- SDWebImage
- SwiftyGif
- DKPhotoGallery/Preview (0.0.17):
- DKPhotoGallery/Preview (0.0.19):
- DKPhotoGallery/Model
- DKPhotoGallery/Resource
- SDWebImage
- SwiftyGif
- DKPhotoGallery/Resource (0.0.17):
- DKPhotoGallery/Resource (0.0.19):
- SDWebImage
- SwiftyGif
- file_picker (0.0.1):
@ -42,9 +42,6 @@ PODS:
- Flutter
- flutter_web_auth_2 (3.0.0):
- Flutter
- FMDB (2.7.5):
- FMDB/standard (= 2.7.5)
- FMDB/standard (2.7.5)
- image_gallery_saver (2.0.2):
- Flutter
- image_picker_ios (0.0.1):
@ -55,10 +52,10 @@ PODS:
- Flutter
- media_kit_video (0.0.1):
- Flutter
- ObjectBox (1.9.0)
- ObjectBox (2.0.0)
- objectbox_flutter_libs (0.0.1):
- Flutter
- ObjectBox (= 1.9.0)
- ObjectBox (= 2.0.0)
- package_info_plus (0.4.5):
- Flutter
- path_provider_foundation (0.0.1):
@ -66,20 +63,21 @@ PODS:
- FlutterMacOS
- screen_brightness_ios (0.1.0):
- Flutter
- SDWebImage (5.18.3):
- SDWebImage/Core (= 5.18.3)
- SDWebImage/Core (5.18.3)
- SDWebImage (5.19.4):
- SDWebImage/Core (= 5.19.4)
- SDWebImage/Core (5.19.4)
- shared_preferences_foundation (0.0.1):
- Flutter
- FlutterMacOS
- sqflite (0.0.3):
- Flutter
- FMDB (>= 2.7.5)
- SwiftyGif (5.4.4)
- FlutterMacOS
- SwiftyGif (5.4.5)
- url_launcher_ios (0.0.1):
- Flutter
- video_player_avfoundation (0.0.1):
- Flutter
- FlutterMacOS
- volume_controller (0.0.1):
- Flutter
- wakelock_plus (0.0.1):
@ -102,9 +100,9 @@ DEPENDENCIES:
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- screen_brightness_ios (from `.symlinks/plugins/screen_brightness_ios/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- sqflite (from `.symlinks/plugins/sqflite/ios`)
- sqflite (from `.symlinks/plugins/sqflite/darwin`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/ios`)
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
- volume_controller (from `.symlinks/plugins/volume_controller/ios`)
- wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
@ -112,7 +110,6 @@ SPEC REPOS:
trunk:
- DKImagePickerController
- DKPhotoGallery
- FMDB
- ObjectBox
- SDWebImage
- SwiftyGif
@ -151,44 +148,43 @@ EXTERNAL SOURCES:
shared_preferences_foundation:
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
sqflite:
:path: ".symlinks/plugins/sqflite/ios"
:path: ".symlinks/plugins/sqflite/darwin"
url_launcher_ios:
:path: ".symlinks/plugins/url_launcher_ios/ios"
video_player_avfoundation:
:path: ".symlinks/plugins/video_player_avfoundation/ios"
:path: ".symlinks/plugins/video_player_avfoundation/darwin"
volume_controller:
:path: ".symlinks/plugins/volume_controller/ios"
wakelock_plus:
:path: ".symlinks/plugins/wakelock_plus/ios"
SPEC CHECKSUMS:
device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6
DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac
DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
file_picker: 15fd9539e4eb735dc54bae8c0534a7a9511a03de
device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
flutter_file_dialog: 4c014a45b105709a27391e266c277d7e588e9299
flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be
flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12
flutter_web_auth_2: 051cf9f5dc366f31b5dcc4e2952c2b954767be8a
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
image_gallery_saver: cb43cc43141711190510e92c460eb1655cd343cb
image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5
image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
media_kit_libs_ios_video: a5fe24bc7875ccd6378a0978c13185e1344651c1
media_kit_native_event_loop: e6b2ab20cf0746eb1c33be961fcf79667304fa2a
media_kit_video: 5da63f157170e5bf303bf85453b7ef6971218a2e
ObjectBox: e7ff611291a0663380e0736b46786bcd077294ff
objectbox_flutter_libs: 0948d6feb7de4f7edaebc7a898b9e85b7fc2bc89
package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85
path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943
ObjectBox: f5319bd9ad2ea960796eff7227e86471867e9ef0
objectbox_flutter_libs: c7748f6c6fda47d22f15c8062fb8208063fd948a
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
screen_brightness_ios: 715ca807df953bf676d339f11464e438143ee625
SDWebImage: 96e0c18ef14010b7485210e92fac888587ebb958
shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126
sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a
SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f
url_launcher_ios: 68d46cc9766d0c41dbdc884310529557e3cd7a86
video_player_avfoundation: 81e49bb3d9fb63dccf9fa0f6d877dc3ddbeac126
SDWebImage: 066c47b573f408f18caa467d71deace7c0f8280d
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3
volume_controller: 531ddf792994285c9b17f9d8a7e4dcdd29b3eae9
wakelock_plus: 8b09852c8876491e4b6d179e17dfe2a0b5f60d47
wakelock_plus: 78ec7c5b202cab7761af8e2b2b3d0671be6c4ae1
PODFILE CHECKSUM: 1df1bb3ed89ef4be6115286519e24a9fad12e640

View file

@ -1,5 +1,4 @@
import 'package:color_blindness/color_blindness.dart';
import 'package:color_blindness/color_blindness_color_scheme.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

View file

@ -63,10 +63,10 @@ class _MediaKitAvControlState extends State<MediaKitAvControl> {
width: widget.width,
height: widget.height,
color: Colors.black12,
child: Column(
child: const Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: const [
children: [
CircularProgressIndicator(),
],
),

View file

@ -27,7 +27,8 @@ class _VideoPlayerLibAvControlState extends State<VideoPlayerLibAvControl> {
@override
void initState() {
super.initState();
videoPlayerController = VideoPlayerController.network(widget.videoUrl);
videoPlayerController =
VideoPlayerController.networkUrl(Uri.parse(widget.videoUrl));
}
@override
@ -70,7 +71,7 @@ class _VideoPlayerLibAvControlState extends State<VideoPlayerLibAvControl> {
videoWidth = scaling * size.width;
videoHeight = scaling * size.height;
}
print('Video Width: $videoWidth, Video Height: $videoHeight');
return GestureDetector(
onTap: toggleVideoPlay,
child: Column(

View file

@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:provider/provider.dart';
import '../../models/connection.dart';
@ -9,8 +8,6 @@ import '../../utils/active_profile_selector.dart';
import '../image_control.dart';
class MentionAutocompleteOptions extends StatelessWidget {
static final _logger = Logger('$MentionAutocompleteOptions');
const MentionAutocompleteOptions({
super.key,
required this.id,

View file

@ -46,7 +46,7 @@ class _MediaUploadEditorControlState extends State<MediaUploadEditorControl> {
alignLabelWithHint: true,
border: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context).colorScheme.background,
color: Theme.of(context).colorScheme.surface,
),
borderRadius: BorderRadius.circular(5.0),
),
@ -74,7 +74,7 @@ class _MediaUploadEditorControlState extends State<MediaUploadEditorControl> {
alignLabelWithHint: true,
border: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context).colorScheme.background,
color: Theme.of(context).colorScheme.surface,
),
borderRadius: BorderRadius.circular(5.0),
),

View file

@ -112,7 +112,7 @@ class _MediaUploadsControlState extends State<MediaUploadsControl> {
alignLabelWithHint: true,
border: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context).colorScheme.background,
color: Theme.of(context).colorScheme.surface,
),
borderRadius: BorderRadius.circular(5.0),
),

View file

@ -38,11 +38,15 @@ class NotificationControl extends StatelessWidget {
}
final loadedPost = await manager.refreshStatusChain(notification.iid);
if (loadedPost.isSuccess) {
context.push('/post/view/${loadedPost.value.id}/${notification.iid}');
if (context.mounted) {
context.push('/post/view/${loadedPost.value.id}/${notification.iid}');
}
return;
}
buildSnackbar(
context, 'Error getting data for notification: ${loadedPost.error}');
if (context.mounted) {
buildSnackbar(
context, 'Error getting data for notification: ${loadedPost.error}');
}
}
@override
@ -171,7 +175,7 @@ class NotificationControl extends StatelessWidget {
void _tapProcessingStarted() {
_processingTap = true;
Future.delayed(Duration(seconds: 10), () => _processingTap = false);
Future.delayed(const Duration(seconds: 10), () => _processingTap = false);
}
void _tapProcessingStop() {

View file

@ -5,7 +5,7 @@ import 'package:relatica/controls/padding.dart';
import 'package:relatica/globals.dart';
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
import '../../models/TimelineIdentifiers.dart';
import '../../models/timeline_identifiers.dart';
import '../../services/network_status_service.dart';
import '../../services/setting_service.dart';
import '../../services/timeline_manager.dart';

View file

@ -8,7 +8,6 @@ import 'package:result_monad/result_monad.dart';
import '../friendica_client/paged_response.dart';
import '../globals.dart';
import '../models/TimelineIdentifiers.dart';
import '../models/auth/profile.dart';
import '../models/circle_data.dart';
import '../models/connection.dart';
@ -22,6 +21,7 @@ import '../models/media_attachment_uploads/image_types_enum.dart';
import '../models/search_results.dart';
import '../models/search_types.dart';
import '../models/timeline_entry.dart';
import '../models/timeline_identifiers.dart';
import '../models/user_notification.dart';
import '../models/visibility.dart';
import '../serializers/friendica/direct_message_friendica_extensions.dart';

View file

@ -1,5 +1,3 @@
import 'package:device_preview/device_preview.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:media_kit/media_kit.dart';
@ -38,7 +36,6 @@ void main() async {
getIt.registerSingleton<LogService>(logService);
// await dotenv.load(fileName: '.env');
const enablePreview = false;
Logger.root.level = Level.OFF;
Logger.root.onRecord.listen((event) {
logService.add(event);
@ -48,10 +45,12 @@ void main() async {
await dependencyInjectionInitialization();
await setupPackageInfoAndUserAgent();
runApp(DevicePreview(
enabled: !kReleaseMode && enablePreview,
builder: (context) => const App(),
));
// TODO Add back Device Preview once supported in Flutter 3.22+
// runApp(DevicePreview(
// enabled: !kReleaseMode && enablePreview,
// builder: (context) => const App(),
// ));
runApp(const App());
}
Future<void> setupPackageInfoAndUserAgent() async {
@ -70,7 +69,6 @@ class App extends StatelessWidget {
return AnimatedBuilder(
builder: (context, child) {
Logger.root.level = settingsService.logLevel;
print('Log level: ${settingsService.logLevel}');
return Portal(
child: MultiProvider(
providers: [
@ -142,8 +140,9 @@ class App extends StatelessWidget {
),
],
child: MaterialApp.router(
locale: DevicePreview.locale(context),
builder: DevicePreview.appBuilder,
// TODO Add back Device Preview once supported in Flutter 3.22+
// locale: DevicePreview.locale(context),
// builder: DevicePreview.appBuilder,
theme: buildTheme(
brightness: Brightness.light,
blindnessType: settingsService.colorBlindnessType,

View file

@ -1,6 +1,6 @@
import 'dart:convert';
import 'package:result_monad/src/result_monad_base.dart';
import 'package:result_monad/result_monad.dart';
import 'package:uuid/uuid.dart';
import '../exec_error.dart';

View file

@ -149,9 +149,11 @@ class OAuthCredentials implements ICredentials {
.setStatus('Attempting getting authorization to $serverName');
final result = await FlutterWebAuth2.authenticate(
url: url.toString(),
callbackUrlScheme: redirectScheme,
);
url: url.toString(),
callbackUrlScheme: redirectScheme,
options: const FlutterWebAuth2Options(
preferEphemeral: true,
));
final code = Uri.parse(result).queryParameters['code'];
if (code == null) {
_logger.severe(

View file

@ -5,6 +5,7 @@ class Connection {
@Id()
int obId;
@Transient()
ConnectionStatus status;
int get dbStatus => status.code;

View file

@ -1,5 +1,5 @@
import 'TimelineIdentifiers.dart';
import 'entry_tree_item.dart';
import 'timeline_identifiers.dart';
const defaultLowestId = 9223372036854775807;
const defaultHighestId = 0;

View file

@ -1,17 +1,17 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// This code was generated by ObjectBox. To update it run the generator again:
// With a Flutter package, run `flutter pub run build_runner build`.
// With a Dart package, run `dart run build_runner build`.
// This code was generated by ObjectBox. To update it run the generator again
// with `dart run build_runner build`.
// See also https://docs.objectbox.io/getting-started#generate-objectbox-code
// ignore_for_file: camel_case_types
// ignore_for_file: camel_case_types, depend_on_referenced_packages
// coverage:ignore-file
import 'dart:typed_data';
import 'package:flat_buffers/flat_buffers.dart' as fb;
import 'package:objectbox/internal.dart'; // generated code can access "internal" functionality
import 'package:objectbox/objectbox.dart';
import 'package:objectbox/internal.dart'
as obx_int; // generated code can access "internal" functionality
import 'package:objectbox/objectbox.dart' as obx;
import 'package:objectbox_flutter_libs/objectbox_flutter_libs.dart';
import 'models/connection.dart';
@ -19,143 +19,158 @@ import 'models/hashtag.dart';
export 'package:objectbox/objectbox.dart'; // so that callers only have to import this file
final _entities = <ModelEntity>[
ModelEntity(
id: const IdUid(1, 1213035855270739890),
final _entities = <obx_int.ModelEntity>[
obx_int.ModelEntity(
id: const obx_int.IdUid(1, 1213035855270739890),
name: 'Connection',
lastPropertyId: const IdUid(14, 7495390888349913259),
lastPropertyId: const obx_int.IdUid(14, 7495390888349913259),
flags: 0,
properties: <ModelProperty>[
ModelProperty(
id: const IdUid(1, 4133343279264917280),
properties: <obx_int.ModelProperty>[
obx_int.ModelProperty(
id: const obx_int.IdUid(1, 4133343279264917280),
name: 'obId',
type: 6,
flags: 1),
ModelProperty(
id: const IdUid(2, 3393770296096844708),
obx_int.ModelProperty(
id: const obx_int.IdUid(2, 3393770296096844708),
name: 'name',
type: 9,
flags: 0),
ModelProperty(
id: const IdUid(3, 5864801995210079539),
obx_int.ModelProperty(
id: const obx_int.IdUid(3, 5864801995210079539),
name: 'handle',
type: 9,
flags: 0),
ModelProperty(
id: const IdUid(4, 2926904168461994523),
obx_int.ModelProperty(
id: const obx_int.IdUid(4, 2926904168461994523),
name: 'id',
type: 9,
flags: 34848,
indexId: const IdUid(1, 8342366639839511243)),
ModelProperty(
id: const IdUid(5, 3621370552742492695),
indexId: const obx_int.IdUid(1, 8342366639839511243)),
obx_int.ModelProperty(
id: const obx_int.IdUid(5, 3621370552742492695),
name: 'network',
type: 9,
flags: 0),
ModelProperty(
id: const IdUid(6, 3054748457893853359),
obx_int.ModelProperty(
id: const obx_int.IdUid(6, 3054748457893853359),
name: 'profileUrl',
type: 9,
flags: 0),
ModelProperty(
id: const IdUid(7, 3716471511430220806),
obx_int.ModelProperty(
id: const obx_int.IdUid(7, 3716471511430220806),
name: 'avatarUrl',
type: 9,
flags: 0),
ModelProperty(
id: const IdUid(8, 3334077197732145885),
obx_int.ModelProperty(
id: const obx_int.IdUid(8, 3334077197732145885),
name: 'dbStatus',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(9, 7727190023732579468),
obx_int.ModelProperty(
id: const obx_int.IdUid(9, 7727190023732579468),
name: 'lastUpdateTime',
type: 10,
flags: 0),
ModelProperty(
id: const IdUid(10, 7236128628019094924),
obx_int.ModelProperty(
id: const obx_int.IdUid(10, 7236128628019094924),
name: 'note',
type: 9,
flags: 0),
ModelProperty(
id: const IdUid(11, 714760695336940281),
obx_int.ModelProperty(
id: const obx_int.IdUid(11, 714760695336940281),
name: 'followerCount',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(12, 4204087390924684186),
obx_int.ModelProperty(
id: const obx_int.IdUid(12, 4204087390924684186),
name: 'followingCount',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(13, 6842754750534163483),
obx_int.ModelProperty(
id: const obx_int.IdUid(13, 6842754750534163483),
name: 'statusesCount',
type: 6,
flags: 0),
ModelProperty(
id: const IdUid(14, 7495390888349913259),
obx_int.ModelProperty(
id: const obx_int.IdUid(14, 7495390888349913259),
name: 'lastStatus',
type: 10,
flags: 0)
],
relations: <ModelRelation>[],
backlinks: <ModelBacklink>[]),
ModelEntity(
id: const IdUid(2, 8060242331335522964),
relations: <obx_int.ModelRelation>[],
backlinks: <obx_int.ModelBacklink>[]),
obx_int.ModelEntity(
id: const obx_int.IdUid(2, 8060242331335522964),
name: 'Hashtag',
lastPropertyId: const IdUid(4, 985152873657204249),
lastPropertyId: const obx_int.IdUid(4, 985152873657204249),
flags: 0,
properties: <ModelProperty>[
ModelProperty(
id: const IdUid(1, 3633001791521338712),
properties: <obx_int.ModelProperty>[
obx_int.ModelProperty(
id: const obx_int.IdUid(1, 3633001791521338712),
name: 'id',
type: 6,
flags: 1),
ModelProperty(
id: const IdUid(2, 3468373950035339457),
obx_int.ModelProperty(
id: const obx_int.IdUid(2, 3468373950035339457),
name: 'tag',
type: 9,
flags: 34848,
indexId: const IdUid(2, 6156017341759176249)),
ModelProperty(
id: const IdUid(3, 5102584273729210526),
indexId: const obx_int.IdUid(2, 6156017341759176249)),
obx_int.ModelProperty(
id: const obx_int.IdUid(3, 5102584273729210526),
name: 'url',
type: 9,
flags: 0),
ModelProperty(
id: const IdUid(4, 985152873657204249),
obx_int.ModelProperty(
id: const obx_int.IdUid(4, 985152873657204249),
name: 'lastUpdateTime',
type: 10,
flags: 0)
],
relations: <ModelRelation>[],
backlinks: <ModelBacklink>[])
relations: <obx_int.ModelRelation>[],
backlinks: <obx_int.ModelBacklink>[])
];
/// Open an ObjectBox store with the model declared in this file.
Future<Store> openStore(
{String? directory,
int? maxDBSizeInKB,
int? fileMode,
int? maxReaders,
bool queriesCaseSensitiveDefault = true,
String? macosApplicationGroup}) async =>
Store(getObjectBoxModel(),
directory: directory ?? (await defaultStoreDirectory()).path,
maxDBSizeInKB: maxDBSizeInKB,
fileMode: fileMode,
maxReaders: maxReaders,
queriesCaseSensitiveDefault: queriesCaseSensitiveDefault,
macosApplicationGroup: macosApplicationGroup);
/// Shortcut for [obx.Store.new] that passes [getObjectBoxModel] and for Flutter
/// apps by default a [directory] using `defaultStoreDirectory()` from the
/// ObjectBox Flutter library.
///
/// Note: for desktop apps it is recommended to specify a unique [directory].
///
/// See [obx.Store.new] for an explanation of all parameters.
///
/// For Flutter apps, also calls `loadObjectBoxLibraryAndroidCompat()` from
/// the ObjectBox Flutter library to fix loading the native ObjectBox library
/// on Android 6 and older.
Future<obx.Store> openStore(
{String? directory,
int? maxDBSizeInKB,
int? maxDataSizeInKB,
int? fileMode,
int? maxReaders,
bool queriesCaseSensitiveDefault = true,
String? macosApplicationGroup}) async {
await loadObjectBoxLibraryAndroidCompat();
return obx.Store(getObjectBoxModel(),
directory: directory ?? (await defaultStoreDirectory()).path,
maxDBSizeInKB: maxDBSizeInKB,
maxDataSizeInKB: maxDataSizeInKB,
fileMode: fileMode,
maxReaders: maxReaders,
queriesCaseSensitiveDefault: queriesCaseSensitiveDefault,
macosApplicationGroup: macosApplicationGroup);
}
/// ObjectBox model definition, pass it to [Store] - Store(getObjectBoxModel())
ModelDefinition getObjectBoxModel() {
final model = ModelInfo(
/// Returns the ObjectBox model definition for this project for use with
/// [obx.Store.new].
obx_int.ModelDefinition getObjectBoxModel() {
final model = obx_int.ModelInfo(
entities: _entities,
lastEntityId: const IdUid(2, 8060242331335522964),
lastIndexId: const IdUid(2, 6156017341759176249),
lastRelationId: const IdUid(0, 0),
lastSequenceId: const IdUid(0, 0),
lastEntityId: const obx_int.IdUid(2, 8060242331335522964),
lastIndexId: const obx_int.IdUid(2, 6156017341759176249),
lastRelationId: const obx_int.IdUid(0, 0),
lastSequenceId: const obx_int.IdUid(0, 0),
retiredEntityUids: const [],
retiredIndexUids: const [],
retiredPropertyUids: const [],
@ -164,8 +179,8 @@ ModelDefinition getObjectBoxModel() {
modelVersionParserMinimum: 5,
version: 1);
final bindings = <Type, EntityDefinition>{
Connection: EntityDefinition<Connection>(
final bindings = <Type, obx_int.EntityDefinition>{
Connection: obx_int.EntityDefinition<Connection>(
model: _entities[0],
toOneRelations: (Connection object) => [],
toManyRelations: (Connection object) => {},
@ -199,37 +214,58 @@ ModelDefinition getObjectBoxModel() {
fbb.finish(fbb.endTable());
return object.obId;
},
objectFromFB: (Store store, ByteData fbData) {
objectFromFB: (obx.Store store, ByteData fbData) {
final buffer = fb.BufferContext(fbData);
final rootOffset = buffer.derefObject(0);
final lastStatusValue =
const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 30);
final obIdParam =
const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0);
final nameParam = const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 6, '');
final handleParam = const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 8, '');
final idParam = const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 10, '');
final profileUrlParam = const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 14, '');
final networkParam = const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 12, '');
final avatarUrlParam = const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 16, '');
final lastUpdateTimeParam = DateTime.fromMillisecondsSinceEpoch(
const fb.Int64Reader().vTableGet(buffer, rootOffset, 20, 0));
final noteParam = const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 22, '');
final followerCountParam =
const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 24);
final followingCountParam =
const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 26);
final statusesCountParam =
const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 28);
final lastStatusParam = lastStatusValue == null
? null
: DateTime.fromMillisecondsSinceEpoch(lastStatusValue);
final object = Connection(
obId: const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0),
name: const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 6, ''),
handle: const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 8, ''),
id: const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 10, ''),
profileUrl: const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 14, ''),
network: const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 12, ''),
avatarUrl: const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 16, ''),
lastUpdateTime: DateTime.fromMillisecondsSinceEpoch(
const fb.Int64Reader().vTableGet(buffer, rootOffset, 20, 0)),
note: const fb.StringReader(asciiOptimization: true).vTableGet(buffer, rootOffset, 22, ''),
followerCount: const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 24),
followingCount: const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 26),
statusesCount: const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 28),
lastStatus: lastStatusValue == null ? null : DateTime.fromMillisecondsSinceEpoch(lastStatusValue))
..dbStatus = const fb.Int64Reader().vTableGet(buffer, rootOffset, 18, 0);
obId: obIdParam,
name: nameParam,
handle: handleParam,
id: idParam,
profileUrl: profileUrlParam,
network: networkParam,
avatarUrl: avatarUrlParam,
lastUpdateTime: lastUpdateTimeParam,
note: noteParam,
followerCount: followerCountParam,
followingCount: followingCountParam,
statusesCount: statusesCountParam,
lastStatus: lastStatusParam)
..dbStatus =
const fb.Int64Reader().vTableGet(buffer, rootOffset, 18, 0);
return object;
}),
Hashtag: EntityDefinition<Hashtag>(
Hashtag: obx_int.EntityDefinition<Hashtag>(
model: _entities[1],
toOneRelations: (Hashtag object) => [],
toManyRelations: (Hashtag object) => {},
@ -248,16 +284,16 @@ ModelDefinition getObjectBoxModel() {
fbb.finish(fbb.endTable());
return object.id;
},
objectFromFB: (Store store, ByteData fbData) {
objectFromFB: (obx.Store store, ByteData fbData) {
final buffer = fb.BufferContext(fbData);
final rootOffset = buffer.derefObject(0);
final object = Hashtag(
id: const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0),
tag: const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 6, ''),
url: const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 8, ''))
final idParam =
const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0);
final tagParam = const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 6, '');
final urlParam = const fb.StringReader(asciiOptimization: true)
.vTableGet(buffer, rootOffset, 8, '');
final object = Hashtag(id: idParam, tag: tagParam, url: urlParam)
..lastUpdateTime = DateTime.fromMillisecondsSinceEpoch(
const fb.Int64Reader().vTableGet(buffer, rootOffset, 10, 0));
@ -265,79 +301,83 @@ ModelDefinition getObjectBoxModel() {
})
};
return ModelDefinition(model, bindings);
return obx_int.ModelDefinition(model, bindings);
}
/// [Connection] entity fields to define ObjectBox queries.
class Connection_ {
/// see [Connection.obId]
/// See [Connection.obId].
static final obId =
QueryIntegerProperty<Connection>(_entities[0].properties[0]);
obx.QueryIntegerProperty<Connection>(_entities[0].properties[0]);
/// see [Connection.name]
/// See [Connection.name].
static final name =
QueryStringProperty<Connection>(_entities[0].properties[1]);
obx.QueryStringProperty<Connection>(_entities[0].properties[1]);
/// see [Connection.handle]
/// See [Connection.handle].
static final handle =
QueryStringProperty<Connection>(_entities[0].properties[2]);
obx.QueryStringProperty<Connection>(_entities[0].properties[2]);
/// see [Connection.id]
static final id = QueryStringProperty<Connection>(_entities[0].properties[3]);
/// See [Connection.id].
static final id =
obx.QueryStringProperty<Connection>(_entities[0].properties[3]);
/// see [Connection.network]
/// See [Connection.network].
static final network =
QueryStringProperty<Connection>(_entities[0].properties[4]);
obx.QueryStringProperty<Connection>(_entities[0].properties[4]);
/// see [Connection.profileUrl]
/// See [Connection.profileUrl].
static final profileUrl =
QueryStringProperty<Connection>(_entities[0].properties[5]);
obx.QueryStringProperty<Connection>(_entities[0].properties[5]);
/// see [Connection.avatarUrl]
/// See [Connection.avatarUrl].
static final avatarUrl =
QueryStringProperty<Connection>(_entities[0].properties[6]);
obx.QueryStringProperty<Connection>(_entities[0].properties[6]);
/// see [Connection.dbStatus]
/// See [Connection.dbStatus].
static final dbStatus =
QueryIntegerProperty<Connection>(_entities[0].properties[7]);
obx.QueryIntegerProperty<Connection>(_entities[0].properties[7]);
/// see [Connection.lastUpdateTime]
/// See [Connection.lastUpdateTime].
static final lastUpdateTime =
QueryIntegerProperty<Connection>(_entities[0].properties[8]);
obx.QueryDateProperty<Connection>(_entities[0].properties[8]);
/// see [Connection.note]
/// See [Connection.note].
static final note =
QueryStringProperty<Connection>(_entities[0].properties[9]);
obx.QueryStringProperty<Connection>(_entities[0].properties[9]);
/// see [Connection.followerCount]
/// See [Connection.followerCount].
static final followerCount =
QueryIntegerProperty<Connection>(_entities[0].properties[10]);
obx.QueryIntegerProperty<Connection>(_entities[0].properties[10]);
/// see [Connection.followingCount]
/// See [Connection.followingCount].
static final followingCount =
QueryIntegerProperty<Connection>(_entities[0].properties[11]);
obx.QueryIntegerProperty<Connection>(_entities[0].properties[11]);
/// see [Connection.statusesCount]
/// See [Connection.statusesCount].
static final statusesCount =
QueryIntegerProperty<Connection>(_entities[0].properties[12]);
obx.QueryIntegerProperty<Connection>(_entities[0].properties[12]);
/// see [Connection.lastStatus]
/// See [Connection.lastStatus].
static final lastStatus =
QueryIntegerProperty<Connection>(_entities[0].properties[13]);
obx.QueryDateProperty<Connection>(_entities[0].properties[13]);
}
/// [Hashtag] entity fields to define ObjectBox queries.
class Hashtag_ {
/// see [Hashtag.id]
static final id = QueryIntegerProperty<Hashtag>(_entities[1].properties[0]);
/// See [Hashtag.id].
static final id =
obx.QueryIntegerProperty<Hashtag>(_entities[1].properties[0]);
/// see [Hashtag.tag]
static final tag = QueryStringProperty<Hashtag>(_entities[1].properties[1]);
/// See [Hashtag.tag].
static final tag =
obx.QueryStringProperty<Hashtag>(_entities[1].properties[1]);
/// see [Hashtag.url]
static final url = QueryStringProperty<Hashtag>(_entities[1].properties[2]);
/// See [Hashtag.url].
static final url =
obx.QueryStringProperty<Hashtag>(_entities[1].properties[2]);
/// see [Hashtag.lastUpdateTime]
/// See [Hashtag.lastUpdateTime].
static final lastUpdateTime =
QueryIntegerProperty<Hashtag>(_entities[1].properties[3]);
obx.QueryDateProperty<Hashtag>(_entities[1].properties[3]);
}

View file

@ -54,7 +54,9 @@ class _CircleAddUsersScreenState extends State<CircleAddUsersScreen> {
onSuccess: (_) => 'Added $messageBase',
onError: (error) => 'Error adding $messageBase: $error',
);
buildSnackbar(context, message);
if (mounted) {
buildSnackbar(context, message);
}
}
}

View file

@ -81,7 +81,9 @@ class _CircleEditorScreenState extends State<CircleEditorScreen> {
onSuccess: (_) => 'Removed $messageBase',
onError: (error) => 'Error removing $messageBase: $error',
);
buildSnackbar(context, message);
if (mounted) {
buildSnackbar(context, message);
}
}
}

View file

@ -178,7 +178,7 @@ class _EditorScreenState extends State<EditorScreen> {
return;
}
if (mounted && context.canPop()) {
if (context.mounted && context.canPop()) {
context.pop();
}
}
@ -220,7 +220,7 @@ class _EditorScreenState extends State<EditorScreen> {
return;
}
if (mounted && context.canPop()) {
if (context.mounted && context.canPop()) {
context.pop();
}
}
@ -254,51 +254,49 @@ class _EditorScreenState extends State<EditorScreen> {
} else {
final mainBody = Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
if (isComment && parentEntry != null)
buildCommentPreview(context, parentEntry!),
TextFormField(
readOnly: isSubmitting,
enabled: !isSubmitting && canSpoilerText,
controller: spoilerController,
textCapitalization: TextCapitalization.sentences,
decoration: InputDecoration(
labelText: canSpoilerText
? '$statusType Spoiler Text (optional)'
: 'Your server doesnt support $statusType Spoiler Text',
border: OutlineInputBorder(
borderSide: const BorderSide(),
borderRadius: BorderRadius.circular(5.0),
),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
if (isComment && parentEntry != null)
buildCommentPreview(context, parentEntry!),
TextFormField(
readOnly: isSubmitting,
enabled: !isSubmitting && canSpoilerText,
controller: spoilerController,
textCapitalization: TextCapitalization.sentences,
decoration: InputDecoration(
labelText: canSpoilerText
? '$statusType Spoiler Text (optional)'
: 'Your server doesnt support $statusType Spoiler Text',
border: OutlineInputBorder(
borderSide: const BorderSide(),
borderRadius: BorderRadius.circular(5.0),
),
),
const VerticalPadding(),
buildVisibilitySelector(context),
const VerticalPadding(),
buildContentField(context),
CharacterCountWidget(
contentController: contentController,
linkPreviewController: linkPreviewController,
),
const VerticalPadding(),
buildLinkWithPreview(context),
const VerticalPadding(),
GallerySelectorControl(
entries: existingMediaItems,
visibilityFilter: visibility,
),
const VerticalPadding(),
MediaUploadsControl(
entryMediaItems: newMediaItems,
),
buildButtonBar(context, manager),
],
),
),
const VerticalPadding(),
buildVisibilitySelector(context),
const VerticalPadding(),
buildContentField(context),
CharacterCountWidget(
contentController: contentController,
linkPreviewController: linkPreviewController,
),
const VerticalPadding(),
buildLinkWithPreview(context),
const VerticalPadding(),
GallerySelectorControl(
entries: existingMediaItems,
visibilityFilter: visibility,
),
const VerticalPadding(),
MediaUploadsControl(
entryMediaItems: newMediaItems,
),
buildButtonBar(context, manager),
],
),
),
);
@ -610,7 +608,7 @@ class _EditorScreenState extends State<EditorScreen> {
value: CircleData.followersPseudoCircle,
child: Text(CircleData.followersPseudoCircle.name)));
circleMenuItems.add(DropdownMenuItem(
value: CircleData('', ''), child: const Divider(), enabled: false));
value: CircleData('', ''), enabled: false, child: const Divider()));
circleMenuItems.addAll(circles.map((g) => DropdownMenuItem(
value: g,
child: Text(g.name),

View file

@ -133,10 +133,12 @@ class _FilterEditorScreenState extends State<FilterEditorScreen> {
}
if (filteredAuthors.contains(newConnection)) {
buildSnackbar(
context,
'Already filtering on ${newConnection.handle}',
);
if (context.mounted) {
buildSnackbar(
context,
'Already filtering on ${newConnection.handle}',
);
}
}
setState(() {
filteredAuthors.add(newConnection);

View file

@ -95,7 +95,7 @@ class GalleryBrowsersScreen extends StatelessWidget {
StatusAndRefreshButton(
valueListenable: nss.imageGalleryLoadingStatus,
refreshFunction: () async => await service.updateGalleries(),
busyColor: Theme.of(context).colorScheme.background,
busyColor: Theme.of(context).colorScheme.surface,
),
]),
body: RefreshIndicator(

View file

@ -10,7 +10,7 @@ import '../controls/responsive_max_width.dart';
import '../controls/standard_app_drawer.dart';
import '../controls/timeline/timeline_panel.dart';
import '../globals.dart';
import '../models/TimelineIdentifiers.dart';
import '../models/timeline_identifiers.dart';
import '../services/auth_service.dart';
import '../services/network_status_service.dart';
import '../services/timeline_manager.dart';

View file

@ -106,7 +106,7 @@ class _ImageEditorScreenState extends State<ImageEditorScreen> {
context,
'Cancel changes?',
);
if (ok == true && mounted) {
if (ok == true && context.mounted) {
context.pop();
}
},

View file

@ -59,7 +59,7 @@ class InteractionsViewerScreen extends StatelessWidget {
StatusAndRefreshButton(
valueListenable: nss.interactionsLoadingStatus,
refreshFunction: () async => await refreshInteractors(manager),
busyColor: Theme.of(context).colorScheme.background,
busyColor: Theme.of(context).colorScheme.surface,
)
]),
body: Center(

View file

@ -67,7 +67,7 @@ class _MediaViewerScreenState extends State<MediaViewerScreen> {
final bytesResult =
await RemoteFileClient(getIt<AccountsService>().currentProfile)
.getFileBytes(attachment.uri);
if (bytesResult.isFailure && mounted) {
if (bytesResult.isFailure && context.mounted) {
buildSnackbar(context,
'Error getting full size version of file: ${bytesResult.error}');
return;
@ -75,10 +75,13 @@ class _MediaViewerScreenState extends State<MediaViewerScreen> {
if (Platform.isAndroid || Platform.isIOS) {
final saveResult = await ImageGallerySaver.saveImage(bytesResult.value);
if (saveResult['isSuccess']) {
buildSnackbar(context, 'Image saved to gallery');
} else {
buildSnackbar(context, 'Unable to save to gallery, check permissions');
if (context.mounted) {
if (saveResult['isSuccess']) {
buildSnackbar(context, 'Image saved to gallery');
} else {
buildSnackbar(
context, 'Unable to save to gallery, check permissions');
}
}
} else {
final location = await FilePicker.platform.saveFile(

View file

@ -113,7 +113,7 @@ class _MessageThreadScreenState extends State<MessageThreadScreen> {
labelText: 'Reply Text',
border: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context).colorScheme.background,
color: Theme.of(context).colorScheme.surface,
),
borderRadius: BorderRadius.circular(5.0),
),

View file

@ -28,7 +28,7 @@ class MessagesScreen extends StatelessWidget {
StatusAndRefreshButton(
valueListenable: nss.directMessageUpdateStatus,
refreshFunction: () async => await service.updateThreads(),
busyColor: Theme.of(context).colorScheme.background,
busyColor: Theme.of(context).colorScheme.surface,
),
IconButton(
onPressed: () {

View file

@ -29,7 +29,7 @@ class MessagesNewThread extends StatelessWidget {
Widget buildBody(BuildContext context) {
final border = OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context).colorScheme.background,
color: Theme.of(context).colorScheme.surface,
),
borderRadius: BorderRadius.circular(5.0),
);

View file

@ -168,7 +168,9 @@ class NotificationsScreen extends StatelessWidget {
final message = (await manager.markAllAsRead()).fold(
onSuccess: (_) => 'Marked all notifications as read',
onError: (error) => 'Error marking notifications: $error');
buildSnackbar(context, message);
if (context.mounted) {
buildSnackbar(context, message);
}
}
}
}

View file

@ -30,6 +30,7 @@ class _PostScreenState extends State<PostScreen> {
@override
void initState() {
super.initState();
Future.delayed(const Duration(milliseconds: 500), () async {
getIt<ActiveProfileSelector<TimelineManager>>()
.activeEntry

View file

@ -62,13 +62,11 @@ class _SearchScreenState extends State<SearchScreen> {
}
Future<void> updateSearchResults(Profile profile, {bool reset = true}) async {
print('Starting update');
if (reset) {
nextPage = PagingData(limit: limit);
searchResult = SearchResults.empty();
}
print('Search $searchType on ${searchTextController.text}');
final result = await SearchClient(profile)
.search(searchType, searchTextController.text, nextPage);
result.match(
@ -80,12 +78,9 @@ class _SearchScreenState extends State<SearchScreen> {
onError: (error) =>
buildSnackbar(context, 'Error getting search result: $error'),
);
print('Ending update');
}
clearSearchResults() {
print('Clearing results');
setState(() {
searchResult = SearchResults.empty();
searchTextController.text = '';
@ -159,7 +154,7 @@ class _SearchScreenState extends State<SearchScreen> {
alignLabelWithHint: true,
border: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context).colorScheme.background,
color: Theme.of(context).colorScheme.surface,
),
borderRadius: BorderRadius.circular(5.0),
),
@ -329,7 +324,7 @@ class _SearchScreenState extends State<SearchScreen> {
await cm.fullRefresh(connection);
}
});
if (context.mounted) {
if (mounted) {
context.pushNamed(ScreenPaths.userProfile,
pathParameters: {'id': connection.id});
}

View file

@ -219,7 +219,7 @@ class NetworkCapabilitiesWidget extends StatelessWidget {
}
return ListTile(
title: Row(
title: const Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Network Capabilities'),
@ -230,7 +230,7 @@ class NetworkCapabilitiesWidget extends StatelessWidget {
],
),
subtitle: DataTable(
columns: [
columns: const [
DataColumn(label: Text('Network')),
DataColumn(label: Text('React')),
DataColumn(label: Text('Reshare')),

View file

@ -174,7 +174,7 @@ class _SignInScreenState extends State<SignInScreen> {
hintText: 'Server Name (friendica.example.com)',
border: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context).colorScheme.background,
color: Theme.of(context).colorScheme.surface,
),
borderRadius: BorderRadius.circular(5.0),
),
@ -225,7 +225,7 @@ class _SignInScreenState extends State<SignInScreen> {
'Your username on the server (not email address)',
border: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context).colorScheme.background,
color: Theme.of(context).colorScheme.surface,
),
borderRadius: BorderRadius.circular(5.0),
),
@ -260,7 +260,7 @@ class _SignInScreenState extends State<SignInScreen> {
hintText: 'Password',
border: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context).colorScheme.background,
color: Theme.of(context).colorScheme.surface,
),
borderRadius: BorderRadius.circular(5.0),
),
@ -274,7 +274,7 @@ class _SignInScreenState extends State<SignInScreen> {
onPressed: () async => await _signIn(context),
child: const Text('Signin'),
)
: SizedBox(),
: const SizedBox(),
const VerticalPadding(),
Text(
'Logged out:',
@ -383,14 +383,13 @@ class _SignInScreenState extends State<SignInScreen> {
final confirm = await showYesNoDialog(context,
'Are you sure you want to logout and delete *all* accounts? This cannot be undone.') ??
false;
print(confirm);
if (!confirm) {
return;
}
await getIt<AccountsService>().clearAllProfiles();
},
child: Text('Clear All')),
child: const Text('Clear All')),
],
),
),
@ -438,16 +437,16 @@ class _SignInScreenState extends State<SignInScreen> {
creds,
withNotification: false,
);
if (mounted && result.isFailure) {
if (context.mounted && result.isFailure) {
buildSnackbar(context, 'Error signing in: ${result.error}');
return;
}
if (mounted) {
if (context.mounted) {
buildSnackbar(context, 'Account signed in...');
}
await getIt<AccountsService>().setActiveProfile(result.value);
if (mounted) {
if (context.mounted) {
context.goNamed(ScreenPaths.timelines);
}
}

View file

@ -4,7 +4,7 @@ import '../controls/linear_status_indicator.dart';
import '../controls/standard_appbar.dart';
import '../controls/timeline/timeline_panel.dart';
import '../globals.dart';
import '../models/TimelineIdentifiers.dart';
import '../models/timeline_identifiers.dart';
import '../services/network_status_service.dart';
import '../services/timeline_manager.dart';
import '../utils/active_profile_selector.dart';

View file

@ -189,7 +189,7 @@ class _UserProfileScreenState extends State<UserProfileScreen> {
} else {
await manager.removeUserFromCircle(g, profile);
}
if (mounted) {
if (context.mounted) {
buildSnackbar(context, "User's Circles Updated");
}

View file

@ -322,7 +322,7 @@ class ConnectionsManager extends ChangeNotifier {
Result<List<CircleData>, ExecError> getCirclesForUser(String id) {
final result = circlesRepo.getCirclesForUser(id);
if (result.isSuccess) {
print("Circles for user $id: $result");
_logger.finer("Circles for user $id: $result");
return result;
}

View file

@ -6,13 +6,13 @@ import 'package:result_monad/result_monad.dart';
import '../friendica_client/friendica_client.dart';
import '../friendica_client/paging_data.dart';
import '../globals.dart';
import '../models/TimelineIdentifiers.dart';
import '../models/auth/profile.dart';
import '../models/entry_tree_item.dart';
import '../models/exec_error.dart';
import '../models/image_entry.dart';
import '../models/media_attachment_uploads/new_entry_media_items.dart';
import '../models/timeline_entry.dart';
import '../models/timeline_identifiers.dart';
import '../models/visibility.dart';
import '../utils/active_profile_selector.dart';
import 'media_upload_attachment_helper.dart';

View file

@ -80,8 +80,9 @@ class NotificationsManager extends ChangeNotifier {
first = false;
result.match(
onSuccess: (nd) => print('Got ${nd.data.length} notifications'),
onError: (e) => debugPrint('Error getting notification: $e'));
onSuccess: (nd) =>
_logger.fine('Got ${nd.data.length} notifications'),
onError: (e) => _logger.severe('Error getting notification: $e'));
final response = result.getValueOrElse(() => PagedResponse([]));
response.data
.where((n) =>

View file

@ -4,7 +4,6 @@ import 'package:result_monad/result_monad.dart';
import '../data/interfaces/circles_repo_intf.dart';
import '../friendica_client/friendica_client.dart';
import '../models/TimelineIdentifiers.dart';
import '../models/auth/profile.dart';
import '../models/circle_data.dart';
import '../models/entry_tree_item.dart';
@ -13,6 +12,7 @@ import '../models/image_entry.dart';
import '../models/media_attachment_uploads/new_entry_media_items.dart';
import '../models/timeline.dart';
import '../models/timeline_entry.dart';
import '../models/timeline_identifiers.dart';
import '../models/visibility.dart';
import 'entry_manager_service.dart';

View file

@ -2,10 +2,10 @@ import '../models/entry_tree_item.dart';
import '../models/flattened_tree_item.dart';
extension FlatteningExtensions on EntryTreeItem {
static const BaseLevel = 0;
static const baseLevel = 0;
List<FlattenedTreeItem> flatten(
{int level = BaseLevel, bool topLevelOnly = false}) {
{int level = baseLevel, bool topLevelOnly = false}) {
final items = <FlattenedTreeItem>[];
final myEntry = FlattenedTreeItem(
timelineEntry: entry,
@ -23,7 +23,7 @@ extension FlatteningExtensions on EntryTreeItem {
c1.entry.creationTimestamp.compareTo(c2.entry.creationTimestamp));
for (final child in sortedChildren) {
int childLevel = level + 1;
if (child.entry.authorId == entry.authorId && level != BaseLevel) {
if (child.entry.authorId == entry.authorId && level != baseLevel) {
childLevel = level;
}

View file

@ -38,19 +38,21 @@ void _updateSwapTagLinks(Node node, List<String> tags) {
if (hasExpectedTag) {
final profile = getIt<AccountsService>().currentProfile;
final newTagUrl = generateTagUrlFromProfile(profile, tag);
print(node.attributes['href']);
node.attributes['href'] = newTagUrl.toString();
print(node.attributes['href']);
}
}
node.nodes.forEach((n) => _updateSwapTagLinks(n, tags));
for (var n in node.nodes) {
_updateSwapTagLinks(n, tags);
}
}
}
String htmlWithTagLinkSwap(String htmlContentFragment, List<String> tags) {
try {
final dom = parseFragment(htmlContentFragment);
dom.nodes.forEach((n) => _updateSwapTagLinks(n, tags));
for (var n in dom.nodes) {
_updateSwapTagLinks(n, tags);
}
final result = dom.outerHtml;
return result;

View file

@ -1,6 +1,6 @@
import 'dart:convert';
import 'package:collection/collection.dart';
import 'package:collection/collection.dart' show MapEquality;
import 'package:http/http.dart' as http;
import 'package:logging/logging.dart';
import 'package:result_monad/result_monad.dart';
@ -149,7 +149,6 @@ class _ExpiringRequestCache {
response,
);
print('Adding cached response for $type => $url');
_responses[cacheEntry] = cacheEntry;
}

View file

@ -19,6 +19,7 @@ import screen_brightness_macos
import shared_preferences_foundation
import sqflite
import url_launcher_macos
import video_player_avfoundation
import wakelock_plus
import window_to_front
@ -37,6 +38,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin"))
WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin"))
WindowToFrontPlugin.register(with: registry.registrar(forPlugin: "WindowToFrontPlugin"))
}

View file

@ -10,19 +10,16 @@ PODS:
- flutter_web_auth_2 (3.0.0):
- FlutterMacOS
- FlutterMacOS (1.0.0)
- FMDB (2.7.5):
- FMDB/standard (= 2.7.5)
- FMDB/standard (2.7.5)
- media_kit_libs_macos_video (1.0.4):
- FlutterMacOS
- media_kit_native_event_loop (1.0.0):
- FlutterMacOS
- media_kit_video (0.0.1):
- FlutterMacOS
- ObjectBox (1.9.0)
- ObjectBox (2.0.0)
- objectbox_flutter_libs (0.0.1):
- FlutterMacOS
- ObjectBox (= 1.9.0)
- ObjectBox (= 2.0.0)
- package_info_plus (0.0.1):
- FlutterMacOS
- path_provider_foundation (0.0.1):
@ -33,11 +30,14 @@ PODS:
- shared_preferences_foundation (0.0.1):
- Flutter
- FlutterMacOS
- sqflite (0.0.2):
- sqflite (0.0.3):
- Flutter
- FlutterMacOS
- FMDB (>= 2.7.5)
- url_launcher_macos (0.0.1):
- FlutterMacOS
- video_player_avfoundation (0.0.1):
- Flutter
- FlutterMacOS
- wakelock_plus (0.0.1):
- FlutterMacOS
- window_to_front (0.0.1):
@ -58,14 +58,14 @@ DEPENDENCIES:
- path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`)
- screen_brightness_macos (from `Flutter/ephemeral/.symlinks/plugins/screen_brightness_macos/macos`)
- shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`)
- sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`)
- sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/darwin`)
- url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
- video_player_avfoundation (from `Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin`)
- wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`)
- window_to_front (from `Flutter/ephemeral/.symlinks/plugins/window_to_front/macos`)
SPEC REPOS:
trunk:
- FMDB
- ObjectBox
EXTERNAL SOURCES:
@ -98,9 +98,11 @@ EXTERNAL SOURCES:
shared_preferences_foundation:
:path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin
sqflite:
:path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos
:path: Flutter/ephemeral/.symlinks/plugins/sqflite/darwin
url_launcher_macos:
:path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
video_player_avfoundation:
:path: Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin
wakelock_plus:
:path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos
window_to_front:
@ -108,23 +110,23 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
desktop_window: fb7c4f12c1129f947ac482296b6f14059d57a3c3
device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
file_selector_macos: 468fb6b81fac7c0e88d71317f3eec34c3b008ff9
flutter_secure_storage_macos: d56e2d218c1130b262bef8b4a7d64f88d7f9c9ea
device_info_plus: ce1b7762849d3ec103d0e0517299f2db7ad60720
file_selector_macos: 54fdab7caa3ac3fc43c9fac4d7d8d231277f8cf2
flutter_secure_storage_macos: 59459653abe1adb92abbc8ea747d79f8d19866c9
flutter_web_auth_2: 2e1dc2d2139973e4723c5286ce247dd590390d70
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
media_kit_libs_macos_video: b3e2bbec2eef97c285f2b1baa7963c67c753fb82
media_kit_native_event_loop: 81fd5b45192b72f8b5b69eaf5b540f45777eb8d5
media_kit_video: c75b07f14d59706c775778e4dd47dd027de8d1e5
ObjectBox: e7ff611291a0663380e0736b46786bcd077294ff
objectbox_flutter_libs: 32997857c213cbcc6f9b25ffc73e1e3c34ea3c8e
package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce
path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943
ObjectBox: f5319bd9ad2ea960796eff7227e86471867e9ef0
objectbox_flutter_libs: 8ce2ac829cfbbc62ad4764a0d219786d098b1afa
package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
screen_brightness_macos: 2d6d3af2165592d9a55ffcd95b7550970e41ebda
shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126
sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea
url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
url_launcher_macos: 5f437abeda8c85500ceb03f5c1938a8c5a705399
video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3
wakelock_plus: 4783562c9a43d209c458cb9b30692134af456269
window_to_front: 4cdc24ddd8461ad1a55fa06286d6a79d8b29e8d8

View file

@ -14,7 +14,7 @@
<true/>
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)T69YZGT58U.relatica</string>
<string>T69YZGT58U.relatica</string>
</array>
</dict>
</plist>

View file

@ -14,7 +14,7 @@
<true/>
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)T69YZGT58U.relatica</string>
<string>T69YZGT58U.relatica</string>
</array>
</dict>
</plist>

View file

@ -18,7 +18,7 @@
<true/>
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)T69YZGT58U.relatica</string>
<string>T69YZGT58U.relatica</string>
</array>
</dict>
</plist>

File diff suppressed because it is too large Load diff

View file

@ -5,64 +5,65 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 0.12.0+7
environment:
sdk: '>=3.0.0 <4.0.0'
sdk: '>=3.2.0 <4.0.0'
dependencies:
flutter:
sdk: flutter
cached_network_image: ^3.2.2
color_blindness: ^0.1.2
cupertino_icons: ^1.0.2
cached_network_image: ^3.3.1
color_blindness: ^0.2.0
cupertino_icons: ^1.0.8
carousel_slider: ^4.2.1
desktop_window: ^0.4.0
device_info_plus: ^9.1.0
device_preview: ^1.1.0
file_picker: ^6.0.0
flutter_dotenv: ^5.0.2
flutter_file_dialog: ^3.0.0
flutter_secure_storage: ^9.0.0
flutter_web_auth_2: ^3.0.3
flutter_widget_from_html_core: ^0.14.6
get_it: ^7.2.0
get_it_mixin: ^4.1.1
go_router: ^12.0.1
html: ^0.15.2
image: ^4.0.15
image_picker: ^1.0.4
logging: ^1.1.0
markdown: ^7.0.1
device_info_plus: ^10.1.0
# device_preview: ^1.1.0
file_picker: ^8.0.6
flutter_dotenv: ^5.1.0
flutter_file_dialog: ^3.0.2
flutter_secure_storage: ^9.2.2
flutter_web_auth_2: ^3.1.2
flutter_widget_from_html_core: ^0.15.1
get_it: ^7.7.0
get_it_mixin: ^4.2.2
go_router: ^14.1.2
html: ^0.15.4
image: ^4.2.0
image_picker: ^1.1.2
logging: ^1.2.0
markdown: ^7.2.2
## TODO Media Kit Update
media_kit: ^1.1.10 # Primary package.
media_kit_libs_video: ^1.0.4 # Native video dependencies.
media_kit_video: ^1.2.4 # For video rendering.
multi_trigger_autocomplete: ^1.0.0
network_to_file_image: ^4.0.1
objectbox: ^2.3.1
objectbox_flutter_libs: ^2.3.1
path: ^1.8.2
path_provider: ^2.0.11
provider: ^6.0.4
result_monad:
git:
url: https://gitlab.com/HankG/dart-result-monad.git
scrollable_positioned_list: ^0.3.5
shared_preferences: ^2.0.15
sqlite3: ^2.1.0
stack_trace: ^1.11.0
string_validator: ^1.0.2
network_to_file_image: ^6.0.1
objectbox: ^4.0.1
objectbox_flutter_libs: ^4.0.1
path: ^1.9.0
path_provider: ^2.1.3
provider: ^6.1.2
result_monad: ^2.3.2
scrollable_positioned_list: ^0.3.8
shared_preferences: ^2.2.3
sqlite3: ^2.4.3
stack_trace: ^1.11.1
string_validator: ^1.1.0
time_machine: ^0.9.17
url_launcher: ^6.1.6
uuid: ^4.1.0
video_player: ^2.4.10
flutter_svg: ^2.0.5
url_launcher: ^6.3.0
uuid: ^4.4.2
video_player: ^2.9.1
flutter_svg: ^2.0.10+1
image_gallery_saver: ^2.0.3
http: any
http_parser: any
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^3.0.0
build_runner: ^2.3.3
objectbox_generator: ^2.0.0
flutter_lints: ^4.0.0
build_runner: ^2.4.10
objectbox_generator: ^4.0.1
flutter:
uses-material-design: true