diff --git a/android/assets/jsons/translationsByLanguage/German.properties b/android/assets/jsons/translationsByLanguage/German.properties index cf6f70db14..6152458f1c 100644 --- a/android/assets/jsons/translationsByLanguage/German.properties +++ b/android/assets/jsons/translationsByLanguage/German.properties @@ -1747,8 +1747,9 @@ An error has occured = Ein Fehler ist aufgetreten Multiplayer turn notifier service terminated = Multiplayer Zug Benachrichtigungsdienst wurde beendet Your friends are waiting on your turn. = Deine Freunde warten auf deinen Zug. Unciv - It's your turn! = Unciv - Du bist am Zug! -Unciv will inform you when it's your turn. = Unciv wird dich benachrichtigen wenn du am Zug bist. -Last checked: [lastTimeChecked]. Checks ca. every [checkPeriod] minute(s) when Internet available. = Zuletzt geprüft: [lastTimeChecked]. Prüft etwa alle [checkPeriod] Minute(n) wenn Internet vorhanden. +Unciv will inform you when it's your turn in multiplayer. = Unciv wird dich benachrichtigen, wenn du im Multiplayer am Zug bist. +Last online turn check: [lastTimeChecked] = Letzter online Zug Check: [lastTimeChecked] +Checks ca. every [checkPeriod] minute(s) when Internet available. = Prüft etwa alle [checkPeriod] Minute(n) wenn Internet vorhanden. Configurable in Unciv options menu. = Konfigurierbar im Unciv Optionsmenü. Unciv multiplayer turn notifier running = Unciv Multiplayer Zug Benachrichtiger läuft. Multiplayer options = Multiplayer Einstellungen diff --git a/android/assets/jsons/translationsByLanguage/template.properties b/android/assets/jsons/translationsByLanguage/template.properties index 696cfdd529..bdc4a078e2 100644 --- a/android/assets/jsons/translationsByLanguage/template.properties +++ b/android/assets/jsons/translationsByLanguage/template.properties @@ -1746,8 +1746,9 @@ An error has occured = Multiplayer turn notifier service terminated = Your friends are waiting on your turn. = Unciv - It's your turn! = -Unciv will inform you when it's your turn. = -Last checked: [lastTimeChecked]. Checks ca. every [checkPeriod] minute(s) when Internet available. = +Unciv will inform you when it's your turn in multiplayer. = +Last online turn check: [lastTimeChecked] = +Checks ca. every [checkPeriod] minute(s) when Internet available. = Configurable in Unciv options menu. = Unciv multiplayer turn notifier running = Multiplayer options = diff --git a/android/src/com/unciv/app/AndroidLauncher.kt b/android/src/com/unciv/app/AndroidLauncher.kt index 493f29429b..91093acfdc 100644 --- a/android/src/com/unciv/app/AndroidLauncher.kt +++ b/android/src/com/unciv/app/AndroidLauncher.kt @@ -12,7 +12,7 @@ import java.io.File class AndroidLauncher : AndroidApplication() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - createNotificationChannels() + MultiplayerTurnCheckWorker.createNotificationChannels(applicationContext) // Only allow mods on KK+, to avoid READ_EXTERNAL_STORAGE permission earlier versions need if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { @@ -26,14 +26,6 @@ class AndroidLauncher : AndroidApplication() { initialize(game, config) } - /** - * Necessary for Multiplayer Turner Checker, starting with Android Oreo - */ - private fun createNotificationChannels() { - MultiplayerTurnCheckWorker.createNotificationChannelInfo(context) - MultiplayerTurnCheckWorker.createNotificationChannelService(context) - } - /** * Copies mods from external data directory (where users can access) to the private one (where * libGDX reads from). Note: deletes all files currently in the private mod directory and diff --git a/android/src/com/unciv/app/MultiplayerTurnCheckWorker.kt b/android/src/com/unciv/app/MultiplayerTurnCheckWorker.kt index 087bec3b35..2f2162f098 100644 --- a/android/src/com/unciv/app/MultiplayerTurnCheckWorker.kt +++ b/android/src/com/unciv/app/MultiplayerTurnCheckWorker.kt @@ -10,6 +10,7 @@ import android.os.Build import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat.DEFAULT_VIBRATE import androidx.core.app.NotificationManagerCompat +import androidx.core.content.ContextCompat.getSystemService import androidx.work.* import com.badlogic.gdx.backends.android.AndroidApplication import com.unciv.logic.GameInfo @@ -27,13 +28,18 @@ class MultiplayerTurnCheckWorker(appContext: Context, workerParams: WorkerParame const val WORK_TAG = "UNCIV_MULTIPLAYER_TURN_CHECKER_WORKER" const val NOTIFICATION_ID_SERVICE = 1 const val NOTIFICATION_ID_INFO = 2 + + // Notification Channels can't be modified after creation. + // Therefore Unciv needs to create new ones and delete previously used ones. + // Add old channel names here when replacing them with new ones below. + private val HISTORIC_NOTIFICATION_CHANNELS = arrayOf("UNCIV_NOTIFICATION_CHANNEL_SERVICE") + private const val NOTIFICATION_CHANNEL_ID_INFO = "UNCIV_NOTIFICATION_CHANNEL_INFO" - private const val NOTIFICATION_CHANNEL_ID_SERVICE = "UNCIV_NOTIFICATION_CHANNEL_SERVICE" + private const val NOTIFICATION_CHANNEL_ID_SERVICE = "UNCIV_NOTIFICATION_CHANNEL_SERVICE_02" // These fields need to be volatile because they are set by main thread but later accessed by worker thread. // Classes used here need to be primitive or internally synchronized to avoid visibility issues. - // Long and double must not be used here because they have visibility issues: https://stackoverflow.com/a/9278798 @Volatile private var failCount = 0 @Volatile private var gameId = "" @Volatile private var userId = "" @@ -90,6 +96,8 @@ class MultiplayerTurnCheckWorker(appContext: Context, workerParams: WorkerParame val descriptionText = "Shown constantly to inform you about background checking." val importance = NotificationManager.IMPORTANCE_MIN val mChannel = NotificationChannel(NOTIFICATION_CHANNEL_ID_SERVICE, name, importance) + mChannel.setShowBadge(false) + mChannel.setLockscreenVisibility(NotificationCompat.VISIBILITY_PUBLIC) mChannel.description = descriptionText val notificationManager = appContext.getSystemService(AndroidApplication.NOTIFICATION_SERVICE) as NotificationManager @@ -110,16 +118,17 @@ class MultiplayerTurnCheckWorker(appContext: Context, workerParams: WorkerParame val notification: NotificationCompat.Builder = NotificationCompat.Builder(appContext, NOTIFICATION_CHANNEL_ID_SERVICE) .setPriority(NotificationManagerCompat.IMPORTANCE_MIN) // it's only a status - .setContentTitle("Unciv multiplayer turn notifier running".tr()) + .setContentTitle(("Last online turn check: [$lastTimeChecked]").tr()) .setStyle(NotificationCompat.BigTextStyle() - .bigText("Unciv will inform you when it's your turn.".tr() + "\n" + - "Last checked: [$lastTimeChecked]. Checks ca. every [$checkPeriod] minute(s) when Internet available.".tr() + .bigText("Unciv will inform you when it's your turn in multiplayer.".tr() + " " + + "Checks ca. every [$checkPeriod] minute(s) when Internet available.".tr() + " " + "Configurable in Unciv options menu.".tr())) .setSmallIcon(R.drawable.uncivicon2) .setContentIntent(pendingIntent) .setCategory(NotificationCompat.CATEGORY_SERVICE) .setOnlyAlertOnce(true) .setOngoing(true) + .setShowWhen(false) with(NotificationManagerCompat.from(appContext)) { notify(NOTIFICATION_ID_INFO, notification.build()) @@ -168,6 +177,30 @@ class MultiplayerTurnCheckWorker(appContext: Context, workerParams: WorkerParame enqueue(applicationContext, 1) } } + + /** + * Necessary for Multiplayer Turner Checker, starting with Android Oreo + */ + fun createNotificationChannels(appContext: Context) { + createNotificationChannelInfo(appContext) + createNotificationChannelService(appContext) + destroyOldChannels(appContext) + } + + /** + * Notification Channels can't be modified after creation. + * Therefore Unciv needs to create new ones and delete legacy ones. + */ + private fun destroyOldChannels(appContext: Context) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val notificationManager = appContext.getSystemService(AndroidApplication.NOTIFICATION_SERVICE) as NotificationManager + HISTORIC_NOTIFICATION_CHANNELS.forEach { + if (null != notificationManager.getNotificationChannel(it)) { + notificationManager.deleteNotificationChannel(it) + } + } + } + } } override fun doWork(): Result {