Skip to content

Commit 49f1cd4

Browse files
committed
rm location code from PermissionsActivity part 2
Decouple callback and fallback settings from PermissionsActivity.
1 parent 7f6ec78 commit 49f1cd4

File tree

7 files changed

+181
-47
lines changed

7 files changed

+181
-47
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.onesignal
2+
3+
import android.app.Activity
4+
import android.app.AlertDialog
5+
6+
object AlertDialogPrepromptForAndroidSettings {
7+
8+
interface Callback {
9+
fun onAccept()
10+
fun onDecline()
11+
}
12+
13+
fun show(
14+
activity: Activity,
15+
titlePrefix: String,
16+
previouslyDeniedPostfix: String,
17+
callback: Callback,
18+
) {
19+
val titleTemplate = activity.getString(R.string.permission_not_available_title)
20+
val title = titleTemplate.format(titlePrefix)
21+
22+
val messageTemplate = activity.getString(R.string.permission_not_available_message)
23+
val message = messageTemplate.format(previouslyDeniedPostfix)
24+
25+
AlertDialog.Builder(activity)
26+
.setTitle(title)
27+
.setMessage(message)
28+
.setPositiveButton(R.string.permission_not_available_open_settings_option) { dialog, which ->
29+
callback.onAccept()
30+
}
31+
.setNegativeButton(android.R.string.no) { dialog, which ->
32+
callback.onDecline()
33+
}
34+
.show()
35+
}
36+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ static void getLocation(Context context, boolean promptLocation, boolean fallbac
252252
//
253253
// For each case, we call the prompt handlers
254254
if (requestPermission != null && promptLocation) {
255-
PermissionsActivity.startPrompt(fallbackToSettings,"LOCATION", requestPermission);
255+
LocationPermissionController.INSTANCE.prompt(fallbackToSettings, requestPermission);
256256
} else if (locationCoarsePermission == PackageManager.PERMISSION_GRANTED) {
257257
sendAndClearPromptHandlers(promptLocation, OneSignal.PromptActionResult.PERMISSION_GRANTED);
258258
startGetLocation();
@@ -289,7 +289,7 @@ private static void backgroundLocationPermissionLogic(Context context, boolean p
289289
}
290290

291291
if (requestPermission != null && promptLocation) {
292-
PermissionsActivity.startPrompt(fallbackToSettings, "LOCATION", requestPermission);
292+
LocationPermissionController.INSTANCE.prompt(fallbackToSettings, requestPermission);
293293
} else {
294294
// Fine permission already granted
295295
sendAndClearPromptHandlers(promptLocation, OneSignal.PromptActionResult.PERMISSION_GRANTED);
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.onesignal
2+
3+
object LocationPermissionController : PermissionsActivity.PermissionCallback {
4+
private const val PERMISSION_TYPE = "LOCATION"
5+
6+
init {
7+
PermissionsActivity.registerAsCallback(PERMISSION_TYPE, this)
8+
}
9+
10+
fun prompt(
11+
fallbackToSettings: Boolean,
12+
androidPermissionString: String,
13+
) {
14+
PermissionsActivity.startPrompt(
15+
fallbackToSettings,
16+
PERMISSION_TYPE,
17+
androidPermissionString,
18+
this::class.java
19+
)
20+
}
21+
22+
private fun onResponse(result: OneSignal.PromptActionResult) {
23+
LocationController.sendAndClearPromptHandlers(
24+
true,
25+
result
26+
)
27+
}
28+
29+
override fun onAccept() {
30+
onResponse(OneSignal.PromptActionResult.PERMISSION_GRANTED)
31+
LocationController.startGetLocation()
32+
}
33+
34+
override fun onReject(fallbackToSettings: Boolean) {
35+
onResponse(OneSignal.PromptActionResult.PERMISSION_DENIED)
36+
if (fallbackToSettings) showFallbackAlertDialog()
37+
LocationController.fireFailedComplete()
38+
}
39+
40+
private fun showFallbackAlertDialog() {
41+
val activity = OneSignal.getCurrentActivity() ?: return
42+
AlertDialogPrepromptForAndroidSettings.show(
43+
activity,
44+
activity.getString(R.string.location_permission_name_for_title),
45+
activity.getString(R.string.location_permission_settings_message),
46+
object : AlertDialogPrepromptForAndroidSettings.Callback {
47+
override fun onAccept() {
48+
NavigateToAndroidSettingsForLocation.show(activity)
49+
LocationController.sendAndClearPromptHandlers(
50+
true,
51+
OneSignal.PromptActionResult.PERMISSION_DENIED
52+
)
53+
}
54+
override fun onDecline() {
55+
LocationController.sendAndClearPromptHandlers(
56+
true,
57+
OneSignal.PromptActionResult.PERMISSION_DENIED
58+
)
59+
}
60+
}
61+
)
62+
}
63+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.onesignal
2+
3+
import android.content.Context
4+
import android.content.Intent
5+
import android.net.Uri
6+
import android.provider.Settings
7+
8+
object NavigateToAndroidSettingsForLocation {
9+
fun show(context: Context) {
10+
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
11+
intent.data = Uri.parse("package:" + context.packageName)
12+
context.startActivity(intent)
13+
}
14+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -446,8 +446,8 @@ public void onCompleted(OneSignal.PromptActionResult result) {
446446
}
447447

448448
private void showAlertDialogMessage(final OSInAppMessageInternal inAppMessage, final List<OSInAppMessagePrompt> prompts) {
449-
final String messageTitle = OneSignal.appContext.getString(R.string.location_not_available_title);
450-
final String message = OneSignal.appContext.getString(R.string.location_not_available_message);
449+
final String messageTitle = OneSignal.appContext.getString(R.string.location_permission_missing_title);
450+
final String message = OneSignal.appContext.getString(R.string.location_permission_missing_message);
451451
new AlertDialog.Builder(OneSignal.getCurrentActivity())
452452
.setTitle(messageTitle)
453453
.setMessage(message)

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

Lines changed: 56 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,24 @@
2828
package com.onesignal;
2929

3030
import android.app.Activity;
31-
import android.app.AlertDialog;
32-
import android.content.DialogInterface;
3331
import android.content.Intent;
3432
import android.content.pm.PackageManager;
35-
import android.net.Uri;
3633
import android.os.Build;
3734
import android.os.Bundle;
3835
import android.os.Handler;
3936
import androidx.annotation.NonNull;
4037

4138
import com.onesignal.AndroidSupportV4Compat.ActivityCompat;
4239

40+
import java.util.HashMap;
41+
4342
public class PermissionsActivity extends Activity {
4443

44+
interface PermissionCallback {
45+
void onAccept();
46+
void onReject(boolean fallbackToSettings);
47+
}
48+
4549
private static final String TAG = PermissionsActivity.class.getCanonicalName();
4650
// TODO this will be removed once the handled is deleted
4751
// Default animation duration in milliseconds
@@ -54,8 +58,21 @@ public class PermissionsActivity extends Activity {
5458

5559
private static final String INTENT_EXTRA_PERMISSION_TYPE = "INTENT_EXTRA_PERMISSION_TYPE";
5660
private static final String INTENT_EXTRA_ANDROID_PERMISSION_STRING = "INTENT_EXTRA_ANDROID_PERMISSION_STRING";
61+
private static final String INTENT_EXTRA_CALLBACK_CLASS = "INTENT_EXTRA_CALLBACK_CLASS";
62+
5763
private String permissionRequestType;
5864

65+
private String androidPermissionString;
66+
67+
private static final HashMap<String, PermissionCallback> callbackMap = new HashMap<>();
68+
69+
public static void registerAsCallback(
70+
@NonNull String permissionType,
71+
@NonNull PermissionCallback callback
72+
) {
73+
callbackMap.put(permissionType, callback);
74+
}
75+
5976
@Override
6077
protected void onCreate(Bundle savedInstanceState) {
6178
super.onCreate(savedInstanceState);
@@ -93,11 +110,26 @@ private void handleBundleParams(Bundle extras) {
93110
return;
94111
}
95112

113+
reregisterCallbackHandlers(extras);
114+
96115
permissionRequestType = extras.getString(INTENT_EXTRA_PERMISSION_TYPE);
97-
String androidPermissionString = extras.getString(INTENT_EXTRA_ANDROID_PERMISSION_STRING);
116+
androidPermissionString = extras.getString(INTENT_EXTRA_ANDROID_PERMISSION_STRING);
98117
requestPermission(androidPermissionString);
99118
}
100119

120+
// Required if the app was killed while this prompt was showing
121+
private void reregisterCallbackHandlers(Bundle extras) {
122+
String className = extras.getString(INTENT_EXTRA_CALLBACK_CLASS);
123+
try {
124+
// Loads class into memory so it's static initialization block runs
125+
Class.forName(className);
126+
} catch (ClassNotFoundException e) {
127+
throw new RuntimeException(
128+
"Could not find callback class for PermissionActivity: " + className
129+
);
130+
}
131+
}
132+
101133
private void requestPermission(String androidPermissionString) {
102134
if (!waiting) {
103135
waiting = true;
@@ -122,13 +154,15 @@ public void onRequestPermissionsResult(final int requestCode, @NonNull String pe
122154
@Override
123155
public void run() {
124156
boolean granted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
125-
OneSignal.PromptActionResult result = granted ? OneSignal.PromptActionResult.PERMISSION_GRANTED : OneSignal.PromptActionResult.PERMISSION_DENIED;
126-
LocationController.sendAndClearPromptHandlers(true, result);
127-
if (granted) {
128-
LocationController.startGetLocation();
129-
} else {
130-
attemptToShowLocationPermissionSettings();
131-
LocationController.fireFailedComplete();
157+
158+
PermissionCallback callback = callbackMap.get(permissionRequestType);
159+
if (callback == null)
160+
throw new RuntimeException("Missing handler for permissionRequestType: " + permissionRequestType);
161+
162+
if (granted)
163+
callback.onAccept();
164+
else {
165+
callback.onReject(shouldShowSettings());
132166
}
133167
}
134168
}, DELAY_TIME_CALLBACK_CALL);
@@ -141,35 +175,18 @@ public void run() {
141175
overridePendingTransition(R.anim.onesignal_fade_in, R.anim.onesignal_fade_out);
142176
}
143177

144-
private void attemptToShowLocationPermissionSettings() {
145-
if (fallbackToSettings
178+
private boolean shouldShowSettings() {
179+
return fallbackToSettings
146180
&& neverAskAgainClicked
147-
&& !ActivityCompat.shouldShowRequestPermissionRationale(PermissionsActivity.this, LocationController.requestPermission))
148-
showLocationPermissionSettings();
149-
}
150-
151-
private void showLocationPermissionSettings() {
152-
new AlertDialog.Builder(OneSignal.getCurrentActivity())
153-
.setTitle(R.string.location_not_available_title)
154-
.setMessage(R.string.location_not_available_open_settings_message)
155-
.setPositiveButton(R.string.location_not_available_open_settings_option, new DialogInterface.OnClickListener() {
156-
public void onClick(DialogInterface dialog, int which) {
157-
Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
158-
intent.setData(Uri.parse("package:" + getPackageName()));
159-
startActivity(intent);
160-
LocationController.sendAndClearPromptHandlers(true, OneSignal.PromptActionResult.PERMISSION_DENIED);
161-
}
162-
})
163-
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
164-
@Override
165-
public void onClick(DialogInterface dialog, int which) {
166-
LocationController.sendAndClearPromptHandlers(true, OneSignal.PromptActionResult.PERMISSION_DENIED);
167-
}
168-
})
169-
.show();
181+
&& !ActivityCompat.shouldShowRequestPermissionRationale(PermissionsActivity.this, androidPermissionString);
170182
}
171183

172-
static void startPrompt(boolean fallbackCondition, String permissionRequestType, String androidPermissionString) {
184+
static void startPrompt(
185+
boolean fallbackCondition,
186+
String permissionRequestType,
187+
String androidPermissionString,
188+
Class<?> callbackClass
189+
) {
173190
if (PermissionsActivity.waiting || PermissionsActivity.answered)
174191
return;
175192

@@ -181,7 +198,8 @@ public void available(@NonNull Activity activity) {
181198
Intent intent = new Intent(activity, PermissionsActivity.class);
182199
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
183200
intent.putExtra(INTENT_EXTRA_PERMISSION_TYPE, permissionRequestType)
184-
.putExtra(INTENT_EXTRA_ANDROID_PERMISSION_STRING, androidPermissionString);
201+
.putExtra(INTENT_EXTRA_ANDROID_PERMISSION_STRING, androidPermissionString)
202+
.putExtra(INTENT_EXTRA_CALLBACK_CLASS, callbackClass.getName());
185203
activity.startActivity(intent);
186204
activity.overridePendingTransition(R.anim.onesignal_fade_in, R.anim.onesignal_fade_out);
187205
}
Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<resources>
3+
<string name="location_permission_missing_title">App Missing Permission</string>
4+
<string name="location_permission_missing_message">Looks like this app doesn\'t have location services configured. Please see OneSignal docs for more information.</string>
35

4-
<string name="location_not_available_title">Location Not Available</string>
5-
<string name="location_not_available_message">Looks like this app doesn\'t have location services configured. Please see OneSignal docs for more information.</string>
6+
<string name="permission_not_available_title">%s Not Available</string>
7+
<string name="permission_not_available_message">You have previously denied %s. Please go to settings to enable.</string>
8+
<string name="permission_not_available_open_settings_option">Settings</string>
69

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>
9-
</resources>
10+
<string name="location_permission_name_for_title">Location</string>
11+
<string name="location_permission_settings_message">sharing your device location</string>
12+
</resources>

0 commit comments

Comments
 (0)