From 21ec1e4539ea83053aefe195e1a25f315b31a911 Mon Sep 17 00:00:00 2001 From: Li Wei Date: Fri, 16 Dec 2022 21:43:06 +0800 Subject: [PATCH] fix: follow android 11 storage permissions (#66) --- .github/workflows/build.yml | 1 + ui/flutter/android/app/build.gradle | 17 +++++-- .../android/app/src/debug/AndroidManifest.xml | 4 -- .../android/app/src/main/AndroidManifest.xml | 3 -- .../app/src/profile/AndroidManifest.xml | 4 -- ui/flutter/lib/pages/app/app_controller.dart | 26 ++++------ ui/flutter/lib/pages/app/app_view.dart | 7 +++ ui/flutter/lib/pages/create/create_view.dart | 17 +++---- ui/flutter/lib/pages/task/task_view.dart | 13 ++--- ui/flutter/pubspec.lock | 47 ++----------------- ui/flutter/pubspec.yaml | 6 +-- 11 files changed, 55 insertions(+), 90 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f0ba1b93..4279abba 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -268,6 +268,7 @@ jobs: gomobile init gomobile bind -tags nosqlite -ldflags="-w -s" -o ui/flutter/android/app/libs/libgopeed.aar -target=android -androidapi 19 -javapkg=com.gopeed github.com/monkeyWie/gopeed/bind/mobile cd ui/flutter + echo $APK_KEYSTORE | base64 -d > android/app/upload-keystore.jks flutter build apk mkdir dist cp build/app/outputs/flutter-apk/app-release.apk dist/Gopeed-$VERSION-android.apk diff --git a/ui/flutter/android/app/build.gradle b/ui/flutter/android/app/build.gradle index 9fd7e9fe..8e1a322d 100644 --- a/ui/flutter/android/app/build.gradle +++ b/ui/flutter/android/app/build.gradle @@ -53,11 +53,22 @@ android { versionName flutterVersionName } + signingConfigs { + release { + keyAlias "upload" + keyPassword System.getenv("APK_KEY_PASSWORD") + storeFile file("upload-keystore.jks") + storePassword System.getenv("APK_STORE_PASSWORD") + } + } + buildTypes { release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug + if (signingConfigs.release.keyPassword != null) { + signingConfig signingConfigs.release + } else { + signingConfig signingConfigs.debug + } } } diff --git a/ui/flutter/android/app/src/debug/AndroidManifest.xml b/ui/flutter/android/app/src/debug/AndroidManifest.xml index 5492f719..21e7544e 100644 --- a/ui/flutter/android/app/src/debug/AndroidManifest.xml +++ b/ui/flutter/android/app/src/debug/AndroidManifest.xml @@ -4,9 +4,5 @@ the Flutter tool needs it to communicate with the running application to allow setting breakpoints, to provide hot reload, etc. --> - - - - diff --git a/ui/flutter/android/app/src/main/AndroidManifest.xml b/ui/flutter/android/app/src/main/AndroidManifest.xml index 9fcb0b2c..731921e2 100644 --- a/ui/flutter/android/app/src/main/AndroidManifest.xml +++ b/ui/flutter/android/app/src/main/AndroidManifest.xml @@ -2,11 +2,8 @@ package="com.gopeed"> - - diff --git a/ui/flutter/android/app/src/profile/AndroidManifest.xml b/ui/flutter/android/app/src/profile/AndroidManifest.xml index 5492f719..21e7544e 100644 --- a/ui/flutter/android/app/src/profile/AndroidManifest.xml +++ b/ui/flutter/android/app/src/profile/AndroidManifest.xml @@ -4,9 +4,5 @@ the Flutter tool needs it to communicate with the running application to allow setting breakpoints, to provide hot reload, etc. --> - - - - diff --git a/ui/flutter/lib/pages/app/app_controller.dart b/ui/flutter/lib/pages/app/app_controller.dart index 63cae985..c8941e09 100644 --- a/ui/flutter/lib/pages/app/app_controller.dart +++ b/ui/flutter/lib/pages/app/app_controller.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'dart:ui' as ui; -import 'package:external_path/external_path.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:path_provider/path_provider.dart'; @@ -157,23 +156,16 @@ class AppController extends GetxController { extra.bt.trackerSubscribeUrls.addAll(allTrackerSubscribeUrls); } - if (Util.isAndroid()) { - config.downloadDir = - '${await ExternalPath.getExternalStoragePublicDirectory(ExternalPath.DIRECTORY_DOWNLOADS)}/com.gopeed'; + if (Util.isDesktop()) { + config.downloadDir = (await getDownloadsDirectory())?.path ?? "./"; + } else if (Util.isAndroid()) { + config.downloadDir = (await getExternalStorageDirectory())?.path ?? + (await getApplicationDocumentsDirectory()).path; return; - } - if (Util.isIOS()) { - config.downloadDir = 'Documents'; - return; - } - - if (config.downloadDir.isEmpty) { - if (Util.isWeb()) { - config.downloadDir = './'; - } - if (Util.isDesktop()) { - config.downloadDir = (await getDownloadsDirectory())?.path ?? "./"; - } + } else if (Util.isIOS()) { + config.downloadDir = (await getApplicationDocumentsDirectory()).path; + } else { + config.downloadDir = './'; } } diff --git a/ui/flutter/lib/pages/app/app_view.dart b/ui/flutter/lib/pages/app/app_view.dart index d51edc21..1b95421e 100644 --- a/ui/flutter/lib/pages/app/app_view.dart +++ b/ui/flutter/lib/pages/app/app_view.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:get/get.dart'; import '../../i18n/messages.dart'; @@ -20,6 +21,12 @@ class AppView extends GetView { translations: messages, locale: toLocale(config.extra.locale), fallbackLocale: fallbackLocale, + localizationsDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + supportedLocales: messages.keys.keys.map((e) => toLocale(e)).toList(), getPages: Routes.routes, ); } diff --git a/ui/flutter/lib/pages/create/create_view.dart b/ui/flutter/lib/pages/create/create_view.dart index 2f56532b..1c183307 100644 --- a/ui/flutter/lib/pages/create/create_view.dart +++ b/ui/flutter/lib/pages/create/create_view.dart @@ -1,7 +1,6 @@ import 'package:desktop_drop/desktop_drop.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:permission_handler/permission_handler.dart'; import 'package:rounded_loading_button/rounded_loading_button.dart'; import '../../api/api.dart'; @@ -171,13 +170,15 @@ class CreateView extends GetView { try { if (createFormKey.currentState!.validate()) { downloadController.start(); - if (Util.isAndroid()) { - if (!await Permission.storage.request().isGranted) { - Get.snackbar('error'.tr, - 'create.error.noStoragePermission'.tr); - return; - } - } + + // if (Util.isAndroid()) { + // if (!await Permission.storage.request().isGranted) { + // Get.snackbar('error'.tr, + // 'create.error.noStoragePermission'.tr); + // return; + // } + // } + await createTask(CreateTask( res: res, opts: Options( diff --git a/ui/flutter/lib/pages/task/task_view.dart b/ui/flutter/lib/pages/task/task_view.dart index a8c12d4d..2f757481 100644 --- a/ui/flutter/lib/pages/task/task_view.dart +++ b/ui/flutter/lib/pages/task/task_view.dart @@ -30,13 +30,14 @@ class Item extends StatelessWidget { ), Row( children: [ - Expanded( + SizedBox( + width: 180, child: Text( - "${isDone() ? "" : "${Util.fmtByte(task.progress.downloaded)} / "}${Util.fmtByte(task.size)}", - style: context.textTheme.bodyText1 - ?.copyWith(color: Get.theme.disabledColor), - ).padding(left: 18)), - Expanded( + "${isDone() ? "" : "${Util.fmtByte(task.progress.downloaded)} / "}${Util.fmtByte(task.size)}", + style: context.textTheme.bodyText1 + ?.copyWith(color: Get.theme.disabledColor), + ).padding(left: 18)), + Flexible( child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ diff --git a/ui/flutter/pubspec.lock b/ui/flutter/pubspec.lock index 1d2add2c..ee1bf4ff 100644 --- a/ui/flutter/pubspec.lock +++ b/ui/flutter/pubspec.lock @@ -197,13 +197,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "4.0.6" - external_path: - dependency: "direct main" - description: - name: external_path - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.0.3" fake_async: dependency: transitive description: @@ -309,6 +302,11 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.0.1" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -564,41 +562,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.1.3" - permission_handler: - dependency: "direct main" - description: - name: permission_handler - url: "https://pub.flutter-io.cn" - source: hosted - version: "10.1.0" - permission_handler_android: - dependency: transitive - description: - name: permission_handler_android - url: "https://pub.flutter-io.cn" - source: hosted - version: "10.1.0" - permission_handler_apple: - dependency: transitive - description: - name: permission_handler_apple - url: "https://pub.flutter-io.cn" - source: hosted - version: "9.0.6" - permission_handler_platform_interface: - dependency: transitive - description: - name: permission_handler_platform_interface - url: "https://pub.flutter-io.cn" - source: hosted - version: "3.9.0" - permission_handler_windows: - dependency: transitive - description: - name: permission_handler_windows - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.1.1" petitparser: dependency: transitive description: diff --git a/ui/flutter/pubspec.yaml b/ui/flutter/pubspec.yaml index 03989c60..8cddc9d8 100644 --- a/ui/flutter/pubspec.yaml +++ b/ui/flutter/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.2.2+1 +version: 1.2.3+1 environment: sdk: ">=2.17.6 <3.0.0" @@ -29,6 +29,8 @@ environment: dependencies: flutter: sdk: flutter + flutter_localizations: + sdk: flutter # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. @@ -46,8 +48,6 @@ dependencies: rounded_loading_button: ^2.1.0 url_launcher: ^6.1.6 shared_preferences: ^2.0.15 - permission_handler: ^10.1.0 - external_path: ^1.0.3 logger: ^1.1.0 desktop_drop: ^0.3.3 intl: ^0.17.0