Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
}

Expand All @@ -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() {
Expand All @@ -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()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) }

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
}
Expand Down