44
44
import android .text .TextUtils ;
45
45
import android .util .Log ;
46
46
47
+ import androidx .annotation .NonNull ;
47
48
import androidx .annotation .Nullable ;
48
49
import androidx .core .content .ContextCompat ;
49
50
50
51
import java .util .ArrayList ;
51
52
import java .util .Arrays ;
53
+ import java .util .Collections ;
52
54
import java .util .HashSet ;
53
55
import java .util .List ;
54
56
import java .util .Set ;
@@ -76,11 +78,11 @@ private PermissionsUtil() {
76
78
* @param activity the caller activity for this method.
77
79
* @return true/false. "true" if permissions are already granted, "false" if a permissions request was dispatched.
78
80
*/
79
- public static boolean requestPermissions (Activity activity , List <String > permissions ) {
80
- if (activity == null ) {
81
- return false ;
82
- }
81
+ public static boolean requestPermissions (@ NonNull Activity activity , List <String > permissions ) {
82
+ return requestPermissions (activity , permissions , REQUEST_ALL_PERMISSION_REQ_CODE );
83
+ }
83
84
85
+ private static boolean requestPermissions (@ NonNull Activity activity , List <String > permissions , int requestCode ) {
84
86
if (permissions == null || permissions .isEmpty ()) {
85
87
return true ;
86
88
}
@@ -90,6 +92,7 @@ public static boolean requestPermissions(Activity activity, List<String> permiss
90
92
return true ;
91
93
}
92
94
95
+ boolean dispatchedPermissionsRequest = false ;
93
96
Set <String > requestedPermissions = new HashSet <>();
94
97
for (String permission : permissions ) {
95
98
try {
@@ -104,13 +107,15 @@ public static boolean requestPermissions(Activity activity, List<String> permiss
104
107
Intent intent = new Intent (Settings .ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION );
105
108
activity .startActivityForResult (intent , REQUEST_MANAGE_EXTERNAL_STORAGE_REQ_CODE );
106
109
}
110
+ dispatchedPermissionsRequest = true ;
107
111
}
108
112
} else if (permission .equals (Manifest .permission .REQUEST_INSTALL_PACKAGES )) {
109
113
if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .O && !activity .getPackageManager ().canRequestPackageInstalls ()) {
110
114
try {
111
115
Intent intent = new Intent (Settings .ACTION_MANAGE_UNKNOWN_APP_SOURCES );
112
116
intent .setData (Uri .parse (String .format ("package:%s" , activity .getPackageName ())));
113
117
activity .startActivityForResult (intent , REQUEST_INSTALL_PACKAGES_REQ_CODE );
118
+ dispatchedPermissionsRequest = true ;
114
119
} catch (Exception e ) {
115
120
Log .e (TAG , "Unable to request permission " + Manifest .permission .REQUEST_INSTALL_PACKAGES );
116
121
}
@@ -129,13 +134,12 @@ public static boolean requestPermissions(Activity activity, List<String> permiss
129
134
}
130
135
}
131
136
132
- if (requestedPermissions .isEmpty ()) {
133
- // If list is empty, all of dangerous permissions were granted.
134
- return true ;
137
+ if (! requestedPermissions .isEmpty ()) {
138
+ activity . requestPermissions ( requestedPermissions . toArray ( new String [ 0 ]), requestCode );
139
+ dispatchedPermissionsRequest = true ;
135
140
}
136
141
137
- activity .requestPermissions (requestedPermissions .toArray (new String [0 ]), REQUEST_ALL_PERMISSION_REQ_CODE );
138
- return false ;
142
+ return !dispatchedPermissionsRequest ;
139
143
}
140
144
141
145
/**
@@ -144,57 +148,37 @@ public static boolean requestPermissions(Activity activity, List<String> permiss
144
148
* @param activity the caller activity for this method.
145
149
* @return true/false. "true" if permission is already granted, "false" if a permission request was dispatched.
146
150
*/
147
- public static boolean requestPermission (String permissionName , Activity activity ) {
148
- if (activity == null || TextUtils .isEmpty (permissionName )) {
149
- return false ;
150
- }
151
-
152
- if (Build .VERSION .SDK_INT < Build .VERSION_CODES .M ) {
153
- // Not necessary, asked on install already
151
+ public static boolean requestPermission (String permissionName , @ NonNull Activity activity ) {
152
+ if (TextUtils .isEmpty (permissionName )) {
154
153
return true ;
155
154
}
156
155
156
+ final int requestCode ;
157
+ final String updatedPermissionName ;
157
158
switch (permissionName ) {
158
159
case "RECORD_AUDIO" :
159
- case Manifest .permission .RECORD_AUDIO :
160
- if (ContextCompat .checkSelfPermission (activity , Manifest .permission .RECORD_AUDIO ) != PackageManager .PERMISSION_GRANTED ) {
161
- activity .requestPermissions (new String [] { Manifest .permission .RECORD_AUDIO }, REQUEST_RECORD_AUDIO_PERMISSION );
162
- return false ;
163
- }
164
- return true ;
160
+ updatedPermissionName = Manifest .permission .RECORD_AUDIO ;
161
+ requestCode = REQUEST_RECORD_AUDIO_PERMISSION ;
162
+ break ;
165
163
166
164
case "CAMERA" :
167
- case Manifest .permission .CAMERA :
168
- if (ContextCompat .checkSelfPermission (activity , Manifest .permission .CAMERA ) != PackageManager .PERMISSION_GRANTED ) {
169
- activity .requestPermissions (new String [] { Manifest .permission .CAMERA }, REQUEST_CAMERA_PERMISSION );
170
- return false ;
171
- }
172
- return true ;
165
+ updatedPermissionName = Manifest .permission .CAMERA ;
166
+ requestCode = REQUEST_CAMERA_PERMISSION ;
167
+ break ;
173
168
174
169
case "VIBRATE" :
175
- case Manifest .permission .VIBRATE :
176
- if (ContextCompat .checkSelfPermission (activity , Manifest .permission .VIBRATE ) != PackageManager .PERMISSION_GRANTED ) {
177
- activity .requestPermissions (new String [] { Manifest .permission .VIBRATE }, REQUEST_VIBRATE_PERMISSION );
178
- return false ;
179
- }
180
- return true ;
170
+ updatedPermissionName = Manifest .permission .VIBRATE ;
171
+ requestCode = REQUEST_VIBRATE_PERMISSION ;
172
+ break ;
181
173
182
174
default :
183
- // Check if the given permission is a dangerous permission
184
- try {
185
- PermissionInfo permissionInfo = getPermissionInfo (activity , permissionName );
186
- int protectionLevel = Build .VERSION .SDK_INT >= Build .VERSION_CODES .P ? permissionInfo .getProtection () : permissionInfo .protectionLevel ;
187
- if ((protectionLevel & PermissionInfo .PROTECTION_DANGEROUS ) == PermissionInfo .PROTECTION_DANGEROUS && ContextCompat .checkSelfPermission (activity , permissionName ) != PackageManager .PERMISSION_GRANTED ) {
188
- activity .requestPermissions (new String [] { permissionName }, REQUEST_SINGLE_PERMISSION_REQ_CODE );
189
- return false ;
190
- }
191
- } catch (PackageManager .NameNotFoundException e ) {
192
- // Unknown permission - return false as it can't be granted.
193
- Log .w (TAG , "Unable to identify permission " + permissionName , e );
194
- return false ;
195
- }
196
- return true ;
175
+ updatedPermissionName = permissionName ;
176
+ requestCode = REQUEST_SINGLE_PERMISSION_REQ_CODE ;
177
+ break ;
197
178
}
179
+
180
+ List <String > permissions = Collections .singletonList (updatedPermissionName );
181
+ return requestPermissions (activity , permissions , requestCode );
198
182
}
199
183
200
184
/**
0 commit comments