Skip to content

Commit 0cccc6b

Browse files
committed
Add Settings option to denied location prompt
* Whenever the user clicks on never ask again option and denies the permission, we will show the reason why we need it and the option to open settings and change the location permission * Don't show setting dialog after first never ask again option click
1 parent 36d7f73 commit 0cccc6b

File tree

7 files changed

+59
-13
lines changed

7 files changed

+59
-13
lines changed

OneSignalSDK/onesignal/src/main/java/com/onesignal/AndroidSupportV4Compat.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import android.content.pm.PackageManager;
3636
import android.os.Build;
3737
import android.support.annotation.NonNull;
38+
import android.support.v4.app.ActivityCompat;
3839
import android.util.Log;
3940

4041
// Designed as a compat for use of Android Support v4 revision 23.+ methods when an older revision of the library is included with the app developer's project.
@@ -68,6 +69,10 @@ static void requestPermissions(final @NonNull Activity activity, final @NonNull
6869
// OneSignal SDK code already checks that device is Android M, omit else code from the support library.
6970
ActivityCompatApi23.requestPermissions(activity, permissions, requestCode);
7071
}
72+
73+
static boolean shouldShowRequestPermissionRationale(Activity activity, String permission) {
74+
return ActivityCompatApi23.shouldShowRequestPermissionRationale(activity, permission);
75+
}
7176
}
7277

7378
@TargetApi(23)
@@ -77,5 +82,9 @@ static void requestPermissions(Activity activity, String[] permissions, int requ
7782
((RequestPermissionsRequestCodeValidator) activity).validateRequestPermissionsRequestCode(requestCode);
7883
activity.requestPermissions(permissions, requestCode);
7984
}
85+
86+
static boolean shouldShowRequestPermissionRationale(Activity activity, String permission) {
87+
return android.support.v4.app.ActivityCompat.shouldShowRequestPermissionRationale(activity, permission);
88+
}
8089
}
8190
}

OneSignalSDK/onesignal/src/main/java/com/onesignal/LocationGMS.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ static void sendAndClearPromptHandlers(boolean promptLocation, OneSignal.PromptA
167167
*
168168
* For all cases we are calling prompt listeners.
169169
*/
170-
static void getLocation(Context context, boolean promptLocation, LocationHandler handler) {
170+
static void getLocation(Context context, boolean promptLocation, boolean fallbackToSettings, LocationHandler handler) {
171171
addPromptHandlerIfAvailable(handler);
172172
classContext = context;
173173
locationHandlers.put(handler.getType(), handler);
@@ -226,7 +226,7 @@ else if (permissionList.contains("android.permission.ACCESS_COARSE_LOCATION")) {
226226
//
227227
// For each case, we call the prompt handlers
228228
if (requestPermission != null && promptLocation) {
229-
PermissionsActivity.startPrompt();
229+
PermissionsActivity.startPrompt(fallbackToSettings);
230230
} else if (locationCoarsePermission == PackageManager.PERMISSION_GRANTED) {
231231
sendAndClearPromptHandlers(promptLocation, OneSignal.PromptActionResult.PERMISSION_GRANTED);
232232
startGetLocation();

OneSignalSDK/onesignal/src/main/java/com/onesignal/OSInAppMessageLocationPrompt.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ class OSInAppMessageLocationPrompt extends OSInAppMessagePrompt {
66

77
@Override
88
void handlePrompt(OneSignal.OSPromptActionCompletionCallback callback) {
9-
OneSignal.promptLocation(callback);
9+
OneSignal.promptLocation(callback, true);
1010
}
1111

1212
@Override

OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignal.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,7 @@ public void onComplete(LocationGMS.LocationPoint point) {
947947
// Prompted so we don't ask for permissions more than once
948948
promptedLocation = promptedLocation || mInitBuilder.mPromptLocation;
949949

950-
LocationGMS.getLocation(appContext, doPrompt, locationHandler);
950+
LocationGMS.getLocation(appContext, doPrompt, false, locationHandler);
951951
}
952952
private static PushRegistrator mPushRegistrator;
953953

@@ -2524,10 +2524,10 @@ public static void setLocationShared(boolean enable) {
25242524
* @see <a href="https://documentation.onesignal.com/docs/permission-requests">Permission Requests | OneSignal Docs</a>
25252525
*/
25262526
public static void promptLocation() {
2527-
promptLocation(null);
2527+
promptLocation(null, false);
25282528
}
25292529

2530-
static void promptLocation(@Nullable final OSPromptActionCompletionCallback callback) {
2530+
static void promptLocation(@Nullable final OSPromptActionCompletionCallback callback, final boolean fallbackToSettings) {
25312531
//if applicable, check if the user provided privacy consent
25322532
if (shouldLogUserPrivacyConsentErrorMessageForMethodName("promptLocation()"))
25332533
return;
@@ -2558,7 +2558,7 @@ void onAnswered(OneSignal.PromptActionResult result) {
25582558
}
25592559
};
25602560

2561-
LocationGMS.getLocation(appContext, true, locationHandler);
2561+
LocationGMS.getLocation(appContext, true, fallbackToSettings, locationHandler);
25622562
promptedLocation = true;
25632563
}
25642564
};

OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignalSyncServiceUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ public void onComplete(LocationGMS.LocationPoint point) {
230230
queue.offer(object);
231231
}
232232
};
233-
LocationGMS.getLocation(OneSignal.appContext, false, locationHandler);
233+
LocationGMS.getLocation(OneSignal.appContext, false, false, locationHandler);
234234

235235
// The take() will return the offered point once the callback for the locationHandler is completed
236236
Object point = queue.take();

OneSignalSDK/onesignal/src/main/java/com/onesignal/PermissionsActivity.java

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,11 @@
2828
package com.onesignal;
2929

3030
import android.app.Activity;
31+
import android.app.AlertDialog;
32+
import android.content.DialogInterface;
3133
import android.content.Intent;
3234
import android.content.pm.PackageManager;
35+
import android.net.Uri;
3336
import android.os.Build;
3437
import android.os.Bundle;
3538
import android.os.Handler;
@@ -44,10 +47,11 @@ public class PermissionsActivity extends Activity {
4447
// Default animation duration in milliseconds
4548
private static final int DELAY_TIME_CALLBACK_CALL = 500;
4649
private static final int REQUEST_LOCATION = 2;
50+
private static final int REQUEST_SETTINGS = 3;
4751

48-
static boolean waiting, answered;
52+
static boolean waiting, answered, fallbackToSettings, neverAskAgainClicked;
4953
private static ActivityLifecycleHandler.ActivityAvailableListener activityAvailableListener;
50-
54+
5155
@Override
5256
protected void onCreate(Bundle savedInstanceState) {
5357
super.onCreate(savedInstanceState);
@@ -83,6 +87,7 @@ private void requestPermission() {
8387

8488
if (!waiting) {
8589
waiting = true;
90+
neverAskAgainClicked = !ActivityCompat.shouldShowRequestPermissionRationale(PermissionsActivity.this, LocationGMS.requestPermission);
8691
ActivityCompat.requestPermissions(this, new String[]{LocationGMS.requestPermission}, REQUEST_LOCATION);
8792
}
8893
}
@@ -105,10 +110,12 @@ public void run() {
105110
boolean granted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
106111
OneSignal.PromptActionResult result = granted ? OneSignal.PromptActionResult.PERMISSION_GRANTED : OneSignal.PromptActionResult.PERMISSION_DENIED;
107112
LocationGMS.sendAndClearPromptHandlers(true, result);
108-
if (granted)
113+
if (granted) {
109114
LocationGMS.startGetLocation();
110-
else
115+
} else {
116+
attemptToShowLocationPermissionSettings();
111117
LocationGMS.fireFailedComplete();
118+
}
112119
}
113120
}, DELAY_TIME_CALLBACK_CALL);
114121
}
@@ -117,11 +124,39 @@ public void run() {
117124
overridePendingTransition(R.anim.onesignal_fade_in, R.anim.onesignal_fade_out);
118125
}
119126

127+
private void attemptToShowLocationPermissionSettings() {
128+
if (fallbackToSettings
129+
&& neverAskAgainClicked
130+
&& !ActivityCompat.shouldShowRequestPermissionRationale(PermissionsActivity.this, LocationGMS.requestPermission))
131+
showLocationPermissionSettings();
132+
}
133+
134+
private void showLocationPermissionSettings() {
135+
new AlertDialog.Builder(ActivityLifecycleHandler.curActivity)
136+
.setTitle(R.string.location_not_available_title)
137+
.setMessage(R.string.location_not_available_open_settings_message)
138+
.setPositiveButton(R.string.location_not_available_open_settings_option, new DialogInterface.OnClickListener() {
139+
public void onClick(DialogInterface dialog, int which) {
140+
Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
141+
intent.setData(Uri.parse("package:" + getPackageName()));
142+
startActivity(intent);
143+
LocationGMS.sendAndClearPromptHandlers(true, OneSignal.PromptActionResult.PERMISSION_DENIED);
144+
}
145+
})
146+
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
147+
@Override
148+
public void onClick(DialogInterface dialog, int which) {
149+
LocationGMS.sendAndClearPromptHandlers(true, OneSignal.PromptActionResult.PERMISSION_DENIED);
150+
}
151+
})
152+
.show();
153+
}
120154

121-
static void startPrompt() {
155+
static void startPrompt(boolean fallbackCondition) {
122156
if (PermissionsActivity.waiting || PermissionsActivity.answered)
123157
return;
124158

159+
fallbackToSettings = fallbackCondition;
125160
activityAvailableListener = new ActivityLifecycleHandler.ActivityAvailableListener() {
126161
@Override
127162
public void available(@NonNull Activity activity) {

OneSignalSDK/onesignal/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@
44
<string name="location_not_available_title">Location Not Available</string>
55
<string name="location_not_available_message">Looks like this app doesn\'t have location services configured. Please see OneSignal docs for more information.</string>
66

7+
<string name="location_not_available_open_settings_message">You have previously denied sharing your device location. Please go to settings to enable.</string>
8+
<string name="location_not_available_open_settings_option">Settings</string>
79
</resources>

0 commit comments

Comments
 (0)