diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 0cae0a5..ce1abc1 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -29,6 +29,15 @@ + + + + + + + + + diff --git a/lib/apis/base_api.dart b/lib/apis/base_api.dart new file mode 100644 index 0000000..a8b5f56 --- /dev/null +++ b/lib/apis/base_api.dart @@ -0,0 +1,9 @@ +import 'package:open_media_server_app/helpers/Preferences.dart'; + +class BaseApi { + static Map getHeaders() { + return { + "Authorization": "Bearer ${Preferences.prefs?.getString("AccessToken")}" + }; + } +} diff --git a/lib/apis/inventory_api.dart b/lib/apis/inventory_api.dart index 3f8d258..4d71d02 100644 --- a/lib/apis/inventory_api.dart +++ b/lib/apis/inventory_api.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:open_media_server_app/apis/base_api.dart'; import 'package:open_media_server_app/globals.dart'; import 'package:open_media_server_app/models/inventory/episode.dart'; import 'package:open_media_server_app/models/inventory/inventory_item.dart'; @@ -11,7 +12,10 @@ class InventoryApi { Future> listItems(String category) async { String apiUrl = "${Globals.BaseUrl}/api/inventory/items?"; - var response = await http.get(Uri.parse("${apiUrl}category=$category")); + var headers = BaseApi.getHeaders(); + + var response = await http.get(Uri.parse("${apiUrl}category=$category"), + headers: headers); if (response.statusCode == 200) { List jsonResponse = json.decode(response.body); @@ -24,7 +28,10 @@ class InventoryApi { Future getMovie(String id) async { String apiUrl = "${Globals.BaseUrl}/api/inventory/movie?"; - var response = await http.get(Uri.parse("${apiUrl}id=$id")); + var headers = BaseApi.getHeaders(); + + var response = + await http.get(Uri.parse("${apiUrl}id=$id"), headers: headers); if (response.statusCode == 200) { dynamic jsonResponse = json.decode(response.body); @@ -37,7 +44,10 @@ class InventoryApi { Future getShow(String id) async { String apiUrl = "${Globals.BaseUrl}/api/inventory/show?"; - var response = await http.get(Uri.parse("${apiUrl}id=$id")); + var headers = BaseApi.getHeaders(); + + var response = + await http.get(Uri.parse("${apiUrl}id=$id"), headers: headers); if (response.statusCode == 200) { dynamic jsonResponse = json.decode(response.body); @@ -50,7 +60,10 @@ class InventoryApi { Future getSeason(String id) async { String apiUrl = "${Globals.BaseUrl}/api/inventory/season?"; - var response = await http.get(Uri.parse("${apiUrl}id=$id")); + var headers = BaseApi.getHeaders(); + + var response = + await http.get(Uri.parse("${apiUrl}id=$id"), headers: headers); if (response.statusCode == 200) { dynamic jsonResponse = json.decode(response.body); @@ -63,7 +76,10 @@ class InventoryApi { Future getEpisode(String id) async { String apiUrl = "${Globals.BaseUrl}/api/inventory/episode?"; - var response = await http.get(Uri.parse("${apiUrl}id=$id")); + var headers = BaseApi.getHeaders(); + + var response = + await http.get(Uri.parse("${apiUrl}id=$id"), headers: headers); if (response.statusCode == 200) { dynamic jsonResponse = json.decode(response.body); diff --git a/lib/apis/metadata_api.dart b/lib/apis/metadata_api.dart index c4a9790..7c3a5c8 100644 --- a/lib/apis/metadata_api.dart +++ b/lib/apis/metadata_api.dart @@ -1,13 +1,17 @@ import 'dart:convert'; +import 'package:open_media_server_app/apis/base_api.dart'; import 'package:open_media_server_app/globals.dart'; import 'package:open_media_server_app/models/metadata/metadata_model.dart'; import 'package:http/http.dart' as http; class MetadataApi { - Future getMetadata(String id, String category) async { + Future getMetadata(String id, String category) async { String apiUrl = "${Globals.BaseUrl}/api/metadata?"; - var response = await http.get(Uri.parse("${apiUrl}id=$id&category=$category")); + var headers = BaseApi.getHeaders(); + + var response = await http + .get(Uri.parse("${apiUrl}id=$id&category=$category"), headers: headers); if (response.statusCode == 200) { dynamic jsonResponse = json.decode(response.body); @@ -16,4 +20,4 @@ class MetadataApi { throw Exception('Failed to load metadata'); } } -} \ No newline at end of file +} diff --git a/lib/auth/login_manager.dart b/lib/auth/login_manager.dart new file mode 100644 index 0000000..f39bfc1 --- /dev/null +++ b/lib/auth/login_manager.dart @@ -0,0 +1,85 @@ +// import 'package:fedodo_general/globals/preferences.dart'; +// import 'package:fedodo_general/widgets/auth/oauth_handler/custom_web_base_dummy.dart' +// if (dart.library.html) '../oauth_handler/custom_web_base.dart'; +import 'package:flutter/foundation.dart'; +import 'package:oauth2_client/access_token_response.dart'; +import 'package:oauth2_client/interfaces.dart'; +import 'package:oauth2_client/oauth2_client.dart'; +import 'package:open_media_server_app/globals.dart'; +import 'package:open_media_server_app/helpers/Preferences.dart'; +import 'package:random_string/random_string.dart'; + +class LoginManager { + late OAuth2Client client; + + BaseWebAuth? baseWebAuth; + + LoginManager() { + if (!Globals.isWeb) { + client = OAuth2Client( + authorizeUrl: Globals.AuthorizeUrl, + tokenUrl: Globals.TokenUrl, + redirectUri: "my.test.app:/oauth2redirect", // TODO + customUriScheme: "my.test.app", + ); + } else { + // client = OAuth2Client( + // authorizeUrl: + // "https://auth.${Preferences.prefs!.getString("DomainName")}/oauth/authorize", + // tokenUrl: + // "https://auth.${Preferences.prefs!.getString("DomainName")}/oauth/token", + // redirectUri: AuthGlobals.redirectUriWeb, + // // refreshUrl: "https://auth.${GlobalSettings.domainName}/oauth/token", + // customUriScheme: Uri.parse(AuthGlobals.redirectUriWeb).authority, + // ); + } + + // if (kIsWeb) { + // baseWebAuth = CustomWebBase(); + // } + } + + Future login(String clientId, String clientSecret) async { + var state = Preferences.prefs?.getString("OAuth_State"); + var codeVerifier = Preferences.prefs?.getString("OAuth_CodeVerifier"); + + if (kIsWeb && codeVerifier == null) { + codeVerifier = randomAlphaNumeric(80); + Preferences.prefs?.setString("OAuth_CodeVerifier", codeVerifier); + } + + AccessTokenResponse tknResponse = await client.getTokenWithAuthCodeFlow( + clientId: clientId, + clientSecret: Uri.encodeQueryComponent(clientSecret), + scopes: ["offline_access"], + webAuthClient: baseWebAuth, + state: state, + codeVerifier: codeVerifier, + ); + + var refreshToken = tknResponse.refreshToken; + if (refreshToken != null) { + Preferences.prefs?.setString("RefreshToken", refreshToken); + } + + Preferences.prefs?.setString("AccessToken", tknResponse.accessToken!); + + return tknResponse.accessToken; + } + + Future refreshAsync() async { + String clientId = Preferences.prefs!.getString("ClientId")!; + String clientSecret = Preferences.prefs!.getString("ClientSecret")!; + + var tknResponse = await client.refreshToken( + Preferences.prefs!.getString("RefreshToken")!, + clientId: clientId, + clientSecret: Uri.encodeQueryComponent(clientSecret), + ); + + Preferences.prefs?.setString("AccessToken", tknResponse.accessToken!); + Preferences.prefs?.setString("RefreshToken", tknResponse.refreshToken!); + + return tknResponse.accessToken; + } +} \ No newline at end of file diff --git a/lib/gallery_item.dart b/lib/gallery_item.dart index aafa3ab..6af307e 100644 --- a/lib/gallery_item.dart +++ b/lib/gallery_item.dart @@ -1,7 +1,7 @@ -import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:open_media_server_app/globals.dart'; import 'package:open_media_server_app/models/internal/grid_item_model.dart'; +import 'package:open_media_server_app/widgets/custom_image.dart'; class GridItem extends StatelessWidget { final GridItemModel item; @@ -16,7 +16,7 @@ class GridItem extends StatelessWidget { Expanded( child: ClipRRect( borderRadius: BorderRadius.circular(8.0), - child: CachedNetworkImage( + child: CustomImage( imageUrl: item.posterUrl ?? Globals.PictureNotFoundUrl, fit: BoxFit.cover, width: double.infinity, diff --git a/lib/globals.dart b/lib/globals.dart index 7742abb..699d940 100644 --- a/lib/globals.dart +++ b/lib/globals.dart @@ -1,8 +1,16 @@ class Globals { static String BaseUrl = "http://localhost:8080"; + + static String ClientId = ""; + static String ClientSecret = ""; + static String AuthorizeUrl = ""; + static String TokenUrl = ""; + static String Title = "Open Media Station"; static String PictureNotFoundUrl = "https://static.vecteezy.com/system/resources/previews/005/337/799/original/icon-image-not-found-free-vector.jpg"; + static bool isTv = false; static bool isMobile = false; + static bool isWeb = false; } diff --git a/lib/helpers/Preferences.dart b/lib/helpers/Preferences.dart new file mode 100644 index 0000000..45d8361 --- /dev/null +++ b/lib/helpers/Preferences.dart @@ -0,0 +1,5 @@ +import 'package:shared_preferences/shared_preferences.dart'; + +class Preferences { + static SharedPreferences? prefs; +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index d398765..bd90d8b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,8 +2,11 @@ import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:media_kit/media_kit.dart'; +import 'package:open_media_server_app/auth/login_manager.dart'; import 'package:open_media_server_app/gallery.dart'; import 'package:open_media_server_app/globals.dart'; +import 'package:open_media_server_app/helpers/Preferences.dart'; +import 'package:shared_preferences/shared_preferences.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -22,6 +25,16 @@ Future main() async { Globals.isMobile = false; } + if (kIsWeb) { + Globals.isWeb = true; + } + + var prefs = await SharedPreferences.getInstance(); + Preferences.prefs = prefs; + + LoginManager loginManager = LoginManager(); + var token = await loginManager.login(Globals.ClientId, Globals.ClientSecret); + runApp(const MyApp()); } diff --git a/lib/player.dart b/lib/player.dart index 8a3e952..3305087 100644 --- a/lib/player.dart +++ b/lib/player.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:media_kit/media_kit.dart'; import 'package:media_kit_video/media_kit_video.dart'; +import 'package:open_media_server_app/apis/base_api.dart'; import 'package:open_media_server_app/player_controls/material_tv.dart'; import 'package:open_media_server_app/helpers/wrapper.dart'; import 'package:open_media_server_app/globals.dart'; @@ -27,6 +28,7 @@ class _PlayerState extends State { player.open( Media( widget.url, + httpHeaders: BaseApi.getHeaders(), ), ); diff --git a/lib/views/episode_detail.dart b/lib/views/episode_detail.dart index f290d3e..1c9fdc8 100644 --- a/lib/views/episode_detail.dart +++ b/lib/views/episode_detail.dart @@ -1,8 +1,8 @@ -import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:open_media_server_app/globals.dart'; import 'package:open_media_server_app/models/internal/grid_item_model.dart'; import 'package:open_media_server_app/player.dart'; +import 'package:open_media_server_app/widgets/custom_image.dart'; class EpisodeDetailView extends StatelessWidget { const EpisodeDetailView({ @@ -35,7 +35,7 @@ class EpisodeDetailView extends StatelessWidget { Rect.fromLTRB(220, 220, rect.width, rect.height)); }, blendMode: BlendMode.dstIn, - child: CachedNetworkImage( + child: CustomImage( imageUrl: itemModel.backdropUrl ?? Globals.PictureNotFoundUrl, height: 300, width: double.infinity, diff --git a/lib/views/movie_detail.dart b/lib/views/movie_detail.dart index f58e919..ea75340 100644 --- a/lib/views/movie_detail.dart +++ b/lib/views/movie_detail.dart @@ -1,8 +1,8 @@ -import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:open_media_server_app/globals.dart'; import 'package:open_media_server_app/models/internal/grid_item_model.dart'; import 'package:open_media_server_app/player.dart'; +import 'package:open_media_server_app/widgets/custom_image.dart'; class MovieDetailView extends StatelessWidget { const MovieDetailView({ @@ -36,7 +36,7 @@ class MovieDetailView extends StatelessWidget { Rect.fromLTRB(220, 220, rect.width, rect.height)); }, blendMode: BlendMode.dstIn, - child: CachedNetworkImage( + child: CustomImage( imageUrl: itemModel.backdropUrl ?? Globals.PictureNotFoundUrl, height: 300, width: double.infinity, diff --git a/lib/views/season_detail.dart b/lib/views/season_detail.dart index bb03d50..0903e19 100644 --- a/lib/views/season_detail.dart +++ b/lib/views/season_detail.dart @@ -1,11 +1,13 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; +import 'package:open_media_server_app/apis/base_api.dart'; import 'package:open_media_server_app/apis/inventory_api.dart'; import 'package:open_media_server_app/apis/metadata_api.dart'; import 'package:open_media_server_app/globals.dart'; import 'package:open_media_server_app/models/internal/grid_item_model.dart'; import 'package:open_media_server_app/models/metadata/metadata_model.dart'; import 'package:open_media_server_app/views/episode_detail.dart'; +import 'package:open_media_server_app/widgets/custom_image.dart'; import 'package:open_media_server_app/widgets/title.dart'; class SeasonDetailView extends StatelessWidget { @@ -56,9 +58,9 @@ class SeasonDetailView extends StatelessWidget { Rect.fromLTRB(220, 220, rect.width, rect.height)); }, blendMode: BlendMode.dstIn, - child: CachedNetworkImage( - imageUrl: itemModel.backdropUrl ?? - Globals.PictureNotFoundUrl, + child: CustomImage( + imageUrl: + itemModel.backdropUrl ?? Globals.PictureNotFoundUrl, height: 300, width: double.infinity, fit: BoxFit.cover, @@ -114,6 +116,7 @@ class SeasonDetailView extends StatelessWidget { image: CachedNetworkImageProvider( element.backdropUrl ?? Globals.PictureNotFoundUrl, + headers: BaseApi.getHeaders(), ), ), const SizedBox( @@ -121,7 +124,8 @@ class SeasonDetailView extends StatelessWidget { ), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Text( element.metadataModel?.title != null diff --git a/lib/views/show_detail.dart b/lib/views/show_detail.dart index 8927599..b09eead 100644 --- a/lib/views/show_detail.dart +++ b/lib/views/show_detail.dart @@ -1,11 +1,13 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; +import 'package:open_media_server_app/apis/base_api.dart'; import 'package:open_media_server_app/apis/inventory_api.dart'; import 'package:open_media_server_app/apis/metadata_api.dart'; import 'package:open_media_server_app/globals.dart'; import 'package:open_media_server_app/models/internal/grid_item_model.dart'; import 'package:open_media_server_app/models/metadata/metadata_model.dart'; import 'package:open_media_server_app/views/season_detail.dart'; +import 'package:open_media_server_app/widgets/custom_image.dart'; import 'package:open_media_server_app/widgets/title.dart'; class ShowDetailView extends StatelessWidget { @@ -53,6 +55,7 @@ class ShowDetailView extends StatelessWidget { fit: BoxFit.cover, image: CachedNetworkImageProvider( element.posterUrl ?? Globals.PictureNotFoundUrl, + headers: BaseApi.getHeaders(), ), ), const SizedBox( @@ -99,8 +102,9 @@ class ShowDetailView extends StatelessWidget { Rect.fromLTRB(220, 220, rect.width, rect.height)); }, blendMode: BlendMode.dstIn, - child: CachedNetworkImage( - imageUrl: itemModel.backdropUrl ?? Globals.PictureNotFoundUrl, + child: CustomImage( + imageUrl: + itemModel.backdropUrl ?? Globals.PictureNotFoundUrl, height: 300, width: double.infinity, fit: BoxFit.cover, diff --git a/lib/widgets/custom_image.dart b/lib/widgets/custom_image.dart new file mode 100644 index 0000000..e6f39a5 --- /dev/null +++ b/lib/widgets/custom_image.dart @@ -0,0 +1,29 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:open_media_server_app/apis/base_api.dart'; + +class CustomImage extends StatelessWidget { + const CustomImage({ + super.key, + required this.imageUrl, + this.fit, + this.width, + this.height, + }); + + final String imageUrl; + final BoxFit? fit; + final double? width; + final double? height; + + @override + Widget build(BuildContext context) { + return CachedNetworkImage( + imageUrl: imageUrl, + fit: fit, + width: width, + height: height, + httpHeaders: BaseApi.getHeaders(), + ); + } +} diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index e4b9cf8..cd9cc1e 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,14 +6,26 @@ #include "generated_plugin_registrant.h" +#include #include #include +#include +#include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); + flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); g_autoptr(FlPluginRegistrar) media_kit_libs_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "MediaKitLibsLinuxPlugin"); media_kit_libs_linux_plugin_register_with_registrar(media_kit_libs_linux_registrar); g_autoptr(FlPluginRegistrar) media_kit_video_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "MediaKitVideoPlugin"); media_kit_video_plugin_register_with_registrar(media_kit_video_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); + g_autoptr(FlPluginRegistrar) window_to_front_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "WindowToFrontPlugin"); + window_to_front_plugin_register_with_registrar(window_to_front_registrar); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 6e35efc..7176f52 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,8 +3,11 @@ # list(APPEND FLUTTER_PLUGIN_LIST + flutter_secure_storage_linux media_kit_libs_linux media_kit_video + url_launcher_linux + window_to_front ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 849019d..c7f7baa 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,21 +6,31 @@ import FlutterMacOS import Foundation import device_info_plus +import flutter_secure_storage_macos +import flutter_web_auth_2 import media_kit_libs_macos_video import media_kit_video import package_info_plus import path_provider_foundation import screen_brightness_macos +import shared_preferences_foundation import sqflite_darwin +import url_launcher_macos import wakelock_plus +import window_to_front func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) + FlutterWebAuth2Plugin.register(with: registry.registrar(forPlugin: "FlutterWebAuth2Plugin")) MediaKitLibsMacosVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitLibsMacosVideoPlugin")) MediaKitVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitVideoPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) ScreenBrightnessMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenBrightnessMacosPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) + WindowToFrontPlugin.register(with: registry.registrar(forPlugin: "WindowToFrontPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 2755f33..1d7fbea 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -174,11 +174,75 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.3" + flutter_secure_storage: + dependency: transitive + description: + name: flutter_secure_storage + sha256: "165164745e6afb5c0e3e3fcc72a012fb9e58496fb26ffb92cf22e16a821e85d0" + url: "https://pub.dev" + source: hosted + version: "9.2.2" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: "4d91bfc23047422cbcd73ac684bc169859ee766482517c22172c86596bf1464b" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: "1693ab11121a5f925bbea0be725abfcfbbcf36c1e29e571f84a0c0f436147a81" + url: "https://pub.dev" + source: hosted + version: "3.1.2" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + url: "https://pub.dev" + source: hosted + version: "3.1.2" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + flutter_web_auth_2: + dependency: transitive + description: + name: flutter_web_auth_2 + sha256: "4d3d2fd3d26bf1a26b3beafd4b4b899c0ffe10dc99af25abc58ffe24e991133c" + url: "https://pub.dev" + source: hosted + version: "3.1.2" + flutter_web_auth_2_platform_interface: + dependency: transitive + description: + name: flutter_web_auth_2_platform_interface + sha256: e8669e262005a8354389ba2971f0fc1c36188481234ff50d013aaf993f30f739 + url: "https://pub.dev" + source: hosted + version: "3.1.0" flutter_web_plugins: dependency: transitive description: flutter @@ -344,6 +408,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.15.0" + oauth2_client: + dependency: "direct main" + description: + name: oauth2_client + sha256: db7e93d8097ad0dff1cb07cbe7158344fb32082f8f2ed60b32af84591fb81722 + url: "https://pub.dev" + source: hosted + version: "3.3.0" octo_image: dependency: transitive description: @@ -448,6 +520,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + random_string: + dependency: "direct main" + description: + name: random_string + sha256: "03b52435aae8cbdd1056cf91bfc5bf845e9706724dd35ae2e99fa14a1ef79d02" + url: "https://pub.dev" + source: hosted + version: "2.3.1" rxdart: dependency: transitive description: @@ -512,6 +592,62 @@ packages: url: "https://pub.dev" source: hosted version: "0.1.3" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "3b9febd815c9ca29c9e3520d50ec32f49157711e143b7a4ca039eb87e8ade5ab" + url: "https://pub.dev" + source: hosted + version: "2.3.3" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d" + url: "https://pub.dev" + source: hosted + version: "2.5.3" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e + url: "https://pub.dev" + source: hosted + version: "2.4.2" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" + source: hosted + version: "2.4.1" sky_engine: dependency: transitive description: flutter @@ -645,6 +781,70 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.2" + url_launcher: + dependency: transitive + description: + name: url_launcher + sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" + url: "https://pub.dev" + source: hosted + version: "6.3.1" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "0dea215895a4d254401730ca0ba8204b29109a34a99fb06ae559a2b60988d2de" + url: "https://pub.dev" + source: hosted + version: "6.3.13" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e + url: "https://pub.dev" + source: hosted + version: "6.3.1" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af + url: "https://pub.dev" + source: hosted + version: "3.2.0" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" + url: "https://pub.dev" + source: hosted + version: "2.3.3" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4" + url: "https://pub.dev" + source: hosted + version: "3.1.3" uuid: dependency: transitive description: @@ -717,6 +917,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.5" + window_to_front: + dependency: transitive + description: + name: window_to_front + sha256: "7aef379752b7190c10479e12b5fd7c0b9d92adc96817d9e96c59937929512aee" + url: "https://pub.dev" + source: hosted + version: "0.0.3" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index aa77b62..d5660c7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,6 +17,9 @@ dependencies: http: ^1.2.2 device_info_plus: ^11.0.0 cached_network_image: ^3.4.1 + shared_preferences: ^2.3.2 + oauth2_client: ^3.3.0 + random_string: ^2.3.1 dev_dependencies: flutter_test: diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 0594ad4..fdd8fe1 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,15 +6,24 @@ #include "generated_plugin_registrant.h" +#include #include #include #include +#include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + FlutterSecureStorageWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); MediaKitLibsWindowsVideoPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("MediaKitLibsWindowsVideoPluginCApi")); MediaKitVideoPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("MediaKitVideoPluginCApi")); ScreenBrightnessWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("ScreenBrightnessWindowsPlugin")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); + WindowToFrontPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("WindowToFrontPlugin")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 0833234..525cdf1 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,9 +3,12 @@ # list(APPEND FLUTTER_PLUGIN_LIST + flutter_secure_storage_windows media_kit_libs_windows_video media_kit_video screen_brightness_windows + url_launcher_windows + window_to_front ) list(APPEND FLUTTER_FFI_PLUGIN_LIST