Try not blocking main threads to start foreground service.
This commit is contained in:
parent
99d3f9918f
commit
534c5c3c64
4 changed files with 16 additions and 5 deletions
|
@ -277,7 +277,7 @@ public class VoiceNotePlaybackService extends MediaBrowserServiceCompat {
|
||||||
public void onNotificationPosted(int notificationId, Notification notification, boolean ongoing) {
|
public void onNotificationPosted(int notificationId, Notification notification, boolean ongoing) {
|
||||||
if (ongoing && !isForegroundService) {
|
if (ongoing && !isForegroundService) {
|
||||||
try {
|
try {
|
||||||
ForegroundServiceUtil.startWhenCapable(getApplicationContext(), new Intent(getApplicationContext(), VoiceNotePlaybackService.class));
|
ForegroundServiceUtil.start(getApplicationContext(), new Intent(getApplicationContext(), VoiceNotePlaybackService.class));
|
||||||
startForeground(notificationId, notification);
|
startForeground(notificationId, notification);
|
||||||
isForegroundService = true;
|
isForegroundService = true;
|
||||||
} catch (UnableToStartException e) {
|
} catch (UnableToStartException e) {
|
||||||
|
|
|
@ -30,7 +30,7 @@ import org.thoughtcrime.securesms.util.concurrent.SerialMonoLifoExecutor
|
||||||
object FcmFetchManager {
|
object FcmFetchManager {
|
||||||
|
|
||||||
private val TAG = Log.tag(FcmFetchManager::class.java)
|
private val TAG = Log.tag(FcmFetchManager::class.java)
|
||||||
|
private const val MAX_BLOCKING_TIME_MS = 500L
|
||||||
private val EXECUTOR = SerialMonoLifoExecutor(SignalExecutors.UNBOUNDED)
|
private val EXECUTOR = SerialMonoLifoExecutor(SignalExecutors.UNBOUNDED)
|
||||||
|
|
||||||
@Volatile
|
@Volatile
|
||||||
|
@ -48,7 +48,7 @@ object FcmFetchManager {
|
||||||
try {
|
try {
|
||||||
if (foreground) {
|
if (foreground) {
|
||||||
Log.i(TAG, "Starting in the foreground.")
|
Log.i(TAG, "Starting in the foreground.")
|
||||||
ForegroundServiceUtil.startWhenCapableOrThrow(context, Intent(context, FcmFetchForegroundService::class.java))
|
ForegroundServiceUtil.startWhenCapableOrThrow(context, Intent(context, FcmFetchForegroundService::class.java), MAX_BLOCKING_TIME_MS)
|
||||||
startedForeground = true
|
startedForeground = true
|
||||||
} else {
|
} else {
|
||||||
Log.i(TAG, "Starting in the background.")
|
Log.i(TAG, "Starting in the background.")
|
||||||
|
|
|
@ -8,6 +8,7 @@ import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.SystemClock
|
import android.os.SystemClock
|
||||||
|
import androidx.annotation.WorkerThread
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import org.signal.core.util.PendingIntentFlags
|
import org.signal.core.util.PendingIntentFlags
|
||||||
import org.signal.core.util.logging.Log
|
import org.signal.core.util.logging.Log
|
||||||
|
@ -73,6 +74,7 @@ object ForegroundServiceUtil {
|
||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@Throws(UnableToStartException::class)
|
@Throws(UnableToStartException::class)
|
||||||
|
@WorkerThread
|
||||||
fun startWhenCapable(context: Context, intent: Intent, timeout: Long = DEFAULT_TIMEOUT) {
|
fun startWhenCapable(context: Context, intent: Intent, timeout: Long = DEFAULT_TIMEOUT) {
|
||||||
try {
|
try {
|
||||||
start(context, intent)
|
start(context, intent)
|
||||||
|
@ -91,6 +93,7 @@ object ForegroundServiceUtil {
|
||||||
*/
|
*/
|
||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
|
@WorkerThread
|
||||||
fun startWhenCapableOrThrow(context: Context, intent: Intent, timeout: Long = DEFAULT_TIMEOUT) {
|
fun startWhenCapableOrThrow(context: Context, intent: Intent, timeout: Long = DEFAULT_TIMEOUT) {
|
||||||
try {
|
try {
|
||||||
startWhenCapable(context, intent, timeout)
|
startWhenCapable(context, intent, timeout)
|
||||||
|
|
|
@ -25,6 +25,7 @@ import org.thoughtcrime.securesms.jobmanager.JobTracker
|
||||||
import org.thoughtcrime.securesms.jobmanager.JobTracker.JobListener
|
import org.thoughtcrime.securesms.jobmanager.JobTracker.JobListener
|
||||||
import org.thoughtcrime.securesms.jobmanager.impl.BackoffUtil
|
import org.thoughtcrime.securesms.jobmanager.impl.BackoffUtil
|
||||||
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint
|
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint
|
||||||
|
import org.thoughtcrime.securesms.jobs.ForegroundServiceUtil
|
||||||
import org.thoughtcrime.securesms.jobs.ForegroundServiceUtil.startWhenCapable
|
import org.thoughtcrime.securesms.jobs.ForegroundServiceUtil.startWhenCapable
|
||||||
import org.thoughtcrime.securesms.jobs.PushDecryptMessageJob
|
import org.thoughtcrime.securesms.jobs.PushDecryptMessageJob
|
||||||
import org.thoughtcrime.securesms.jobs.PushProcessMessageJob
|
import org.thoughtcrime.securesms.jobs.PushProcessMessageJob
|
||||||
|
@ -94,9 +95,16 @@ class IncomingMessageObserver(private val context: Application) {
|
||||||
|
|
||||||
if (!SignalStore.account().fcmEnabled || SignalStore.internalValues().isWebsocketModeForced) {
|
if (!SignalStore.account().fcmEnabled || SignalStore.internalValues().isWebsocketModeForced) {
|
||||||
try {
|
try {
|
||||||
startWhenCapable(context, Intent(context, ForegroundService::class.java))
|
ForegroundServiceUtil.start(context, Intent(context, ForegroundService::class.java))
|
||||||
} catch (e: UnableToStartException) {
|
} catch (e: UnableToStartException) {
|
||||||
Log.w(TAG, "Unable to start foreground service for websocket!", e)
|
Log.w(TAG, "Unable to start foreground service for websocket. Deferring to background to try with blocking")
|
||||||
|
SignalExecutors.UNBOUNDED.execute {
|
||||||
|
try {
|
||||||
|
startWhenCapable(context, Intent(context, ForegroundService::class.java))
|
||||||
|
} catch (e: UnableToStartException) {
|
||||||
|
Log.w(TAG, "Unable to start foreground service for websocket!", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue