Commit d6a4a367 by Jeroen Weener Committed by GitHub

Update logic to handle calendar WRITE/FULL_ACCESS instead of READ/FULL_ACCESS (#1194)

* Swaps calendar READ for WRITE

* Delete confusing doc sentence
parent 0b6b5290
## 12.0.0
* **BREAKING CHANGES:**
* Adds `Permission.calendarWriteOnly`.
* Removes `Permission.calendarReadOnly`.
## 11.1.0 ## 11.1.0
* Implements the `Permission.calendarReadOnly` and `PermissionCalendarFullAccess` permissions. * Implements the `Permission.calendarReadOnly` and `PermissionCalendarFullAccess` permissions.
......
...@@ -20,7 +20,7 @@ final class PermissionConstants { ...@@ -20,7 +20,7 @@ final class PermissionConstants {
// PERMISSION_GROUP // PERMISSION_GROUP
// Deprecated in favor of PERMISSION_GROUP_CALENDAR_READ_ONLY and // Deprecated in favor of PERMISSION_GROUP_CALENDAR_WRITE_ONLY and
// PERMISSION_GROUP_CALENDAR_FULL_ACCESS. // PERMISSION_GROUP_CALENDAR_FULL_ACCESS.
static final int PERMISSION_GROUP_CALENDAR = 0; static final int PERMISSION_GROUP_CALENDAR = 0;
static final int PERMISSION_GROUP_CAMERA = 1; static final int PERMISSION_GROUP_CAMERA = 1;
...@@ -58,7 +58,7 @@ final class PermissionConstants { ...@@ -58,7 +58,7 @@ final class PermissionConstants {
static final int PERMISSION_GROUP_AUDIO = 33; static final int PERMISSION_GROUP_AUDIO = 33;
static final int PERMISSION_GROUP_SCHEDULE_EXACT_ALARM = 34; static final int PERMISSION_GROUP_SCHEDULE_EXACT_ALARM = 34;
static final int PERMISSION_GROUP_SENSORS_ALWAYS = 35; static final int PERMISSION_GROUP_SENSORS_ALWAYS = 35;
static final int PERMISSION_GROUP_CALENDAR_READ_ONLY = 36; static final int PERMISSION_GROUP_CALENDAR_WRITE_ONLY = 36;
static final int PERMISSION_GROUP_CALENDAR_FULL_ACCESS = 37; static final int PERMISSION_GROUP_CALENDAR_FULL_ACCESS = 37;
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
...@@ -96,7 +96,7 @@ final class PermissionConstants { ...@@ -96,7 +96,7 @@ final class PermissionConstants {
PERMISSION_GROUP_VIDEOS, PERMISSION_GROUP_VIDEOS,
PERMISSION_GROUP_AUDIO, PERMISSION_GROUP_AUDIO,
PERMISSION_GROUP_SCHEDULE_EXACT_ALARM, PERMISSION_GROUP_SCHEDULE_EXACT_ALARM,
PERMISSION_GROUP_CALENDAR_READ_ONLY, PERMISSION_GROUP_CALENDAR_WRITE_ONLY,
PERMISSION_GROUP_CALENDAR_FULL_ACCESS PERMISSION_GROUP_CALENDAR_FULL_ACCESS
}) })
@interface PermissionGroup { @interface PermissionGroup {
......
...@@ -166,24 +166,24 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener, ...@@ -166,24 +166,24 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener,
return false; return false;
} }
// Calendar permissions are split between READ and WRITE in Android, and split between READ // Calendar permissions are split between WRITE and READ in Android, and split between WRITE
// and FULL ACCESS in the plugin. We need special logic for this translation. // and FULL ACCESS in the plugin. We need special logic for this translation.
final List<String> permissionList = Arrays.asList(permissions); final List<String> permissionList = Arrays.asList(permissions);
final int calendarReadIndex = permissionList.indexOf(Manifest.permission.READ_CALENDAR);
final int calendarWriteIndex = permissionList.indexOf(Manifest.permission.WRITE_CALENDAR); final int calendarWriteIndex = permissionList.indexOf(Manifest.permission.WRITE_CALENDAR);
// READ -> READ. // WRITE -> WRITE.
if (calendarReadIndex >= 0) { if (calendarWriteIndex >= 0) {
final int readGrantResult = grantResults[calendarReadIndex]; final int writeGrantResult = grantResults[calendarWriteIndex];
final @PermissionConstants.PermissionStatus int readStatus = final @PermissionConstants.PermissionStatus int writeStatus =
PermissionUtils.toPermissionStatus(this.activity, Manifest.permission.READ_CALENDAR, readGrantResult); PermissionUtils.toPermissionStatus(this.activity, Manifest.permission.WRITE_CALENDAR, writeGrantResult);
requestResults.put(PermissionConstants.PERMISSION_GROUP_CALENDAR_READ_ONLY, readStatus); requestResults.put(PermissionConstants.PERMISSION_GROUP_CALENDAR_WRITE_ONLY, writeStatus);
// READ + WRITE -> FULL ACCESS. // WRITE + READ -> FULL ACCESS.
if (calendarWriteIndex >= 0) { final int calendarReadIndex = permissionList.indexOf(Manifest.permission.READ_CALENDAR);
final int writeGrantResult = grantResults[calendarWriteIndex]; if (calendarReadIndex >= 0) {
final @PermissionConstants.PermissionStatus int writeStatus = final int readGrantResult = grantResults[calendarReadIndex];
PermissionUtils.toPermissionStatus(this.activity, Manifest.permission.WRITE_CALENDAR, writeGrantResult); final @PermissionConstants.PermissionStatus int readStatus =
final @PermissionConstants.PermissionStatus int fullAccessStatus = strictestStatus(readStatus, writeStatus); PermissionUtils.toPermissionStatus(this.activity, Manifest.permission.READ_CALENDAR, readGrantResult);
final @PermissionConstants.PermissionStatus int fullAccessStatus = strictestStatus(writeStatus, readStatus);
requestResults.put(PermissionConstants.PERMISSION_GROUP_CALENDAR_FULL_ACCESS, fullAccessStatus); requestResults.put(PermissionConstants.PERMISSION_GROUP_CALENDAR_FULL_ACCESS, fullAccessStatus);
// Support deprecated CALENDAR permission. // Support deprecated CALENDAR permission.
requestResults.put(PermissionConstants.PERMISSION_GROUP_CALENDAR, fullAccessStatus); requestResults.put(PermissionConstants.PERMISSION_GROUP_CALENDAR, fullAccessStatus);
...@@ -193,8 +193,8 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener, ...@@ -193,8 +193,8 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener,
for (int i = 0; i < permissions.length; i++) { for (int i = 0; i < permissions.length; i++) {
final String permissionName = permissions[i]; final String permissionName = permissions[i];
// READ_CALENDAR and WRITE_CALENDAR permission results have already been handled. // WRITE_CALENDAR and READ_CALENDAR permission results have already been handled.
if (permissionName.equals(Manifest.permission.READ_CALENDAR) || permissionName.equals(Manifest.permission.WRITE_CALENDAR)) { if (permissionName.equals(Manifest.permission.WRITE_CALENDAR) || permissionName.equals(Manifest.permission.READ_CALENDAR)) {
continue; continue;
} }
...@@ -409,12 +409,11 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener, ...@@ -409,12 +409,11 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener,
Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM, Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM,
PermissionConstants.PERMISSION_CODE_SCHEDULE_EXACT_ALARM); PermissionConstants.PERMISSION_CODE_SCHEDULE_EXACT_ALARM);
} else if (permission == PermissionConstants.PERMISSION_GROUP_CALENDAR_FULL_ACCESS || permission == PermissionConstants.PERMISSION_GROUP_CALENDAR) { } else if (permission == PermissionConstants.PERMISSION_GROUP_CALENDAR_FULL_ACCESS || permission == PermissionConstants.PERMISSION_GROUP_CALENDAR) {
// Deny CALENDAR_FULL_ACCESS permission if manifest is not listing both read- and write permissions. // Deny CALENDAR_FULL_ACCESS permission if manifest is not listing both write- and read permissions.
// Otherwise, we will only ask for READ permission and think full access is granted.
final boolean isValidManifest = isValidManifestForCalendarFullAccess(); final boolean isValidManifest = isValidManifestForCalendarFullAccess();
if (isValidManifest) { if (isValidManifest) {
permissionsToRequest.add(Manifest.permission.READ_CALENDAR);
permissionsToRequest.add(Manifest.permission.WRITE_CALENDAR); permissionsToRequest.add(Manifest.permission.WRITE_CALENDAR);
permissionsToRequest.add(Manifest.permission.READ_CALENDAR);
pendingRequestCount += 2; pendingRequestCount += 2;
} else { } else {
requestResults.put(permission, PermissionConstants.PERMISSION_STATUS_DENIED); requestResults.put(permission, PermissionConstants.PERMISSION_STATUS_DENIED);
...@@ -650,19 +649,19 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener, ...@@ -650,19 +649,19 @@ final class PermissionManager implements PluginRegistry.ActivityResultListener,
} }
/** /**
* Checks if the manifest contains both {@link Manifest.permission#READ_CALENDAR} and * Checks if the manifest contains both {@link Manifest.permission#WRITE_CALENDAR} and
* {@link Manifest.permission#WRITE_CALENDAR} permission declarations. * {@link Manifest.permission#READ_CALENDAR} permission declarations.
*/ */
private boolean isValidManifestForCalendarFullAccess() { private boolean isValidManifestForCalendarFullAccess() {
List<String> names = PermissionUtils.getManifestNames(context, PermissionConstants.PERMISSION_GROUP_CALENDAR_FULL_ACCESS); List<String> names = PermissionUtils.getManifestNames(context, PermissionConstants.PERMISSION_GROUP_CALENDAR_FULL_ACCESS);
final boolean readInManifest = names != null && names.contains(Manifest.permission.READ_CALENDAR);
final boolean writeInManifest = names != null && names.contains(Manifest.permission.WRITE_CALENDAR); final boolean writeInManifest = names != null && names.contains(Manifest.permission.WRITE_CALENDAR);
final boolean validManifest = readInManifest && writeInManifest; final boolean readInManifest = names != null && names.contains(Manifest.permission.READ_CALENDAR);
final boolean validManifest = writeInManifest && readInManifest;
if (!validManifest) { if (!validManifest) {
if (!readInManifest)
Log.d(PermissionConstants.LOG_TAG, Manifest.permission.READ_CALENDAR + " missing in manifest");
if (!writeInManifest) if (!writeInManifest)
Log.d(PermissionConstants.LOG_TAG, Manifest.permission.WRITE_CALENDAR + " missing in manifest"); Log.d(PermissionConstants.LOG_TAG, Manifest.permission.WRITE_CALENDAR + " missing in manifest");
if (!readInManifest)
Log.d(PermissionConstants.LOG_TAG, Manifest.permission.READ_CALENDAR + " missing in manifest");
return false; return false;
} }
return true; return true;
......
...@@ -27,8 +27,8 @@ public class PermissionUtils { ...@@ -27,8 +27,8 @@ public class PermissionUtils {
@PermissionConstants.PermissionGroup @PermissionConstants.PermissionGroup
static int parseManifestName(String permission) { static int parseManifestName(String permission) {
switch (permission) { switch (permission) {
case Manifest.permission.READ_CALENDAR:
case Manifest.permission.WRITE_CALENDAR: case Manifest.permission.WRITE_CALENDAR:
case Manifest.permission.READ_CALENDAR:
return PermissionConstants.PERMISSION_GROUP_CALENDAR; return PermissionConstants.PERMISSION_GROUP_CALENDAR;
case Manifest.permission.CAMERA: case Manifest.permission.CAMERA:
return PermissionConstants.PERMISSION_GROUP_CAMERA; return PermissionConstants.PERMISSION_GROUP_CAMERA;
...@@ -103,17 +103,17 @@ public class PermissionUtils { ...@@ -103,17 +103,17 @@ public class PermissionUtils {
final ArrayList<String> permissionNames = new ArrayList<>(); final ArrayList<String> permissionNames = new ArrayList<>();
switch (permission) { switch (permission) {
case PermissionConstants.PERMISSION_GROUP_CALENDAR_READ_ONLY: case PermissionConstants.PERMISSION_GROUP_CALENDAR_WRITE_ONLY:
if (hasPermissionInManifest(context, permissionNames, Manifest.permission.READ_CALENDAR)) if (hasPermissionInManifest(context, permissionNames, Manifest.permission.WRITE_CALENDAR))
permissionNames.add(Manifest.permission.READ_CALENDAR); permissionNames.add(Manifest.permission.WRITE_CALENDAR);
break; break;
case PermissionConstants.PERMISSION_GROUP_CALENDAR_FULL_ACCESS: case PermissionConstants.PERMISSION_GROUP_CALENDAR_FULL_ACCESS:
case PermissionConstants.PERMISSION_GROUP_CALENDAR: case PermissionConstants.PERMISSION_GROUP_CALENDAR:
if (hasPermissionInManifest(context, permissionNames, Manifest.permission.READ_CALENDAR))
permissionNames.add(Manifest.permission.READ_CALENDAR);
if (hasPermissionInManifest(context, permissionNames, Manifest.permission.WRITE_CALENDAR)) if (hasPermissionInManifest(context, permissionNames, Manifest.permission.WRITE_CALENDAR))
permissionNames.add(Manifest.permission.WRITE_CALENDAR); permissionNames.add(Manifest.permission.WRITE_CALENDAR);
if (hasPermissionInManifest(context, permissionNames, Manifest.permission.READ_CALENDAR))
permissionNames.add(Manifest.permission.READ_CALENDAR);
break; break;
case PermissionConstants.PERMISSION_GROUP_CAMERA: case PermissionConstants.PERMISSION_GROUP_CAMERA:
......
name: permission_handler_android name: permission_handler_android
description: Permission plugin for Flutter. This plugin provides the Android API to request and check permissions. description: Permission plugin for Flutter. This plugin provides the Android API to request and check permissions.
homepage: https://github.com/baseflow/flutter-permission-handler homepage: https://github.com/baseflow/flutter-permission-handler
version: 11.1.0 version: 12.0.0
environment: environment:
sdk: ">=2.15.0 <4.0.0" sdk: ">=2.15.0 <4.0.0"
...@@ -18,7 +18,7 @@ flutter: ...@@ -18,7 +18,7 @@ flutter:
dependencies: dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
permission_handler_platform_interface: ^3.12.0 permission_handler_platform_interface: ^4.0.0
dev_dependencies: dev_dependencies:
flutter_lints: ^1.0.4 flutter_lints: ^1.0.4
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment