Skip to content

Commit dae2b03

Browse files
brismithersjinliu9508
authored andcommitted
Merge pull request #1722 from OneSignal/user-model/focus-and-threading
[User Model] Application Focus and Threading
2 parents a54d7f3 + e62a5a7 commit dae2b03

File tree

5 files changed

+91
-79
lines changed

5 files changed

+91
-79
lines changed

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/application/impl/ApplicationService.kt

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -132,21 +132,23 @@ class ApplicationService() : IApplicationService, ActivityLifecycleCallbacks, On
132132
}
133133

134134
override fun onActivityCreated(activity: Activity, bundle: Bundle?) {
135-
Logging.debug("ApplicationService.onActivityCreated: $activity")
135+
Logging.debug("ApplicationService.onActivityCreated($_activityReferences,$entryState): $activity")
136136
}
137137

138138
override fun onActivityStarted(activity: Activity) {
139-
Logging.debug("ApplicationService.onActivityStarted: $activity")
139+
Logging.debug("ApplicationService.onActivityStarted($_activityReferences,$entryState): $activity")
140140

141141
current = activity
142+
_activityReferences++
142143

143-
if (++_activityReferences == 1 && !_isActivityChangingConfigurations) {
144+
if ((!isInForeground || _nextResumeIsFirstActivity) && !_isActivityChangingConfigurations) {
145+
_activityReferences = 1
144146
handleFocus()
145147
}
146148
}
147149

148150
override fun onActivityResumed(activity: Activity) {
149-
Logging.debug("ApplicationService.onActivityResumed: $activity")
151+
Logging.debug("ApplicationService.onActivityResumed($_activityReferences,$entryState): $activity")
150152

151153
// When an activity has something shown above it, it will be paused allowing
152154
// the new activity to be started (where current is set). However when that
@@ -156,18 +158,24 @@ class ApplicationService() : IApplicationService, ActivityLifecycleCallbacks, On
156158
if (current != activity) {
157159
current = activity
158160
}
161+
162+
if ((!isInForeground || _nextResumeIsFirstActivity) && !_isActivityChangingConfigurations) {
163+
_activityReferences = 1
164+
handleFocus()
165+
}
159166
}
160167

161168
override fun onActivityPaused(activity: Activity) {
162-
Logging.debug("ApplicationService.onActivityPaused: $activity")
169+
Logging.debug("ApplicationService.onActivityPaused($_activityReferences,$entryState): $activity")
163170
}
164171

165172
override fun onActivityStopped(activity: Activity) {
166-
Logging.debug("ApplicationService.onActivityStopped: $activity")
173+
Logging.debug("ApplicationService.onActivityStopped($_activityReferences,$entryState): $activity")
167174

168175
_isActivityChangingConfigurations = activity.isChangingConfigurations
169-
if (--_activityReferences == 0 && !_isActivityChangingConfigurations) {
176+
if (!_isActivityChangingConfigurations && --_activityReferences <= 0) {
170177
current = null
178+
_activityReferences = 0
171179
handleLostFocus()
172180
}
173181

@@ -179,7 +187,7 @@ class ApplicationService() : IApplicationService, ActivityLifecycleCallbacks, On
179187
}
180188

181189
override fun onActivityDestroyed(activity: Activity) {
182-
Logging.debug("ApplicationService.onActivityDestroyed: $activity")
190+
Logging.debug("ApplicationService.onActivityDestroyed($_activityReferences,$entryState): $activity")
183191
}
184192

185193
override fun onGlobalLayout() {
@@ -199,7 +207,7 @@ class ApplicationService() : IApplicationService, ActivityLifecycleCallbacks, On
199207
if (currentActivity is AppCompatActivity) {
200208
val manager = currentActivity.supportFragmentManager
201209

202-
var lastFragment = manager.fragments.lastOrNull()
210+
val lastFragment = manager.fragments.lastOrNull()
203211
if (lastFragment != null && lastFragment.isVisible && lastFragment is DialogFragment) {
204212
val waiter = Waiter()
205213

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/config/ConfigModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ class ConfigModel : Model() {
9494
* the queue.
9595
*/
9696
var opRepoExecutionInterval: Long
97-
get() = getLongProperty(::opRepoExecutionInterval.name) { 10000 }
97+
get() = getLongProperty(::opRepoExecutionInterval.name) { 5000 }
9898
set(value) { setLongProperty(::opRepoExecutionInterval.name, value) }
9999

100100
/**

OneSignalSDK/onesignal/location/src/main/java/com/onesignal/location/internal/LocationManager.kt

Lines changed: 67 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import com.onesignal.location.internal.common.LocationUtils
1414
import com.onesignal.location.internal.controller.ILocationController
1515
import com.onesignal.location.internal.permissions.ILocationPermissionChangedHandler
1616
import com.onesignal.location.internal.permissions.LocationPermissionController
17+
import kotlinx.coroutines.Dispatchers
18+
import kotlinx.coroutines.withContext
1719

1820
internal class LocationManager(
1921
private val _applicationService: IApplicationService,
@@ -61,79 +63,81 @@ internal class LocationManager(
6163
override suspend fun requestPermission(fallbackToSettings: Boolean): Boolean {
6264
Logging.log(LogLevel.DEBUG, "LocationManager.requestPermission()")
6365

64-
if (!isShared) {
65-
return false
66-
}
66+
var result = false
67+
withContext(Dispatchers.Main) {
68+
if (!isShared) {
69+
return@withContext false
70+
}
6771

68-
var result: Boolean
69-
val hasFinePermissionGranted = AndroidUtils.hasPermission(LocationConstants.ANDROID_FINE_LOCATION_PERMISSION_STRING, true, _applicationService)
70-
var hasCoarsePermissionGranted: Boolean = false
71-
var hasBackgroundPermissionGranted: Boolean = false
72+
val hasFinePermissionGranted = AndroidUtils.hasPermission(LocationConstants.ANDROID_FINE_LOCATION_PERMISSION_STRING, true, _applicationService)
73+
var hasCoarsePermissionGranted: Boolean = false
74+
var hasBackgroundPermissionGranted: Boolean = false
7275

73-
if (!hasFinePermissionGranted) {
74-
hasCoarsePermissionGranted = AndroidUtils.hasPermission(LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING, true, _applicationService)
75-
_capturer.locationCoarse = true
76-
}
77-
78-
if (Build.VERSION.SDK_INT >= 29) {
79-
hasBackgroundPermissionGranted = AndroidUtils.hasPermission(LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING, true, _applicationService)
80-
}
76+
if (!hasFinePermissionGranted) {
77+
hasCoarsePermissionGranted = AndroidUtils.hasPermission(LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING, true, _applicationService)
78+
_capturer.locationCoarse = true
79+
}
8180

82-
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
83-
if (!hasFinePermissionGranted && !hasCoarsePermissionGranted) {
84-
// Permission missing on manifest
85-
Logging.error("Location permissions not added on AndroidManifest file < M")
86-
return false
81+
if (Build.VERSION.SDK_INT >= 29) {
82+
hasBackgroundPermissionGranted = AndroidUtils.hasPermission(LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING, true, _applicationService)
8783
}
8884

89-
startGetLocation()
90-
result = true
91-
} else { // Android 6.0+
92-
if (!hasFinePermissionGranted) {
93-
var requestPermission: String? = null
94-
var permissionList = AndroidUtils.filterManifestPermissions(
95-
listOf(
96-
LocationConstants.ANDROID_FINE_LOCATION_PERMISSION_STRING,
97-
LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING,
98-
LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING
99-
),
100-
_applicationService
101-
)
102-
103-
if (permissionList.contains(LocationConstants.ANDROID_FINE_LOCATION_PERMISSION_STRING)) {
104-
// ACCESS_FINE_LOCATION permission defined on Manifest, prompt for permission
105-
// If permission already given prompt will return positive, otherwise will prompt again or show settings
106-
requestPermission = LocationConstants.ANDROID_FINE_LOCATION_PERMISSION_STRING
107-
} else if (permissionList.contains(LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING)) {
108-
if (!hasCoarsePermissionGranted) {
109-
// ACCESS_COARSE_LOCATION permission defined on Manifest, prompt for permission
85+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
86+
if (!hasFinePermissionGranted && !hasCoarsePermissionGranted) {
87+
// Permission missing on manifest
88+
Logging.error("Location permissions not added on AndroidManifest file < M")
89+
return@withContext false
90+
}
91+
92+
startGetLocation()
93+
result = true
94+
} else { // Android 6.0+
95+
if (!hasFinePermissionGranted) {
96+
var requestPermission: String? = null
97+
var permissionList = AndroidUtils.filterManifestPermissions(
98+
listOf(
99+
LocationConstants.ANDROID_FINE_LOCATION_PERMISSION_STRING,
100+
LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING,
101+
LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING
102+
),
103+
_applicationService
104+
)
105+
106+
if (permissionList.contains(LocationConstants.ANDROID_FINE_LOCATION_PERMISSION_STRING)) {
107+
// ACCESS_FINE_LOCATION permission defined on Manifest, prompt for permission
110108
// If permission already given prompt will return positive, otherwise will prompt again or show settings
111-
requestPermission = LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING
112-
} else if (Build.VERSION.SDK_INT >= 29 && permissionList.contains(LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING)) {
113-
// ACCESS_BACKGROUND_LOCATION permission defined on Manifest, prompt for permission
114-
requestPermission = LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING
109+
requestPermission = LocationConstants.ANDROID_FINE_LOCATION_PERMISSION_STRING
110+
} else if (permissionList.contains(LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING)) {
111+
if (!hasCoarsePermissionGranted) {
112+
// ACCESS_COARSE_LOCATION permission defined on Manifest, prompt for permission
113+
// If permission already given prompt will return positive, otherwise will prompt again or show settings
114+
requestPermission = LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING
115+
} else if (Build.VERSION.SDK_INT >= 29 && permissionList.contains(LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING)) {
116+
// ACCESS_BACKGROUND_LOCATION permission defined on Manifest, prompt for permission
117+
requestPermission = LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING
118+
}
119+
} else {
120+
Logging.info("Location permissions not added on AndroidManifest file >= M")
115121
}
116-
} else {
117-
Logging.info("Location permissions not added on AndroidManifest file >= M")
118-
}
119122

120-
// We handle the following cases:
121-
// 1 - If needed and available then prompt for permissions
122-
// - Request permission can be ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION
123-
// 2 - If the permission were already granted then start getting location
124-
// 3 - If permission wasn't granted then trigger fail flow
125-
//
126-
// For each case, we call the prompt handlers
127-
result = if (requestPermission != null) {
128-
_locationPermissionController.prompt(fallbackToSettings, requestPermission)
123+
// We handle the following cases:
124+
// 1 - If needed and available then prompt for permissions
125+
// - Request permission can be ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION
126+
// 2 - If the permission were already granted then start getting location
127+
// 3 - If permission wasn't granted then trigger fail flow
128+
//
129+
// For each case, we call the prompt handlers
130+
result = if (requestPermission != null) {
131+
_locationPermissionController.prompt(fallbackToSettings, requestPermission)
132+
} else {
133+
hasCoarsePermissionGranted
134+
}
135+
} else if (Build.VERSION.SDK_INT >= 29 && !hasBackgroundPermissionGranted) {
136+
result = backgroundLocationPermissionLogic(fallbackToSettings)
129137
} else {
130-
hasCoarsePermissionGranted
138+
result = true
139+
startGetLocation()
131140
}
132-
} else if (Build.VERSION.SDK_INT >= 29 && !hasBackgroundPermissionGranted) {
133-
result = backgroundLocationPermissionLogic(fallbackToSettings)
134-
} else {
135-
result = true
136-
startGetLocation()
137141
}
138142
}
139143

OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/NotificationsManager.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import com.onesignal.notifications.internal.permissions.INotificationPermissionC
1818
import com.onesignal.notifications.internal.permissions.INotificationPermissionController
1919
import com.onesignal.notifications.internal.restoration.INotificationRestoreWorkManager
2020
import com.onesignal.notifications.internal.summary.INotificationSummaryManager
21+
import kotlinx.coroutines.Dispatchers
22+
import kotlinx.coroutines.withContext
2123
import org.json.JSONArray
2224
import org.json.JSONException
2325

@@ -81,7 +83,10 @@ internal class NotificationsManager(
8183

8284
override suspend fun requestPermission(fallbackToSettings: Boolean): Boolean {
8385
Logging.debug("NotificationsManager.requestPermission()")
84-
return _notificationPermissionController.prompt(fallbackToSettings)
86+
87+
return withContext(Dispatchers.Main) {
88+
return@withContext _notificationPermissionController.prompt(fallbackToSettings)
89+
}
8590
}
8691

8792
private fun setPermissionStatusAndFire(isEnabled: Boolean) {

OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/permissions/impl/NotificationPermissionController.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ import com.onesignal.notifications.R
4040
import com.onesignal.notifications.internal.common.NotificationHelper
4141
import com.onesignal.notifications.internal.permissions.INotificationPermissionChangedHandler
4242
import com.onesignal.notifications.internal.permissions.INotificationPermissionController
43-
import kotlinx.coroutines.yield
4443

4544
internal class NotificationPermissionController(
4645
private val _application: IApplicationService,
@@ -74,10 +73,6 @@ internal class NotificationPermissionController(
7473
* to notify of the status.
7574
*/
7675
override suspend fun prompt(fallbackToSettings: Boolean): Boolean {
77-
// yield to force a suspension. When there is no suspension the continuation will
78-
// never be called
79-
yield()
80-
8176
if (notificationsEnabled()) {
8277
return true
8378
}

0 commit comments

Comments
 (0)