28
28
package com .onesignal ;
29
29
30
30
import android .content .Context ;
31
- import android .content .pm .PackageInfo ;
32
31
import android .content .pm .PackageManager ;
33
32
import android .location .Location ;
34
33
import android .os .Build ;
@@ -221,48 +220,54 @@ static void getLocation(Context context, boolean promptLocation, boolean fallbac
221
220
startGetLocation ();
222
221
} else { // Android 6.0+
223
222
if (locationFinePermission != PackageManager .PERMISSION_GRANTED ) {
224
- try {
225
- PackageInfo packageInfo = context .getPackageManager ().getPackageInfo (context .getPackageName (), PackageManager .GET_PERMISSIONS );
226
- List <String > permissionList = Arrays .asList (packageInfo .requestedPermissions );
227
- OneSignal .PromptActionResult result = OneSignal .PromptActionResult .PERMISSION_DENIED ;
223
+ GetPackageInfoResult packageResult =
224
+ PackageInfoHelper .Companion .getInfo (
225
+ context ,
226
+ context .getPackageName (),
227
+ PackageManager .GET_PERMISSIONS
228
+ );
229
+
230
+ if (!packageResult .getSuccessful () || packageResult .getPackageInfo () == null ) {
231
+ sendAndClearPromptHandlers (promptLocation , OneSignal .PromptActionResult .ERROR );
232
+ return ;
233
+ }
234
+
235
+ List <String > permissionList = Arrays .asList (packageResult .getPackageInfo ().requestedPermissions );
236
+ OneSignal .PromptActionResult result = OneSignal .PromptActionResult .PERMISSION_DENIED ;
228
237
229
- if (permissionList .contains ("android.permission.ACCESS_FINE_LOCATION" )) {
230
- // ACCESS_FINE_LOCATION permission defined on Manifest, prompt for permission
238
+ if (permissionList .contains ("android.permission.ACCESS_FINE_LOCATION" )) {
239
+ // ACCESS_FINE_LOCATION permission defined on Manifest, prompt for permission
240
+ // If permission already given prompt will return positive, otherwise will prompt again or show settings
241
+ requestPermission = "android.permission.ACCESS_FINE_LOCATION" ;
242
+ } else if (permissionList .contains ("android.permission.ACCESS_COARSE_LOCATION" )) {
243
+ if (locationCoarsePermission != PackageManager .PERMISSION_GRANTED ) {
244
+ // ACCESS_COARSE_LOCATION permission defined on Manifest, prompt for permission
231
245
// If permission already given prompt will return positive, otherwise will prompt again or show settings
232
- requestPermission = "android.permission.ACCESS_FINE_LOCATION" ;
233
- } else if (permissionList .contains ("android.permission.ACCESS_COARSE_LOCATION" )) {
234
- if (locationCoarsePermission != PackageManager .PERMISSION_GRANTED ) {
235
- // ACCESS_COARSE_LOCATION permission defined on Manifest, prompt for permission
236
- // If permission already given prompt will return positive, otherwise will prompt again or show settings
237
- requestPermission = "android.permission.ACCESS_COARSE_LOCATION" ;
238
- } else if (Build .VERSION .SDK_INT >= 29 && permissionList .contains ("android.permission.ACCESS_BACKGROUND_LOCATION" )) {
239
- // ACCESS_BACKGROUND_LOCATION permission defined on Manifest, prompt for permission
240
- requestPermission = "android.permission.ACCESS_BACKGROUND_LOCATION" ;
241
- }
242
- } else {
243
- OneSignal .onesignalLog (OneSignal .LOG_LEVEL .INFO , "Location permissions not added on AndroidManifest file" );
244
- result = OneSignal .PromptActionResult .LOCATION_PERMISSIONS_MISSING_MANIFEST ;
246
+ requestPermission = "android.permission.ACCESS_COARSE_LOCATION" ;
247
+ } else if (Build .VERSION .SDK_INT >= 29 && permissionList .contains ("android.permission.ACCESS_BACKGROUND_LOCATION" )) {
248
+ // ACCESS_BACKGROUND_LOCATION permission defined on Manifest, prompt for permission
249
+ requestPermission = "android.permission.ACCESS_BACKGROUND_LOCATION" ;
245
250
}
251
+ } else {
252
+ OneSignal .onesignalLog (OneSignal .LOG_LEVEL .INFO , "Location permissions not added on AndroidManifest file" );
253
+ result = OneSignal .PromptActionResult .LOCATION_PERMISSIONS_MISSING_MANIFEST ;
254
+ }
246
255
247
- // We handle the following cases:
248
- // 1 - If needed and available then prompt for permissions
249
- // - Request permission can be ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION
250
- // 2 - If the permission were already granted then start getting location
251
- // 3 - If permission wasn't granted then trigger fail flow
252
- //
253
- // For each case, we call the prompt handlers
254
- if (requestPermission != null && promptLocation ) {
255
- LocationPermissionController .INSTANCE .prompt (fallbackToSettings , requestPermission );
256
- } else if (locationCoarsePermission == PackageManager .PERMISSION_GRANTED ) {
257
- sendAndClearPromptHandlers (promptLocation , OneSignal .PromptActionResult .PERMISSION_GRANTED );
258
- startGetLocation ();
259
- } else {
260
- sendAndClearPromptHandlers (promptLocation , result );
261
- fireFailedComplete ();
262
- }
263
- } catch (PackageManager .NameNotFoundException e ) {
264
- sendAndClearPromptHandlers (promptLocation , OneSignal .PromptActionResult .ERROR );
265
- e .printStackTrace ();
256
+ // We handle the following cases:
257
+ // 1 - If needed and available then prompt for permissions
258
+ // - Request permission can be ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION
259
+ // 2 - If the permission were already granted then start getting location
260
+ // 3 - If permission wasn't granted then trigger fail flow
261
+ //
262
+ // For each case, we call the prompt handlers
263
+ if (requestPermission != null && promptLocation ) {
264
+ LocationPermissionController .INSTANCE .prompt (fallbackToSettings , requestPermission );
265
+ } else if (locationCoarsePermission == PackageManager .PERMISSION_GRANTED ) {
266
+ sendAndClearPromptHandlers (promptLocation , OneSignal .PromptActionResult .PERMISSION_GRANTED );
267
+ startGetLocation ();
268
+ } else {
269
+ sendAndClearPromptHandlers (promptLocation , result );
270
+ fireFailedComplete ();
266
271
}
267
272
} else if (Build .VERSION .SDK_INT >= 29 && locationBackgroundPermission != PackageManager .PERMISSION_GRANTED ) {
268
273
backgroundLocationPermissionLogic (context , promptLocation , fallbackToSettings );
@@ -279,25 +284,31 @@ static void getLocation(Context context, boolean promptLocation, boolean fallbac
279
284
* If background permission is asked at the same time as fine and coarse then both permission request are ignored
280
285
* */
281
286
private static void backgroundLocationPermissionLogic (Context context , boolean promptLocation , boolean fallbackToSettings ) {
282
- try {
283
- PackageInfo packageInfo = context .getPackageManager ().getPackageInfo (context .getPackageName (), PackageManager .GET_PERMISSIONS );
284
- List <String > permissionList = Arrays .asList (packageInfo .requestedPermissions );
287
+ GetPackageInfoResult result =
288
+ PackageInfoHelper .Companion .getInfo (
289
+ context ,
290
+ context .getPackageName (),
291
+ PackageManager .GET_PERMISSIONS
292
+ );
293
+
294
+ if (!result .getSuccessful () || result .getPackageInfo () == null ) {
295
+ sendAndClearPromptHandlers (promptLocation , OneSignal .PromptActionResult .ERROR );
296
+ return ;
297
+ }
285
298
286
- if (permissionList .contains ("android.permission.ACCESS_BACKGROUND_LOCATION" )) {
287
- // ACCESS_BACKGROUND_LOCATION permission defined on Manifest, prompt for permission
288
- requestPermission = "android.permission.ACCESS_BACKGROUND_LOCATION" ;
289
- }
299
+ List <String > permissionList = Arrays .asList (result .getPackageInfo ().requestedPermissions );
290
300
291
- if (requestPermission != null && promptLocation ) {
292
- LocationPermissionController .INSTANCE .prompt (fallbackToSettings , requestPermission );
293
- } else {
294
- // Fine permission already granted
295
- sendAndClearPromptHandlers (promptLocation , OneSignal .PromptActionResult .PERMISSION_GRANTED );
296
- startGetLocation ();
297
- }
298
- } catch (PackageManager .NameNotFoundException e ) {
299
- sendAndClearPromptHandlers (promptLocation , OneSignal .PromptActionResult .ERROR );
300
- e .printStackTrace ();
301
+ if (permissionList .contains ("android.permission.ACCESS_BACKGROUND_LOCATION" )) {
302
+ // ACCESS_BACKGROUND_LOCATION permission defined on Manifest, prompt for permission
303
+ requestPermission = "android.permission.ACCESS_BACKGROUND_LOCATION" ;
304
+ }
305
+
306
+ if (requestPermission != null && promptLocation ) {
307
+ LocationPermissionController .INSTANCE .prompt (fallbackToSettings , requestPermission );
308
+ } else {
309
+ // Fine permission already granted
310
+ sendAndClearPromptHandlers (promptLocation , OneSignal .PromptActionResult .PERMISSION_GRANTED );
311
+ startGetLocation ();
301
312
}
302
313
}
303
314
0 commit comments