diff --git a/README.md b/README.md index 0b0b52c9..278e2792 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,25 @@ For developers of other Syncthing apps, the custom filesystem scheme that BasicS ## Remote control -When the "Allow remote control" setting is enabled, BasicSync allows other apps to control when Syncthing runs via Android's broadcast mechanism. The following broadcast actions are supported, which behave exactly the same as the corresponding buttons in BasicSync's notification: +When the "Allow remote control" setting is enabled, BasicSync will report the current state of Syncthing to other apps and allow them to control when Syncthing runs. This uses Android's broadcast mechanism. + +Whenever the state changes (eg. Syncthing paused due to metered network), BasicSync will send the following broadcast with the listed extras: + +* `com.chiller3.basicsync.STATE_CHANGED` + * `mode` + * `AUTO_MODE` - Currently set to auto mode + * `MANUAL_MODE_STARTED` - Currently set to manual mode and started + * `MANUAL_MODE_STOPPED` - Currently set to manual mode and stopped/paused + * `run_state` + * `RUNNING` - Syncthing is running and permitted to sync + * `NOT_RUNNING` - Syncthing is not running at all + * `PAUSED` - Syncthing is running, but not permitted to sync + * `STARTING` - Syncthing is in the process of starting up + * `STOPPING` - Syncthing is in the process of shutting down entirely + * `IMPORTING` - Syncthing is not running due to an ongoing config import + * `EXPORTING` - Syncthing is not running due to an ongoing config export + +BasicSync also accepts the following broadcasts from other apps: * `com.chiller3.basicsync.AUTO_MODE` * Switch to auto mode where Syncthing runs based on the configured run conditions. @@ -117,6 +135,8 @@ When the "Allow remote control" setting is enabled, BasicSync allows other apps * Switch to manual mode and start Syncthing. * `com.chiller3.basicsync.STOP` * Switch to manual mode and stop Syncthing. +* `com.chiller3.basicsync.REQUEST_STATE` + * Request a new `com.chiller3.basicsync.STATE_CHANGED` broadcast, even if the state has not changed. These broadcasts can also be sent via `adb`. For example: diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e5e1364f..b1604845 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -155,6 +155,7 @@ + diff --git a/app/src/main/java/com/chiller3/basicsync/Notifications.kt b/app/src/main/java/com/chiller3/basicsync/Notifications.kt index ba8b981a..365e00fc 100644 --- a/app/src/main/java/com/chiller3/basicsync/Notifications.kt +++ b/app/src/main/java/com/chiller3/basicsync/Notifications.kt @@ -101,7 +101,6 @@ class Notifications(private val context: Context) { SyncthingService.RunState.PAUSED -> R.string.notification_persistent_paused_title SyncthingService.RunState.STARTING -> R.string.notification_persistent_starting_title SyncthingService.RunState.STOPPING -> R.string.notification_persistent_stopping_title - SyncthingService.RunState.PAUSING -> R.string.notification_persistent_pausing_title SyncthingService.RunState.IMPORTING -> R.string.notification_persistent_importing_title SyncthingService.RunState.EXPORTING -> R.string.notification_persistent_exporting_title } diff --git a/app/src/main/java/com/chiller3/basicsync/settings/SettingsScreen.kt b/app/src/main/java/com/chiller3/basicsync/settings/SettingsScreen.kt index 0023c315..d3f76957 100644 --- a/app/src/main/java/com/chiller3/basicsync/settings/SettingsScreen.kt +++ b/app/src/main/java/com/chiller3/basicsync/settings/SettingsScreen.kt @@ -990,8 +990,6 @@ private fun serviceStatusSummary(state: SyncthingService.ServiceState?) = state? stringResource(R.string.notification_persistent_starting_title) SyncthingService.RunState.STOPPING -> stringResource(R.string.notification_persistent_stopping_title) - SyncthingService.RunState.PAUSING -> - stringResource(R.string.notification_persistent_pausing_title) SyncthingService.RunState.IMPORTING -> stringResource(R.string.notification_persistent_importing_title) SyncthingService.RunState.EXPORTING -> @@ -1040,6 +1038,7 @@ private fun PreviewSettingsScreen() { isStarted = true, isResumed = true, manualMode = false, + manualShouldRun = false, allowAutoMode = true, preRunAction = null, useLocation = false, diff --git a/app/src/main/java/com/chiller3/basicsync/syncthing/RemoteControlReceiver.kt b/app/src/main/java/com/chiller3/basicsync/syncthing/RemoteControlReceiver.kt index 94e8ac95..68e00583 100644 --- a/app/src/main/java/com/chiller3/basicsync/syncthing/RemoteControlReceiver.kt +++ b/app/src/main/java/com/chiller3/basicsync/syncthing/RemoteControlReceiver.kt @@ -20,6 +20,7 @@ class RemoteControlReceiver : BroadcastReceiver() { private const val ACTION_MANUAL_MODE = "${BuildConfig.APPLICATION_ID}.MANUAL_MODE" private const val ACTION_START = "${BuildConfig.APPLICATION_ID}.START" private const val ACTION_STOP = "${BuildConfig.APPLICATION_ID}.STOP" + private const val ACTION_REQUEST_STATE = "${BuildConfig.APPLICATION_ID}.REQUEST_STATE" } override fun onReceive(context: Context, intent: Intent?) { @@ -33,6 +34,7 @@ class RemoteControlReceiver : BroadcastReceiver() { ACTION_MANUAL_MODE -> SyncthingService.ACTION_MANUAL_MODE ACTION_START -> SyncthingService.ACTION_START ACTION_STOP -> SyncthingService.ACTION_STOP + ACTION_REQUEST_STATE -> SyncthingService.ACTION_RENOTIFY else -> { Log.w(TAG, "Ignoring unrecognized intent: $intent") return diff --git a/app/src/main/java/com/chiller3/basicsync/syncthing/SyncthingService.kt b/app/src/main/java/com/chiller3/basicsync/syncthing/SyncthingService.kt index 144635e3..03131baf 100644 --- a/app/src/main/java/com/chiller3/basicsync/syncthing/SyncthingService.kt +++ b/app/src/main/java/com/chiller3/basicsync/syncthing/SyncthingService.kt @@ -23,6 +23,7 @@ import androidx.annotation.GuardedBy import androidx.annotation.WorkerThread import androidx.core.app.ServiceCompat import androidx.core.net.toUri +import com.chiller3.basicsync.BuildConfig import com.chiller3.basicsync.Notifications import com.chiller3.basicsync.Permissions import com.chiller3.basicsync.Preferences @@ -64,6 +65,13 @@ class SyncthingService : Service(), SyncthingStatusReceiver, DeviceStateListener val ACTION_RECHECK = "${SyncthingService::class.java.canonicalName}.restart" val ACTION_EXIT = "${SyncthingService::class.java.canonicalName}.exit" + private const val BROADCAST_ACTION = "${BuildConfig.APPLICATION_ID}.STATE_CHANGED" + private const val BROADCAST_MODE = "mode" + private const val BROADCAST_MODE_AUTO_MODE = "AUTO_MODE" + private const val BROADCAST_MODE_MANUAL_MODE_STARTED = "MANUAL_MODE_STARTED" + private const val BROADCAST_MODE_MANUAL_MODE_STOPPED = "MANUAL_MODE_STOPPED" + private const val BROADCAST_RUN_STATE = "run_state" + private val isRunningListeners = HashSet() private var isRunning: Boolean = false set(value) { @@ -150,7 +158,6 @@ class SyncthingService : Service(), SyncthingStatusReceiver, DeviceStateListener PAUSED, STARTING, STOPPING, - PAUSING, IMPORTING, EXPORTING; @@ -164,7 +171,7 @@ class SyncthingService : Service(), SyncthingStatusReceiver, DeviceStateListener get() = this == NOT_RUNNING || this == PAUSED val webUiAvailable: Boolean - get() = this == RUNNING || this == PAUSED || this == PAUSING + get() = this == RUNNING || this == PAUSED } data class ServiceState( @@ -173,6 +180,7 @@ class SyncthingService : Service(), SyncthingStatusReceiver, DeviceStateListener private val isStarted: Boolean, private val isResumed: Boolean, private val manualMode: Boolean, + private val manualShouldRun: Boolean, private val allowAutoMode: Boolean, private val preRunAction: PreRunAction?, val useLocation: Boolean, @@ -188,6 +196,7 @@ class SyncthingService : Service(), SyncthingStatusReceiver, DeviceStateListener && isStarted == prev.isStarted && isResumed == prev.isResumed && manualMode == prev.manualMode + && manualShouldRun == prev.manualShouldRun && allowAutoMode == prev.allowAutoMode && preRunAction == prev.preRunAction && useLocation == prev.useLocation @@ -209,9 +218,8 @@ class SyncthingService : Service(), SyncthingStatusReceiver, DeviceStateListener if (isResumed) { if (shouldResume) { RunState.RUNNING - } else if (keepAlive) { - RunState.PAUSING } else { + // If keepAlive is true, isResumed is going to equal shouldResume. RunState.STOPPING } } else { @@ -235,6 +243,15 @@ class SyncthingService : Service(), SyncthingStatusReceiver, DeviceStateListener } } + internal val broadcastMode: String + get() = if (!manualMode) { + BROADCAST_MODE_AUTO_MODE + } else if (manualShouldRun) { + BROADCAST_MODE_MANUAL_MODE_STARTED + } else { + BROADCAST_MODE_MANUAL_MODE_STOPPED + } + val actions: List get() = ArrayList().apply { if (preRunAction == null) { @@ -663,6 +680,7 @@ class SyncthingService : Service(), SyncthingStatusReceiver, DeviceStateListener isStarted = isStarted, isResumed = isResumed, manualMode = prefs.isManualMode, + manualShouldRun = prefs.manualShouldRun, allowAutoMode = prefs.allowAutoMode, preRunAction = currentPreRunAction, useLocation = deviceStateTracker.canUseLocation(), @@ -685,6 +703,15 @@ class SyncthingService : Service(), SyncthingStatusReceiver, DeviceStateListener } if (!serviceState.equivalent(lastServiceState) || forceShowNotification) { + if (prefs.remoteControl) { + sendBroadcast( + Intent(BROADCAST_ACTION).apply { + putExtra(BROADCAST_MODE, serviceState.broadcastMode) + putExtra(BROADCAST_RUN_STATE, serviceState.runState.name) + } + ) + } + val (id, notification) = notifications.createPersistentNotification(serviceState) var type = 0 diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index fe553dae..6bff65a7 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -124,7 +124,6 @@ تم إيقاف Syncthing موقتًا جارٍ تشغيل Syncthing جارٍ إيقاف Syncthing - جارٍ إيقاف Syncthing مؤقتًا جارٍ استيراد التضبيط جارٍ تصدير التضبيط فشل تشغيل Syncthing diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index eb279f8a..e6250b7c 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -102,7 +102,6 @@ Syncthing е на пауза Syncthing се стартира Syncthing се спира - Syncthing се поставя на пауза Внасят се настройките Изнасяне на настройки Грешка при стартиране на Syncthing diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d754cd96..c48b2743 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -90,7 +90,6 @@ Syncthing ist angehalten Syncthing startet Syncthing wird gestoppt - Syncthing wird angehalten Konfiguration wird importiert Konfiguration wird exportiert Ausführen von Syncthing fehlgeschlagen diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 6f46e1cd..2e63cf0b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -93,7 +93,6 @@ Syncthing está pausado Syncthing se está iniciando Syncthing se está deteniendo - Syncthing se está pausando Importando configuración Exportando configuración No se pudo ejecutar Syncthing diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index de2c7ff1..1e2f6f0f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -102,7 +102,6 @@ Syncthing est en pause Syncthing démarre Syncthing s\'arrête - Syncthing se met en pause Importation de la configuration Exportation de la configuration Échec de l\'exécution de Syncthing diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index b773b5db..ebc80d2a 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -102,7 +102,6 @@ A Syncthing szüneteltetve A Syncthing indul A Syncthing leáll - A Syncthing szünetel Konfiguráció importálása Konfiguráció exportálása Nem sikerült a Syncthing futtatása diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 900cd487..c5c30d41 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -94,7 +94,6 @@ Syncthing dijeda Syncthing sedang dimulai Syncthing sedang dihentikan - Syncthing sedang dijeda Mengimpor konfigurasi Mengekspor konfigurasi Gagal menjalankan Syncthing diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index c06cc758..f132690f 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -136,7 +136,6 @@ Syncthing è in pausa Syncthing si sta avviando Syncthing si sta fermando - Syncthing si sta mettendo in pausa Importando configurazione Esportando configurazione Impossibile eseguire Syncthing diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 13f210dd..f9acc584 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -94,7 +94,6 @@ היישום Syncthing מופסק היישום Syncthing מתחיל היישום Syncthing עוצר - היישום Syncthing מפסיק התצורה מיובאת התצורה מיוצאת הרצת Syncthing נכשלה diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e4e142c0..78705aaf 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -23,7 +23,6 @@ Syncthingは稼働しています Syncthingを起動します Syncthingを停止します - Syncthingを休止します このアプリについて デバッグ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 8cd888ac..9b554322 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -91,7 +91,6 @@ Syncthing wstrzymano Syncthing się uruchamia Syncthing się zatrzymuje - Synchronizacja się wstrzymuje Importowanie ustawień Eksportowanie ustawień Nie udało się uruchomić Syncthing diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index d2c4d7f4..1238add8 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -136,7 +136,6 @@ O Syncthing está pausado. O Syncthing está iniciando. O Syncthing está parando. - O Syncthing está pausando. Importando configuração Exportando configuração Falha ao executar o Syncthing diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 88657160..ff6ad5c9 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -102,7 +102,6 @@ Syncthing întrerupt Syncthing pornește Syncthing se oprește - Syncthing se întrerupe Se importă configurația Se exportă configurația Syncthing nu a putut porni diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 3c62b6ef..c0436533 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -93,7 +93,6 @@ Syncthing приостановлен Syncthing запускается Syncthing останавливается - Syncthing приостанавливается Закреплённое уведомление после запуска Закреплённое уведомление после остановки Уведомления об ошибках diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 29c123e6..1cd25df4 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -94,7 +94,6 @@ Syncthing duraklatıldı Syncthing başlatılıyor Syncthing durduruluyor - Syncthing duraklatılıyor Yapılandırma içe aktarılıyor Yapılandırma dışa aktarılıyor Syncthing\'i çalıştırma başarısız oldu diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index af282bd7..35bd946d 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -131,7 +131,6 @@ Syncthing призупинено Syncthing запускається Syncthing зупиняється - Syncthing призупиняється Імпорт параметрів Експорт параметрів Не вдалося запустити Syncthing diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 8336956e..ee8aaacf 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -95,7 +95,6 @@ Syncthing 已暂停 Syncthing 正在启动 Syncthing 正在停止 - Syncthing 正在暂停 正在导入配置 正在导出配置 无法运行 Syncthing diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 81ea4035..167aeeb3 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -102,7 +102,6 @@ Syncthing 已暫停 Syncthing 正在啟動 Syncthing 正在停止 - Syncthing 正在暫停 正在匯入組態 正在匯出組態 Syncthing 執行失敗 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 75c3fb8f..02c55ff3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -280,8 +280,6 @@ Syncthing is starting Syncthing is stopping - - Syncthing is pausing Importing configuration