mirror of
https://github.com/gabehf/Fladder.git
synced 2026-03-09 07:28:14 -07:00
chore: Update flutter to 3.27 and updated packages
This commit is contained in:
parent
e607a6d19b
commit
a817d40463
24 changed files with 3848 additions and 5051 deletions
|
|
@ -1,6 +1,7 @@
|
|||
// ignore_for_file: type=lint
|
||||
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:json_annotation/json_annotation.dart' as json;
|
||||
import 'package:collection/collection.dart';
|
||||
import 'dart:convert';
|
||||
|
||||
|
|
@ -30,7 +31,7 @@ abstract class JellyfinOpenApi extends ChopperService {
|
|||
ErrorConverter? errorConverter,
|
||||
Converter? converter,
|
||||
Uri? baseUrl,
|
||||
Iterable<dynamic>? interceptors,
|
||||
List<Interceptor>? interceptors,
|
||||
}) {
|
||||
if (client != null) {
|
||||
return _$JellyfinOpenApi(client);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1,12 +1,13 @@
|
|||
import 'dart:developer';
|
||||
|
||||
import 'package:chopper/chopper.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
|
||||
import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart';
|
||||
import 'package:fladder/providers/auth_provider.dart';
|
||||
import 'package:fladder/providers/service_provider.dart';
|
||||
import 'package:fladder/providers/user_provider.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
|
||||
part 'api_provider.g.dart';
|
||||
|
||||
|
|
@ -26,37 +27,40 @@ class JellyApi extends _$JellyApi {
|
|||
}
|
||||
}
|
||||
|
||||
class JellyRequest implements RequestInterceptor {
|
||||
class JellyRequest implements Interceptor {
|
||||
JellyRequest(this.ref);
|
||||
|
||||
final Ref ref;
|
||||
|
||||
@override
|
||||
FutureOr<Request> onRequest(Request request) async {
|
||||
if (request.method == HttpMethod.Post) {
|
||||
chopperLogger.info('Performed a POST request');
|
||||
}
|
||||
|
||||
FutureOr<Response<BodyType>> intercept<BodyType>(Chain<BodyType> chain) async {
|
||||
final serverUrl = Uri.parse(ref.read(userProvider)?.server ?? ref.read(authProvider).tempCredentials.server);
|
||||
|
||||
//Use current logged in user otherwise use the authprovider
|
||||
var loginModel = ref.read(userProvider)?.credentials ?? ref.read(authProvider).tempCredentials;
|
||||
var headers = loginModel.header(ref);
|
||||
|
||||
return request.copyWith(
|
||||
baseUri: serverUrl,
|
||||
headers: request.headers..addAll(headers),
|
||||
final Response<BodyType> response = await chain.proceed(
|
||||
applyHeaders(
|
||||
chain.request.copyWith(
|
||||
baseUri: serverUrl,
|
||||
),
|
||||
headers),
|
||||
);
|
||||
|
||||
return response;
|
||||
}
|
||||
}
|
||||
|
||||
class JellyResponse implements ResponseInterceptor {
|
||||
class JellyResponse implements Interceptor {
|
||||
JellyResponse(this.ref);
|
||||
|
||||
final Ref ref;
|
||||
|
||||
@override
|
||||
FutureOr<Response<dynamic>> onResponse(Response<dynamic> response) {
|
||||
FutureOr<Response<BodyType>> intercept<BodyType>(Chain<BodyType> chain) async {
|
||||
final Response<BodyType> response = await chain.proceed(chain.request);
|
||||
|
||||
if (!response.isSuccessful) {
|
||||
log('x- ${response.base.statusCode} - ${response.base.reasonPhrase} - ${response.error} - ${response.base.request?.method} ${response.base.request?.url.toString()}');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,4 +22,4 @@ final jellyApiProvider =
|
|||
|
||||
typedef _$JellyApi = AutoDisposeNotifier<JellyService>;
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
|
|
|||
|
|
@ -1,17 +1,18 @@
|
|||
import 'dart:developer';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
||||
import 'package:archive/archive_io.dart';
|
||||
import 'package:chopper/chopper.dart';
|
||||
import 'package:fladder/providers/service_provider.dart';
|
||||
import 'package:fladder/providers/user_provider.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
|
||||
import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart';
|
||||
import 'package:fladder/models/book_model.dart';
|
||||
import 'package:fladder/providers/api_provider.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:fladder/providers/service_provider.dart';
|
||||
import 'package:fladder/providers/user_provider.dart';
|
||||
|
||||
class BookViewerModel {
|
||||
final BookModel? book;
|
||||
|
|
@ -75,7 +76,7 @@ class BookViewerNotifier extends StateNotifier<BookViewerModel> {
|
|||
await bookFile.writeAsBytes(response.bodyBytes);
|
||||
|
||||
final inputStream = InputFileStream(bookFile.path);
|
||||
final archive = ZipDecoder().decodeBuffer(inputStream);
|
||||
final archive = ZipDecoder().decodeStream(inputStream);
|
||||
|
||||
final List<String> imagesPath = [];
|
||||
for (var file in archive.files) {
|
||||
|
|
|
|||
|
|
@ -23,4 +23,4 @@ final serverDiscoveryProvider = AutoDisposeStreamNotifierProvider<
|
|||
|
||||
typedef _$ServerDiscovery = AutoDisposeStreamNotifier<List<DiscoveryInfo>>;
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
|
|
|||
|
|
@ -157,6 +157,8 @@ class MovieDetailsProvider
|
|||
}
|
||||
}
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
mixin MovieDetailsRef on AutoDisposeNotifierProviderRef<MovieModel?> {
|
||||
/// The parameter `arg` of this provider.
|
||||
String get arg;
|
||||
|
|
@ -171,4 +173,4 @@ class _MovieDetailsProviderElement
|
|||
String get arg => (origin as MovieDetailsProvider).arg;
|
||||
}
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
|
|
|||
|
|
@ -157,6 +157,8 @@ class LibraryFiltersProvider extends AutoDisposeNotifierProviderImpl<
|
|||
}
|
||||
}
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
mixin LibraryFiltersRef
|
||||
on AutoDisposeNotifierProviderRef<List<LibraryFiltersModel>> {
|
||||
/// The parameter `ids` of this provider.
|
||||
|
|
@ -171,4 +173,4 @@ class _LibraryFiltersProviderElement extends AutoDisposeNotifierProviderElement<
|
|||
List<String> get ids => (origin as LibraryFiltersProvider).ids;
|
||||
}
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
|
|
|||
|
|
@ -43,4 +43,4 @@ final sessionInfoProvider =
|
|||
|
||||
typedef _$SessionInfo = AutoDisposeNotifier<SessionInfoModel>;
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
|
|
|||
|
|
@ -21,6 +21,8 @@ final backgroundDownloaderProvider = Provider<FileDownloader>.internal(
|
|||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
typedef BackgroundDownloaderRef = ProviderRef<FileDownloader>;
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
|
|
|||
|
|
@ -157,6 +157,8 @@ class SyncChildrenProvider
|
|||
}
|
||||
}
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
mixin SyncChildrenRef on AutoDisposeNotifierProviderRef<List<SyncedItem>> {
|
||||
/// The parameter `arg` of this provider.
|
||||
SyncedItem get arg;
|
||||
|
|
@ -302,6 +304,8 @@ class SyncDownloadStatusProvider extends AutoDisposeNotifierProviderImpl<
|
|||
}
|
||||
}
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
mixin SyncDownloadStatusRef on AutoDisposeNotifierProviderRef<DownloadStream?> {
|
||||
/// The parameter `arg` of this provider.
|
||||
SyncedItem get arg;
|
||||
|
|
@ -446,6 +450,8 @@ class SyncStatusesProvider
|
|||
}
|
||||
}
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
mixin SyncStatusesRef on AutoDisposeAsyncNotifierProviderRef<SyncStatus> {
|
||||
/// The parameter `arg` of this provider.
|
||||
SyncedItem get arg;
|
||||
|
|
@ -586,6 +592,8 @@ class SyncSizeProvider extends AutoDisposeNotifierProviderImpl<SyncSize, int?> {
|
|||
}
|
||||
}
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
mixin SyncSizeRef on AutoDisposeNotifierProviderRef<int?> {
|
||||
/// The parameter `arg` of this provider.
|
||||
SyncedItem get arg;
|
||||
|
|
@ -600,4 +608,4 @@ class _SyncSizeProviderElement
|
|||
SyncedItem get arg => (origin as SyncSizeProvider).arg;
|
||||
}
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
|
|
|||
|
|
@ -21,6 +21,8 @@ final showSyncButtonProviderProvider = AutoDisposeProvider<bool>.internal(
|
|||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
typedef ShowSyncButtonProviderRef = AutoDisposeProviderRef<bool>;
|
||||
String _$userHash() => r'e83369c0d569d5a862aa1b92f3f0a45a9d1fe446';
|
||||
|
||||
|
|
@ -37,4 +39,4 @@ final userProvider = NotifierProvider<User, AccountModel?>.internal(
|
|||
|
||||
typedef _$User = Notifier<AccountModel?>;
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
||||
|
|
|
|||
|
|
@ -1,11 +1,13 @@
|
|||
import 'dart:io';
|
||||
import 'dart:math' as math;
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:extended_image/extended_image.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import 'package:fladder/providers/settings/book_viewer_settings_provider.dart';
|
||||
import 'package:fladder/screens/book_viewer/book_viewer_controls.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
class BookViewerReader extends ConsumerWidget {
|
||||
final int index;
|
||||
|
|
@ -112,7 +114,6 @@ class BookViewerReader extends ConsumerWidget {
|
|||
);
|
||||
},
|
||||
File(pages[index - 1]),
|
||||
enableMemoryCache: true,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
|
|||
|
||||
import 'package:flutter_custom_tabs/flutter_custom_tabs.dart' as customtab;
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:url_launcher/url_launcher.dart' as urllauncher;
|
||||
import 'package:url_launcher/url_launcher.dart' as urilauncher;
|
||||
import 'package:url_launcher/url_launcher_string.dart';
|
||||
|
||||
import 'package:fladder/models/items/item_shared_models.dart';
|
||||
|
|
@ -49,26 +49,22 @@ Future<void> launchUrl(BuildContext context, String link) async {
|
|||
final Uri url = Uri.parse(link);
|
||||
|
||||
if (AdaptiveLayout.of(context).isDesktop) {
|
||||
if (!await urllauncher.launchUrl(url, mode: LaunchMode.externalApplication)) {
|
||||
if (!await urilauncher.launchUrl(url, mode: LaunchMode.externalApplication)) {
|
||||
throw Exception('Could not launch $url');
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
await customtab.launch(
|
||||
link,
|
||||
customTabsOption: customtab.CustomTabsOption(
|
||||
toolbarColor: Theme.of(context).primaryColor,
|
||||
enableDefaultShare: true,
|
||||
enableUrlBarHiding: true,
|
||||
showPageTitle: true,
|
||||
extraCustomTabs: const <String>[
|
||||
// ref. https://play.google.com/store/apps/details?id=org.mozilla.firefox
|
||||
'org.mozilla.firefox',
|
||||
// ref. https://play.google.com/store/apps/details?id=com.microsoft.emmx
|
||||
'com.microsoft.emmx',
|
||||
],
|
||||
await customtab.launchUrl(
|
||||
Uri.parse(link),
|
||||
customTabsOptions: customtab.CustomTabsOptions(
|
||||
colorSchemes: customtab.CustomTabsColorSchemes.defaults(
|
||||
toolbarColor: Theme.of(context).primaryColor,
|
||||
),
|
||||
urlBarHidingEnabled: true,
|
||||
shareState: customtab.CustomTabsShareState.browserDefault,
|
||||
showTitle: true,
|
||||
),
|
||||
safariVCOption: customtab.SafariViewControllerOption(
|
||||
safariVCOptions: customtab.SafariViewControllerOptions(
|
||||
preferredBarTintColor: Theme.of(context).primaryColor,
|
||||
preferredControlTintColor: Colors.white,
|
||||
barCollapsingEnabled: true,
|
||||
|
|
|
|||
|
|
@ -149,7 +149,7 @@ class MediaControlsWrapper extends BaseAudioHandler {
|
|||
playbackState.add(playbackState.value.copyWith(
|
||||
playing: value.playing,
|
||||
));
|
||||
smtc?.setPlaybackStatus(value.playing ? PlaybackStatus.Playing : PlaybackStatus.Paused);
|
||||
smtc?.setPlaybackStatus(value.playing ? PlaybackStatus.playing : PlaybackStatus.paused);
|
||||
}));
|
||||
}
|
||||
|
||||
|
|
@ -212,7 +212,7 @@ class MediaControlsWrapper extends BaseAudioHandler {
|
|||
);
|
||||
|
||||
smtc?.enableSmtc();
|
||||
smtc?.setPlaybackStatus(PlaybackStatus.Playing);
|
||||
smtc?.setPlaybackStatus(PlaybackStatus.playing);
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
@ -225,7 +225,7 @@ class MediaControlsWrapper extends BaseAudioHandler {
|
|||
|
||||
ref.read(playBackModel)?.playbackStopped(position ?? Duration.zero, totalDuration, ref);
|
||||
ref.read(mediaPlaybackProvider.notifier).update((state) => state.copyWith(position: Duration.zero));
|
||||
smtc?.setPlaybackStatus(PlaybackStatus.Stopped);
|
||||
smtc?.setPlaybackStatus(PlaybackStatus.stopped);
|
||||
smtc?.clearMetadata();
|
||||
smtc?.disableSmtc();
|
||||
playbackState.add(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue