Procházet zdrojové kódy

iOS: Handle limited or no permission (#1358)

Neeraj Gupta před 1 rokem
rodič
revize
52009727a1

+ 5 - 0
lib/generated/intl/messages_en.dart

@@ -687,6 +687,8 @@ class MessageLookup extends MessageLookupByLibrary {
             "Generating encryption keys..."),
         "goToSettings": MessageLookupByLibrary.simpleMessage("Go to settings"),
         "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"),
+        "grantFullAccessPrompt": MessageLookupByLibrary.simpleMessage(
+            "Please allow access to all photos in the Settings app"),
         "grantPermission":
             MessageLookupByLibrary.simpleMessage("Grant permission"),
         "groupNearbyPhotos":
@@ -877,6 +879,7 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("Oops, could not save edits"),
         "oopsSomethingWentWrong":
             MessageLookupByLibrary.simpleMessage("Oops, something went wrong"),
+        "openSettings": MessageLookupByLibrary.simpleMessage("Open Settings"),
         "openTheItem": MessageLookupByLibrary.simpleMessage("• Open the item"),
         "openstreetmapContributors":
             MessageLookupByLibrary.simpleMessage("OpenStreetMap contributors"),
@@ -1080,6 +1083,8 @@ class MessageLookup extends MessageLookupByLibrary {
             MessageLookupByLibrary.simpleMessage("Select items to add"),
         "selectLanguage":
             MessageLookupByLibrary.simpleMessage("Select Language"),
+        "selectMorePhotos":
+            MessageLookupByLibrary.simpleMessage("Select more photos"),
         "selectReason": MessageLookupByLibrary.simpleMessage("Select reason"),
         "selectYourPlan":
             MessageLookupByLibrary.simpleMessage("Select your plan"),

+ 30 - 0
lib/generated/l10n.dart

@@ -4455,6 +4455,36 @@ class S {
     );
   }
 
+  /// `Please allow access to all photos in the Settings app`
+  String get grantFullAccessPrompt {
+    return Intl.message(
+      'Please allow access to all photos in the Settings app',
+      name: 'grantFullAccessPrompt',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Open Settings`
+  String get openSettings {
+    return Intl.message(
+      'Open Settings',
+      name: 'openSettings',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Select more photos`
+  String get selectMorePhotos {
+    return Intl.message(
+      'Select more photos',
+      name: 'selectMorePhotos',
+      desc: '',
+      args: [],
+    );
+  }
+
   /// `Existing user`
   String get existingUser {
     return Intl.message(

+ 3 - 0
lib/l10n/intl_en.arb

@@ -644,6 +644,9 @@
   "startBackup": "Start backup",
   "noPhotosAreBeingBackedUpRightNow": "No photos are being backed up right now",
   "preserveMore": "Preserve more",
+  "grantFullAccessPrompt": "Please allow access to all photos in the Settings app",
+  "openSettings": "Open Settings",
+  "selectMorePhotos": "Select more photos",
   "existingUser": "Existing user",
   "privateBackups": "Private backups",
   "forYourMemories": "for your memories",

+ 10 - 0
lib/services/local_sync_service.dart

@@ -241,6 +241,16 @@ class LocalSyncService {
         PermissionState.limited.toString();
   }
 
+  bool hasGrantedFullPermission() {
+    return (_prefs.getString(kPermissionStateKey) ?? '') ==
+        PermissionState.authorized.toString();
+  }
+
+  Future<void> onUpdatePermission(PermissionState state) async {
+    await _prefs.setBool(kHasGrantedPermissionsKey, true);
+    await _prefs.setString(kPermissionStateKey, state.toString());
+  }
+
   Future<void> onPermissionGranted(PermissionState state) async {
     await _prefs.setBool(kHasGrantedPermissionsKey, true);
     await _prefs.setString(kPermissionStateKey, state.toString());

+ 41 - 4
lib/ui/home/preserve_footer_widget.dart

@@ -1,11 +1,16 @@
 import 'dart:async';
+import "dart:io";
 
 import 'package:flutter/material.dart';
+import "package:flutter/services.dart";
+import "package:logging/logging.dart";
 import 'package:photo_manager/photo_manager.dart';
+import "package:photos/core/configuration.dart";
 import "package:photos/generated/l10n.dart";
 import 'package:photos/services/local_sync_service.dart';
 import 'package:photos/ui/common/gradient_button.dart';
 import 'package:photos/ui/settings/backup/backup_folder_selection_page.dart';
+import "package:photos/utils/dialog_util.dart";
 import 'package:photos/utils/navigation_util.dart';
 
 class PreserveFooterWidget extends StatelessWidget {
@@ -17,14 +22,46 @@ class PreserveFooterWidget extends StatelessWidget {
       padding: const EdgeInsets.fromLTRB(20, 24, 20, 100),
       child: GradientButton(
         onTap: () async {
-          if (LocalSyncService.instance.hasGrantedLimitedPermissions()) {
-            await PhotoManager.presentLimited();
+          try {
+            final PermissionState state =
+                await PhotoManager.requestPermissionExtend();
+            await LocalSyncService.instance.onUpdatePermission(state);
+          } on Exception catch (e) {
+            Logger("PreserveFooterWidget").severe(
+              "Failed to request permission: ${e.toString()}",
+              e,
+            );
+          }
+          if (!LocalSyncService.instance.hasGrantedFullPermission()) {
+            if (Platform.isAndroid) {
+              await PhotoManager.openSetting();
+            } else {
+              final bool hasGrantedLimit =
+                  LocalSyncService.instance.hasGrantedLimitedPermissions();
+              showChoiceActionSheet(
+                context,
+                title: S.of(context).preserveMore,
+                body: S.of(context).grantFullAccessPrompt,
+                firstButtonLabel: S.of(context).openSettings,
+                firstButtonOnTap: () async {
+                  await PhotoManager.openSetting();
+                },
+                secondButtonLabel: hasGrantedLimit
+                    ? S.of(context).selectMorePhotos
+                    : S.of(context).cancel,
+                secondButtonOnTap: () async {
+                  if (hasGrantedLimit) {
+                    await PhotoManager.presentLimited();
+                  }
+                },
+              );
+            }
           } else {
             unawaited(
               routeToPage(
                 context,
-                const BackupFolderSelectionPage(
-                  buttonText: "Preserve",
+                 BackupFolderSelectionPage(
+                  buttonText: S.of(context).backup,
                 ),
               ),
             );

+ 2 - 2
lib/ui/settings/backup/backup_folder_selection_page.dart

@@ -78,14 +78,14 @@ class _BackupFolderSelectionPageState extends State<BackupFolderSelectionPage> {
               title: const Text(""),
             ),
       body: Column(
-        mainAxisAlignment: MainAxisAlignment.center,
+        mainAxisAlignment: MainAxisAlignment.start,
         children: [
           const SizedBox(
             height: 0,
           ),
           SafeArea(
             child: Container(
-              padding: const EdgeInsets.fromLTRB(24, 32, 24, 8),
+              padding: const EdgeInsets.fromLTRB(24, 8, 24, 8),
               child: Text(
                 S.of(context).selectFoldersForBackup,
                 textAlign: TextAlign.left,

+ 1 - 1
lib/ui/viewer/file/file_app_bar.dart

@@ -150,7 +150,7 @@ class FileAppBarState extends State<FileAppBar> {
             );
           }
           // options for files owned by the user
-          if (isOwnedByUser && !isFileHidden) {
+          if (isOwnedByUser && !isFileHidden && isFileUploaded) {
             final bool isArchived =
                 widget.file.magicMetadata.visibility == archiveVisibility;
             items.add(

+ 1 - 1
pubspec.yaml

@@ -12,7 +12,7 @@ description: ente photos application
 # Read more about iOS versioning at
 # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
 
-version: 0.7.84+484
+version: 0.7.87+487
 
 environment:
   sdk: ">=3.0.0 <4.0.0"