diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9afe71f0..f9b53473 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -89,6 +89,7 @@ jobs: with: distribution: 'temurin' java-version: '17' + cache: gradle # Flutter Pub Get - name: Flutter Pub Get @@ -113,7 +114,7 @@ jobs: - name: Build Android if: matrix.target == 'Android' run: | - flutter build apk --release + flutter build apk --release --verbose flutter build apk --release --split-per-abi cd build/app/outputs/flutter-apk mv app-release.apk CloudOTP-${{ steps.get_version.outputs.version }}-android-universal.apk diff --git a/android/app/build.gradle b/android/app/build.gradle index 4f2cc4ec..0c3d690f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -39,7 +39,13 @@ android { } kotlinOptions { - jvmTarget = '1.8' + jvmTarget = '17' + } + + tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { + kotlinOptions { + jvmTarget = "17" + } } defaultConfig { @@ -62,7 +68,6 @@ android { buildTypes { release { signingConfig signingConfigs.release -// useProguard true minifyEnabled true shrinkResources true zipAlignEnabled true @@ -74,6 +79,10 @@ android { } } +kotlin { + jvmToolchain(17) +} + flutter { source '../..' } diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index afb29c82..b8239ae8 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -11,4 +11,14 @@ -keepattributes *Annotation* --keepattributes SourceFile,LineNumberTable \ No newline at end of file +-dontwarn com.google.android.play.core.splitcompat.SplitCompatApplication +-dontwarn com.google.android.play.core.splitinstall.SplitInstallException +-dontwarn com.google.android.play.core.splitinstall.SplitInstallManager +-dontwarn com.google.android.play.core.splitinstall.SplitInstallManagerFactory +-dontwarn com.google.android.play.core.splitinstall.SplitInstallRequest$Builder +-dontwarn com.google.android.play.core.splitinstall.SplitInstallRequest +-dontwarn com.google.android.play.core.splitinstall.SplitInstallSessionState +-dontwarn com.google.android.play.core.splitinstall.SplitInstallStateUpdatedListener +-dontwarn com.google.android.play.core.tasks.OnFailureListener +-dontwarn com.google.android.play.core.tasks.OnSuccessListener +-dontwarn com.google.android.play.core.tasks.Task \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index 216f5c6e..ceba1f59 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,28 +1,20 @@ -//buildscript { -// ext.kotlin_version = '1.8.10' -// repositories { -// google() -// mavenCentral() -// } -// dependencies { -// classpath 'com.android.tools.build:gradle:7.3.1' -// classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" -// } -//} +buildscript { + ext.kotlin_version = '2.1.10' + repositories { + google() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:8.0.2' +// classpath 'com.android.tools:r8:1.6.82' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} allprojects { repositories { -// maven { url 'https://maven.aliyun.com/repository/google' } -// maven { url 'https://maven.aliyun.com/repository/jcenter' } google() mavenCentral() -// maven { url 'https://jitpack.io' } -// maven { url "https://maven.google.com" } -// maven { url 'https://maven.aliyun.com/repository/public' } -// maven { url 'https://maven.aliyun.com/repository/central' } -// maven { url 'https://maven.aliyun.com/nexus/content/groups/public' } -// maven { url 'https://maven.aliyun.com/repository/flutter-plugin' } -// maven { url "https://download.flutter.io" } } } @@ -32,6 +24,20 @@ subprojects { android { compileSdkVersion 34 } + if (it.plugins.hasPlugin('com.android.library') || it.plugins.hasPlugin('com.android.application')) { + it.android { + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + } + + it.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { + kotlinOptions { + jvmTarget = "17" + } + } + } } } subprojects { diff --git a/android/gradle.properties b/android/gradle.properties index 696b2e75..de5b1e4f 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -2,3 +2,5 @@ org.gradle.jvmargs=-Xmx4096m org.gradle.parallel=true android.useAndroidX=true android.enableJetifier=true +kotlin.version=2.1.10 +org.gradle.jvm.toolchain=17 diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index e1ca574e..5e6b5427 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip diff --git a/android/settings.gradle b/android/settings.gradle index 85a11d92..a3010453 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -14,12 +14,17 @@ pluginManagement { mavenCentral() gradlePluginPortal() } + + plugins { + id("org.jetbrains.kotlin.jvm") version "2.1.10" + id("org.jetbrains.kotlin.android") version "2.1.10" + } } plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "7.3.1" apply false - id "org.jetbrains.kotlin.android" version "2.1.0" apply false + id "com.android.application" version "8.0.2" apply false + id "org.jetbrains.kotlin.android" version "2.1.10" apply false } include ":app" \ No newline at end of file diff --git a/lib/Database/database_manager.dart b/lib/Database/database_manager.dart index 8267faef..52beeecf 100644 --- a/lib/Database/database_manager.dart +++ b/lib/Database/database_manager.dart @@ -124,8 +124,8 @@ class DatabaseManager { await _database!.rawQuery("SELECT sqlcipher_export('tmp')"); await _database!.rawQuery("DETACH DATABASE tmp"); return true; - } catch (e) { - ILogger.error("Failed to change database password", e); + } catch (e, t) { + ILogger.error("Failed to change database password", e, t); return false; } } @@ -143,9 +143,7 @@ class DatabaseManager { "Configure database with cipher successfully. Result is $res"); } else { ILogger.error( - "Failed to configure database with cipher, perhaps the sqlcipher dynamic library was not loaded.", - res, - ); + "Failed to configure database with cipher, perhaps the sqlcipher dynamic library was not loaded. Result is $res"); } } } @@ -265,7 +263,11 @@ class DatabaseManager { if (Platform.isLinux || Platform.isAndroid) { try { lib = DynamicLibrary.open('libsqlcipher.so'); - } catch (e) { + } catch (e, t) { + ILogger.error( + "Failed to load libsqlcipher.so, perhaps the library is not installed or not in the correct path.", + e, + t); if (Platform.isAndroid) { final appIdAsBytes = File('/proc/self/cmdline').readAsBytesSync(); final endOfAppId = max(appIdAsBytes.indexOf(0), 0); @@ -284,7 +286,8 @@ class DatabaseManager { lib = DynamicLibrary.open('sqlite_sqlcipher.dll'); } return lib; - } catch (e) { + } catch (e, t) { + ILogger.error("Failed to load sqlcipher dynamic library", e, t); return null; } } diff --git a/lib/Database/token_category_binding_dao.dart b/lib/Database/token_category_binding_dao.dart index 1beb98e3..75779c10 100644 --- a/lib/Database/token_category_binding_dao.dart +++ b/lib/Database/token_category_binding_dao.dart @@ -19,7 +19,6 @@ import 'package:cloudotp/Models/opt_token.dart'; import 'package:cloudotp/Models/token_category_binding.dart'; import 'package:sqflite_sqlcipher/sqflite.dart'; -import '../Utils/utils.dart'; import 'database_manager.dart'; class BindingDao { diff --git a/lib/Models/token_category.dart b/lib/Models/token_category.dart index e03bdd70..96630a6b 100644 --- a/lib/Models/token_category.dart +++ b/lib/Models/token_category.dart @@ -18,7 +18,6 @@ import 'dart:convert'; import 'package:awesome_chewie/awesome_chewie.dart'; import '../Database/token_category_binding_dao.dart'; -import '../Utils/utils.dart'; import 'Proto/TokenCategory/token_category_payload.pb.dart'; import 'opt_token.dart'; diff --git a/lib/Screens/Backup/aliyundrive_service_screen.dart b/lib/Screens/Backup/aliyundrive_service_screen.dart index 4a96e31a..d31a8e3d 100644 --- a/lib/Screens/Backup/aliyundrive_service_screen.dart +++ b/lib/Screens/Backup/aliyundrive_service_screen.dart @@ -16,11 +16,12 @@ import 'dart:typed_data'; import 'package:awesome_chewie/awesome_chewie.dart'; +import 'package:awesome_cloud/awesome_cloud.dart'; import 'package:cloudotp/Models/cloud_service_config.dart'; import 'package:cloudotp/TokenUtils/Cloud/cloud_service.dart'; import 'package:cloudotp/Utils/app_provider.dart'; import 'package:flutter/material.dart'; -import 'package:awesome_cloud/awesome_cloud.dart'; +import 'package:window_manager/window_manager.dart'; import '../../Database/cloud_service_config_dao.dart'; import '../../TokenUtils/Cloud/aliyundrive_cloud_service.dart'; @@ -242,12 +243,14 @@ class _AliyunDriveServiceScreenState onPressed: () async { try { appProvider.preventLock = true; + windowManager.minimize(); await ping(); } catch (e, t) { ILogger.error("Failed to connect to aliyunDrive", e, t); IToast.show(appLocalizations.cloudConnectionError); } finally { appProvider.preventLock = false; + windowManager.restore(); } }, ), diff --git a/lib/Screens/Backup/box_service_screen.dart b/lib/Screens/Backup/box_service_screen.dart index d1698b62..78f0ab08 100644 --- a/lib/Screens/Backup/box_service_screen.dart +++ b/lib/Screens/Backup/box_service_screen.dart @@ -21,6 +21,7 @@ import 'package:awesome_cloud/models/box_response.dart'; import 'package:cloudotp/Models/cloud_service_config.dart'; import 'package:cloudotp/TokenUtils/Cloud/cloud_service.dart'; import 'package:flutter/material.dart'; +import 'package:window_manager/window_manager.dart'; import '../../Database/cloud_service_config_dao.dart'; import '../../TokenUtils/Cloud/box_cloud_service.dart'; @@ -254,12 +255,14 @@ class _BoxServiceScreenState extends BaseDynamicState onPressed: () async { try { appProvider.preventLock = true; + windowManager.minimize(); await ping(); } catch (e, t) { ILogger.error("Failed to connect to box", e, t); IToast.show(appLocalizations.cloudConnectionError); } finally { appProvider.preventLock = false; + windowManager.restore(); } }, ), diff --git a/lib/Screens/Backup/dropbox_service_screen.dart b/lib/Screens/Backup/dropbox_service_screen.dart index b089952b..40248c3c 100644 --- a/lib/Screens/Backup/dropbox_service_screen.dart +++ b/lib/Screens/Backup/dropbox_service_screen.dart @@ -16,10 +16,11 @@ import 'dart:typed_data'; import 'package:awesome_chewie/awesome_chewie.dart'; +import 'package:awesome_cloud/awesome_cloud.dart'; import 'package:cloudotp/Models/cloud_service_config.dart'; import 'package:cloudotp/TokenUtils/Cloud/cloud_service.dart'; import 'package:flutter/material.dart'; -import 'package:awesome_cloud/awesome_cloud.dart'; +import 'package:window_manager/window_manager.dart'; import '../../Database/cloud_service_config_dao.dart'; import '../../TokenUtils/Cloud/dropbox_cloud_service.dart'; @@ -243,12 +244,14 @@ class _DropboxServiceScreenState extends BaseDynamicState onPressed: () async { try { appProvider.preventLock = true; + windowManager.minimize(); await ping(); } catch (e, t) { ILogger.error("Failed to connect to dropbox", e, t); IToast.show(appLocalizations.cloudConnectionError); } finally { appProvider.preventLock = false; + windowManager.restore(); } }, ), diff --git a/lib/Screens/Backup/googledrive_service_screen.dart b/lib/Screens/Backup/googledrive_service_screen.dart index 2dc1b5c3..3dfcf91f 100644 --- a/lib/Screens/Backup/googledrive_service_screen.dart +++ b/lib/Screens/Backup/googledrive_service_screen.dart @@ -20,6 +20,7 @@ import 'package:awesome_cloud/awesome_cloud.dart'; import 'package:cloudotp/Models/cloud_service_config.dart'; import 'package:cloudotp/TokenUtils/Cloud/cloud_service.dart'; import 'package:flutter/material.dart'; +import 'package:window_manager/window_manager.dart'; import '../../Database/cloud_service_config_dao.dart'; import '../../TokenUtils/Cloud/googledrive_cloud_service.dart'; @@ -241,12 +242,14 @@ class _GoogleDriveServiceScreenState onPressed: () async { try { appProvider.preventLock = true; + windowManager.minimize(); await ping(); } catch (e, t) { ILogger.error("Failed to connect to google drive", e, t); IToast.show(appLocalizations.cloudConnectionError); } finally { appProvider.preventLock = false; + windowManager.restore(); } }, ), diff --git a/lib/Screens/Backup/huawei_service_screen.dart b/lib/Screens/Backup/huawei_service_screen.dart index 2d332b97..f5ddd641 100644 --- a/lib/Screens/Backup/huawei_service_screen.dart +++ b/lib/Screens/Backup/huawei_service_screen.dart @@ -20,6 +20,7 @@ import 'package:awesome_cloud/awesome_cloud.dart'; import 'package:cloudotp/Models/cloud_service_config.dart'; import 'package:cloudotp/TokenUtils/Cloud/cloud_service.dart'; import 'package:flutter/material.dart'; +import 'package:window_manager/window_manager.dart'; import '../../Database/cloud_service_config_dao.dart'; import '../../TokenUtils/Cloud/huawei_cloud_service.dart'; @@ -235,12 +236,14 @@ class _HuaweiCloudServiceScreenState onPressed: () async { try { appProvider.preventLock = true; + windowManager.minimize(); await ping(); } catch (e, t) { ILogger.error("Failed to connect to huawei cloud", e, t); IToast.show(appLocalizations.cloudConnectionError); } finally { appProvider.preventLock = false; + windowManager.restore(); } }, ), diff --git a/lib/Screens/Backup/onedrive_service_screen.dart b/lib/Screens/Backup/onedrive_service_screen.dart index 15374aff..a2ea7a1b 100644 --- a/lib/Screens/Backup/onedrive_service_screen.dart +++ b/lib/Screens/Backup/onedrive_service_screen.dart @@ -15,17 +15,18 @@ import 'dart:typed_data'; +import 'package:awesome_chewie/awesome_chewie.dart'; +import 'package:awesome_cloud/awesome_cloud.dart'; import 'package:cloudotp/Models/cloud_service_config.dart'; import 'package:cloudotp/TokenUtils/Cloud/cloud_service.dart'; import 'package:cloudotp/Widgets/BottomSheet/Backups/onedrive_backups_bottom_sheet.dart'; import 'package:flutter/material.dart'; +import 'package:window_manager/window_manager.dart'; -import 'package:awesome_cloud/awesome_cloud.dart'; import '../../Database/cloud_service_config_dao.dart'; import '../../TokenUtils/Cloud/onedrive_cloud_service.dart'; import '../../TokenUtils/export_token_util.dart'; import '../../TokenUtils/import_token_util.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; import '../../Utils/app_provider.dart'; import '../../l10n/l10n.dart'; @@ -65,8 +66,9 @@ class _OneDriveServiceScreenState super.initState(); try { loadConfig(); - } catch (e) { + } catch (e, t) { inited = true; + ILogger.error("Failed to load OneDrive config", e, t); IToast.show(appLocalizations.cloudConnectionError); } } @@ -251,12 +253,14 @@ class _OneDriveServiceScreenState onPressed: () async { try { appProvider.preventLock = true; + windowManager.minimize(); await ping(); } catch (e, t) { ILogger.error("Failed to connect to onedrive", e, t); IToast.show(appLocalizations.cloudConnectionError); } finally { appProvider.preventLock = false; + windowManager.restore(); } }, ), diff --git a/lib/Screens/Backup/s3_service_screen.dart b/lib/Screens/Backup/s3_service_screen.dart index ae916405..72809f6f 100644 --- a/lib/Screens/Backup/s3_service_screen.dart +++ b/lib/Screens/Backup/s3_service_screen.dart @@ -15,16 +15,17 @@ import 'dart:typed_data'; +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/Models/cloud_service_config.dart'; import 'package:cloudotp/TokenUtils/Cloud/cloud_service.dart'; import 'package:cloudotp/TokenUtils/export_token_util.dart'; import 'package:cloudotp/TokenUtils/import_token_util.dart'; import 'package:flutter/material.dart'; +import 'package:window_manager/window_manager.dart'; import '../../Database/cloud_service_config_dao.dart'; import '../../Models/s3_cloud_file_info.dart'; import '../../TokenUtils/Cloud/s3_cloud_service.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; import '../../Utils/app_provider.dart'; import '../../Utils/regex_util.dart'; import '../../Widgets/BottomSheet/Backups/s3_backups_bottom_sheet.dart'; @@ -299,12 +300,14 @@ class _S3CloudServiceScreenState extends BaseDynamicState await CloudServiceConfigDao.updateConfig(currentConfig); _s3CloudService = S3CloudService(_s3CloudServiceConfig!); appProvider.preventLock = true; + windowManager.minimize(); await ping(); } catch (e, t) { ILogger.error("Failed to connect to S3 cloud", e, t); IToast.show(appLocalizations.cloudConnectionError); } finally { appProvider.preventLock = false; + windowManager.restore(); } } }, diff --git a/lib/Screens/Backup/webdav_service_screen.dart b/lib/Screens/Backup/webdav_service_screen.dart index bfe61898..8412c5dd 100644 --- a/lib/Screens/Backup/webdav_service_screen.dart +++ b/lib/Screens/Backup/webdav_service_screen.dart @@ -15,6 +15,7 @@ import 'dart:typed_data'; +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/Models/cloud_service_config.dart'; import 'package:cloudotp/TokenUtils/Cloud/cloud_service.dart'; import 'package:cloudotp/TokenUtils/export_token_util.dart'; @@ -22,10 +23,10 @@ import 'package:cloudotp/TokenUtils/import_token_util.dart'; import 'package:cloudotp/Widgets/BottomSheet/Backups/webdav_backups_bottom_sheet.dart'; import 'package:flutter/material.dart'; import 'package:webdav_client/webdav_client.dart'; +import 'package:window_manager/window_manager.dart'; import '../../Database/cloud_service_config_dao.dart'; import '../../TokenUtils/Cloud/webdav_cloud_service.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; import '../../Utils/app_provider.dart'; import '../../Utils/regex_util.dart'; import '../../l10n/l10n.dart'; @@ -264,12 +265,14 @@ class _WebDavServiceScreenState extends BaseDynamicState WebDavCloudService(_webDavCloudServiceConfig!); try { appProvider.preventLock = true; + windowManager.minimize(); await ping(); } catch (e, t) { ILogger.error("Failed to connect to webdav", e, t); IToast.show(appLocalizations.cloudConnectionError); } finally { appProvider.preventLock = false; + windowManager.restore(); } } }, diff --git a/lib/Screens/Lock/database_decrypt_screen.dart b/lib/Screens/Lock/database_decrypt_screen.dart index fecdcf8e..6350a1da 100644 --- a/lib/Screens/Lock/database_decrypt_screen.dart +++ b/lib/Screens/Lock/database_decrypt_screen.dart @@ -15,6 +15,7 @@ import 'dart:math'; +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:biometric_storage/biometric_storage.dart'; import 'package:cloudotp/Utils/shortcuts_util.dart'; import 'package:flutter/material.dart'; @@ -25,7 +26,6 @@ import '../../Database/database_manager.dart'; import '../../Utils/biometric_util.dart'; import '../../Utils/constant.dart'; import '../../Utils/hive_util.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; import '../../Utils/lottie_util.dart'; import '../../Utils/utils.dart'; import '../../l10n/l10n.dart'; @@ -37,13 +37,11 @@ class DatabaseDecryptScreen extends StatefulWidget { DatabaseDecryptScreenState createState() => DatabaseDecryptScreenState(); } -class DatabaseDecryptScreenState extends BaseDynamicState - with WindowListener, TrayListener { +class DatabaseDecryptScreenState extends BaseWindowState + with TrayListener { final FocusNode _focusNode = FocusNode(); late InputValidateAsyncController validateAsyncController; GlobalKey formKey = GlobalKey(); - bool _isMaximized = false; - bool _isStayOnTop = false; bool _isValidated = true; final bool _allowDatabaseBiometric = ChewieHiveUtil.getBool( CloudOTPHiveUtil.allowDatabaseBiometricKey, @@ -111,47 +109,6 @@ class DatabaseDecryptScreenState extends BaseDynamicState FocusScope.of(context).requestFocus(_focusNode); } - @override - Future onWindowResize() async { - super.onWindowResize(); - windowManager.setMinimumSize(ChewieProvider.minimumWindowSize); - ChewieHiveUtil.setWindowSize(await windowManager.getSize()); - } - - @override - Future onWindowResized() async { - super.onWindowResized(); - ChewieHiveUtil.setWindowSize(await windowManager.getSize()); - } - - @override - Future onWindowMove() async { - super.onWindowMove(); - ChewieHiveUtil.setWindowPosition(await windowManager.getPosition()); - } - - @override - Future onWindowMoved() async { - super.onWindowMoved(); - ChewieHiveUtil.setWindowPosition(await windowManager.getPosition()); - } - - @override - void onWindowMaximize() { - windowManager.setMinimumSize(ChewieProvider.minimumWindowSize); - setState(() { - _isMaximized = true; - }); - } - - @override - void onWindowUnmaximize() { - windowManager.setMinimumSize(ChewieProvider.minimumWindowSize); - setState(() { - _isMaximized = false; - }); - } - @override void dispose() { super.dispose(); @@ -192,7 +149,7 @@ class DatabaseDecryptScreenState extends BaseDynamicState @override Widget build(BuildContext context) { - chewieProvider.rootContext = context; + chewieProvider.resetRootContext(); ChewieUtils.setSafeMode(ChewieHiveUtil.getBool( CloudOTPHiveUtil.enableSafeModeKey, defaultValue: defaultEnableSafeMode)); @@ -231,12 +188,12 @@ class DatabaseDecryptScreenState extends BaseDynamicState height: 48, forceClose: true, backgroundColor: Colors.transparent, - isStayOnTop: _isStayOnTop, - isMaximized: _isMaximized, + isStayOnTop: isStayOnTop, + isMaximized: isMaximized, onStayOnTopTap: () { setState(() { - _isStayOnTop = !_isStayOnTop; - windowManager.setAlwaysOnTop(_isStayOnTop); + isStayOnTop = !isStayOnTop; + windowManager.setAlwaysOnTop(isStayOnTop); }); }, ), diff --git a/lib/Screens/Lock/pin_verify_screen.dart b/lib/Screens/Lock/pin_verify_screen.dart index 611acb05..56779f68 100644 --- a/lib/Screens/Lock/pin_verify_screen.dart +++ b/lib/Screens/Lock/pin_verify_screen.dart @@ -49,8 +49,8 @@ class PinVerifyScreen extends StatefulWidget { PinVerifyScreenState createState() => PinVerifyScreenState(); } -class PinVerifyScreenState extends BaseDynamicState - with WindowListener, TrayListener { +class PinVerifyScreenState extends BaseWindowState + with TrayListener { final String? _password = ChewieHiveUtil.getString(CloudOTPHiveUtil.guesturePasswdKey); late final bool _enableBiometric = @@ -59,54 +59,11 @@ class PinVerifyScreenState extends BaseDynamicState status: GestureStatus.verify, gestureText: appLocalizations.verifyGestureLock); final GlobalKey _gestureUnlockView = GlobalKey(); - bool _isMaximized = false; - bool _isStayOnTop = false; String? canAuthenticateResponseString; CanAuthenticateResponse? canAuthenticateResponse; bool get _biometricAvailable => canAuthenticateResponse?.isSuccess ?? false; - @override - Future onWindowResize() async { - super.onWindowResize(); - windowManager.setMinimumSize(ChewieProvider.minimumWindowSize); - ChewieHiveUtil.setWindowSize(await windowManager.getSize()); - } - - @override - Future onWindowResized() async { - super.onWindowResized(); - ChewieHiveUtil.setWindowSize(await windowManager.getSize()); - } - - @override - Future onWindowMove() async { - super.onWindowMove(); - ChewieHiveUtil.setWindowPosition(await windowManager.getPosition()); - } - - @override - Future onWindowMoved() async { - super.onWindowMoved(); - ChewieHiveUtil.setWindowPosition(await windowManager.getPosition()); - } - - @override - void onWindowMaximize() { - windowManager.setMinimumSize(ChewieProvider.minimumWindowSize); - setState(() { - _isMaximized = true; - }); - } - - @override - void onWindowUnmaximize() { - windowManager.setMinimumSize(ChewieProvider.minimumWindowSize); - setState(() { - _isMaximized = false; - }); - } - @override void dispose() { super.dispose(); @@ -149,6 +106,7 @@ class PinVerifyScreenState extends BaseDynamicState @override Widget build(BuildContext context) { + chewieProvider.resetRootContext(); ChewieUtils.setSafeMode(ChewieHiveUtil.getBool( CloudOTPHiveUtil.enableSafeModeKey, defaultValue: defaultEnableSafeMode)); @@ -228,12 +186,12 @@ class PinVerifyScreenState extends BaseDynamicState height: 48, forceClose: true, backgroundColor: Colors.transparent, - isStayOnTop: _isStayOnTop, - isMaximized: _isMaximized, + isStayOnTop: isStayOnTop, + isMaximized: isMaximized, onStayOnTopTap: () { setState(() { - _isStayOnTop = !_isStayOnTop; - windowManager.setAlwaysOnTop(_isStayOnTop); + isStayOnTop = !isStayOnTop; + windowManager.setAlwaysOnTop(isStayOnTop); }); }, ), diff --git a/lib/Screens/Setting/about_setting_screen.dart b/lib/Screens/Setting/about_setting_screen.dart index 9bbea1c4..b693a5c7 100644 --- a/lib/Screens/Setting/about_setting_screen.dart +++ b/lib/Screens/Setting/about_setting_screen.dart @@ -19,11 +19,9 @@ import 'dart:io'; import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/Screens/Setting/base_setting_screen.dart'; import 'package:cloudotp/Screens/Setting/egg_screen.dart'; -import 'package:cloudotp/Utils/website_util.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:lucide_icons/lucide_icons.dart'; -import 'package:share_plus/share_plus.dart'; import '../../Utils/asset_util.dart'; import '../../Utils/constant.dart'; diff --git a/lib/Screens/Setting/backup_log_screen.dart b/lib/Screens/Setting/backup_log_screen.dart index bf456d4b..54916d82 100644 --- a/lib/Screens/Setting/backup_log_screen.dart +++ b/lib/Screens/Setting/backup_log_screen.dart @@ -23,7 +23,6 @@ import 'package:flutter/material.dart'; import 'package:lucide_icons/lucide_icons.dart'; import '../../Database/config_dao.dart'; -import '../../Utils/utils.dart'; import '../../l10n/l10n.dart'; class BackupLogScreen extends StatefulWidget { diff --git a/lib/Screens/Setting/select_theme_screen.dart b/lib/Screens/Setting/select_theme_screen.dart index 125414fd..cb924281 100644 --- a/lib/Screens/Setting/select_theme_screen.dart +++ b/lib/Screens/Setting/select_theme_screen.dart @@ -16,7 +16,6 @@ import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/Screens/Setting/base_setting_screen.dart'; import 'package:cloudotp/Utils/app_provider.dart'; -import 'package:cloudotp/Utils/hive_util.dart'; import 'package:flutter/material.dart'; import '../../l10n/l10n.dart'; diff --git a/lib/Screens/Setting/setting_operation_screen.dart b/lib/Screens/Setting/setting_operation_screen.dart index d4ee7f54..f572311a 100644 --- a/lib/Screens/Setting/setting_operation_screen.dart +++ b/lib/Screens/Setting/setting_operation_screen.dart @@ -15,7 +15,6 @@ import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; import '../../Database/token_dao.dart'; import '../../Utils/app_provider.dart'; diff --git a/lib/Screens/Token/add_token_screen.dart b/lib/Screens/Token/add_token_screen.dart index 78535d9c..5b896bb2 100644 --- a/lib/Screens/Token/add_token_screen.dart +++ b/lib/Screens/Token/add_token_screen.dart @@ -13,6 +13,7 @@ * If not, see . */ +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/Database/token_category_binding_dao.dart'; import 'package:cloudotp/Database/token_dao.dart'; import 'package:cloudotp/Models/opt_token.dart'; @@ -26,7 +27,6 @@ import 'package:lucide_icons/lucide_icons.dart'; import '../../Database/category_dao.dart'; import '../../TokenUtils/check_token_util.dart'; import '../../TokenUtils/token_image_util.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; import '../../Widgets/BottomSheet/select_icon_bottom_sheet.dart'; import '../../Widgets/cloudotp/cloudotp_item_builder.dart'; import '../../l10n/l10n.dart'; diff --git a/lib/Screens/main_screen.dart b/lib/Screens/main_screen.dart index 96a0fdb9..1f215eb9 100644 --- a/lib/Screens/main_screen.dart +++ b/lib/Screens/main_screen.dart @@ -100,7 +100,7 @@ class MainScreenState extends BaseWindowState @override void onProtocolUrlReceived(String url) { - ILogger.info("Received protocol url:", url); + ILogger.info("Received protocol url: $url"); } Future fetchReleases() async { @@ -178,12 +178,13 @@ class MainScreenState extends BaseWindowState Future jumpToLock({ bool autoAuth = false, }) async { - ILogger.info("Jump to lock screen"); if (CloudOTPHiveUtil.canDatabaseLock()) { + ILogger.debug("Jump to database lock screen"); await DatabaseManager.resetDatabase(); RouteUtil.pushRootPage(const DatabaseDecryptScreen()); } else { appProvider.preventLock = true; + ILogger.debug("Jump to pin lock screen"); RouteUtil.pushFadeRoute( context, PinVerifyScreen( @@ -201,7 +202,7 @@ class MainScreenState extends BaseWindowState @override Widget build(BuildContext context) { - chewieProvider.rootContext = context; + chewieProvider.setRootContext(context); ChewieUtils.setSafeMode(ChewieHiveUtil.getBool( CloudOTPHiveUtil.enableSafeModeKey, defaultValue: defaultEnableSafeMode)); @@ -234,7 +235,7 @@ class MainScreenState extends BaseWindowState HomeScreen(key: chewieProvider.panelScreenKey), Positioned( right: 0, - child: buildTitleBar(), + child: _buildTitleBar(), ), ], ), @@ -426,6 +427,7 @@ class MainScreenState extends BaseWindowState bool reCaptureWhenFailed = true, }) async { try { + appProvider.preventLock = true; windowManager.minimize(); Directory directory = Directory(await FileUtil.getScreenshotDir()); String imageName = @@ -483,6 +485,8 @@ class MainScreenState extends BaseWindowState .captureFailedNoProcess(osType.captureProcessName)); } } + } finally { + appProvider.preventLock = false; } } @@ -705,7 +709,7 @@ class MainScreenState extends BaseWindowState ); } - Widget buildTitleBar() { + Widget _buildTitleBar() { return ResponsiveUtil.selectByPlatform( desktop: WindowTitleWrapper( height: 48, diff --git a/lib/TokenUtils/Backup/backup_encrypt_v1.dart b/lib/TokenUtils/Backup/backup_encrypt_v1.dart index 5ec3910f..c222100e 100644 --- a/lib/TokenUtils/Backup/backup_encrypt_v1.dart +++ b/lib/TokenUtils/Backup/backup_encrypt_v1.dart @@ -17,9 +17,9 @@ import 'dart:async'; import 'dart:convert'; import 'dart:typed_data'; +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:pointycastle/export.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; import './backup_encrypt_interface.dart'; import 'backup.dart'; diff --git a/lib/TokenUtils/Cloud/s3_cloud_service.dart b/lib/TokenUtils/Cloud/s3_cloud_service.dart index 034e6ea7..d4a76f64 100644 --- a/lib/TokenUtils/Cloud/s3_cloud_service.dart +++ b/lib/TokenUtils/Cloud/s3_cloud_service.dart @@ -15,6 +15,7 @@ import 'dart:typed_data'; +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/Models/s3_cloud_file_info.dart'; import 'package:flutter/cupertino.dart'; import 'package:s3_storage/models.dart'; @@ -22,7 +23,6 @@ import 'package:s3_storage/s3_storage.dart'; import '../../Models/cloud_service_config.dart'; import '../../Utils/hive_util.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; import '../../Utils/utils.dart'; import '../export_token_util.dart'; import 'cloud_service.dart'; diff --git a/lib/TokenUtils/Cloud/webdav_cloud_service.dart b/lib/TokenUtils/Cloud/webdav_cloud_service.dart index f1d0f92a..4b857dfe 100644 --- a/lib/TokenUtils/Cloud/webdav_cloud_service.dart +++ b/lib/TokenUtils/Cloud/webdav_cloud_service.dart @@ -15,6 +15,7 @@ import 'dart:typed_data'; +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/TokenUtils/export_token_util.dart'; import 'package:cloudotp/Utils/hive_util.dart'; import 'package:dio/dio.dart'; @@ -22,7 +23,6 @@ import 'package:path/path.dart'; import 'package:webdav_client/webdav_client.dart'; import '../../Models/cloud_service_config.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; import 'cloud_service.dart'; class WebDavCloudService extends CloudService { diff --git a/lib/TokenUtils/ThirdParty/2fas_importer.dart b/lib/TokenUtils/ThirdParty/2fas_importer.dart index f0b515e1..bb3a5e21 100644 --- a/lib/TokenUtils/ThirdParty/2fas_importer.dart +++ b/lib/TokenUtils/ThirdParty/2fas_importer.dart @@ -16,11 +16,11 @@ import 'dart:convert'; import 'dart:io'; +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/Models/opt_token.dart'; import 'package:cloudotp/Models/token_category.dart'; import 'package:cloudotp/Models/token_category_binding.dart'; import 'package:cloudotp/TokenUtils/ThirdParty/base_token_importer.dart'; -import 'package:cloudotp/Utils/app_provider.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:pointycastle/api.dart'; @@ -31,7 +31,6 @@ import 'package:pointycastle/key_derivators/api.dart'; import 'package:pointycastle/key_derivators/pbkdf2.dart'; import 'package:pointycastle/macs/hmac.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; import '../../l10n/l10n.dart'; class TwoFASTokenOtp { diff --git a/lib/TokenUtils/ThirdParty/andotp_importer.dart b/lib/TokenUtils/ThirdParty/andotp_importer.dart index 48b8ca2b..450c7481 100644 --- a/lib/TokenUtils/ThirdParty/andotp_importer.dart +++ b/lib/TokenUtils/ThirdParty/andotp_importer.dart @@ -16,11 +16,11 @@ import 'dart:convert'; import 'dart:io'; +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/Models/opt_token.dart'; import 'package:cloudotp/Models/token_category.dart'; import 'package:cloudotp/Models/token_category_binding.dart'; import 'package:cloudotp/TokenUtils/ThirdParty/base_token_importer.dart'; -import 'package:cloudotp/Utils/app_provider.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:pointycastle/api.dart'; @@ -31,7 +31,6 @@ import 'package:pointycastle/key_derivators/api.dart'; import 'package:pointycastle/key_derivators/pbkdf2.dart'; import 'package:pointycastle/macs/hmac.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; import '../../l10n/l10n.dart'; class AndOTPToken { diff --git a/lib/TokenUtils/ThirdParty/authenticatorplus_importer.dart b/lib/TokenUtils/ThirdParty/authenticatorplus_importer.dart index f0476183..b59eaac7 100644 --- a/lib/TokenUtils/ThirdParty/authenticatorplus_importer.dart +++ b/lib/TokenUtils/ThirdParty/authenticatorplus_importer.dart @@ -15,6 +15,7 @@ import 'dart:io'; +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/Database/database_manager.dart'; import 'package:cloudotp/Models/opt_token.dart'; import 'package:cloudotp/Models/token_category.dart'; @@ -26,7 +27,6 @@ import 'package:path/path.dart'; import 'package:sqflite_sqlcipher/sqflite.dart'; import '../../Utils/Base32/base32.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; import '../../l10n/l10n.dart'; enum AuthenticatorType { diff --git a/lib/TokenUtils/ThirdParty/bitwarden_importer.dart b/lib/TokenUtils/ThirdParty/bitwarden_importer.dart index 1eef4efe..5f31cb7c 100644 --- a/lib/TokenUtils/ThirdParty/bitwarden_importer.dart +++ b/lib/TokenUtils/ThirdParty/bitwarden_importer.dart @@ -16,12 +16,12 @@ import 'dart:convert'; import 'dart:io'; +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/Models/opt_token.dart'; import 'package:cloudotp/Models/token_category.dart'; import 'package:cloudotp/Models/token_category_binding.dart'; import 'package:cloudotp/TokenUtils/ThirdParty/base_token_importer.dart'; import 'package:cloudotp/TokenUtils/otp_token_parser.dart'; -import 'package:cloudotp/Utils/app_provider.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:pointycastle/api.dart'; @@ -35,7 +35,6 @@ import 'package:pointycastle/key_derivators/pbkdf2.dart'; import 'package:pointycastle/macs/hmac.dart'; import 'package:pointycastle/paddings/pkcs7.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; import '../../l10n/l10n.dart'; class BitwardenFolder { diff --git a/lib/TokenUtils/ThirdParty/enteauth_importer.dart b/lib/TokenUtils/ThirdParty/enteauth_importer.dart index e866d667..0149157a 100644 --- a/lib/TokenUtils/ThirdParty/enteauth_importer.dart +++ b/lib/TokenUtils/ThirdParty/enteauth_importer.dart @@ -16,6 +16,7 @@ import 'dart:convert'; import 'dart:io'; +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/Models/opt_token.dart'; import 'package:cloudotp/Models/token_category.dart'; import 'package:cloudotp/Models/token_category_binding.dart'; @@ -25,7 +26,6 @@ import 'package:ente_crypto_dart/ente_crypto_dart.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; import '../../l10n/l10n.dart'; class KdfParams { diff --git a/lib/TokenUtils/ThirdParty/freeotpplus_importer.dart b/lib/TokenUtils/ThirdParty/freeotpplus_importer.dart index f9f5cbcb..cf71f8f6 100644 --- a/lib/TokenUtils/ThirdParty/freeotpplus_importer.dart +++ b/lib/TokenUtils/ThirdParty/freeotpplus_importer.dart @@ -16,6 +16,7 @@ import 'dart:convert'; import 'dart:io'; +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/Models/opt_token.dart'; import 'package:cloudotp/Models/token_category.dart'; import 'package:cloudotp/Models/token_category_binding.dart'; @@ -23,8 +24,6 @@ import 'package:cloudotp/TokenUtils/ThirdParty/base_token_importer.dart'; import 'package:cloudotp/Utils/Base32/base32.dart'; import 'package:flutter/foundation.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; -import '../../Utils/utils.dart'; import '../../l10n/l10n.dart'; class TokenInfo { diff --git a/lib/TokenUtils/ThirdParty/totpauthenticator_importer.dart b/lib/TokenUtils/ThirdParty/totpauthenticator_importer.dart index a04242ed..4f48ec67 100644 --- a/lib/TokenUtils/ThirdParty/totpauthenticator_importer.dart +++ b/lib/TokenUtils/ThirdParty/totpauthenticator_importer.dart @@ -16,10 +16,10 @@ import 'dart:convert'; import 'dart:io'; +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/Models/opt_token.dart'; import 'package:cloudotp/TokenUtils/ThirdParty/base_token_importer.dart'; import 'package:cloudotp/Utils/Base32/base32.dart'; -import 'package:cloudotp/Utils/app_provider.dart'; import 'package:convert/convert.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; @@ -28,7 +28,6 @@ import 'package:pointycastle/block/aes.dart'; import 'package:pointycastle/block/modes/cbc.dart'; import 'package:pointycastle/paddings/pkcs7.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; import '../../l10n/l10n.dart'; class TotpAuthenticatorAccount { diff --git a/lib/TokenUtils/ThirdParty/winauth_importer.dart b/lib/TokenUtils/ThirdParty/winauth_importer.dart index 67d0bb43..cfb5b9c8 100644 --- a/lib/TokenUtils/ThirdParty/winauth_importer.dart +++ b/lib/TokenUtils/ThirdParty/winauth_importer.dart @@ -16,13 +16,13 @@ import 'dart:io'; import 'package:archive/archive_io.dart'; +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/TokenUtils/ThirdParty/base_token_importer.dart'; import 'package:cloudotp/Utils/app_provider.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import '../../Models/opt_token.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; import '../../l10n/l10n.dart'; import '../import_token_util.dart'; diff --git a/lib/TokenUtils/check_token_util.dart b/lib/TokenUtils/check_token_util.dart index ec0aecf6..09b2e4e7 100644 --- a/lib/TokenUtils/check_token_util.dart +++ b/lib/TokenUtils/check_token_util.dart @@ -13,9 +13,9 @@ * If not, see . */ +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/l10n/l10n.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; import '../Models/opt_token.dart'; import '../Utils/Base32/base32.dart'; diff --git a/lib/TokenUtils/token_image_util.dart b/lib/TokenUtils/token_image_util.dart index 63da9e40..dd3d9fea 100644 --- a/lib/TokenUtils/token_image_util.dart +++ b/lib/TokenUtils/token_image_util.dart @@ -15,12 +15,10 @@ import 'dart:convert'; +import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/Models/opt_token.dart'; -import 'package:cloudotp/Utils/utils.dart'; import 'package:flutter/services.dart'; -import 'package:awesome_chewie/awesome_chewie.dart'; - class TokenImageUtil { static const int matchThreshold = 5; static List brandLogos = []; diff --git a/lib/Utils/biometric_util.dart b/lib/Utils/biometric_util.dart index 740bfde5..faba2290 100644 --- a/lib/Utils/biometric_util.dart +++ b/lib/Utils/biometric_util.dart @@ -59,22 +59,19 @@ class BiometricUtil { if (response != CanAuthenticateResponse.success) { switch (response) { case CanAuthenticateResponse.errorHwUnavailable: - ILogger.info( - "BiometricStorage", "Biometric hardware is not available"); + ILogger.info("Biometric hardware is not available"); break; case CanAuthenticateResponse.errorNoBiometricEnrolled: - ILogger.info( - "BiometricStorage", "No biometric enrolled on this device"); + ILogger.info("No biometric enrolled on this device"); break; case CanAuthenticateResponse.errorNoHardware: - ILogger.info( - "BiometricStorage", "No biometric hardware on this device"); + ILogger.info("No biometric hardware on this device"); break; case CanAuthenticateResponse.errorPasscodeNotSet: - ILogger.info("BiometricStorage", "No passcode set on this device"); + ILogger.info("No passcode set on this device"); break; default: - ILogger.info("BiometricStorage", "Unknown error"); + ILogger.info("Unknown error"); break; } } @@ -139,7 +136,7 @@ class BiometricUtil { ); return true; } catch (e, t) { - ILogger.error("Failed to save database password: $e\n$t"); + ILogger.error("Failed to save database password", e, t); if (e is AuthException) { switch (e.code) { case AuthExceptionCode.userCanceled: @@ -168,7 +165,7 @@ class BiometricUtil { try { await databasePassswordStorage!.delete(); } catch (e, t) { - ILogger.error("Failed to delete database password: $e\n$t"); + ILogger.error("Failed to delete database password", e, t); } } } diff --git a/lib/Utils/constant.dart b/lib/Utils/constant.dart index 7e1cde60..8eb981f5 100644 --- a/lib/Utils/constant.dart +++ b/lib/Utils/constant.dart @@ -15,7 +15,6 @@ import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:flutter/cupertino.dart'; -import 'package:local_auth_android/local_auth_android.dart'; import '../l10n/l10n.dart'; diff --git a/lib/Utils/lottie_util.dart b/lib/Utils/lottie_util.dart index b4ee8aca..c41b2946 100644 --- a/lib/Utils/lottie_util.dart +++ b/lib/Utils/lottie_util.dart @@ -14,7 +14,6 @@ */ import 'package:awesome_chewie/awesome_chewie.dart'; -import 'package:cloudotp/Utils/utils.dart'; import 'package:flutter/cupertino.dart'; import 'package:lottie/lottie.dart'; diff --git a/lib/Utils/utils.dart b/lib/Utils/utils.dart index 57ec9cc2..f585ace2 100644 --- a/lib/Utils/utils.dart +++ b/lib/Utils/utils.dart @@ -15,7 +15,6 @@ import 'dart:async'; import 'dart:io'; -import 'dart:ui'; import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/Database/category_dao.dart'; @@ -27,16 +26,12 @@ import 'package:cloudotp/Models/token_category.dart'; import 'package:cloudotp/Utils/shortcuts_util.dart'; import 'package:flutter/material.dart'; import 'package:launch_at_startup/launch_at_startup.dart'; +import 'package:screen_retriever/screen_retriever.dart'; import 'package:tray_manager/tray_manager.dart'; import 'package:window_manager/window_manager.dart'; -import '../Screens/Setting/about_setting_screen.dart'; -import '../Screens/Setting/mobile_setting_navigation_screen.dart'; -import '../Screens/Setting/setting_navigation_screen.dart'; -import '../Screens/Setting/setting_safe_screen.dart'; import '../TokenUtils/Cloud/cloud_service.dart'; import '../TokenUtils/code_generator.dart'; -import 'package:screen_retriever/screen_retriever.dart'; import '../l10n/l10n.dart'; import 'app_provider.dart'; import 'constant.dart'; diff --git a/lib/Widgets/BottomSheet/Backups/huawei_backups_bottom_sheet.dart b/lib/Widgets/BottomSheet/Backups/huawei_backups_bottom_sheet.dart index 924c1db6..5072828b 100644 --- a/lib/Widgets/BottomSheet/Backups/huawei_backups_bottom_sheet.dart +++ b/lib/Widgets/BottomSheet/Backups/huawei_backups_bottom_sheet.dart @@ -14,12 +14,11 @@ */ import 'package:awesome_chewie/awesome_chewie.dart'; -import 'package:flutter/material.dart'; import 'package:awesome_cloud/awesome_cloud.dart'; +import 'package:flutter/material.dart'; import 'package:lucide_icons/lucide_icons.dart'; import '../../../TokenUtils/Cloud/huawei_cloud_service.dart'; -import '../../../Utils/utils.dart'; import '../../../l10n/l10n.dart'; class HuaweiCloudBackupsBottomSheet extends StatefulWidget { diff --git a/lib/Widgets/BottomSheet/Backups/local_backups_bottom_sheet.dart b/lib/Widgets/BottomSheet/Backups/local_backups_bottom_sheet.dart index 631c04c5..407d2e31 100644 --- a/lib/Widgets/BottomSheet/Backups/local_backups_bottom_sheet.dart +++ b/lib/Widgets/BottomSheet/Backups/local_backups_bottom_sheet.dart @@ -20,7 +20,6 @@ import 'package:flutter/material.dart'; import 'package:lucide_icons/lucide_icons.dart'; import '../../../TokenUtils/export_token_util.dart'; -import '../../../Utils/utils.dart'; import '../../../l10n/l10n.dart'; class LocalBackupsBottomSheet extends StatefulWidget { diff --git a/lib/Widgets/BottomSheet/Backups/onedrive_backups_bottom_sheet.dart b/lib/Widgets/BottomSheet/Backups/onedrive_backups_bottom_sheet.dart index b74abf99..05c59fde 100644 --- a/lib/Widgets/BottomSheet/Backups/onedrive_backups_bottom_sheet.dart +++ b/lib/Widgets/BottomSheet/Backups/onedrive_backups_bottom_sheet.dart @@ -14,9 +14,9 @@ */ import 'package:awesome_chewie/awesome_chewie.dart'; +import 'package:awesome_cloud/awesome_cloud.dart'; import 'package:cloudotp/TokenUtils/Cloud/onedrive_cloud_service.dart'; import 'package:flutter/material.dart'; -import 'package:awesome_cloud/awesome_cloud.dart'; import 'package:lucide_icons/lucide_icons.dart'; import '../../../l10n/l10n.dart'; diff --git a/lib/Widgets/BottomSheet/Backups/s3_backups_bottom_sheet.dart b/lib/Widgets/BottomSheet/Backups/s3_backups_bottom_sheet.dart index 03d23d8b..cb9e3a1c 100644 --- a/lib/Widgets/BottomSheet/Backups/s3_backups_bottom_sheet.dart +++ b/lib/Widgets/BottomSheet/Backups/s3_backups_bottom_sheet.dart @@ -19,7 +19,6 @@ import 'package:lucide_icons/lucide_icons.dart'; import '../../../Models/s3_cloud_file_info.dart'; import '../../../TokenUtils/Cloud/s3_cloud_service.dart'; -import '../../../Utils/utils.dart'; import '../../../l10n/l10n.dart'; class S3CloudBackupsBottomSheet extends StatefulWidget { diff --git a/lib/Widgets/BottomSheet/Backups/webdav_backups_bottom_sheet.dart b/lib/Widgets/BottomSheet/Backups/webdav_backups_bottom_sheet.dart index f6caf8b9..1bea7a9c 100644 --- a/lib/Widgets/BottomSheet/Backups/webdav_backups_bottom_sheet.dart +++ b/lib/Widgets/BottomSheet/Backups/webdav_backups_bottom_sheet.dart @@ -19,7 +19,6 @@ import 'package:flutter/material.dart'; import 'package:lucide_icons/lucide_icons.dart'; import 'package:webdav_client/webdav_client.dart'; -import '../../../Utils/utils.dart'; import '../../../l10n/l10n.dart'; class WebDavBackupsBottomSheet extends StatefulWidget { diff --git a/lib/Widgets/BottomSheet/add_bottom_sheet.dart b/lib/Widgets/BottomSheet/add_bottom_sheet.dart index 47a96181..362abbbc 100644 --- a/lib/Widgets/BottomSheet/add_bottom_sheet.dart +++ b/lib/Widgets/BottomSheet/add_bottom_sheet.dart @@ -20,9 +20,9 @@ import 'package:cloudotp/Widgets/BottomSheet/token_option_bottom_sheet.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:lucide_icons/lucide_icons.dart'; import 'package:mobile_scanner/mobile_scanner.dart'; import 'package:native_device_orientation/native_device_orientation.dart'; -import 'package:lucide_icons/lucide_icons.dart'; import '../../Models/opt_token.dart'; import '../../Screens/Token/add_token_screen.dart'; diff --git a/lib/Widgets/Shortcuts/app_shortcuts.dart b/lib/Widgets/Shortcuts/app_shortcuts.dart index 415da4ea..c4b6dbdb 100644 --- a/lib/Widgets/Shortcuts/app_shortcuts.dart +++ b/lib/Widgets/Shortcuts/app_shortcuts.dart @@ -1,7 +1,6 @@ import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:flutter/material.dart'; -import '../../Screens/Setting/setting_navigation_screen.dart'; import '../../Screens/Token/add_token_screen.dart'; import '../../Screens/Token/category_screen.dart'; import '../../Screens/Token/import_export_token_screen.dart'; diff --git a/lib/Widgets/cloudotp/cloudotp_item_builder.dart b/lib/Widgets/cloudotp/cloudotp_item_builder.dart index 6fc01bfb..5001dfd0 100644 --- a/lib/Widgets/cloudotp/cloudotp_item_builder.dart +++ b/lib/Widgets/cloudotp/cloudotp_item_builder.dart @@ -18,10 +18,8 @@ import 'dart:math'; import 'package:auto_size_text/auto_size_text.dart'; import 'package:awesome_chewie/awesome_chewie.dart'; import 'package:cloudotp/Widgets/cloudotp/qrcodes_dialog_widget.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_context_menu/flutter_context_menu.dart'; import 'package:group_button/group_button.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; diff --git a/lib/Widgets/cloudotp/navigation_bar.dart b/lib/Widgets/cloudotp/navigation_bar.dart index 60bfc653..08b6a470 100644 --- a/lib/Widgets/cloudotp/navigation_bar.dart +++ b/lib/Widgets/cloudotp/navigation_bar.dart @@ -14,7 +14,6 @@ */ import 'package:awesome_chewie/awesome_chewie.dart'; -import 'package:cloudotp/Utils/app_provider.dart'; import 'package:flutter/material.dart'; class SettingNavigationItem { diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index dba5f6c0..9f8232aa 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -44,9 +43,6 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) local_notifier_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "LocalNotifierPlugin"); local_notifier_plugin_register_with_registrar(local_notifier_registrar); - g_autoptr(FlPluginRegistrar) local_proxy_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "LocalProxyPlugin"); - local_proxy_plugin_register_with_registrar(local_proxy_registrar); g_autoptr(FlPluginRegistrar) screen_capturer_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenCapturerLinuxPlugin"); screen_capturer_linux_plugin_register_with_registrar(screen_capturer_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 77030329..afbf6d46 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -10,7 +10,6 @@ list(APPEND FLUTTER_PLUGIN_LIST hotkey_manager_linux isar_flutter_libs local_notifier - local_proxy screen_capturer_linux screen_retriever_linux sodium_libs diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 6d26f1ae..74050913 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -19,7 +19,6 @@ import isar_flutter_libs import just_audio import local_auth_darwin import local_notifier -import local_proxy import mobile_scanner import package_info_plus import path_provider_foundation @@ -53,7 +52,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) FLALocalAuthPlugin.register(with: registry.registrar(forPlugin: "FLALocalAuthPlugin")) LocalNotifierPlugin.register(with: registry.registrar(forPlugin: "LocalNotifierPlugin")) - LocalProxyPlugin.register(with: registry.registrar(forPlugin: "LocalProxyPlugin")) MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) diff --git a/pubspec.lock b/pubspec.lock index e85ea68c..a8b5b57b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1058,10 +1058,9 @@ packages: image_gallery_saver: dependency: transitive description: - name: image_gallery_saver - sha256: "0aba74216a4d9b0561510cb968015d56b701ba1bd94aace26aacdd8ae5761816" - url: "https://pub.flutter-io.cn" - source: hosted + path: "third-party/tool/image_gallery_saver" + relative: true + source: path version: "2.0.3" intl: dependency: "direct main" @@ -1239,14 +1238,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "0.1.6" - local_proxy: - dependency: transitive - description: - name: local_proxy - sha256: f17e637d0388d278eff905cf7c66331f0f8fc3218d23174452c5ec3ccf99f76b - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.0.3" logger: dependency: "direct main" description: @@ -1368,10 +1359,9 @@ packages: move_to_background: dependency: "direct main" description: - name: move_to_background - sha256: "00caad17a6ce149910777131503f43f8ed80025681f94684e3a6a87d979b914c" - url: "https://pub.flutter-io.cn" - source: hosted + path: "third-party/tool/move_to_background" + relative: true + source: path version: "1.0.2" msix: dependency: "direct dev" diff --git a/pubspec.yaml b/pubspec.yaml index f3ff7098..d66344a3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -97,7 +97,8 @@ dependencies: screen_protector: ^1.4.2+1 flutter_windowmanager: path: third-party/tool/flutter_windowmanager - move_to_background: ^1.0.2 # 移动到后台 + move_to_background: + path: third-party/tool/move_to_background launch_at_startup: ^0.3.1 # 开机启动 local_notifier: ^0.1.6 # 本地通知 shell_executor: ^0.1.6 # 执行命令 diff --git a/third-party/chewie/lib/awesome_chewie.dart b/third-party/chewie/lib/awesome_chewie.dart index 79534c78..73a3f815 100644 --- a/third-party/chewie/lib/awesome_chewie.dart +++ b/third-party/chewie/lib/awesome_chewie.dart @@ -41,7 +41,6 @@ export 'src/Utils/System/import_util.dart'; export 'src/Utils/System/locale_util.dart'; export 'src/Utils/System/lottie_util.dart'; export 'src/Utils/System/notification_util.dart'; -export 'src/Utils/System/proxy_util.dart'; export 'src/Utils/System/route_util.dart'; export 'src/Utils/System/uri_util.dart'; export 'src/Utils/utils.dart'; diff --git a/third-party/chewie/lib/src/Providers/chewie_provider.dart b/third-party/chewie/lib/src/Providers/chewie_provider.dart index 3551a9d3..53da21fe 100644 --- a/third-party/chewie/lib/src/Providers/chewie_provider.dart +++ b/third-party/chewie/lib/src/Providers/chewie_provider.dart @@ -19,13 +19,23 @@ class ChewieProvider with ChangeNotifier { BuildContext get globalNavigatorContext => globalNavigatorKey.currentContext!; - late BuildContext rootContext; + late BuildContext _rootContext; + + BuildContext get rootContext => _rootContext; bool initedRootContext = false; + void setRootContext(BuildContext context) { + _rootContext = context; + } + + void resetRootContext() { + _rootContext = globalNavigatorContext; + } + void initRootContext(BuildContext context) { if (!initedRootContext) { - rootContext = context; + _rootContext = context; initedRootContext = true; } } @@ -69,18 +79,6 @@ class ChewieProvider with ChangeNotifier { Widget Function(double size, bool forceDark) loadingWidgetBuilder = (size, forceDark) => const Center(child: CircularProgressIndicator()); - ProxyConfig _proxyConfig = ChewieHiveUtil.getProxyConfig() ?? - ProxyConfig(proxyType: ProxyType.NoProxy); - - ProxyConfig get proxyConfig => _proxyConfig; - - set proxyConfig(ProxyConfig value) { - _proxyConfig = value; - ChewieHiveUtil.setProxyConfig(value); - notifyListeners(); - ProxyUtil.refresh(); - } - bool _enableLandscapeInTablet = ChewieHiveUtil.getBool(ChewieHiveUtil.enableLandscapeInTabletKey); diff --git a/third-party/chewie/lib/src/Utils/System/hive_util.dart b/third-party/chewie/lib/src/Utils/System/hive_util.dart index 515c0c07..370a27f5 100644 --- a/third-party/chewie/lib/src/Utils/System/hive_util.dart +++ b/third-party/chewie/lib/src/Utils/System/hive_util.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'package:awesome_chewie/src/Resources/theme_color_data.dart'; import 'package:awesome_chewie/src/Utils/System/file_util.dart'; -import 'package:awesome_chewie/src/Utils/System/proxy_util.dart'; import 'package:awesome_chewie/src/Utils/enums.dart'; import 'package:awesome_chewie/src/Utils/utils.dart'; import 'package:awesome_chewie/src/Utils/constant.dart'; @@ -142,19 +141,6 @@ class ChewieHiveUtil { } } - static setProxyConfig(ProxyConfig config) async { - await put(ChewieHiveUtil.proxyConfigKey, jsonEncode(config.toMap())); - } - - static ProxyConfig? getProxyConfig() { - try { - return ProxyConfig.fromMap(jsonDecode( - ChewieHiveUtil.getString(ChewieHiveUtil.proxyConfigKey) ?? "{}")); - } catch (e) { - return null; - } - } - static bool isFirstLogin() { if (getBool(firstLoginKey, defaultValue: true) == true) return true; return false; diff --git a/third-party/chewie/lib/src/Utils/System/proxy_util.dart b/third-party/chewie/lib/src/Utils/System/proxy_util.dart deleted file mode 100644 index db0091ae..00000000 --- a/third-party/chewie/lib/src/Utils/System/proxy_util.dart +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2024 Robert-Stackflow. - * - * This program is free software: you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program. - * If not, see . - */ - -import 'dart:io'; - -import 'package:awesome_chewie/src/Utils/General/string_util.dart'; -import 'package:awesome_chewie/src/Utils/System/hive_util.dart'; -import 'package:awesome_chewie/src/Utils/ilogger.dart'; -import 'package:local_proxy/local_proxy.dart'; - -import 'package:awesome_chewie/src/Models/selection_item_model.dart'; - -enum ProxyType { - FollowSystem('FollowSystem'), - Custom('Custom'), - NoProxy('NoProxy'); - - final String key; - - const ProxyType(this.key); - - static fromString(String value) { - switch (value) { - case 'FollowSystem': - return ProxyType.FollowSystem; - case 'Custom': - return ProxyType.Custom; - case 'NoProxy': - return ProxyType.NoProxy; - default: - return ProxyType.NoProxy; - } - } - - static List> options() { - return [ - SelectionItemModel('Follow System', ProxyType.FollowSystem), - SelectionItemModel('Custom', ProxyType.Custom), - SelectionItemModel('No Proxy', ProxyType.NoProxy), - ]; - } -} - -class ProxyConfig { - ProxyType proxyType; - String? httpProxy; - - ProxyConfig({required this.proxyType, this.httpProxy}); - - factory ProxyConfig.fromMap(Map map) { - return ProxyConfig( - proxyType: ProxyType.fromString(map['proxyType'] ?? ""), - httpProxy: map['httpProxy'] ?? "", - ); - } - - Map toMap() { - return { - 'proxyType': proxyType.key, - 'httpProxy': httpProxy, - }; - } - - @override - String toString() { - return 'ProxyConfig{proxyType: $proxyType, httpProxy: $httpProxy}'; - } -} - -class CustomProxyHttpOverrides extends HttpOverrides { - @override - HttpClient createHttpClient(SecurityContext? context) { - final client = super.createHttpClient(context); - client.findProxy = (uri) => ProxyUtil.dioProxy; - return client; - } -} - -class ProxyUtil { - static String dioProxy = "DIRECT"; - - static refresh() async { - dioProxy = await getDioProxy(); - ILogger.info("ProxyUtil", "Dio Proxy: $dioProxy"); - HttpOverrides.global = CustomProxyHttpOverrides(); - } - - static Future getSystemProxy() async { - ProxySetting? proxySettings = await LocalProxy.getProxySettings(); - ILogger.info("ProxyUtil", "System Proxy: ${proxySettings?.toString()}"); - return proxySettings?.toString(); - } - - static Future getDioProxy() async { - ProxyConfig proxyConfig = ChewieHiveUtil.getProxyConfig() ?? - ProxyConfig(proxyType: ProxyType.NoProxy); - String? systemProxy = await getSystemProxy(); - if (proxyConfig.proxyType == ProxyType.FollowSystem) { - return systemProxy.notNullOrEmpty ? 'PROXY $systemProxy' : 'DIRECT'; - } else if (proxyConfig.proxyType == ProxyType.Custom) { - return proxyConfig.httpProxy.notNullOrEmpty - ? 'PROXY ${proxyConfig.httpProxy}' - : 'DIRECT'; - } else { - return 'DIRECT'; - } - } -} diff --git a/third-party/chewie/pubspec.lock b/third-party/chewie/pubspec.lock index f3d17988..ee517fcd 100644 --- a/third-party/chewie/pubspec.lock +++ b/third-party/chewie/pubspec.lock @@ -809,10 +809,9 @@ packages: image_gallery_saver: dependency: "direct main" description: - name: image_gallery_saver - sha256: "0aba74216a4d9b0561510cb968015d56b701ba1bd94aace26aacdd8ae5761816" - url: "https://pub.flutter-io.cn" - source: hosted + path: "../tool/image_gallery_saver" + relative: true + source: path version: "2.0.3" intl: dependency: "direct main" @@ -974,14 +973,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "0.1.6" - local_proxy: - dependency: "direct main" - description: - name: local_proxy - sha256: f17e637d0388d278eff905cf7c66331f0f8fc3218d23174452c5ec3ccf99f76b - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.0.3" logger: dependency: "direct main" description: diff --git a/third-party/chewie/pubspec.yaml b/third-party/chewie/pubspec.yaml index a39254c0..4d4aa836 100644 --- a/third-party/chewie/pubspec.yaml +++ b/third-party/chewie/pubspec.yaml @@ -44,7 +44,6 @@ dependencies: path_provider: ^2.0.12 cached_network_image: ^3.4.1 flutter_cache_manager: ^3.4.1 - local_proxy: ^0.0.3 file_picker: ^8.3.1 process_run: 1.2.2+1 # 系统 diff --git a/third-party/tool/move_to_background/.gitignore b/third-party/tool/move_to_background/.gitignore new file mode 100644 index 00000000..e2b54cef --- /dev/null +++ b/third-party/tool/move_to_background/.gitignore @@ -0,0 +1,96 @@ +.DS_Store +.dart_tool/ + +.packages +.pub/ +build/ +*.log + +.flutter-plugins-dependencies +flutter_export_environment.sh + +# Built application files +*.apk +*.aar +*.ap_ +*.aab + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +# Uncomment the following line in case you need and you don't have the release build type files in your app +# release/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml + +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +#*.jks +#*.keystore + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild +.cxx/ + +# Google Services (e.g. APIs or Firebase) +# google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +# Version control +vcs.xml + +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ diff --git a/third-party/tool/move_to_background/.metadata b/third-party/tool/move_to_background/.metadata new file mode 100644 index 00000000..42c5a740 --- /dev/null +++ b/third-party/tool/move_to_background/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: b712a172f9694745f50505c93340883493b505e5 + channel: unknown + +project_type: plugin diff --git a/third-party/tool/move_to_background/CHANGELOG.md b/third-party/tool/move_to_background/CHANGELOG.md new file mode 100644 index 00000000..08e9485b --- /dev/null +++ b/third-party/tool/move_to_background/CHANGELOG.md @@ -0,0 +1,35 @@ +## 1.0.2 + +- null-safety release + +## 1.0.1-nullsafety.1 + +- Enable null-safety + +## 1.0.1 + +- Suppress deprecation warning for `getFlutterEngine` + +## 1.0.0+1 + +- Update README. + +## 1.0.0 + +- Support the new Android plugins APIs. + +## 0.2.0 + +- Add iOS support. + +## 0.1.2 + +- Update Docs. + +## 0.1.1 + +- Analysis improvement. + +## 0.1.0 + +- Initial release. diff --git a/third-party/tool/move_to_background/LICENSE b/third-party/tool/move_to_background/LICENSE new file mode 100644 index 00000000..8a1b3a63 --- /dev/null +++ b/third-party/tool/move_to_background/LICENSE @@ -0,0 +1,8 @@ +Copyright 2019 Ahmed El Sayegh + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/third-party/tool/move_to_background/README.md b/third-party/tool/move_to_background/README.md new file mode 100644 index 00000000..ee03c556 --- /dev/null +++ b/third-party/tool/move_to_background/README.md @@ -0,0 +1,41 @@ +# move_to_background + +Flutter plugin for sending mobile applications to background. Supports iOS and Android. + +## Getting Started + +### Install it (pubspec.yaml) + +```yaml +move_to_background: +``` + +### Import it + +```dart +import 'package:move_to_background/move_to_background.dart'; +``` + +### Use it + +```dart +MoveToBackground.moveTaskToBack(); +``` + +## Useful Scenario + +Use with WillPopScope to send your application to the background when the user attempts to exit the app. + +```dart +WillPopScope( + child: MaterialApp(...), + onWillPop: () async { + MoveToBackground.moveTaskToBack(); + return false; + }, +); +``` + +## Note about using it for iOS + +Quitting your application or sending it to the background programmatically is a violation of the iOS [Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/ios/overview/themes/#//apple_ref/doc/uid/TP40006556-CH20-SW27), which usually doesn't bode well for getting through the review process. Keep that in mind. diff --git a/third-party/tool/move_to_background/android/.classpath b/third-party/tool/move_to_background/android/.classpath new file mode 100644 index 00000000..eb19361b --- /dev/null +++ b/third-party/tool/move_to_background/android/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/third-party/tool/move_to_background/android/.gitignore b/third-party/tool/move_to_background/android/.gitignore new file mode 100644 index 00000000..69ffdf69 --- /dev/null +++ b/third-party/tool/move_to_background/android/.gitignore @@ -0,0 +1,93 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +# Built application files +*.apk +*.aar +*.ap_ +*.aab + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +# Uncomment the following line in case you need and you don't have the release build type files in your app +# release/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml + +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +#*.jks +#*.keystore + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild +.cxx/ + +# Google Services (e.g. APIs or Firebase) +# google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +# Version control +vcs.xml + +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ diff --git a/third-party/tool/move_to_background/android/.project b/third-party/tool/move_to_background/android/.project new file mode 100644 index 00000000..7aecebd1 --- /dev/null +++ b/third-party/tool/move_to_background/android/.project @@ -0,0 +1,23 @@ + + + move_to_background + Project android created by Buildship. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/third-party/tool/move_to_background/android/.settings/org.eclipse.buildship.core.prefs b/third-party/tool/move_to_background/android/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 00000000..9c7f4af9 --- /dev/null +++ b/third-party/tool/move_to_background/android/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,13 @@ +arguments= +auto.sync=false +build.scans.enabled=false +connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(5.4)) +connection.project.dir=../example/android +eclipse.preferences.version=1 +gradle.user.home= +java.home= +jvm.arguments= +offline.mode=false +override.workspace.settings=true +show.console.view=true +show.executions.view=true diff --git a/third-party/tool/move_to_background/android/build.gradle b/third-party/tool/move_to_background/android/build.gradle new file mode 100644 index 00000000..ec9c3ed4 --- /dev/null +++ b/third-party/tool/move_to_background/android/build.gradle @@ -0,0 +1,38 @@ +group 'com.sayegh.move_to_background' +version '1.0-SNAPSHOT' + +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + } +} + +rootProject.allprojects { + repositories { + google() + jcenter() + } + tasks.withType(JavaCompile) { + options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" + } +} + +apply plugin: 'com.android.library' + +android { + namespace "com.sayegh.move_to_background" + compileSdkVersion 28 + + defaultConfig { + minSdkVersion 16 + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + lintOptions { + disable 'InvalidPackage' + } +} diff --git a/third-party/tool/move_to_background/android/gradle.properties b/third-party/tool/move_to_background/android/gradle.properties new file mode 100644 index 00000000..2bd6f4fd --- /dev/null +++ b/third-party/tool/move_to_background/android/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.jvmargs=-Xmx1536M + diff --git a/third-party/tool/move_to_background/android/gradle/wrapper/gradle-wrapper.jar b/third-party/tool/move_to_background/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..f6b961fd Binary files /dev/null and b/third-party/tool/move_to_background/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/third-party/tool/move_to_background/android/gradle/wrapper/gradle-wrapper.properties b/third-party/tool/move_to_background/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..5f8fb3a4 --- /dev/null +++ b/third-party/tool/move_to_background/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Jul 23 12:58:04 EET 2019 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip diff --git a/third-party/tool/move_to_background/android/gradlew b/third-party/tool/move_to_background/android/gradlew new file mode 100644 index 00000000..cccdd3d5 --- /dev/null +++ b/third-party/tool/move_to_background/android/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/third-party/tool/move_to_background/android/gradlew.bat b/third-party/tool/move_to_background/android/gradlew.bat new file mode 100644 index 00000000..f9553162 --- /dev/null +++ b/third-party/tool/move_to_background/android/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/third-party/tool/move_to_background/android/settings.gradle b/third-party/tool/move_to_background/android/settings.gradle new file mode 100644 index 00000000..0a1b23e8 --- /dev/null +++ b/third-party/tool/move_to_background/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'move_to_background' diff --git a/third-party/tool/move_to_background/android/src/main/AndroidManifest.xml b/third-party/tool/move_to_background/android/src/main/AndroidManifest.xml new file mode 100644 index 00000000..4a0bd4e0 --- /dev/null +++ b/third-party/tool/move_to_background/android/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + diff --git a/third-party/tool/move_to_background/android/src/main/java/com/sayegh/move_to_background/MoveToBackgroundPlugin.java b/third-party/tool/move_to_background/android/src/main/java/com/sayegh/move_to_background/MoveToBackgroundPlugin.java new file mode 100644 index 00000000..09843d5d --- /dev/null +++ b/third-party/tool/move_to_background/android/src/main/java/com/sayegh/move_to_background/MoveToBackgroundPlugin.java @@ -0,0 +1,91 @@ +package com.sayegh.move_to_background; + +import android.app.Activity; +import android.content.Context; +import android.util.Log; + +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.MethodCallHandler; +import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.plugin.common.PluginRegistry.Registrar; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; + +/** MoveToBackgroundPlugin */ +public class MoveToBackgroundPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware { + private static final String CHANNEL_NAME = "move_to_background"; + private MethodChannel channel; + private static Activity activity; + + /** Plugin registration. */ + public static void registerWith(Registrar registrar) { + if (registrar.activity() != null) { + MoveToBackgroundPlugin.activity = registrar.activity(); + } + MoveToBackgroundPlugin plugin = new MoveToBackgroundPlugin(); + plugin.setupChannel(registrar.messenger(), registrar.context()); + } + + @Override + @SuppressWarnings("deprecation") + public void onAttachedToEngine(FlutterPluginBinding binding) { + setupChannel(binding.getFlutterEngine().getDartExecutor(), binding.getApplicationContext()); + } + + @Override + public void onDetachedFromEngine(FlutterPluginBinding binding) { + teardownChannel(); + } + + + private void setupChannel(BinaryMessenger messenger, Context context) { + channel = new MethodChannel(messenger, CHANNEL_NAME); + channel.setMethodCallHandler(this); + + } + + private void teardownChannel() { + channel.setMethodCallHandler(null); + channel = null; + } + + @Override + public void onMethodCall(MethodCall call, Result result) { + if (call.method.equals("moveTaskToBack")) { + if (MoveToBackgroundPlugin.activity != null) { + MoveToBackgroundPlugin.activity.moveTaskToBack(true); + } else { + Log.e("MoveToBackgroundPlugin", "moveTaskToBack failed: activity=null"); + } + result.success(true); + } else { + result.notImplemented(); + } + } + + + @Override + public void onAttachedToActivity(ActivityPluginBinding binding) + { + MoveToBackgroundPlugin.activity = binding.getActivity(); + } + + @Override + public void onDetachedFromActivityForConfigChanges() { + MoveToBackgroundPlugin.activity = null; + } + + @Override + public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) { + MoveToBackgroundPlugin.activity = binding.getActivity(); + } + + @Override + public void onDetachedFromActivity() { + MoveToBackgroundPlugin.activity = null; + } + +} diff --git a/third-party/tool/move_to_background/ios/.gitignore b/third-party/tool/move_to_background/ios/.gitignore new file mode 100644 index 00000000..710ec6cf --- /dev/null +++ b/third-party/tool/move_to_background/ios/.gitignore @@ -0,0 +1,36 @@ +.idea/ +.vagrant/ +.sconsign.dblite +.svn/ + +.DS_Store +*.swp +profile + +DerivedData/ +build/ +GeneratedPluginRegistrant.h +GeneratedPluginRegistrant.m + +.generated/ + +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 + +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 + +xcuserdata + +*.moved-aside + +*.pyc +*sync/ +Icon? +.tags* + +/Flutter/Generated.xcconfig diff --git a/third-party/tool/move_to_background/ios/Assets/.gitkeep b/third-party/tool/move_to_background/ios/Assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/third-party/tool/move_to_background/ios/Classes/MoveToBackgroundPlugin.h b/third-party/tool/move_to_background/ios/Classes/MoveToBackgroundPlugin.h new file mode 100644 index 00000000..1b402115 --- /dev/null +++ b/third-party/tool/move_to_background/ios/Classes/MoveToBackgroundPlugin.h @@ -0,0 +1,4 @@ +#import + +@interface MoveToBackgroundPlugin : NSObject +@end diff --git a/third-party/tool/move_to_background/ios/Classes/MoveToBackgroundPlugin.m b/third-party/tool/move_to_background/ios/Classes/MoveToBackgroundPlugin.m new file mode 100644 index 00000000..cfe9c7f3 --- /dev/null +++ b/third-party/tool/move_to_background/ios/Classes/MoveToBackgroundPlugin.m @@ -0,0 +1,21 @@ +#import "MoveToBackgroundPlugin.h" + +@implementation MoveToBackgroundPlugin ++ (void)registerWithRegistrar:(NSObject*)registrar { + FlutterMethodChannel* channel = [FlutterMethodChannel + methodChannelWithName:@"move_to_background" + binaryMessenger:[registrar messenger]]; + MoveToBackgroundPlugin* instance = [[MoveToBackgroundPlugin alloc] init]; + [registrar addMethodCallDelegate:instance channel:channel]; +} + +- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { + if ([@"moveTaskToBack" isEqualToString:call.method]) { + UIApplication *app = [UIApplication sharedApplication]; + [app performSelector:@selector(suspend)]; + } else { + result(FlutterMethodNotImplemented); + } +} + +@end diff --git a/third-party/tool/move_to_background/ios/move_to_background.podspec b/third-party/tool/move_to_background/ios/move_to_background.podspec new file mode 100644 index 00000000..b047b9d5 --- /dev/null +++ b/third-party/tool/move_to_background/ios/move_to_background.podspec @@ -0,0 +1,21 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# +Pod::Spec.new do |s| + s.name = 'move_to_background' + s.version = '0.0.1' + s.summary = 'A new flutter plugin project.' + s.description = <<-DESC +A new flutter plugin project. + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + s.dependency 'Flutter' + + s.ios.deployment_target = '8.0' +end + diff --git a/third-party/tool/move_to_background/lib/move_to_background.dart b/third-party/tool/move_to_background/lib/move_to_background.dart new file mode 100644 index 00000000..4a7b435f --- /dev/null +++ b/third-party/tool/move_to_background/lib/move_to_background.dart @@ -0,0 +1,16 @@ +/// This library is a wrapper for iOS and Android to send the application to the background programmatically. +import 'dart:async'; + +import 'package:flutter/services.dart'; + +/// A class containing the static function used. +class MoveToBackground { + /// The method channel used to contact the native side + static const MethodChannel _channel = + const MethodChannel('move_to_background'); + + /// Calls the platform-specific function to send the app to the background + static Future moveTaskToBack() async { + await _channel.invokeMethod('moveTaskToBack'); + } +} diff --git a/third-party/tool/move_to_background/pubspec.yaml b/third-party/tool/move_to_background/pubspec.yaml new file mode 100644 index 00000000..b0226614 --- /dev/null +++ b/third-party/tool/move_to_background/pubspec.yaml @@ -0,0 +1,25 @@ +name: move_to_background +description: Flutter plugin for sending application to background. Send your app to the background with one line of code. +version: 1.0.2 +homepage: https://github.com/Sayegh7/move_to_background + +environment: + sdk: ">=2.12.0 <3.0.0" + flutter: "^1.10.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + +flutter: + plugin: + platforms: + android: + package: com.sayegh.move_to_background + pluginClass: MoveToBackgroundPlugin + ios: + pluginClass: MoveToBackgroundPlugin diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 949e0d87..a75446b1 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -37,8 +36,6 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("LocalAuthPlugin")); LocalNotifierPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("LocalNotifierPlugin")); - LocalProxyPluginCApiRegisterWithRegistrar( - registry->GetRegistrarForPlugin("LocalProxyPluginCApi")); PermissionHandlerWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); ProtocolHandlerWindowsPluginCApiRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 9489e127..a3c0e2ae 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -9,7 +9,6 @@ list(APPEND FLUTTER_PLUGIN_LIST isar_flutter_libs local_auth_windows local_notifier - local_proxy permission_handler_windows protocol_handler_windows screen_capturer_windows