2024-05-11 04:06:25 -04:00
|
|
|
import 'package:flutter/material.dart';
|
2024-05-11 04:46:17 -04:00
|
|
|
import 'package:flutter_animate/flutter_animate.dart';
|
2024-06-28 06:01:56 -04:00
|
|
|
import 'package:logging/logging.dart';
|
2024-05-11 04:06:25 -04:00
|
|
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
2024-08-23 04:21:46 -04:00
|
|
|
import 'package:vaani/api/image_provider.dart';
|
2024-05-11 04:06:25 -04:00
|
|
|
|
|
|
|
|
part 'theme_from_cover_provider.g.dart';
|
|
|
|
|
|
2024-06-28 06:01:56 -04:00
|
|
|
final _logger = Logger('ThemeFromCoverProvider');
|
|
|
|
|
|
2024-05-14 06:13:16 -04:00
|
|
|
@Riverpod(keepAlive: true)
|
2024-05-11 04:46:17 -04:00
|
|
|
Future<FutureOr<ColorScheme?>> themeFromCover(
|
2024-05-11 04:06:25 -04:00
|
|
|
ThemeFromCoverRef ref,
|
|
|
|
|
ImageProvider<Object> img, {
|
|
|
|
|
Brightness brightness = Brightness.dark,
|
2024-05-11 04:46:17 -04:00
|
|
|
}) async {
|
2024-06-15 23:43:08 -04:00
|
|
|
// ! add deliberate delay to simulate a long running task as it interferes with other animations
|
2024-05-11 05:13:56 -04:00
|
|
|
await Future.delayed(500.ms);
|
2024-05-14 06:13:16 -04:00
|
|
|
|
2024-06-28 06:01:56 -04:00
|
|
|
_logger.fine('Generating color scheme from cover image');
|
2024-05-11 04:06:25 -04:00
|
|
|
return ColorScheme.fromImageProvider(
|
|
|
|
|
provider: img,
|
|
|
|
|
brightness: brightness,
|
|
|
|
|
);
|
2024-05-11 04:46:17 -04:00
|
|
|
// TODO isolate is not working
|
|
|
|
|
// see https://github.com/flutter/flutter/issues/119207
|
|
|
|
|
// use isolate to generate the color scheme
|
|
|
|
|
// RootIsolateToken? token = RootIsolateToken.instance;
|
|
|
|
|
// final scheme = await Isolate.run(
|
|
|
|
|
// () async {
|
2024-06-28 06:01:56 -04:00
|
|
|
// _logger.fine('Isolate running ${Isolate.current.debugName}');
|
2024-05-11 04:46:17 -04:00
|
|
|
// try {
|
|
|
|
|
// BackgroundIsolateBinaryMessenger.ensureInitialized(token!);
|
|
|
|
|
// WidgetsFlutterBinding.ensureInitialized();
|
|
|
|
|
// return await ColorScheme.fromImageProvider(
|
|
|
|
|
// provider: img,
|
|
|
|
|
// brightness: brightness,
|
|
|
|
|
// );
|
|
|
|
|
// } catch (e) {
|
2024-06-28 06:01:56 -04:00
|
|
|
// _logger.fine('Error in isolate: $e');
|
2024-05-11 04:46:17 -04:00
|
|
|
// return null;
|
|
|
|
|
// }
|
|
|
|
|
// },
|
|
|
|
|
// );
|
|
|
|
|
// return scheme;
|
2024-05-11 04:06:25 -04:00
|
|
|
}
|
|
|
|
|
|
2024-05-14 06:13:16 -04:00
|
|
|
@Riverpod(keepAlive: true)
|
2024-05-11 04:06:25 -04:00
|
|
|
FutureOr<ColorScheme?> themeOfLibraryItem(
|
|
|
|
|
ThemeOfLibraryItemRef ref,
|
2024-09-23 03:55:32 -04:00
|
|
|
String? itemId, {
|
2024-05-11 04:06:25 -04:00
|
|
|
Brightness brightness = Brightness.dark,
|
|
|
|
|
}) async {
|
2024-09-23 03:55:32 -04:00
|
|
|
if (itemId == null) {
|
2024-05-11 04:06:25 -04:00
|
|
|
return null;
|
|
|
|
|
}
|
2024-09-23 03:55:32 -04:00
|
|
|
final coverImage = await ref.watch(coverImageProvider(itemId).future);
|
2024-05-11 04:06:25 -04:00
|
|
|
final val = await ref.watch(
|
|
|
|
|
themeFromCoverProvider(MemoryImage(coverImage), brightness: brightness)
|
|
|
|
|
.future,
|
|
|
|
|
);
|
|
|
|
|
return val;
|
|
|
|
|
// coverImage.when(
|
|
|
|
|
// data: (value) async {
|
2024-06-28 06:01:56 -04:00
|
|
|
// _logger.fine('CoverImage: $value');
|
2024-05-11 04:06:25 -04:00
|
|
|
// final val = ref.watch(themeFromCoverProvider(MemoryImage(value)));
|
2024-06-28 06:01:56 -04:00
|
|
|
// _logger.fine('ColorScheme generated: $val');
|
2024-05-11 04:06:25 -04:00
|
|
|
// ref.invalidateSelf();
|
|
|
|
|
// return val;
|
|
|
|
|
// },
|
|
|
|
|
// loading: () => null,
|
|
|
|
|
// error: (error, stackTrace) => null,
|
|
|
|
|
// );
|
|
|
|
|
// return null;
|
|
|
|
|
}
|