28
28
package com .onesignal ;
29
29
30
30
import android .app .Activity ;
31
- import android .app .AlertDialog ;
32
- import android .content .DialogInterface ;
33
31
import android .content .Intent ;
34
32
import android .content .pm .PackageManager ;
35
- import android .net .Uri ;
36
33
import android .os .Build ;
37
34
import android .os .Bundle ;
38
35
import android .os .Handler ;
39
36
import androidx .annotation .NonNull ;
40
37
41
38
import com .onesignal .AndroidSupportV4Compat .ActivityCompat ;
42
39
40
+ import java .util .HashMap ;
41
+
43
42
public class PermissionsActivity extends Activity {
44
43
44
+ interface PermissionCallback {
45
+ void onAccept ();
46
+ void onReject (boolean fallbackToSettings );
47
+ }
48
+
45
49
private static final String TAG = PermissionsActivity .class .getCanonicalName ();
46
50
// TODO this will be removed once the handled is deleted
47
51
// Default animation duration in milliseconds
@@ -54,8 +58,21 @@ public class PermissionsActivity extends Activity {
54
58
55
59
private static final String INTENT_EXTRA_PERMISSION_TYPE = "INTENT_EXTRA_PERMISSION_TYPE" ;
56
60
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
+
57
63
private String permissionRequestType ;
58
64
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
+
59
76
@ Override
60
77
protected void onCreate (Bundle savedInstanceState ) {
61
78
super .onCreate (savedInstanceState );
@@ -93,11 +110,26 @@ private void handleBundleParams(Bundle extras) {
93
110
return ;
94
111
}
95
112
113
+ reregisterCallbackHandlers (extras );
114
+
96
115
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 );
98
117
requestPermission (androidPermissionString );
99
118
}
100
119
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
+
101
133
private void requestPermission (String androidPermissionString ) {
102
134
if (!waiting ) {
103
135
waiting = true ;
@@ -122,13 +154,15 @@ public void onRequestPermissionsResult(final int requestCode, @NonNull String pe
122
154
@ Override
123
155
public void run () {
124
156
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 ());
132
166
}
133
167
}
134
168
}, DELAY_TIME_CALLBACK_CALL );
@@ -141,35 +175,18 @@ public void run() {
141
175
overridePendingTransition (R .anim .onesignal_fade_in , R .anim .onesignal_fade_out );
142
176
}
143
177
144
- private void attemptToShowLocationPermissionSettings () {
145
- if ( fallbackToSettings
178
+ private boolean shouldShowSettings () {
179
+ return fallbackToSettings
146
180
&& 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 );
170
182
}
171
183
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
+ ) {
173
190
if (PermissionsActivity .waiting || PermissionsActivity .answered )
174
191
return ;
175
192
@@ -181,7 +198,8 @@ public void available(@NonNull Activity activity) {
181
198
Intent intent = new Intent (activity , PermissionsActivity .class );
182
199
intent .setFlags (Intent .FLAG_ACTIVITY_REORDER_TO_FRONT );
183
200
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 ());
185
203
activity .startActivity (intent );
186
204
activity .overridePendingTransition (R .anim .onesignal_fade_in , R .anim .onesignal_fade_out );
187
205
}
0 commit comments