Skip to content

Commit 874c02c

Browse files
authored
Merge pull request #131 from powersync-ja/bucket-priorities-example
Adopt bucket priorities in android example
2 parents 0e9ffcc + 2874451 commit 874c02c

File tree

18 files changed

+62
-57
lines changed

18 files changed

+62
-57
lines changed

core/src/commonIntegrationTest/kotlin/com/powersync/SyncIntegrationTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ class SyncIntegrationTest {
177177
),
178178
)
179179

180-
turbine.waitFor { it.priorityStatusFor(priority).hasSynced == true }
180+
turbine.waitFor { it.statusForPriority(priority).hasSynced == true }
181181
expectUserCount(priorityNo + 1)
182182
}
183183

@@ -224,7 +224,7 @@ class SyncIntegrationTest {
224224
// Connect to the same database again
225225
database = openDb()
226226
assertFalse { database.currentStatus.hasSynced == true }
227-
assertTrue { database.currentStatus.priorityStatusFor(BucketPriority(1)).hasSynced == true }
227+
assertTrue { database.currentStatus.statusForPriority(BucketPriority(1)).hasSynced == true }
228228
database.close()
229229
syncLines.close()
230230
}

core/src/commonMain/kotlin/com/powersync/db/PowerSyncDatabaseImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ internal class PowerSyncDatabaseImpl(
342342
if (priority == null) {
343343
{ it.hasSynced == true }
344344
} else {
345-
{ it.priorityStatusFor(priority).hasSynced == true }
345+
{ it.statusForPriority(priority).hasSynced == true }
346346
}
347347

348348
if (predicate(currentStatus)) {

core/src/commonMain/kotlin/com/powersync/sync/SyncStatus.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public interface SyncStatusData {
8585
/**
8686
* Status information for whether buckets in [priority] have been synchronized.
8787
*/
88-
public fun priorityStatusFor(priority: BucketPriority): PriorityStatusEntry {
88+
public fun statusForPriority(priority: BucketPriority): PriorityStatusEntry {
8989
val byDescendingPriorities = priorityStatusEntries.sortedByDescending { it.priority }
9090

9191
for (entry in byDescendingPriorities) {

core/src/commonTest/kotlin/com/powersync/sync/SyncStreamTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ class SyncStreamTest {
286286
),
287287
)
288288

289-
turbine.waitFor { it.priorityStatusFor(priority).hasSynced == true }
289+
turbine.waitFor { it.statusForPriority(priority).hasSynced == true }
290290

291291
verifySuspend(order) {
292292
if (priorityNo == 0) {

demos/android-supabase-todolist/app/src/main/java/com/powersync/androidexample/App.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ fun App() {
3939
}
4040
val db = remember { PowerSyncDatabase(driverFactory, schema) }
4141
val syncStatus = db.currentStatus
42-
val status = syncStatus.asFlow().collectAsState(initial = null)
42+
val status by syncStatus.asFlow().collectAsState(syncStatus)
4343

4444
val navController = remember { NavController(Screen.Home) }
4545
val authViewModel = remember {
@@ -87,7 +87,7 @@ fun App() {
8787
HomeScreen(
8888
modifier = Modifier.fillMaxSize().background(MaterialTheme.colorScheme.background),
8989
items = items,
90-
isConnected = status.value?.connected,
90+
status = status,
9191
onSignOutSelected = { handleSignOut() },
9292
inputText = listsInputText,
9393
onItemClicked = handleOnItemClicked,
@@ -106,7 +106,7 @@ fun App() {
106106
modifier = Modifier.fillMaxSize().background(MaterialTheme.colorScheme.background),
107107
navController = navController,
108108
items = todoItems,
109-
isConnected = status.value?.connected,
109+
isConnected = status.connected,
110110
inputText = todosInputText,
111111
onItemClicked = todos.value::onItemClicked,
112112
onItemDoneChanged = todos.value::onItemDoneChanged,

demos/android-supabase-todolist/app/src/main/java/com/powersync/androidexample/screens/HomeScreen.kt

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,28 @@ import androidx.compose.runtime.Composable
1313
import androidx.compose.ui.Modifier
1414
import androidx.compose.ui.text.style.TextAlign
1515
import androidx.compose.ui.unit.dp
16+
import com.powersync.bucket.BucketPriority
1617
import com.powersync.demos.Screen
1718
import com.powersync.demos.components.Input
1819
import com.powersync.demos.components.ListContent
1920
import com.powersync.demos.components.Menu
2021
import com.powersync.demos.components.WifiIcon
2122
import com.powersync.demos.powersync.ListItem
23+
import com.powersync.sync.SyncStatusData
2224

2325
@OptIn(ExperimentalMaterial3Api::class)
2426
@Composable
2527
internal fun HomeScreen(
2628
modifier: Modifier = Modifier,
2729
items: List<ListItem>,
2830
inputText: String,
29-
isConnected: Boolean?,
31+
status: SyncStatusData,
3032
onSignOutSelected: () -> Unit,
3133
onItemClicked: (item: ListItem) -> Unit,
3234
onItemDeleteClicked: (item: ListItem) -> Unit,
3335
onAddItemClicked: () -> Unit,
3436
onInputTextChanged: (value: String) -> Unit,
3537
) {
36-
3738
Column(modifier) {
3839
TopAppBar(
3940
title = {
@@ -47,7 +48,7 @@ internal fun HomeScreen(
4748
onSignOutSelected
4849
) },
4950
actions = {
50-
WifiIcon(isConnected ?: false)
51+
WifiIcon(status.connected)
5152
Spacer(modifier = Modifier.width(16.dp))
5253
}
5354
)
@@ -60,11 +61,20 @@ internal fun HomeScreen(
6061
)
6162

6263
Box(Modifier.weight(1F)) {
63-
ListContent(
64-
items = items,
65-
onItemClicked = onItemClicked,
66-
onItemDeleteClicked = onItemDeleteClicked
67-
)
64+
// This assumes that the bucket for lists has a priority of 1 (but it will work fine
65+
// with sync rules not defining any priorities at all too).
66+
// When giving lists a higher priority than items, we can have a consistent snapshot of
67+
// lists without items. In the case where many items exist (that might take longer to
68+
// sync initially), this allows us to display lists earlier.
69+
if (status.statusForPriority(BucketPriority(1)).hasSynced == true) {
70+
ListContent(
71+
items = items,
72+
onItemClicked = onItemClicked,
73+
onItemDeleteClicked = onItemDeleteClicked
74+
)
75+
} else {
76+
Text("Busy with sync...")
77+
}
6878
}
6979
}
7080
}

demos/supabase-todolist/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
It is a simple to-do list application demonstrating use of the PowerSync Kotlin Mutiplatform SDK together
44
with [Supabase](https://supabase.com/) in a basic Kotlin Multiplatform Compose App.
55

6-
Supported KMP targets: Android and iOS.
6+
Supported KMP targets: Android, iOS and Desktop (JVM).
77

88
## Setting up your development environment
99

demos/supabase-todolist/desktopApp/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ kotlin {
1111
sourceSets {
1212
jvmMain.dependencies {
1313
implementation(compose.desktop.currentOs)
14-
implementation(project(":shared"))
14+
implementation(projects.shared)
1515
}
1616
}
1717
}

demos/supabase-todolist/gradle/libs.versions.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ junit = "4.13.2"
1818

1919
compose = "1.6.11"
2020
compose-preview = "1.7.2"
21+
lifecycle = "2.8.2"
2122

2223
# plugins
2324
android-gradle-plugin = "8.5.1"
@@ -49,13 +50,15 @@ ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "kto
4950
ktor-client-contentnegotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" }
5051
ktor-serialization-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }
5152
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
53+
kotlinx-coroutines-swing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "coroutines" }
5254

5355
androidx-core = { group = "androidx.core", name = "core-ktx", version.ref = "androidx-core" }
5456
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "androidx-appcompat" }
5557
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity-compose" }
5658
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "androidx-espresso-core" }
5759
androidx-material = { group = "com.google.android.material", name = "material", version.ref = "androidx-material" }
5860
compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "compose-preview" }
61+
compose-lifecycle = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle" }
5962

6063
[plugins]
6164
androidApplication = { id = "com.android.application", version.ref = "android-gradle-plugin" }

demos/supabase-todolist/iosApp/iosApp.xcodeproj/project.pbxproj

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@
118118
7555FF79242A565900829871 /* Resources */,
119119
F85CB1118929364A9C6EFABC /* Frameworks */,
120120
3C5ACF3A4AAFF294B2A5839B /* [CP] Embed Pods Frameworks */,
121-
79E17356D7D971831C2A4119 /* [CP] Copy Pods Resources */,
122121
);
123122
buildRules = (
124123
);
@@ -231,23 +230,6 @@
231230
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
232231
showEnvVarsInLog = 0;
233232
};
234-
79E17356D7D971831C2A4119 /* [CP] Copy Pods Resources */ = {
235-
isa = PBXShellScriptBuildPhase;
236-
buildActionMask = 2147483647;
237-
files = (
238-
);
239-
inputFileListPaths = (
240-
"${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-resources-${CONFIGURATION}-input-files.xcfilelist",
241-
);
242-
name = "[CP] Copy Pods Resources";
243-
outputFileListPaths = (
244-
"${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-resources-${CONFIGURATION}-output-files.xcfilelist",
245-
);
246-
runOnlyForDeploymentPostprocessing = 0;
247-
shellPath = /bin/sh;
248-
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-resources.sh\"\n";
249-
showEnvVarsInLog = 0;
250-
};
251233
/* End PBXShellScriptBuildPhase section */
252234

253235
/* Begin PBXSourcesBuildPhase section */

0 commit comments

Comments
 (0)