From 0c4b7b1d0f5f1a751903907de96e0deb2f8184de Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Mon, 25 Aug 2025 14:38:17 +0200 Subject: [PATCH 1/6] Set correct keyboard type for password inputs. --- .../java/com/powersync/androidexample/screens/SignInScreen.kt | 2 ++ .../java/com/powersync/androidexample/screens/SignUpScreen.kt | 4 ++++ .../kotlin/com/powersync/demos/screens/SignInScreen.kt | 3 +++ .../kotlin/com/powersync/demos/screens/SignUpScreen.kt | 4 ++++ 4 files changed, 13 insertions(+) diff --git a/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignInScreen.kt b/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignInScreen.kt index 4183e38d..d36fea1f 100644 --- a/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignInScreen.kt +++ b/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignInScreen.kt @@ -1,6 +1,7 @@ package com.powersync.demos.screens import androidx.compose.foundation.layout.* +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment @@ -52,6 +53,7 @@ internal fun SignInScreen( onValueChange = { password = it }, label = { Text("Password") }, visualTransformation = PasswordVisualTransformation(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), modifier = Modifier .fillMaxWidth() .padding(bottom = 16.dp) diff --git a/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignUpScreen.kt b/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignUpScreen.kt index f51038be..01257730 100644 --- a/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignUpScreen.kt +++ b/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignUpScreen.kt @@ -1,10 +1,12 @@ package com.powersync.demos.screens import androidx.compose.foundation.layout.* +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.dp import com.powersync.demos.AuthViewModel @@ -48,6 +50,7 @@ internal fun SignUpScreen( onValueChange = { password = it }, label = { Text("Password") }, visualTransformation = PasswordVisualTransformation(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), modifier = Modifier .fillMaxWidth() .padding(bottom = 16.dp) @@ -58,6 +61,7 @@ internal fun SignUpScreen( onValueChange = { confirmPassword = it }, label = { Text("Confirm Password") }, visualTransformation = PasswordVisualTransformation(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), modifier = Modifier .fillMaxWidth() .padding(bottom = 16.dp) diff --git a/demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/SignInScreen.kt b/demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/SignInScreen.kt index 4cae23f5..b6e0b05d 100644 --- a/demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/SignInScreen.kt +++ b/demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/SignInScreen.kt @@ -1,10 +1,12 @@ package com.powersync.demos.screens import androidx.compose.foundation.layout.* +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.dp import com.powersync.demos.AuthViewModel @@ -52,6 +54,7 @@ internal fun SignInScreen( onValueChange = { password = it }, label = { Text("Password") }, visualTransformation = PasswordVisualTransformation(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), modifier = Modifier .fillMaxWidth() .padding(bottom = 16.dp) diff --git a/demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/SignUpScreen.kt b/demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/SignUpScreen.kt index cc364f73..d8403ac7 100644 --- a/demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/SignUpScreen.kt +++ b/demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/SignUpScreen.kt @@ -1,10 +1,12 @@ package com.powersync.demos.screens import androidx.compose.foundation.layout.* +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.dp import com.powersync.demos.AuthViewModel @@ -48,6 +50,7 @@ internal fun SignUpScreen( onValueChange = { password = it }, label = { Text("Password") }, visualTransformation = PasswordVisualTransformation(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), modifier = Modifier .fillMaxWidth() .padding(bottom = 16.dp) @@ -58,6 +61,7 @@ internal fun SignUpScreen( onValueChange = { confirmPassword = it }, label = { Text("Confirm Password") }, visualTransformation = PasswordVisualTransformation(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), modifier = Modifier .fillMaxWidth() .padding(bottom = 16.dp) From e1fe2b2ab7d3f72bdd0a846c3b72f6eb83a91abd Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Mon, 25 Aug 2025 14:56:30 +0200 Subject: [PATCH 2/6] Make sign-in and sign-up pages scrollable. --- .../kotlin/com/powersync/demos/screens/SignInScreen.kt | 7 ++++++- .../kotlin/com/powersync/demos/screens/SignUpScreen.kt | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/SignInScreen.kt b/demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/SignInScreen.kt index b6e0b05d..d69753bb 100644 --- a/demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/SignInScreen.kt +++ b/demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/SignInScreen.kt @@ -1,7 +1,9 @@ package com.powersync.demos.screens import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll import androidx.compose.material.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment @@ -26,13 +28,16 @@ internal fun SignInScreen( var isLoading by remember { mutableStateOf(false) } val coroutineScope = rememberCoroutineScope() + val scrollState = rememberScrollState() Column( modifier = Modifier .fillMaxSize() + .verticalScroll(scrollState) .padding(16.dp), verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, + ) { Text( "Sign In", diff --git a/demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/SignUpScreen.kt b/demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/SignUpScreen.kt index d8403ac7..0301249e 100644 --- a/demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/SignUpScreen.kt +++ b/demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/SignUpScreen.kt @@ -1,7 +1,9 @@ package com.powersync.demos.screens import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll import androidx.compose.material.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment @@ -26,10 +28,12 @@ internal fun SignUpScreen( var isLoading by remember { mutableStateOf(false) } val coroutineScope = rememberCoroutineScope() + val scrollState = rememberScrollState() Column( modifier = Modifier .fillMaxSize() + .verticalScroll(scrollState) .padding(16.dp), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally From 13c87bf6bb117e90a9c4fcd595dde322bdcedec3 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Mon, 25 Aug 2025 15:36:56 +0200 Subject: [PATCH 3/6] Fix system bar clashing with background. --- .../androidMain/kotlin/com/powersync/demos/MainActivity.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/demos/supabase-todolist/androidApp/src/androidMain/kotlin/com/powersync/demos/MainActivity.kt b/demos/supabase-todolist/androidApp/src/androidMain/kotlin/com/powersync/demos/MainActivity.kt index acef420d..548e9448 100644 --- a/demos/supabase-todolist/androidApp/src/androidMain/kotlin/com/powersync/demos/MainActivity.kt +++ b/demos/supabase-todolist/androidApp/src/androidMain/kotlin/com/powersync/demos/MainActivity.kt @@ -2,6 +2,7 @@ package com.powersync.demos import android.os.Bundle import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface @@ -11,6 +12,9 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + // Needed to render system bar properly + enableEdgeToEdge() + setContent { MaterialTheme { Surface(color = MaterialTheme.colors.background) { From f94db7e50acf41771dfcbf5ba6695ecb7a57e112 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Mon, 25 Aug 2025 15:37:21 +0200 Subject: [PATCH 4/6] Fix typo. --- demos/supabase-todolist/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/supabase-todolist/README.md b/demos/supabase-todolist/README.md index 4adbf298..3cf02b90 100644 --- a/demos/supabase-todolist/README.md +++ b/demos/supabase-todolist/README.md @@ -41,7 +41,7 @@ all items have been received. 1. Clone this repo: ```git clone https://github.com/powersync-ja/powersync-kotlin.git``` 2. Open the repo in Android Studio. This creates a `local.properties` file in root and should contain a `sdk.dir=/path/to/android/sdk` line. 3. Sync the project with Gradle (this should happen automatically, or choose File > Sync project with Gradle Files). -4. Insert your Supabase project URL, Supabase Anon Key, and PowerSync instance URL into the `demos/supabase-todlist/local.properties` file: +4. Insert your Supabase project URL, Supabase Anon Key, and PowerSync instance URL into the `demos/supabase-todolist/local.properties` file: ```bash # local.properties From fc308f2f73c1b8bc70be5643c08941b66e7b0aec Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Mon, 25 Aug 2025 15:57:23 +0200 Subject: [PATCH 5/6] Fix missing import. --- .../java/com/powersync/androidexample/screens/SignInScreen.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignInScreen.kt b/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignInScreen.kt index d36fea1f..53762e3a 100644 --- a/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignInScreen.kt +++ b/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignInScreen.kt @@ -6,6 +6,7 @@ import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.dp import com.powersync.demos.AuthViewModel From 0182256dccaa386b08e3e2c047e1c258903141b3 Mon Sep 17 00:00:00 2001 From: Ralf Kistner Date: Mon, 25 Aug 2025 17:34:13 +0200 Subject: [PATCH 6/6] Apply system bar and scrolling fixes to android-supabase-todolist. --- .../main/java/com/powersync/androidexample/MainActivity.kt | 4 ++++ .../java/com/powersync/androidexample/screens/SignInScreen.kt | 4 ++++ .../java/com/powersync/androidexample/screens/SignUpScreen.kt | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/MainActivity.kt b/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/MainActivity.kt index 7f2cef02..eed4960f 100644 --- a/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/MainActivity.kt +++ b/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/MainActivity.kt @@ -3,6 +3,7 @@ package com.powersync.androidexample import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import com.powersync.androidexample.ui.CameraService import com.powersync.demos.App @@ -15,6 +16,9 @@ class MainActivity : ComponentActivity() { super.onCreate(savedInstanceState) + // Needed to render system bar properly + enableEdgeToEdge() + setContent { App( cameraService = cameraService, diff --git a/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignInScreen.kt b/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignInScreen.kt index 53762e3a..e70e102c 100644 --- a/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignInScreen.kt +++ b/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignInScreen.kt @@ -1,7 +1,9 @@ package com.powersync.demos.screens import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment @@ -26,10 +28,12 @@ internal fun SignInScreen( var isLoading by remember { mutableStateOf(false) } val coroutineScope = rememberCoroutineScope() + val scrollState = rememberScrollState() Column( modifier = Modifier .fillMaxSize() + .verticalScroll(scrollState) .padding(16.dp), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally diff --git a/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignUpScreen.kt b/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignUpScreen.kt index 01257730..7a03f81f 100644 --- a/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignUpScreen.kt +++ b/demos/android-supabase-todolist/src/main/java/com/powersync/androidexample/screens/SignUpScreen.kt @@ -1,7 +1,9 @@ package com.powersync.demos.screens import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment @@ -26,10 +28,12 @@ internal fun SignUpScreen( var isLoading by remember { mutableStateOf(false) } val coroutineScope = rememberCoroutineScope() + val scrollState = rememberScrollState() Column( modifier = Modifier .fillMaxSize() + .verticalScroll(scrollState) .padding(16.dp), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally