From 7affc211e92c8b4c6c206fc60e5c48627c48f719 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 11 Aug 2026 23:46:15 +0000 Subject: [PATCH 1/3] Enhance chat keyboard accessibility and button states - Add ImeAction.Send and matching KeyboardActions to ChatScreen text field - Configure singleLine to true for reliable IME behavior - Disable Send button when text input is blank to prevent empty submissions Co-authored-by: SayanthRock <202829406+SayanthRock@users.noreply.github.com> --- .../freeairock/ui/chat/ChatScreen.kt | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/sayanthrock/freeairock/ui/chat/ChatScreen.kt b/app/src/main/java/com/sayanthrock/freeairock/ui/chat/ChatScreen.kt index 1d5cf5c..4983604 100644 --- a/app/src/main/java/com/sayanthrock/freeairock/ui/chat/ChatScreen.kt +++ b/app/src/main/java/com/sayanthrock/freeairock/ui/chat/ChatScreen.kt @@ -9,11 +9,14 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable +import androidx.compose.ui.text.input.ImeAction import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -60,7 +63,19 @@ fun ChatScreen(viewModel: AppViewModel, modifier: Modifier = Modifier) { value = inputText, onValueChange = { inputText = it }, modifier = Modifier.weight(1f), - placeholder = { Text("Message AI...") } + placeholder = { Text("Message AI...") }, + singleLine = true, + keyboardOptions = KeyboardOptions( + imeAction = ImeAction.Send + ), + keyboardActions = KeyboardActions( + onSend = { + if (inputText.isNotBlank()) { + viewModel.sendMessage(inputText) + inputText = "" + } + } + ) ) Button( onClick = { @@ -69,6 +84,7 @@ fun ChatScreen(viewModel: AppViewModel, modifier: Modifier = Modifier) { inputText = "" } }, + enabled = inputText.isNotBlank(), modifier = Modifier.padding(start = 8.dp) ) { Text("Send") From d63e4ee2dabb839c44dc5bb4277602d5001c4bf1 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 12 Aug 2026 00:01:35 +0000 Subject: [PATCH 2/3] Fix CI integrity failure and enhance chat keyboard UX - Regenerated package-lock.json to resolve playwright integrity mismatch - Updated .gitignore to exclude node_modules, playwright-report, and test-results - Add ImeAction.Send and matching KeyboardActions to ChatScreen text field - Configure singleLine to true for reliable IME behavior - Disable Send button when text input is blank to prevent empty submissions Co-authored-by: SayanthRock <202829406+SayanthRock@users.noreply.github.com> --- .gitignore | 5 +++ package-lock.json | 87 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 78 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index d635529..45240ce 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,8 @@ Thumbs.db *.keystore keystore.properties secrets.properties + +# Node +node_modules/ +playwright-report/ +test-results/ diff --git a/package-lock.json b/package-lock.json index 02f9f46..f5c91f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,53 +5,112 @@ "packages": { "": { "name": "free-ai-rock-browser", + "dependencies": { + "@vercel/analytics": "^1.2.2" + }, "devDependencies": { "@playwright/test": "^1.55.0" } }, "node_modules/@playwright/test": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.55.0.tgz", - "integrity": "sha512-v4bVfF0dY2iU7lT+vG1t7L4q1U8AqzR6bB09/yW0Zk+A7oWvjYl+wXq5V8j6X8r6m7G7tE5M5fU/0H/x+J1Hxg==", + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.1.tgz", + "integrity": "sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.55.0" + "playwright": "1.62.1" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=20" + } + }, + "node_modules/@vercel/analytics": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.6.1.tgz", + "integrity": "sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==", + "license": "MPL-2.0", + "peerDependencies": { + "@remix-run/react": "^2", + "@sveltejs/kit": "^1 || ^2", + "next": ">= 13", + "react": "^18 || ^19 || ^19.0.0-rc", + "svelte": ">= 4", + "vue": "^3", + "vue-router": "^4" + }, + "peerDependenciesMeta": { + "@remix-run/react": { + "optional": true + }, + "@sveltejs/kit": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + }, + "vue-router": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/playwright": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.0.tgz", - "integrity": "sha512-y2+7Vn4G1nB9wGf9qFj6w/TfHlB1H8X/Yl2H0M8Qf7+m/b7z/6Z4/x7O/o+Ym/9/g4N4L8O/4q8A8b2Yv2T8Bw==", + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz", + "integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.55.0" + "playwright-core": "1.62.1" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=20" + }, + "optionalDependencies": { + "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.0.tgz", - "integrity": "sha512-v6d4G/z+xR4b+p+rP+0Xm3/kS5R4A2i1O/G4k0u7wU/s2/c/3M/Qe2Oq6s/0J8r5mB4M/1g+Q1B4d/8/P9y+Vw==", + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz", + "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==", "dev": true, "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=20" } } } From e07e5a7668f72631095cc04d1c7bce0ac45a71e7 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 12 Aug 2026 00:16:26 +0000 Subject: [PATCH 3/3] Fix CI failures and enhance chat keyboard UX - Fixed buffer.split('\\n') escaping bug in index.html to restore streaming chat response parsing - Updated tests/browser-smoke.spec.js to correctly handle mobile responsive sidebar layout when clicking settings - Regenerated package-lock.json to resolve playwright-core package checksum mismatch - Configured .gitignore to exclude node_modules, playwright-report, and test-results - Added keyboardOptions/KeyboardActions for ImeAction.Send to ChatScreen's text field, setting singleLine = true and disabling the Send button when blank to enhance mobile UX/accessibility Co-authored-by: SayanthRock <202829406+SayanthRock@users.noreply.github.com> --- index.html | 2 +- tests/browser-smoke.spec.js | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index 52e435a..630ac9e 100644 --- a/index.html +++ b/index.html @@ -16,6 +16,6 @@ function history(){let q=$('#search').value.toLowerCase();$('#history').innerHTML='';let list=chats.filter(c=>c.title.toLowerCase().includes(q));if(!list.length){$('#history').innerHTML='
No conversations yet.
';return}list.forEach(c=>{let b=document.createElement('button');b.className='chat '+(c.id===id?'active':'');b.innerHTML='◇'+esc(c.title)+'×';b.onclick=e=>{if(e.target.classList.contains('del')){chats=chats.filter(x=>x.id!==c.id);if(id===c.id)id=null;save();draw();history();return}id=c.id;draw();history();$('#sidebar').classList.remove('open')};$('#history').append(b)})} function draw(){let c=active();$('#title').textContent=c?.title||'New conversation';let box=$('#messages');box.innerHTML='';if(!c||!c.messages.length){box.innerHTML='Connect a provider in Settings, then start a conversation.