Skip to content

Commit d6a4a36

Browse files
authored
Update logic to handle calendar WRITE/FULL_ACCESS instead of READ/FULL_ACCESS (#1194)
* Swaps calendar READ for WRITE * Delete confusing doc sentence
1 parent 0b6b529 commit d6a4a36

File tree

5 files changed

+42
-37
lines changed

5 files changed

+42
-37
lines changed

permission_handler_android/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## 12.0.0
2+
3+
* **BREAKING CHANGES:**
4+
* Adds `Permission.calendarWriteOnly`.
5+
* Removes `Permission.calendarReadOnly`.
6+
17
## 11.1.0
28

39
* Implements the `Permission.calendarReadOnly` and `PermissionCalendarFullAccess` permissions.

permission_handler_android/android/src/main/java/com/baseflow/permissionhandler/PermissionConstants.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ final class PermissionConstants {
2020

2121
// PERMISSION_GROUP
2222

23-
// Deprecated in favor of PERMISSION_GROUP_CALENDAR_READ_ONLY and
23+
// Deprecated in favor of PERMISSION_GROUP_CALENDAR_WRITE_ONLY and
2424
// PERMISSION_GROUP_CALENDAR_FULL_ACCESS.
2525
static final int PERMISSION_GROUP_CALENDAR = 0;
2626
static final int PERMISSION_GROUP_CAMERA = 1;
@@ -58,7 +58,7 @@ final class PermissionConstants {
5858
static final int PERMISSION_GROUP_AUDIO = 33;
5959
static final int PERMISSION_GROUP_SCHEDULE_EXACT_ALARM = 34;
6060
static final int PERMISSION_GROUP_SENSORS_ALWAYS = 35;
61-
static final int PERMISSION_GROUP_CALENDAR_READ_ONLY = 36;
61+
static final int PERMISSION_GROUP_CALENDAR_WRITE_ONLY = 36;
6262
static final int PERMISSION_GROUP_CALENDAR_FULL_ACCESS = 37;
6363

6464
@Retention(RetentionPolicy.SOURCE)
@@ -96,7 +96,7 @@ final class PermissionConstants {
9696
PERMISSION_GROUP_VIDEOS,
9797
PERMISSION_GROUP_AUDIO,
9898
PERMISSION_GROUP_SCHEDULE_EXACT_ALARM,
99-
PERMISSION_GROUP_CALENDAR_READ_ONLY,
99+
PERMISSION_GROUP_CALENDAR_WRITE_ONLY,
100100
PERMISSION_GROUP_CALENDAR_FULL_ACCESS
101101
})
102102
@interface PermissionGroup {

permission_handler_android/android/src/main/java/com/baseflow/permissionhandler/PermissionManager.java

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -166,24 +166,24 @@ public boolean onRequestPermissionsResult(
166166
return false;
167167
}
168168

169-
// Calendar permissions are split between READ and WRITE in Android, and split between READ
169+
// Calendar permissions are split between WRITE and READ in Android, and split between WRITE
170170
// and FULL ACCESS in the plugin. We need special logic for this translation.
171171
final List<String> permissionList = Arrays.asList(permissions);
172-
final int calendarReadIndex = permissionList.indexOf(Manifest.permission.READ_CALENDAR);
173172
final int calendarWriteIndex = permissionList.indexOf(Manifest.permission.WRITE_CALENDAR);
174-
// READ -> READ.
175-
if (calendarReadIndex >= 0) {
176-
final int readGrantResult = grantResults[calendarReadIndex];
177-
final @PermissionConstants.PermissionStatus int readStatus =
178-
PermissionUtils.toPermissionStatus(this.activity, Manifest.permission.READ_CALENDAR, readGrantResult);
179-
requestResults.put(PermissionConstants.PERMISSION_GROUP_CALENDAR_READ_ONLY, readStatus);
180-
181-
// READ + WRITE -> FULL ACCESS.
182-
if (calendarWriteIndex >= 0) {
183-
final int writeGrantResult = grantResults[calendarWriteIndex];
184-
final @PermissionConstants.PermissionStatus int writeStatus =
185-
PermissionUtils.toPermissionStatus(this.activity, Manifest.permission.WRITE_CALENDAR, writeGrantResult);
186-
final @PermissionConstants.PermissionStatus int fullAccessStatus = strictestStatus(readStatus, writeStatus);
173+
// WRITE -> WRITE.
174+
if (calendarWriteIndex >= 0) {
175+
final int writeGrantResult = grantResults[calendarWriteIndex];
176+
final @PermissionConstants.PermissionStatus int writeStatus =
177+
PermissionUtils.toPermissionStatus(this.activity, Manifest.permission.WRITE_CALENDAR, writeGrantResult);
178+
requestResults.put(PermissionConstants.PERMISSION_GROUP_CALENDAR_WRITE_ONLY, writeStatus);
179+
180+
// WRITE + READ -> FULL ACCESS.
181+
final int calendarReadIndex = permissionList.indexOf(Manifest.permission.READ_CALENDAR);
182+
if (calendarReadIndex >= 0) {
183+
final int readGrantResult = grantResults[calendarReadIndex];
184+
final @PermissionConstants.PermissionStatus int readStatus =
185+
PermissionUtils.toPermissionStatus(this.activity, Manifest.permission.READ_CALENDAR, readGrantResult);
186+
final @PermissionConstants.PermissionStatus int fullAccessStatus = strictestStatus(writeStatus, readStatus);
187187
requestResults.put(PermissionConstants.PERMISSION_GROUP_CALENDAR_FULL_ACCESS, fullAccessStatus);
188188
// Support deprecated CALENDAR permission.
189189
requestResults.put(PermissionConstants.PERMISSION_GROUP_CALENDAR, fullAccessStatus);
@@ -193,8 +193,8 @@ public boolean onRequestPermissionsResult(
193193
for (int i = 0; i < permissions.length; i++) {
194194
final String permissionName = permissions[i];
195195

196-
// READ_CALENDAR and WRITE_CALENDAR permission results have already been handled.
197-
if (permissionName.equals(Manifest.permission.READ_CALENDAR) || permissionName.equals(Manifest.permission.WRITE_CALENDAR)) {
196+
// WRITE_CALENDAR and READ_CALENDAR permission results have already been handled.
197+
if (permissionName.equals(Manifest.permission.WRITE_CALENDAR) || permissionName.equals(Manifest.permission.READ_CALENDAR)) {
198198
continue;
199199
}
200200

@@ -409,12 +409,11 @@ void requestPermissions(
409409
Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM,
410410
PermissionConstants.PERMISSION_CODE_SCHEDULE_EXACT_ALARM);
411411
} else if (permission == PermissionConstants.PERMISSION_GROUP_CALENDAR_FULL_ACCESS || permission == PermissionConstants.PERMISSION_GROUP_CALENDAR) {
412-
// Deny CALENDAR_FULL_ACCESS permission if manifest is not listing both read- and write permissions.
413-
// Otherwise, we will only ask for READ permission and think full access is granted.
412+
// Deny CALENDAR_FULL_ACCESS permission if manifest is not listing both write- and read permissions.
414413
final boolean isValidManifest = isValidManifestForCalendarFullAccess();
415414
if (isValidManifest) {
416-
permissionsToRequest.add(Manifest.permission.READ_CALENDAR);
417415
permissionsToRequest.add(Manifest.permission.WRITE_CALENDAR);
416+
permissionsToRequest.add(Manifest.permission.READ_CALENDAR);
418417
pendingRequestCount += 2;
419418
} else {
420419
requestResults.put(permission, PermissionConstants.PERMISSION_STATUS_DENIED);
@@ -650,19 +649,19 @@ private int checkBluetoothPermissionStatus() {
650649
}
651650

652651
/**
653-
* Checks if the manifest contains both {@link Manifest.permission#READ_CALENDAR} and
654-
* {@link Manifest.permission#WRITE_CALENDAR} permission declarations.
652+
* Checks if the manifest contains both {@link Manifest.permission#WRITE_CALENDAR} and
653+
* {@link Manifest.permission#READ_CALENDAR} permission declarations.
655654
*/
656655
private boolean isValidManifestForCalendarFullAccess() {
657656
List<String> names = PermissionUtils.getManifestNames(context, PermissionConstants.PERMISSION_GROUP_CALENDAR_FULL_ACCESS);
658-
final boolean readInManifest = names != null && names.contains(Manifest.permission.READ_CALENDAR);
659657
final boolean writeInManifest = names != null && names.contains(Manifest.permission.WRITE_CALENDAR);
660-
final boolean validManifest = readInManifest && writeInManifest;
658+
final boolean readInManifest = names != null && names.contains(Manifest.permission.READ_CALENDAR);
659+
final boolean validManifest = writeInManifest && readInManifest;
661660
if (!validManifest) {
662-
if (!readInManifest)
663-
Log.d(PermissionConstants.LOG_TAG, Manifest.permission.READ_CALENDAR + " missing in manifest");
664661
if (!writeInManifest)
665662
Log.d(PermissionConstants.LOG_TAG, Manifest.permission.WRITE_CALENDAR + " missing in manifest");
663+
if (!readInManifest)
664+
Log.d(PermissionConstants.LOG_TAG, Manifest.permission.READ_CALENDAR + " missing in manifest");
666665
return false;
667666
}
668667
return true;

permission_handler_android/android/src/main/java/com/baseflow/permissionhandler/PermissionUtils.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ public class PermissionUtils {
2727
@PermissionConstants.PermissionGroup
2828
static int parseManifestName(String permission) {
2929
switch (permission) {
30-
case Manifest.permission.READ_CALENDAR:
3130
case Manifest.permission.WRITE_CALENDAR:
31+
case Manifest.permission.READ_CALENDAR:
3232
return PermissionConstants.PERMISSION_GROUP_CALENDAR;
3333
case Manifest.permission.CAMERA:
3434
return PermissionConstants.PERMISSION_GROUP_CAMERA;
@@ -103,17 +103,17 @@ static List<String> getManifestNames(Context context, @PermissionConstants.Permi
103103
final ArrayList<String> permissionNames = new ArrayList<>();
104104

105105
switch (permission) {
106-
case PermissionConstants.PERMISSION_GROUP_CALENDAR_READ_ONLY:
107-
if (hasPermissionInManifest(context, permissionNames, Manifest.permission.READ_CALENDAR))
108-
permissionNames.add(Manifest.permission.READ_CALENDAR);
106+
case PermissionConstants.PERMISSION_GROUP_CALENDAR_WRITE_ONLY:
107+
if (hasPermissionInManifest(context, permissionNames, Manifest.permission.WRITE_CALENDAR))
108+
permissionNames.add(Manifest.permission.WRITE_CALENDAR);
109109
break;
110110

111111
case PermissionConstants.PERMISSION_GROUP_CALENDAR_FULL_ACCESS:
112112
case PermissionConstants.PERMISSION_GROUP_CALENDAR:
113-
if (hasPermissionInManifest(context, permissionNames, Manifest.permission.READ_CALENDAR))
114-
permissionNames.add(Manifest.permission.READ_CALENDAR);
115113
if (hasPermissionInManifest(context, permissionNames, Manifest.permission.WRITE_CALENDAR))
116114
permissionNames.add(Manifest.permission.WRITE_CALENDAR);
115+
if (hasPermissionInManifest(context, permissionNames, Manifest.permission.READ_CALENDAR))
116+
permissionNames.add(Manifest.permission.READ_CALENDAR);
117117
break;
118118

119119
case PermissionConstants.PERMISSION_GROUP_CAMERA:

permission_handler_android/pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: permission_handler_android
22
description: Permission plugin for Flutter. This plugin provides the Android API to request and check permissions.
33
homepage: https://github.com/baseflow/flutter-permission-handler
4-
version: 11.1.0
4+
version: 12.0.0
55

66
environment:
77
sdk: ">=2.15.0 <4.0.0"
@@ -18,7 +18,7 @@ flutter:
1818
dependencies:
1919
flutter:
2020
sdk: flutter
21-
permission_handler_platform_interface: ^3.12.0
21+
permission_handler_platform_interface: ^4.0.0
2222

2323
dev_dependencies:
2424
flutter_lints: ^1.0.4

0 commit comments

Comments
 (0)