diff --git a/demo/android/src/main/AndroidManifest.xml b/demo/android/src/main/AndroidManifest.xml index d8d7265..3c02ac6 100644 --- a/demo/android/src/main/AndroidManifest.xml +++ b/demo/android/src/main/AndroidManifest.xml @@ -1,6 +1,9 @@ + + + + android:exported="false" + android:foregroundServiceType="dataSync" /> diff --git a/demo/android/src/main/kotlin/im/molly/monero/demo/service/SyncService.kt b/demo/android/src/main/kotlin/im/molly/monero/demo/service/SyncService.kt index 2e1f784..df2b450 100644 --- a/demo/android/src/main/kotlin/im/molly/monero/demo/service/SyncService.kt +++ b/demo/android/src/main/kotlin/im/molly/monero/demo/service/SyncService.kt @@ -1,10 +1,15 @@ package im.molly.monero.demo.service +import android.app.NotificationChannel +import android.app.NotificationManager import android.content.Context import android.content.Intent +import android.content.pm.ServiceInfo import android.os.Binder +import android.os.Build import android.os.IBinder import android.util.Log +import androidx.core.app.NotificationCompat import androidx.lifecycle.LifecycleService import androidx.lifecycle.lifecycleScope import im.molly.monero.demo.AppModule @@ -16,6 +21,8 @@ import kotlin.time.Duration.Companion.seconds const val TAG = "SyncService" +const val NOTIFICATION_CHANNEL_ID = "SyncService" + class SyncService( private val walletRepository: WalletRepository = AppModule.walletRepository, private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO, @@ -82,6 +89,8 @@ class SyncService( Log.d(TAG, "onCreate") super.onCreate() + startForeground() + lifecycleScope.launch(ioDispatcher) { doSync() } @@ -95,7 +104,31 @@ class SyncService( companion object { fun start(context: Context) { val intent = Intent(context, SyncService::class.java) - context.startService(intent) + context.startForegroundService(intent) } } + + private fun startForeground() { + ensureNotificationChannel() + + val notification = NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID) + .build() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + startForeground(100, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC) + } else { + startForeground(100, notification) + } + } + + private fun ensureNotificationChannel() { + val notificationManager = getSystemService(NotificationManager::class.java)!! + + notificationManager.createNotificationChannel( + NotificationChannel( + NOTIFICATION_CHANNEL_ID, + "Wallet Foreground Service", + NotificationManager.IMPORTANCE_LOW, + ) + ) + } } diff --git a/demo/android/src/main/kotlin/im/molly/monero/demo/ui/AddWalletWizard.kt b/demo/android/src/main/kotlin/im/molly/monero/demo/ui/AddWalletWizard.kt index fb2344d..bead0ad 100644 --- a/demo/android/src/main/kotlin/im/molly/monero/demo/ui/AddWalletWizard.kt +++ b/demo/android/src/main/kotlin/im/molly/monero/demo/ui/AddWalletWizard.kt @@ -261,7 +261,7 @@ private fun SecondStepScreen( AlertDialog(onDismissRequest = { showOffLineConfirmationDialog = false }, title = { Text("No remote nodes selected") }, text = { - Text("There are no remote nodes added to your wallet settings. Are you sure you want to start an offline wallet?") + Text("There are no remote nodes added to your wallet settings. Are you sure you want to create an offline wallet?") }, confirmButton = { TextButton(onClick = { showOffLineConfirmationDialog = false