From e2aa73c01c16ff79516d691c23aba1813ed3e4a6 Mon Sep 17 00:00:00 2001 From: rang <378694192@qq.com> Date: Fri, 14 Nov 2025 16:34:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9appName=E7=AD=89=E5=B8=B8?= =?UTF-8?q?=E9=87=8F=E4=B8=BA=E5=85=A8=E5=B1=80=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 2 + lib/api/api_provider.dart | 33 ++++++++ lib/db/cache_manager.dart | 6 +- lib/db/init.dart | 24 ++---- .../view/library_item_actions.dart | 2 +- .../view/library_item_hero_section.dart | 5 +- lib/features/logging/core/logger.dart | 8 +- lib/features/logging/view/logs_page.dart | 2 +- .../view/onboarding_single_page.dart | 4 +- .../view/user_login_with_open_id.dart | 7 +- .../view/user_login_with_password.dart | 6 +- .../providers/playback_reporter_provider.dart | 13 +--- .../playback_reporter_provider.g.dart | 2 +- lib/features/player/core/init.dart | 2 +- .../widgets/chapter_selection_button.dart | 2 +- .../sleep_timer/view/sleep_timer_button.dart | 2 +- lib/features/you/view/server_manager.dart | 2 +- .../you/view/widgets/library_switch_chip.dart | 8 +- lib/features/you/view/you_page.dart | 11 ++- .../metadata_provider.dart => globals.dart} | 66 +++++++++++----- lib/main.dart | 17 ++-- lib/models/tray.dart | 4 +- lib/pages/home_page.dart | 5 +- lib/pages/library_page.dart | 2 +- lib/router/router.dart | 4 +- lib/router/scaffold_with_nav_bar.dart | 2 +- lib/settings/constants.dart | 18 ----- .../metadata/metadata_provider.g.dart | 77 ------------------- lib/settings/settings.dart | 1 - lib/shared/widgets/add_new_server.dart | 2 +- .../widgets/expandable_description.dart | 14 ++-- pubspec.lock | 16 ++-- pubspec.yaml | 6 +- .../flutter/generated_plugin_registrant.cc | 6 +- windows/flutter/generated_plugins.cmake | 2 +- 35 files changed, 167 insertions(+), 216 deletions(-) rename lib/{settings/metadata/metadata_provider.dart => globals.dart} (84%) delete mode 100644 lib/settings/constants.dart delete mode 100644 lib/settings/metadata/metadata_provider.g.dart diff --git a/.vscode/settings.json b/.vscode/settings.json index 9185c43..434aa82 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,7 @@ { "cmake.configureOnOpen": false, "cSpell.words": [ + "Audiobookshelf", "audioplayers", "autolabeler", "Autovalidate", @@ -13,6 +14,7 @@ "mocktail", "nodename", "numberpicker", + "Prefs", "riverpod", "Schyler", "shelfsdk", diff --git a/lib/api/api_provider.dart b/lib/api/api_provider.dart index a991727..477a074 100644 --- a/lib/api/api_provider.dart +++ b/lib/api/api_provider.dart @@ -4,6 +4,8 @@ import 'dart:convert'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:http/http.dart'; +// import 'package:http_cache_core/http_cache_core.dart'; +// import 'package:http_cache_isar_store/http_cache_isar_store.dart'; import 'package:logging/logging.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:shelfsdk/audiobookshelf_api.dart'; @@ -33,6 +35,36 @@ Uri makeBaseUrl(String address) { return Uri.parse(address); } +// Global options +// final options = CacheOptions( +// // A default store is required for the client. +// store: IsarCacheStore("", name: "http_cache"), + +// // All subsequent fields are optional to get a standard behaviour. + +// // Default. +// policy: CachePolicy.request, +// // Returns a previous cached response on error for given status codes. +// // Defaults to `[]`. +// hitCacheOnErrorCodes: const [500], +// // Allows to return a cached response on network errors (e.g. offline usage). +// // Defaults to `false`. +// hitCacheOnNetworkFailure: true, +// // Overrides any HTTP directive to delete entry past this duration. +// // Useful only when origin server has no cache config or custom behaviour is desired. +// // Defaults to `null`. +// maxStale: const Duration(days: 7), +// // Default. Allows 3 cache sets and ease cleanup. +// priority: CachePriority.normal, +// // Default. Body and headers encryption with your own algorithm. +// cipher: null, +// // Default. Key builder to retrieve requests. +// keyBuilder: CacheOptions.defaultCacheKeyBuilder, +// // Default. Allows to cache POST requests. +// // Assigning a [keyBuilder] is strongly recommended when `true`. +// allowPostMethod: false, +// ); + /// get the api instance for the given base url @riverpod AudiobookshelfApi audiobookshelfApi(Ref ref, Uri? baseUrl) { @@ -41,6 +73,7 @@ AudiobookshelfApi audiobookshelfApi(Ref ref, Uri? baseUrl) { baseUrl ??= apiSettings.activeServer?.serverUrl; return AudiobookshelfApi( baseUrl: makeBaseUrl(baseUrl.toString()), + // client: ); } diff --git a/lib/db/cache_manager.dart b/lib/db/cache_manager.dart index ba109c2..7b04999 100644 --- a/lib/db/cache_manager.dart +++ b/lib/db/cache_manager.dart @@ -1,9 +1,9 @@ import 'package:flutter_cache_manager/flutter_cache_manager.dart'; -import 'package:vaani/settings/constants.dart'; +import 'package:vaani/globals.dart'; final imageCacheManager = CacheManager( Config( - '${AppMetadata.appNameLowerCase}_image_cache', + '${appName}_image_cache', stalePeriod: const Duration(days: 365 * 10), repo: JsonCacheInfoRepository(), maxNrOfCacheObjects: 1000, @@ -12,7 +12,7 @@ final imageCacheManager = CacheManager( final apiResponseCacheManager = CacheManager( Config( - '${AppMetadata.appNameLowerCase}_api_response_cache', + '${appName}_api_response_cache', stalePeriod: const Duration(days: 7), repo: JsonCacheInfoRepository(), maxNrOfCacheObjects: 1000, diff --git a/lib/db/init.dart b/lib/db/init.dart index 8b5e7d0..ec45bae 100644 --- a/lib/db/init.dart +++ b/lib/db/init.dart @@ -1,27 +1,19 @@ -import 'dart:io'; - import 'package:hive/hive.dart'; -import 'package:path/path.dart' as p; -import 'package:path_provider/path_provider.dart'; -import 'package:vaani/main.dart'; -import 'package:vaani/settings/constants.dart'; +import 'package:vaani/globals.dart'; import 'register_models.dart'; // does the initial setup of the storage Future initStorage() async { - final dir = await getApplicationDocumentsDirectory(); + // final dir = await getApplicationDocumentsDirectory(); - // use vaani as the directory for hive - final storageDir = Directory( - p.join( - dir.path, - AppMetadata.appNameLowerCase, - ), - ); - await storageDir.create(recursive: true); + // // use vaani as the directory for hive + // final storageDir = Directory( + // p.join(dir.path, appName), + // ); + // await storageDir.create(recursive: true); - Hive.defaultDirectory = storageDir.path; + Hive.defaultDirectory = appStorageDir.path; appLogger.config('Hive storage directory init: ${Hive.defaultDirectory}'); await registerModels(); diff --git a/lib/features/item_viewer/view/library_item_actions.dart b/lib/features/item_viewer/view/library_item_actions.dart index dc6397f..ffde277 100644 --- a/lib/features/item_viewer/view/library_item_actions.dart +++ b/lib/features/item_viewer/view/library_item_actions.dart @@ -19,7 +19,7 @@ import 'package:vaani/features/per_book_settings/providers/book_settings_provide import 'package:vaani/features/player/providers/audiobook_player.dart'; import 'package:vaani/features/player/providers/player_form.dart'; import 'package:vaani/generated/l10n.dart'; -import 'package:vaani/main.dart'; +import 'package:vaani/globals.dart'; import 'package:vaani/router/router.dart'; import 'package:vaani/settings/api_settings_provider.dart'; import 'package:vaani/settings/app_settings_provider.dart'; diff --git a/lib/features/item_viewer/view/library_item_hero_section.dart b/lib/features/item_viewer/view/library_item_hero_section.dart index da4adea..d67ee2f 100644 --- a/lib/features/item_viewer/view/library_item_hero_section.dart +++ b/lib/features/item_viewer/view/library_item_hero_section.dart @@ -9,7 +9,7 @@ import 'package:vaani/api/library_item_provider.dart'; import 'package:vaani/constants/hero_tag_conventions.dart'; import 'package:vaani/features/item_viewer/view/library_item_page.dart'; import 'package:vaani/features/player/providers/audiobook_player.dart'; -import 'package:vaani/main.dart'; +import 'package:vaani/globals.dart'; import 'package:vaani/router/models/library_item_extras.dart'; import 'package:vaani/settings/app_settings_provider.dart'; import 'package:vaani/shared/extensions/duration_format.dart'; @@ -369,9 +369,10 @@ class _BookCover extends HookConsumerWidget { builder: (context) { // change theme after 2 seconds if (themeSettings.useMaterialThemeOnItemPage) { + final theme = ThemeSwitcher.of(context); Future.delayed(150.ms, () { try { - ThemeSwitcher.of(context).changeTheme( + theme.changeTheme( theme: coverColorScheme != null ? ThemeData.from( colorScheme: coverColorScheme, diff --git a/lib/features/logging/core/logger.dart b/lib/features/logging/core/logger.dart index 52eb099..bb914ea 100644 --- a/lib/features/logging/core/logger.dart +++ b/lib/features/logging/core/logger.dart @@ -1,14 +1,12 @@ -import 'dart:io'; - import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; import 'package:logging_appenders/logging_appenders.dart'; -import 'package:path_provider/path_provider.dart'; +import 'package:vaani/globals.dart'; import 'package:vaani/shared/extensions/duration_format.dart'; Future getLoggingFilePath() async { - final Directory directory = await getApplicationDocumentsDirectory(); - return '${directory.path}/vaani.log'; + // final Directory directory = await getApplicationDocumentsDirectory(); + return '${appStorageDir.path}/$appName.log'; } Future initLogging() async { diff --git a/lib/features/logging/view/logs_page.dart b/lib/features/logging/view/logs_page.dart index 74d1ad3..09312a6 100644 --- a/lib/features/logging/view/logs_page.dart +++ b/lib/features/logging/view/logs_page.dart @@ -4,7 +4,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:logging/logging.dart'; import 'package:share_plus/share_plus.dart'; import 'package:vaani/features/logging/providers/logs_provider.dart'; -import 'package:vaani/main.dart'; +import 'package:vaani/globals.dart'; class LogsPage extends HookConsumerWidget { const LogsPage({super.key}); diff --git a/lib/features/onboarding/view/onboarding_single_page.dart b/lib/features/onboarding/view/onboarding_single_page.dart index 6193cac..29fd510 100644 --- a/lib/features/onboarding/view/onboarding_single_page.dart +++ b/lib/features/onboarding/view/onboarding_single_page.dart @@ -5,8 +5,8 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:vaani/api/api_provider.dart'; import 'package:vaani/features/onboarding/view/user_login.dart'; import 'package:vaani/generated/l10n.dart'; +import 'package:vaani/globals.dart'; import 'package:vaani/settings/api_settings_provider.dart'; -import 'package:vaani/settings/constants.dart'; import 'package:vaani/shared/utils.dart'; import 'package:vaani/shared/widgets/add_new_server.dart'; @@ -79,7 +79,7 @@ class OnboardingBody extends HookConsumerWidget { Padding( padding: const EdgeInsets.all(8.0), child: Text( - S.of(context).loginTitle(AppMetadata.appName), + S.of(context).loginTitle(appName), style: Theme.of(context).textTheme.headlineSmall, ), ), diff --git a/lib/features/onboarding/view/user_login_with_open_id.dart b/lib/features/onboarding/view/user_login_with_open_id.dart index 51e7f68..fccfe66 100644 --- a/lib/features/onboarding/view/user_login_with_open_id.dart +++ b/lib/features/onboarding/view/user_login_with_open_id.dart @@ -6,10 +6,9 @@ import 'package:shelfsdk/audiobookshelf_api.dart'; import 'package:vaani/api/api_provider.dart'; import 'package:vaani/features/onboarding/providers/oauth_provider.dart'; import 'package:vaani/features/onboarding/view/user_login_with_password.dart'; -import 'package:vaani/main.dart'; +import 'package:vaani/globals.dart'; import 'package:vaani/models/error_response.dart'; import 'package:vaani/router/router.dart'; -import 'package:vaani/settings/constants.dart'; import 'package:vaani/settings/models/models.dart' as model; import 'package:vaani/shared/extensions/obfuscation.dart'; import 'package:vaani/shared/utils.dart'; @@ -40,9 +39,9 @@ class UserLoginWithOpenID extends HookConsumerWidget { appLogger.fine('Generated verifier: $verifier\nchallenge: $challenge'); final appRedirectUri = - '${AppMetadata.appScheme}://${Routes.openIDCallback.fullPath.substring(1)}'; + '$appScheme://${Routes.openIDCallback.fullPath.substring(1)}'; final (openIDLoginEndpoint, authCookie) = await api.server.oauth2Request( - clientId: AppMetadata.appName, + clientId: appName, codeChallenge: challenge, // redirectUri: Uri( // scheme: AppMetadata.appScheme, diff --git a/lib/features/onboarding/view/user_login_with_password.dart b/lib/features/onboarding/view/user_login_with_password.dart index 6d58e4c..faab24f 100644 --- a/lib/features/onboarding/view/user_login_with_password.dart +++ b/lib/features/onboarding/view/user_login_with_password.dart @@ -7,10 +7,10 @@ import 'package:shelfsdk/audiobookshelf_api.dart'; import 'package:vaani/api/api_provider.dart'; import 'package:vaani/api/authenticated_users_provider.dart'; import 'package:vaani/generated/l10n.dart'; +import 'package:vaani/globals.dart'; import 'package:vaani/hacks/fix_autofill_losing_focus.dart'; import 'package:vaani/models/error_response.dart'; import 'package:vaani/router/router.dart'; -import 'package:vaani/settings/constants.dart'; import 'package:vaani/settings/models/models.dart' as model; import 'package:vaani/shared/utils.dart'; @@ -214,10 +214,10 @@ Future handleServerError( onPressed: () { // open an issue on the github page handleLaunchUrl( - AppMetadata.githubRepo + githubRepo // append the issue url .replace( - path: '${AppMetadata.githubRepo.path}/issues/new', + path: '${githubRepo.path}/issues/new', ), ); }, diff --git a/lib/features/playback_reporting/providers/playback_reporter_provider.dart b/lib/features/playback_reporting/providers/playback_reporter_provider.dart index a7ca1d5..db75bae 100644 --- a/lib/features/playback_reporting/providers/playback_reporter_provider.dart +++ b/lib/features/playback_reporting/providers/playback_reporter_provider.dart @@ -1,11 +1,10 @@ -import 'package:package_info_plus/package_info_plus.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:vaani/api/api_provider.dart'; import 'package:vaani/features/playback_reporting/core/playback_reporter.dart' as core; import 'package:vaani/features/player/providers/audiobook_player.dart'; +import 'package:vaani/globals.dart'; import 'package:vaani/settings/app_settings_provider.dart'; -import 'package:vaani/settings/metadata/metadata_provider.dart'; part 'playback_reporter_provider.g.dart'; @@ -15,13 +14,7 @@ class PlaybackReporter extends _$PlaybackReporter { Future build() async { final playerSettings = ref.watch(appSettingsProvider).playerSettings; final player = ref.watch(simpleAudiobookPlayerProvider); - final packageInfo = await PackageInfo.fromPlatform(); final api = ref.watch(authenticatedApiProvider); - final deviceName = await ref.watch(deviceNameProvider.future); - final deviceModel = await ref.watch(deviceModelProvider.future); - final deviceSdkVersion = await ref.watch(deviceSdkVersionProvider.future); - final deviceManufacturer = - await ref.watch(deviceManufacturerProvider.future); final reporter = core.PlaybackReporter( player, @@ -32,8 +25,8 @@ class PlaybackReporter extends _$PlaybackReporter { deviceName: deviceName, deviceModel: deviceModel, deviceSdkVersion: deviceSdkVersion, - deviceClientName: packageInfo.appName, - deviceClientVersion: packageInfo.version, + deviceClientName: appName, + deviceClientVersion: appVersion, deviceManufacturer: deviceManufacturer, ); ref.onDispose(reporter.dispose); diff --git a/lib/features/playback_reporting/providers/playback_reporter_provider.g.dart b/lib/features/playback_reporting/providers/playback_reporter_provider.g.dart index 3c21f16..7ac1ad6 100644 --- a/lib/features/playback_reporting/providers/playback_reporter_provider.g.dart +++ b/lib/features/playback_reporting/providers/playback_reporter_provider.g.dart @@ -6,7 +6,7 @@ part of 'playback_reporter_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$playbackReporterHash() => r'f5436d652e51c37bcc684acdaec94e17a97e68e5'; +String _$playbackReporterHash() => r'43bde2ac163830b6950303a80cdd915ffcb1943b'; /// See also [PlaybackReporter]. @ProviderFor(PlaybackReporter) diff --git a/lib/features/player/core/init.dart b/lib/features/player/core/init.dart index abcf013..7b6c0f7 100644 --- a/lib/features/player/core/init.dart +++ b/lib/features/player/core/init.dart @@ -9,7 +9,7 @@ import 'package:vaani/settings/models/app_settings.dart'; Future configurePlayer() async { // for playing audio on windows, linux - JustAudioMediaKit.ensureInitialized(); + JustAudioMediaKit.ensureInitialized(windows: false); // for configuring how this app will interact with other audio apps final session = await AudioSession.instance; diff --git a/lib/features/player/view/widgets/chapter_selection_button.dart b/lib/features/player/view/widgets/chapter_selection_button.dart index a3d8740..2eb533d 100644 --- a/lib/features/player/view/widgets/chapter_selection_button.dart +++ b/lib/features/player/view/widgets/chapter_selection_button.dart @@ -8,7 +8,7 @@ import 'package:vaani/features/player/providers/currently_playing_provider.dart' import 'package:vaani/features/player/view/player_expanded.dart' show pendingPlayerModals; import 'package:vaani/features/player/view/widgets/playing_indicator_icon.dart'; -import 'package:vaani/main.dart' show appLogger; +import 'package:vaani/globals.dart'; import 'package:vaani/shared/extensions/chapter.dart' show ChapterDuration; import 'package:vaani/shared/extensions/duration_format.dart' show DurationFormat; diff --git a/lib/features/sleep_timer/view/sleep_timer_button.dart b/lib/features/sleep_timer/view/sleep_timer_button.dart index 99bad80..ed7a372 100644 --- a/lib/features/sleep_timer/view/sleep_timer_button.dart +++ b/lib/features/sleep_timer/view/sleep_timer_button.dart @@ -7,7 +7,7 @@ import 'package:vaani/features/player/view/widgets/speed_selector.dart'; import 'package:vaani/features/sleep_timer/core/sleep_timer.dart'; import 'package:vaani/features/sleep_timer/providers/sleep_timer_provider.dart' show sleepTimerProvider; -import 'package:vaani/main.dart'; +import 'package:vaani/globals.dart'; import 'package:vaani/settings/app_settings_provider.dart'; import 'package:vaani/shared/extensions/duration_format.dart'; diff --git a/lib/features/you/view/server_manager.dart b/lib/features/you/view/server_manager.dart index ff920e6..e43cebe 100644 --- a/lib/features/you/view/server_manager.dart +++ b/lib/features/you/view/server_manager.dart @@ -12,7 +12,7 @@ import 'package:vaani/features/onboarding/view/user_login.dart' import 'package:vaani/features/player/view/mini_player_bottom_padding.dart' show MiniPlayerBottomPadding; import 'package:vaani/generated/l10n.dart'; -import 'package:vaani/main.dart' show appLogger; +import 'package:vaani/globals.dart'; import 'package:vaani/router/router.dart' show Routes; import 'package:vaani/settings/api_settings_provider.dart' show apiSettingsProvider; diff --git a/lib/features/you/view/widgets/library_switch_chip.dart b/lib/features/you/view/widgets/library_switch_chip.dart index 7d7eb94..1da5cca 100644 --- a/lib/features/you/view/widgets/library_switch_chip.dart +++ b/lib/features/you/view/widgets/library_switch_chip.dart @@ -1,15 +1,15 @@ +import 'dart:io' show Platform; + +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shelfsdk/audiobookshelf_api.dart' show Library; import 'package:vaani/api/library_provider.dart'; import 'package:vaani/generated/l10n.dart'; +import 'package:vaani/globals.dart'; import 'package:vaani/settings/api_settings_provider.dart' show apiSettingsProvider; import 'package:vaani/shared/icons/abs_icons.dart'; -import 'dart:io' show Platform; - -import 'package:flutter/foundation.dart'; -import 'package:vaani/main.dart' show appLogger; class LibrarySwitchChip extends HookConsumerWidget { const LibrarySwitchChip({ diff --git a/lib/features/you/view/you_page.dart b/lib/features/you/view/you_page.dart index 8e7868b..bc7ce66 100644 --- a/lib/features/you/view/you_page.dart +++ b/lib/features/you/view/you_page.dart @@ -6,8 +6,8 @@ import 'package:vaani/api/library_provider.dart' show librariesProvider; import 'package:vaani/features/player/view/mini_player_bottom_padding.dart'; import 'package:vaani/features/you/view/widgets/library_switch_chip.dart'; import 'package:vaani/generated/l10n.dart'; +import 'package:vaani/globals.dart'; import 'package:vaani/router/router.dart'; -import 'package:vaani/settings/constants.dart'; import 'package:vaani/shared/utils.dart'; import 'package:vaani/shared/widgets/not_implemented.dart'; import 'package:vaani/shared/widgets/vaani_logo.dart'; @@ -141,17 +141,16 @@ class YouPage extends HookConsumerWidget { ), AboutListTile( icon: const Icon(Icons.info), - applicationName: AppMetadata.appName, - applicationVersion: AppMetadata.version, - applicationLegalese: - 'Made with ❤️ by ${AppMetadata.author}', + applicationName: appName, + applicationVersion: appVersion, + applicationLegalese: 'Made with ❤️ by $appAuthor', aboutBoxChildren: [ // link to github repo ListTile( leading: Icon(Icons.code), title: Text('Source Code'), onTap: () { - handleLaunchUrl(AppMetadata.githubRepo); + handleLaunchUrl(githubRepo); }, ), ], diff --git a/lib/settings/metadata/metadata_provider.dart b/lib/globals.dart similarity index 84% rename from lib/settings/metadata/metadata_provider.dart rename to lib/globals.dart index 16802da..1af2ca4 100644 --- a/lib/settings/metadata/metadata_provider.dart +++ b/lib/globals.dart @@ -1,18 +1,53 @@ +// 全局变量 +import 'dart:io'; + import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:logging/logging.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:path/path.dart' as p; +import 'package:path_provider/path_provider.dart'; -part 'metadata_provider.g.dart'; +late String appName; +const String appScheme = "vaani"; +late String appVersion; +const String appAuthor = "rang"; +late String appBuildNumber; -@Riverpod(keepAlive: true) -Future deviceName(Ref ref) async { - final data = await _getDeviceData(DeviceInfoPlugin()); +Uri githubRepo = Uri.parse('https://github.com/rangdl/Vaani'); +Future initialize() async { + final packageInfo = await PackageInfo.fromPlatform(); + appName = packageInfo.appName; + appVersion = packageInfo.version; + appBuildNumber = packageInfo.buildNumber; + deviceData = await _getDeviceData(DeviceInfoPlugin()); + deviceName = getDeviceName(deviceData); + deviceModel = getDeviceModel(deviceData); + deviceSdkVersion = getDeviceSdkVersion(deviceData); + deviceManufacturer = getDeviceManufacturer(deviceData); + appLogger = Logger(appName); + final dir = await getApplicationDocumentsDirectory(); + appStorageDir = Directory( + p.join(dir.path, appName), + ); + await appStorageDir.create(recursive: true); +} + +late Map deviceData; + +late String deviceName; +late String deviceModel; +late String deviceSdkVersion; +late String deviceManufacturer; + +late Logger appLogger; +late Directory appStorageDir; + +String getDeviceName(data) { // try different keys to get the device name - return - // android + return // android data['product'] ?? // ios data['name'] ?? @@ -27,10 +62,7 @@ Future deviceName(Ref ref) async { 'Unknown name'; } -@Riverpod(keepAlive: true) -Future deviceModel(Ref ref) async { - final data = await _getDeviceData(DeviceInfoPlugin()); - +String getDeviceModel(data) { // try different keys to get the device model return // android, eg: Google Pixel 4 @@ -48,10 +80,7 @@ Future deviceModel(Ref ref) async { 'Unknown model'; } -@Riverpod(keepAlive: true) -Future deviceSdkVersion(Ref ref) async { - final data = await _getDeviceData(DeviceInfoPlugin()); - +String getDeviceSdkVersion(data) { // try different keys to get the device sdk version return // android, eg: 30 @@ -69,10 +98,7 @@ Future deviceSdkVersion(Ref ref) async { 'Unknown sdk version'; } -@Riverpod(keepAlive: true) -Future deviceManufacturer(Ref ref) async { - final data = await _getDeviceData(DeviceInfoPlugin()); - +String getDeviceManufacturer(data) { // try different keys to get the device manufacturer return // android, eg: Google diff --git a/lib/main.dart b/lib/main.dart index 6135cd4..99a46f0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,32 +2,28 @@ import 'package:dynamic_color/dynamic_color.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:logging/logging.dart'; import 'package:vaani/api/server_provider.dart'; import 'package:vaani/db/storage.dart'; import 'package:vaani/features/downloads/providers/download_manager.dart'; import 'package:vaani/features/logging/core/logger.dart'; import 'package:vaani/features/playback_reporting/providers/playback_reporter_provider.dart'; import 'package:vaani/features/player/core/init.dart'; -import 'package:vaani/features/player/providers/audiobook_player.dart' - show audiobookPlayerProvider, simpleAudiobookPlayerProvider; +import 'package:vaani/features/player/providers/audiobook_player.dart'; import 'package:vaani/features/shake_detection/providers/shake_detector.dart'; import 'package:vaani/features/skip_start_end/skip_start_end_provider.dart'; import 'package:vaani/features/sleep_timer/providers/sleep_timer_provider.dart'; import 'package:vaani/generated/l10n.dart'; +import 'package:vaani/globals.dart'; import 'package:vaani/models/tray.dart'; import 'package:vaani/router/router.dart'; import 'package:vaani/settings/api_settings_provider.dart'; import 'package:vaani/settings/app_settings_provider.dart'; -import 'package:vaani/settings/settings.dart'; import 'package:vaani/shared/utils/utils.dart'; import 'package:vaani/theme/providers/system_theme_provider.dart'; import 'package:vaani/theme/providers/theme_from_cover_provider.dart'; import 'package:vaani/theme/theme.dart'; import 'package:window_manager/window_manager.dart'; -final appLogger = Logger(AppMetadata.appName); - void main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -43,6 +39,9 @@ void main() async { await windowManager.setPreventClose(true); }); } + // Configure the App Metadata + await initialize(); + // Configure the root Logger await initLogging(); @@ -55,15 +54,15 @@ void main() async { // run the app runApp( const ProviderScope( - child: _EagerInitialization(child: TrayFramework(MyApp())), + child: _EagerInitialization(child: TrayFramework(AbsApp())), ), ); } var routerConfig = const MyAppRouter().config; -class MyApp extends ConsumerWidget { - const MyApp({super.key}); +class AbsApp extends ConsumerWidget { + const AbsApp({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/lib/models/tray.dart b/lib/models/tray.dart index 5d44e22..ea9f139 100644 --- a/lib/models/tray.dart +++ b/lib/models/tray.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:tray_manager/tray_manager.dart'; import 'package:vaani/features/player/providers/audiobook_player.dart'; -import 'package:vaani/settings/constants.dart'; +import 'package:vaani/globals.dart'; import 'package:vaani/shared/utils/utils.dart'; import 'package:window_manager/window_manager.dart'; @@ -36,7 +36,7 @@ class _TrayFrameworkState extends ConsumerState await trayManager.setIcon( Utils.isWindows() ? 'assets/icon/logo.ico' : 'assets/icon/logo.png', ); - await trayManager.setToolTip(AppMetadata.appName); + await trayManager.setToolTip(appName); Menu menu = Menu( items: [ MenuItem( diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 35b16fc..f04ea70 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -4,12 +4,11 @@ import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:vaani/api/api_provider.dart'; import 'package:vaani/generated/l10n.dart'; -import 'package:vaani/main.dart'; +import 'package:vaani/globals.dart'; import 'package:vaani/router/router.dart'; import 'package:vaani/settings/api_settings_provider.dart'; import 'package:vaani/settings/app_settings_provider.dart' show appSettingsProvider; -import 'package:vaani/settings/constants.dart'; import '../shared/widgets/shelves/home_shelf.dart'; @@ -28,7 +27,7 @@ class HomePage extends HookConsumerWidget { appBar: AppBar( title: GestureDetector( child: Text( - AppMetadata.appName, + appName, style: Theme.of(context).textTheme.headlineLarge, ), onTap: () { diff --git a/lib/pages/library_page.dart b/lib/pages/library_page.dart index a6950a6..2506614 100644 --- a/lib/pages/library_page.dart +++ b/lib/pages/library_page.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:vaani/api/api_provider.dart'; -import 'package:vaani/main.dart'; +import 'package:vaani/globals.dart'; import 'package:vaani/settings/api_settings_provider.dart'; import '../shared/widgets/drawer.dart'; diff --git a/lib/router/router.dart b/lib/router/router.dart index 31abd0f..b123307 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -11,15 +11,15 @@ import 'package:vaani/features/onboarding/view/onboarding_single_page.dart'; import 'package:vaani/features/player/view/player_expanded.dart'; import 'package:vaani/features/you/view/server_manager.dart'; import 'package:vaani/features/you/view/you_page.dart'; -import 'package:vaani/main.dart'; +import 'package:vaani/globals.dart'; import 'package:vaani/pages/home_page.dart'; import 'package:vaani/settings/view/app_settings_page.dart'; import 'package:vaani/settings/view/auto_sleep_timer_settings_page.dart'; +import 'package:vaani/settings/view/home_page_settings_page.dart'; import 'package:vaani/settings/view/notification_settings_page.dart'; import 'package:vaani/settings/view/player_settings_page.dart'; import 'package:vaani/settings/view/shake_detector_settings_page.dart'; import 'package:vaani/settings/view/theme_settings_page.dart'; -import 'package:vaani/settings/view/home_page_settings_page.dart'; import 'scaffold_with_nav_bar.dart'; import 'transitions/slide.dart'; diff --git a/lib/router/scaffold_with_nav_bar.dart b/lib/router/scaffold_with_nav_bar.dart index a28c532..35ff3e6 100644 --- a/lib/router/scaffold_with_nav_bar.dart +++ b/lib/router/scaffold_with_nav_bar.dart @@ -7,7 +7,7 @@ import 'package:vaani/features/player/providers/player_form.dart'; import 'package:vaani/features/player/view/player_minimized.dart'; import 'package:vaani/features/you/view/widgets/library_switch_chip.dart'; import 'package:vaani/generated/l10n.dart'; -import 'package:vaani/main.dart'; +import 'package:vaani/globals.dart'; import 'package:vaani/router/router.dart'; import 'package:vaani/shared/icons/abs_icons.dart' show AbsIcons; import 'package:vaani/shared/utils/utils.dart'; diff --git a/lib/settings/constants.dart b/lib/settings/constants.dart deleted file mode 100644 index 3b836d3..0000000 --- a/lib/settings/constants.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:flutter/foundation.dart' show immutable; - -@immutable -class AppMetadata { - const AppMetadata._(); - // TODO: use the packageinfo package to get the app name - static const String appName = 'Vaani'; - - // for deeplinking - static const String appScheme = 'vaani'; - - static const version = '1.0.0'; - static const author = 'Dr.Blank'; - - static Uri githubRepo = Uri.parse('https://github.com/Dr-Blank/Vaani'); - - static get appNameLowerCase => appName.toLowerCase().replaceAll(' ', '_'); -} diff --git a/lib/settings/metadata/metadata_provider.g.dart b/lib/settings/metadata/metadata_provider.g.dart deleted file mode 100644 index b83c0f0..0000000 --- a/lib/settings/metadata/metadata_provider.g.dart +++ /dev/null @@ -1,77 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'metadata_provider.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$deviceNameHash() => r'9e38adda74e70a91851a682f05228bd759356dcc'; - -/// See also [deviceName]. -@ProviderFor(deviceName) -final deviceNameProvider = FutureProvider.internal( - deviceName, - name: r'deviceNameProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') ? null : _$deviceNameHash, - dependencies: null, - allTransitiveDependencies: null, -); - -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -typedef DeviceNameRef = FutureProviderRef; -String _$deviceModelHash() => r'922b13d9e35b5b5c5b8e96f2f2c2ae594f4f41f2'; - -/// See also [deviceModel]. -@ProviderFor(deviceModel) -final deviceModelProvider = FutureProvider.internal( - deviceModel, - name: r'deviceModelProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') ? null : _$deviceModelHash, - dependencies: null, - allTransitiveDependencies: null, -); - -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -typedef DeviceModelRef = FutureProviderRef; -String _$deviceSdkVersionHash() => r'33178d80590808d1f4cca2be8a3b52c6f6724cac'; - -/// See also [deviceSdkVersion]. -@ProviderFor(deviceSdkVersion) -final deviceSdkVersionProvider = FutureProvider.internal( - deviceSdkVersion, - name: r'deviceSdkVersionProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$deviceSdkVersionHash, - dependencies: null, - allTransitiveDependencies: null, -); - -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -typedef DeviceSdkVersionRef = FutureProviderRef; -String _$deviceManufacturerHash() => - r'39250767deb8635fa7c7e18bae23576b9b863e04'; - -/// See also [deviceManufacturer]. -@ProviderFor(deviceManufacturer) -final deviceManufacturerProvider = FutureProvider.internal( - deviceManufacturer, - name: r'deviceManufacturerProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$deviceManufacturerHash, - dependencies: null, - allTransitiveDependencies: null, -); - -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -typedef DeviceManufacturerRef = FutureProviderRef; -// ignore_for_file: type=lint -// 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 diff --git a/lib/settings/settings.dart b/lib/settings/settings.dart index 2eeef42..9a4e7df 100644 --- a/lib/settings/settings.dart +++ b/lib/settings/settings.dart @@ -1,2 +1 @@ export 'app_settings_provider.dart'; -export 'constants.dart'; diff --git a/lib/shared/widgets/add_new_server.dart b/lib/shared/widgets/add_new_server.dart index 16e2fc0..e226c63 100644 --- a/lib/shared/widgets/add_new_server.dart +++ b/lib/shared/widgets/add_new_server.dart @@ -3,7 +3,7 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:vaani/api/api_provider.dart'; import 'package:vaani/generated/l10n.dart'; -import 'package:vaani/main.dart'; +import 'package:vaani/globals.dart'; final httpUrlRegExp = RegExp('https?://'); diff --git a/lib/shared/widgets/expandable_description.dart b/lib/shared/widgets/expandable_description.dart index c79f6be..f5c12c5 100644 --- a/lib/shared/widgets/expandable_description.dart +++ b/lib/shared/widgets/expandable_description.dart @@ -94,11 +94,15 @@ class ExpandableDescription extends HookWidget { child: Html( data: '
$content
', style: { - "div": Style( - maxLines: isDescExpanded.value ? null : 3, - textOverflow: TextOverflow.ellipsis, - fontStyle: textTheme.bodyMedium?.fontStyle, - ), + "div.vaani-ellipsis": !isDescExpanded.value + ? Style( + maxLines: 3, + textOverflow: TextOverflow.ellipsis, + fontStyle: textTheme.bodyMedium?.fontStyle, + ) + : Style( + fontStyle: textTheme.bodyMedium?.fontStyle, + ), }, ), ), diff --git a/pubspec.lock b/pubspec.lock index dc0a054..740c52b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -787,6 +787,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.16" + just_audio_windows: + dependency: "direct main" + description: + name: just_audio_windows + sha256: b1ba5305d841c0e3883644e20fc11aaa23f28cfdd43ec20236d1e119a402ef29 + url: "https://pub.dev" + source: hosted + version: "0.2.2" leak_tracker: dependency: transitive description: @@ -899,14 +907,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.1" - media_kit_libs_windows_audio: - dependency: "direct main" - description: - name: media_kit_libs_windows_audio - sha256: c2fd558cc87b9d89a801141fcdffe02e338a3b21a41a18fbd63d5b221a1b8e53 - url: "https://pub.dev" - source: hosted - version: "1.0.9" menu_base: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index fc07b1d..690d0d8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -69,10 +69,10 @@ dependencies: url: https://github.com/Dr-Blank/just_audio ref: media-notification-config path: just_audio_background - # just_audio_windows: ^0.2.2 + just_audio_windows: ^0.2.2 just_audio_media_kit: ^2.0.4 media_kit_libs_linux: any - media_kit_libs_windows_audio: any + # media_kit_libs_windows_audio: any list_wheel_scroll_view_nls: ^0.0.3 logging: ^1.2.0 logging_appenders: ^1.3.1 @@ -102,6 +102,8 @@ dependencies: sdk: flutter window_manager: ^0.5.1 tray_manager: ^0.5.2 + # http_cache_client: ^1.0.4 + # http_cache_isar_store: ^3.0.0-dev.1 dev_dependencies: build_runner: ^2.4.9 custom_lint: ^0.7.0 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 4f18e92..db5c691 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -8,7 +8,7 @@ #include #include -#include +#include #include #include #include @@ -21,8 +21,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("DynamicColorPluginCApi")); IsarFlutterLibsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("IsarFlutterLibsPlugin")); - MediaKitLibsWindowsAudioPluginCApiRegisterWithRegistrar( - registry->GetRegistrarForPlugin("MediaKitLibsWindowsAudioPluginCApi")); + JustAudioWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("JustAudioWindowsPlugin")); PermissionHandlerWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index ed05458..cc33937 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -5,7 +5,7 @@ list(APPEND FLUTTER_PLUGIN_LIST dynamic_color isar_flutter_libs - media_kit_libs_windows_audio + just_audio_windows permission_handler_windows screen_retriever_windows share_plus