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