diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7aaabf6..3bda8f3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -22,8 +22,8 @@ android { applicationId = "dev.n1ko.nikogpt" minSdk = 29 // Android 10 targetSdk = 35 - versionCode = 7 - versionName = "1.2.1" + versionCode = 8 + versionName = "1.2.2" } signingConfigs { diff --git a/app/src/main/java/dev/n1ko/nikogpt/MainActivity.kt b/app/src/main/java/dev/n1ko/nikogpt/MainActivity.kt index 9152d35..a8a1e62 100644 --- a/app/src/main/java/dev/n1ko/nikogpt/MainActivity.kt +++ b/app/src/main/java/dev/n1ko/nikogpt/MainActivity.kt @@ -80,6 +80,10 @@ class MainActivity : AppCompatActivity() { // Shared text ("Share to NikoGPT") waiting for the page to load. private var pendingShare: String? = null + // Whether the chat's inner scroll container is at the top; pull-to-refresh + // only fires there (the WebView itself never scrolls). + @Volatile + private var webAtTop = true // Where the camera writes the picture before it reaches the web app. private var pendingCameraUri: Uri? = null @@ -276,6 +280,10 @@ class MainActivity : AppCompatActivity() { }) refresh.setOnRefreshListener { webView.reload() } + // Pull-to-refresh only when the chat list is really at the top; a + // bigger trigger distance keeps normal scrolling from reloading. + refresh.setOnChildScrollUpCallback { _, _ -> !webAtTop } + refresh.setDistanceToTriggerSync((80 * resources.displayMetrics.density).toInt()) onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { @@ -352,6 +360,13 @@ class MainActivity : AppCompatActivity() { fun linkGoogle(clientId: String) { runOnUiThread { openGooglePicker(clientId, link = true) } } + + // The web app reports the message list's scroll position, so pulling + // down only refreshes when the list really is at the top. + @JavascriptInterface + fun setAtTop(atTop: Boolean) { + webAtTop = atTop + } } // openGooglePicker tries the native pickers in order: Credential Manager