iOS: Handle limited or no permission (#1358)

This commit is contained in:
Neeraj Gupta 2023-08-29 15:31:41 +05:30 committed by GitHub
commit 52009727a1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 93 additions and 8 deletions

View file

@ -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"),

View file

@ -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(

View file

@ -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",

View file

@ -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());

View file

@ -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,
),
),
);

View file

@ -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,

View file

@ -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(

View file

@ -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"