iOS: Handle limited or no permission (#1358)
This commit is contained in:
commit
52009727a1
8 changed files with 93 additions and 8 deletions
5
lib/generated/intl/messages_en.dart
generated
5
lib/generated/intl/messages_en.dart
generated
|
@ -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
lib/generated/l10n.dart
generated
30
lib/generated/l10n.dart
generated
|
@ -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(
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
),
|
||||
);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Add table
Reference in a new issue