diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/application/impl/ApplicationService.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/application/impl/ApplicationService.kt index fb21729a8f..1a7bb98989 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/application/impl/ApplicationService.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/application/impl/ApplicationService.kt @@ -132,21 +132,23 @@ class ApplicationService() : IApplicationService, ActivityLifecycleCallbacks, On } override fun onActivityCreated(activity: Activity, bundle: Bundle?) { - Logging.debug("ApplicationService.onActivityCreated: $activity") + Logging.debug("ApplicationService.onActivityCreated($_activityReferences,$entryState): $activity") } override fun onActivityStarted(activity: Activity) { - Logging.debug("ApplicationService.onActivityStarted: $activity") + Logging.debug("ApplicationService.onActivityStarted($_activityReferences,$entryState): $activity") current = activity + _activityReferences++ - if (++_activityReferences == 1 && !_isActivityChangingConfigurations) { + if ((!isInForeground || _nextResumeIsFirstActivity) && !_isActivityChangingConfigurations) { + _activityReferences = 1 handleFocus() } } override fun onActivityResumed(activity: Activity) { - Logging.debug("ApplicationService.onActivityResumed: $activity") + Logging.debug("ApplicationService.onActivityResumed($_activityReferences,$entryState): $activity") // When an activity has something shown above it, it will be paused allowing // the new activity to be started (where current is set). However when that @@ -156,18 +158,24 @@ class ApplicationService() : IApplicationService, ActivityLifecycleCallbacks, On if (current != activity) { current = activity } + + if ((!isInForeground || _nextResumeIsFirstActivity) && !_isActivityChangingConfigurations) { + _activityReferences = 1 + handleFocus() + } } override fun onActivityPaused(activity: Activity) { - Logging.debug("ApplicationService.onActivityPaused: $activity") + Logging.debug("ApplicationService.onActivityPaused($_activityReferences,$entryState): $activity") } override fun onActivityStopped(activity: Activity) { - Logging.debug("ApplicationService.onActivityStopped: $activity") + Logging.debug("ApplicationService.onActivityStopped($_activityReferences,$entryState): $activity") _isActivityChangingConfigurations = activity.isChangingConfigurations - if (--_activityReferences == 0 && !_isActivityChangingConfigurations) { + if (!_isActivityChangingConfigurations && --_activityReferences <= 0) { current = null + _activityReferences = 0 handleLostFocus() } @@ -179,7 +187,7 @@ class ApplicationService() : IApplicationService, ActivityLifecycleCallbacks, On } override fun onActivityDestroyed(activity: Activity) { - Logging.debug("ApplicationService.onActivityDestroyed: $activity") + Logging.debug("ApplicationService.onActivityDestroyed($_activityReferences,$entryState): $activity") } override fun onGlobalLayout() { @@ -199,7 +207,7 @@ class ApplicationService() : IApplicationService, ActivityLifecycleCallbacks, On if (currentActivity is AppCompatActivity) { val manager = currentActivity.supportFragmentManager - var lastFragment = manager.fragments.lastOrNull() + val lastFragment = manager.fragments.lastOrNull() if (lastFragment != null && lastFragment.isVisible && lastFragment is DialogFragment) { val waiter = Waiter() diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/config/ConfigModel.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/config/ConfigModel.kt index f29900bb42..df8c3fd6bd 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/config/ConfigModel.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/config/ConfigModel.kt @@ -94,7 +94,7 @@ class ConfigModel : Model() { * the queue. */ var opRepoExecutionInterval: Long - get() = getLongProperty(::opRepoExecutionInterval.name) { 10000 } + get() = getLongProperty(::opRepoExecutionInterval.name) { 5000 } set(value) { setLongProperty(::opRepoExecutionInterval.name, value) } /** diff --git a/OneSignalSDK/onesignal/location/src/main/java/com/onesignal/location/internal/LocationManager.kt b/OneSignalSDK/onesignal/location/src/main/java/com/onesignal/location/internal/LocationManager.kt index 7c255e0f3d..cda461a155 100644 --- a/OneSignalSDK/onesignal/location/src/main/java/com/onesignal/location/internal/LocationManager.kt +++ b/OneSignalSDK/onesignal/location/src/main/java/com/onesignal/location/internal/LocationManager.kt @@ -14,6 +14,8 @@ import com.onesignal.location.internal.common.LocationUtils import com.onesignal.location.internal.controller.ILocationController import com.onesignal.location.internal.permissions.ILocationPermissionChangedHandler import com.onesignal.location.internal.permissions.LocationPermissionController +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext internal class LocationManager( private val _applicationService: IApplicationService, @@ -61,79 +63,81 @@ internal class LocationManager( override suspend fun requestPermission(fallbackToSettings: Boolean): Boolean { Logging.log(LogLevel.DEBUG, "LocationManager.requestPermission()") - if (!isShared) { - return false - } + var result = false + withContext(Dispatchers.Main) { + if (!isShared) { + return@withContext false + } - var result: Boolean - val hasFinePermissionGranted = AndroidUtils.hasPermission(LocationConstants.ANDROID_FINE_LOCATION_PERMISSION_STRING, true, _applicationService) - var hasCoarsePermissionGranted: Boolean = false - var hasBackgroundPermissionGranted: Boolean = false + val hasFinePermissionGranted = AndroidUtils.hasPermission(LocationConstants.ANDROID_FINE_LOCATION_PERMISSION_STRING, true, _applicationService) + var hasCoarsePermissionGranted: Boolean = false + var hasBackgroundPermissionGranted: Boolean = false - if (!hasFinePermissionGranted) { - hasCoarsePermissionGranted = AndroidUtils.hasPermission(LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING, true, _applicationService) - _capturer.locationCoarse = true - } - - if (Build.VERSION.SDK_INT >= 29) { - hasBackgroundPermissionGranted = AndroidUtils.hasPermission(LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING, true, _applicationService) - } + if (!hasFinePermissionGranted) { + hasCoarsePermissionGranted = AndroidUtils.hasPermission(LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING, true, _applicationService) + _capturer.locationCoarse = true + } - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - if (!hasFinePermissionGranted && !hasCoarsePermissionGranted) { - // Permission missing on manifest - Logging.error("Location permissions not added on AndroidManifest file < M") - return false + if (Build.VERSION.SDK_INT >= 29) { + hasBackgroundPermissionGranted = AndroidUtils.hasPermission(LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING, true, _applicationService) } - startGetLocation() - result = true - } else { // Android 6.0+ - if (!hasFinePermissionGranted) { - var requestPermission: String? = null - var permissionList = AndroidUtils.filterManifestPermissions( - listOf( - LocationConstants.ANDROID_FINE_LOCATION_PERMISSION_STRING, - LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING, - LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING - ), - _applicationService - ) - - if (permissionList.contains(LocationConstants.ANDROID_FINE_LOCATION_PERMISSION_STRING)) { - // ACCESS_FINE_LOCATION permission defined on Manifest, prompt for permission - // If permission already given prompt will return positive, otherwise will prompt again or show settings - requestPermission = LocationConstants.ANDROID_FINE_LOCATION_PERMISSION_STRING - } else if (permissionList.contains(LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING)) { - if (!hasCoarsePermissionGranted) { - // ACCESS_COARSE_LOCATION permission defined on Manifest, prompt for permission + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + if (!hasFinePermissionGranted && !hasCoarsePermissionGranted) { + // Permission missing on manifest + Logging.error("Location permissions not added on AndroidManifest file < M") + return@withContext false + } + + startGetLocation() + result = true + } else { // Android 6.0+ + if (!hasFinePermissionGranted) { + var requestPermission: String? = null + var permissionList = AndroidUtils.filterManifestPermissions( + listOf( + LocationConstants.ANDROID_FINE_LOCATION_PERMISSION_STRING, + LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING, + LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING + ), + _applicationService + ) + + if (permissionList.contains(LocationConstants.ANDROID_FINE_LOCATION_PERMISSION_STRING)) { + // ACCESS_FINE_LOCATION permission defined on Manifest, prompt for permission // If permission already given prompt will return positive, otherwise will prompt again or show settings - requestPermission = LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING - } else if (Build.VERSION.SDK_INT >= 29 && permissionList.contains(LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING)) { - // ACCESS_BACKGROUND_LOCATION permission defined on Manifest, prompt for permission - requestPermission = LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING + requestPermission = LocationConstants.ANDROID_FINE_LOCATION_PERMISSION_STRING + } else if (permissionList.contains(LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING)) { + if (!hasCoarsePermissionGranted) { + // ACCESS_COARSE_LOCATION permission defined on Manifest, prompt for permission + // If permission already given prompt will return positive, otherwise will prompt again or show settings + requestPermission = LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING + } else if (Build.VERSION.SDK_INT >= 29 && permissionList.contains(LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING)) { + // ACCESS_BACKGROUND_LOCATION permission defined on Manifest, prompt for permission + requestPermission = LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING + } + } else { + Logging.info("Location permissions not added on AndroidManifest file >= M") } - } else { - Logging.info("Location permissions not added on AndroidManifest file >= M") - } - // We handle the following cases: - // 1 - If needed and available then prompt for permissions - // - Request permission can be ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION - // 2 - If the permission were already granted then start getting location - // 3 - If permission wasn't granted then trigger fail flow - // - // For each case, we call the prompt handlers - result = if (requestPermission != null) { - _locationPermissionController.prompt(fallbackToSettings, requestPermission) + // We handle the following cases: + // 1 - If needed and available then prompt for permissions + // - Request permission can be ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION + // 2 - If the permission were already granted then start getting location + // 3 - If permission wasn't granted then trigger fail flow + // + // For each case, we call the prompt handlers + result = if (requestPermission != null) { + _locationPermissionController.prompt(fallbackToSettings, requestPermission) + } else { + hasCoarsePermissionGranted + } + } else if (Build.VERSION.SDK_INT >= 29 && !hasBackgroundPermissionGranted) { + result = backgroundLocationPermissionLogic(fallbackToSettings) } else { - hasCoarsePermissionGranted + result = true + startGetLocation() } - } else if (Build.VERSION.SDK_INT >= 29 && !hasBackgroundPermissionGranted) { - result = backgroundLocationPermissionLogic(fallbackToSettings) - } else { - result = true - startGetLocation() } } diff --git a/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/NotificationsManager.kt b/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/NotificationsManager.kt index 86e415ed1c..0370415256 100644 --- a/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/NotificationsManager.kt +++ b/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/NotificationsManager.kt @@ -18,6 +18,8 @@ import com.onesignal.notifications.internal.permissions.INotificationPermissionC import com.onesignal.notifications.internal.permissions.INotificationPermissionController import com.onesignal.notifications.internal.restoration.INotificationRestoreWorkManager import com.onesignal.notifications.internal.summary.INotificationSummaryManager +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import org.json.JSONArray import org.json.JSONException @@ -81,7 +83,10 @@ internal class NotificationsManager( override suspend fun requestPermission(fallbackToSettings: Boolean): Boolean { Logging.debug("NotificationsManager.requestPermission()") - return _notificationPermissionController.prompt(fallbackToSettings) + + return withContext(Dispatchers.Main) { + return@withContext _notificationPermissionController.prompt(fallbackToSettings) + } } private fun setPermissionStatusAndFire(isEnabled: Boolean) { diff --git a/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/permissions/impl/NotificationPermissionController.kt b/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/permissions/impl/NotificationPermissionController.kt index dfcff944bd..e2cee67eb8 100644 --- a/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/permissions/impl/NotificationPermissionController.kt +++ b/OneSignalSDK/onesignal/notifications/src/main/java/com/onesignal/notifications/internal/permissions/impl/NotificationPermissionController.kt @@ -40,7 +40,6 @@ import com.onesignal.notifications.R import com.onesignal.notifications.internal.common.NotificationHelper import com.onesignal.notifications.internal.permissions.INotificationPermissionChangedHandler import com.onesignal.notifications.internal.permissions.INotificationPermissionController -import kotlinx.coroutines.yield internal class NotificationPermissionController( private val _application: IApplicationService, @@ -74,10 +73,6 @@ internal class NotificationPermissionController( * to notify of the status. */ override suspend fun prompt(fallbackToSettings: Boolean): Boolean { - // yield to force a suspension. When there is no suspension the continuation will - // never be called - yield() - if (notificationsEnabled()) { return true }