From ff214eb3d28134579b11b142535412eea3eebebb Mon Sep 17 00:00:00 2001 From: Omni Devel Date: Wed, 24 Jun 2026 20:11:19 +0300 Subject: [PATCH] refactor: updated sync with WearOS logic --- mobile/build.gradle.kts | 2 +- .../java/ru/omni_devel/cards/MainActivity.kt | 15 ++++++++----- .../main/java/ru/omni_devel/cards/Utils.kt | 18 +++++++++++---- wear/build.gradle.kts | 3 ++- .../cards/presentation/MainActivity.kt | 12 +++++++++- .../cards/presentation/MessagesReciever.kt | 22 ++++++++++++++----- 6 files changed, 54 insertions(+), 18 deletions(-) diff --git a/mobile/build.gradle.kts b/mobile/build.gradle.kts index a97c5b8..de017bd 100644 --- a/mobile/build.gradle.kts +++ b/mobile/build.gradle.kts @@ -23,7 +23,7 @@ android { minSdk = 30 targetSdk = 36 versionCode = generateVersionCode() - versionName = "4.2.1" + versionName = "4.3.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/mobile/src/main/java/ru/omni_devel/cards/MainActivity.kt b/mobile/src/main/java/ru/omni_devel/cards/MainActivity.kt index 62ef091..d336d68 100644 --- a/mobile/src/main/java/ru/omni_devel/cards/MainActivity.kt +++ b/mobile/src/main/java/ru/omni_devel/cards/MainActivity.kt @@ -76,6 +76,8 @@ class MainActivity : ComponentActivity() { cards.clear() cards.addAll(db.getCards()) + + syncCardsWithWatch(this, db.getCards()) } } @@ -114,12 +116,13 @@ fun MainPage( NavigationPageData(stringResource(R.string.do_add_card), Icons.Outlined.Add, EditCardActivity::class.java), NavigationPageData(stringResource(R.string.do_sync), Icons.Outlined.Sync) { Toast.makeText(context, context.getString(R.string.sync_in_progress), Toast.LENGTH_SHORT).show() - sendToWatch(context, "/updateCards", Json.encodeToString(getDbFun().getCards())) { isSuccess -> - if (isSuccess) { - Toast.makeText(context, context.getString(R.string.sync_is_successful), Toast.LENGTH_SHORT).show() - } else { - Toast.makeText(context, context.getString(R.string.sync_is_fail), Toast.LENGTH_LONG).show() - } + + val isSuccess = syncCardsWithWatch(context, getDbFun().getCards()) + + if (isSuccess) { + Toast.makeText(context, context.getString(R.string.sync_is_successful), Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(context, context.getString(R.string.sync_is_fail), Toast.LENGTH_LONG).show() } }, NavigationPageData(stringResource(R.string.open_backup_menu), Icons.Outlined.Backup, BackupActivity::class.java), diff --git a/mobile/src/main/java/ru/omni_devel/cards/Utils.kt b/mobile/src/main/java/ru/omni_devel/cards/Utils.kt index 3c952d0..bbf2d37 100644 --- a/mobile/src/main/java/ru/omni_devel/cards/Utils.kt +++ b/mobile/src/main/java/ru/omni_devel/cards/Utils.kt @@ -14,7 +14,9 @@ import com.journeyapps.barcodescanner.BarcodeEncoder import org.json.JSONObject import java.io.ByteArrayOutputStream import android.util.Base64 +import android.widget.Toast import androidx.compose.ui.graphics.asImageBitmap +import kotlinx.serialization.json.Json fun generateCode(value: String, format: BarcodeFormat): Bitmap { val writer = MultiFormatWriter() @@ -33,12 +35,14 @@ fun generateCode(value: String, format: BarcodeFormat): Bitmap { return BarcodeEncoder().createBitmap(matrix) } -fun sendToWatch(context: Context, path: String, message: String, onResult: (Boolean) -> Unit) { +fun sendToWatch(context: Context, path: String, message: String): Boolean { val nodeClient = Wearable.getNodeClient(context) + var isSuccess = false + nodeClient.connectedNodes.addOnSuccessListener { nodes -> if (nodes.isEmpty()) { - onResult(false) + isSuccess = false return@addOnSuccessListener } @@ -59,13 +63,19 @@ fun sendToWatch(context: Context, path: String, message: String, onResult: (Bool } if (completedCount == nodes.size) { - onResult(isAnySuccess) + isSuccess = isAnySuccess } }.addOnFailureListener(context.mainExecutor) { - onResult(false) + isSuccess = false } } } + + return isSuccess +} + +fun syncCardsWithWatch(context: Context, cards: List): Boolean { + return sendToWatch(context, "/updateCards", Json.encodeToString(cards)) } fun checkCardData(name: String, value: String): Int? { diff --git a/wear/build.gradle.kts b/wear/build.gradle.kts index 8b9336a..63a0512 100644 --- a/wear/build.gradle.kts +++ b/wear/build.gradle.kts @@ -23,7 +23,7 @@ android { minSdk = 30 targetSdk = 36 versionCode = generateVersionCode() - versionName = "3.2.0" + versionName = "3.3.0" } buildTypes { @@ -72,4 +72,5 @@ dependencies { implementation(libs.material) implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0") implementation("androidx.compose.material:material-icons-extended") + implementation("androidx.lifecycle:lifecycle-process:2.8.7") } \ No newline at end of file diff --git a/wear/src/main/java/ru/omni_devel/cards/presentation/MainActivity.kt b/wear/src/main/java/ru/omni_devel/cards/presentation/MainActivity.kt index 6f1f8aa..4fdc573 100644 --- a/wear/src/main/java/ru/omni_devel/cards/presentation/MainActivity.kt +++ b/wear/src/main/java/ru/omni_devel/cards/presentation/MainActivity.kt @@ -11,6 +11,7 @@ import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -22,16 +23,25 @@ import ru.omni_devel.cards.R class MainActivity : ComponentActivity() { private lateinit var db: DbHelper + private val cardsState = mutableStateOf>(emptyList()) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) db = DbHelper(this, null) + cardsState.value = db.getCards() + setContent { - App(db.getCards()) + App(cardsState.value) } } + + override fun onResume() { + super.onResume() + + cardsState.value = db.getCards() + } } @SuppressLint("UnusedBoxWithConstraintsScope") diff --git a/wear/src/main/java/ru/omni_devel/cards/presentation/MessagesReciever.kt b/wear/src/main/java/ru/omni_devel/cards/presentation/MessagesReciever.kt index 9b655b3..4e57147 100644 --- a/wear/src/main/java/ru/omni_devel/cards/presentation/MessagesReciever.kt +++ b/wear/src/main/java/ru/omni_devel/cards/presentation/MessagesReciever.kt @@ -8,6 +8,8 @@ import com.google.android.gms.wearable.MessageEvent import com.google.android.gms.wearable.WearableListenerService import kotlinx.serialization.json.Json import ru.omni_devel.cards.R +import androidx.lifecycle.ProcessLifecycleOwner +import androidx.lifecycle.Lifecycle class MessagesReceiver : WearableListenerService() { private lateinit var db: DbHelper @@ -28,13 +30,23 @@ class MessagesReceiver : WearableListenerService() { db.clearDatabase() db.addCards(cards) - Handler(Looper.getMainLooper()).post { - Toast.makeText(this, this.getString(R.string.sync_is_successful), Toast.LENGTH_SHORT).show() + val isAppInForeground = ProcessLifecycleOwner.get().lifecycle.currentState.isAtLeast( + Lifecycle.State.STARTED + ) - val intent = Intent(this, MainActivity::class.java).apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP + if (isAppInForeground) { + Handler(Looper.getMainLooper()).post { + Toast.makeText( + this, + this.getString(R.string.sync_is_successful), + Toast.LENGTH_SHORT + ).show() + + val intent = Intent(this, MainActivity::class.java).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP + } + startActivity(intent) } - startActivity(intent) } } }