2828package com .onesignal ;
2929
3030import android .content .Context ;
31- import android .content .pm .PackageInfo ;
3231import android .content .pm .PackageManager ;
3332import android .location .Location ;
3433import android .os .Build ;
@@ -221,48 +220,54 @@ static void getLocation(Context context, boolean promptLocation, boolean fallbac
221220 startGetLocation ();
222221 } else { // Android 6.0+
223222 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 ;
228237
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
231245 // 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" ;
245250 }
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+ }
246255
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 ();
266271 }
267272 } else if (Build .VERSION .SDK_INT >= 29 && locationBackgroundPermission != PackageManager .PERMISSION_GRANTED ) {
268273 backgroundLocationPermissionLogic (context , promptLocation , fallbackToSettings );
@@ -279,25 +284,31 @@ static void getLocation(Context context, boolean promptLocation, boolean fallbac
279284 * If background permission is asked at the same time as fine and coarse then both permission request are ignored
280285 * */
281286 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+ }
285298
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 );
290300
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 ();
301312 }
302313 }
303314
0 commit comments