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