Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
128 commits
Select commit Hold shift + click to select a range
59e4a04
fix: inverted navigation
OtavioStasiak Feb 26, 2026
4eb8bf2
fix: just invert list content
OtavioStasiak Feb 26, 2026
9b639da
fix: lint
OtavioStasiak Feb 26, 2026
cf4cb85
test: inverted just in the inverted
OtavioStasiak Feb 27, 2026
3f38334
fix: code
OtavioStasiak Feb 27, 2026
a33f49d
fix: invert just the flatlist content
OtavioStasiak Feb 27, 2026
4e86354
fix: switch tab
OtavioStasiak Mar 2, 2026
e3dccec
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Mar 2, 2026
32d0b75
try to reverse just the flatlist content
OtavioStasiak Mar 2, 2026
48609f2
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Mar 2, 2026
037d5c6
fix: inverted list direction
OtavioStasiak Mar 4, 2026
8886ec3
chore: format code and fix lint issues
OtavioStasiak Mar 4, 2026
c1bbde2
fix: list issues
OtavioStasiak Mar 5, 2026
4db3a04
rollback List
OtavioStasiak Mar 5, 2026
846b8ba
revert unused changes on module
OtavioStasiak Mar 5, 2026
2341565
try native module approach
OtavioStasiak Mar 5, 2026
98ea3b5
test: invert navigation
OtavioStasiak Mar 12, 2026
083f4d7
chore: format code and fix lint issues
OtavioStasiak Mar 12, 2026
bde3b23
space
OtavioStasiak Mar 12, 2026
bb3556d
fix: build
OtavioStasiak Mar 13, 2026
cdd5ef8
fix: keyboard navigation still working on different rooms
OtavioStasiak Mar 13, 2026
b07d06b
fix: last item focus
OtavioStasiak Mar 13, 2026
425187b
chore: format code and fix lint issues
OtavioStasiak Mar 13, 2026
4731276
fix: change focus
OtavioStasiak Mar 13, 2026
311cddc
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Mar 14, 2026
0c311b2
fix: lint
OtavioStasiak Mar 16, 2026
b591ecf
fix: merge issues
OtavioStasiak Mar 18, 2026
ec27cc9
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Mar 18, 2026
8064b66
fix: lint
OtavioStasiak Mar 18, 2026
f4b730e
chore: format code and fix lint issues
OtavioStasiak Mar 18, 2026
4b51b7c
rollback focus change
OtavioStasiak Mar 19, 2026
b87b186
focus inside of roomView!
OtavioStasiak Mar 19, 2026
f4c87c2
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Mar 19, 2026
e546f31
rollback: useScrollContainer
OtavioStasiak Mar 20, 2026
4d25dd3
test: use a RNLike scrolview
OtavioStasiak Mar 20, 2026
2ecf157
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Mar 25, 2026
a2abc14
fix: Pressable issues
OtavioStasiak Mar 19, 2026
0b051b1
fix: tests
OtavioStasiak Mar 19, 2026
3fee8cf
use rectButton
OtavioStasiak Mar 24, 2026
e728b66
update snapshot
OtavioStasiak Mar 24, 2026
4098eed
fix: unit tests
OtavioStasiak Mar 25, 2026
5fae357
fix: use Pressable to able to focus on iOS and keep it working on tru…
OtavioStasiak Mar 25, 2026
0907cc1
chore: install react-native-external-keyboard
OtavioStasiak Mar 25, 2026
e45b714
fix: focus on thread and reactions
OtavioStasiak Mar 25, 2026
9cf9ad0
feat: onThreadPress to open threads on keyboard
OtavioStasiak Mar 25, 2026
506ee19
feat: usePressable gh
OtavioStasiak Mar 26, 2026
7f3c952
fix: gesture handler iOS focusable on keyboard
OtavioStasiak Mar 26, 2026
ac854d3
fix: patch package cleanup
OtavioStasiak Mar 26, 2026
ef439b8
fix: improve switch navigation
OtavioStasiak Mar 26, 2026
6f21bba
fix: tests
OtavioStasiak Mar 26, 2026
bfb8ed9
fix: test
OtavioStasiak Mar 26, 2026
7d677c6
fix: tests
OtavioStasiak Mar 27, 2026
20f1775
fix: snapshot test
OtavioStasiak Mar 27, 2026
a80cc11
fix: tests
OtavioStasiak Mar 30, 2026
2120d83
fix: snapshot
OtavioStasiak Mar 30, 2026
a06b1f8
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Mar 31, 2026
2c479dd
rollback
OtavioStasiak Mar 31, 2026
42ac2c4
fix: test
OtavioStasiak Mar 31, 2026
df941b2
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Apr 7, 2026
84b72ca
fix: snapshot test
OtavioStasiak Apr 7, 2026
198f603
fix: lint
OtavioStasiak Apr 7, 2026
f1e6ccb
fix: podfile
OtavioStasiak Apr 7, 2026
86b25f2
fix: lock
OtavioStasiak Apr 7, 2026
b8b7de4
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Apr 7, 2026
fc07e79
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Apr 7, 2026
155dd89
fix: e2e tests
OtavioStasiak Apr 7, 2026
c96d3fb
fix: tests
OtavioStasiak Apr 8, 2026
b0fc731
fix: i18n
OtavioStasiak Apr 8, 2026
4cdce84
chore: add commentsto reference invertedScrollView references
OtavioStasiak Apr 8, 2026
9cf4516
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Apr 9, 2026
3939687
chore: rename archive
OtavioStasiak Apr 13, 2026
284bc80
fix: remove fowardref
OtavioStasiak Apr 13, 2026
0b17432
fix: remove fowardref
OtavioStasiak Apr 13, 2026
20f5abe
remove focusOnOpen
OtavioStasiak Apr 13, 2026
c7fe93c
rename invertedScrollViewAdapter
OtavioStasiak Apr 13, 2026
a30f780
fix: code issues
OtavioStasiak Apr 13, 2026
2978366
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Apr 13, 2026
bc935c4
simplify invertedScrollViewAdapter
OtavioStasiak Apr 13, 2026
535d0f8
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Apr 13, 2026
84c3c2c
fix: snapshot
OtavioStasiak Apr 13, 2026
53ea502
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Apr 14, 2026
3c94b3b
fix: imports
OtavioStasiak Apr 14, 2026
a096bec
code improvements
OtavioStasiak Apr 14, 2026
d86e019
chore: keyboard navigation test
OtavioStasiak Apr 14, 2026
9f257b4
feat: e2e tests batch
OtavioStasiak Apr 14, 2026
75f5617
feat: e2e tests batch
OtavioStasiak Apr 14, 2026
1d487f6
fix: test
OtavioStasiak Apr 14, 2026
d8fb717
chore: keyboard-natigation-room test
OtavioStasiak Apr 15, 2026
ef0eb01
device with keyboard navigation
OtavioStasiak Apr 15, 2026
5f64531
rollback changs and fix test run on CI
OtavioStasiak Apr 15, 2026
ef36528
ci(security): pin android-emulator-runner GitHub Action by SHA
OtavioStasiak Apr 15, 2026
1cbaf15
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Apr 15, 2026
a2df8cc
fix: maestro running
OtavioStasiak Apr 15, 2026
69c4041
external input module
OtavioStasiak Apr 15, 2026
fb14cda
fix: toolbar
OtavioStasiak Apr 15, 2026
2ee3b49
fix: tests
OtavioStasiak Apr 15, 2026
686da41
fix: snapshot
OtavioStasiak Apr 15, 2026
7e7b835
fix: android keyboard build on gh actions
OtavioStasiak Apr 16, 2026
02ec0fd
fix: test
OtavioStasiak Apr 16, 2026
164c0d9
fix: unit test
OtavioStasiak Apr 16, 2026
18baad5
chore: code improvements
OtavioStasiak Apr 16, 2026
2b006e9
fix: test
OtavioStasiak Apr 16, 2026
0f84696
improve tests
OtavioStasiak Apr 16, 2026
abb798d
fix: snapshot
OtavioStasiak Apr 16, 2026
68d45a8
fix: e2e tests
OtavioStasiak Apr 17, 2026
9fee021
fix: test
OtavioStasiak Apr 22, 2026
fe1affb
code improvements
OtavioStasiak Apr 22, 2026
e23279f
usememo
OtavioStasiak Apr 22, 2026
25f78ea
rollback mainActivity
OtavioStasiak Apr 22, 2026
31d37c4
rollback mainActivity
OtavioStasiak Apr 22, 2026
347950c
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Apr 22, 2026
97b8c32
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Apr 23, 2026
144811b
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Apr 23, 2026
aafe576
fix: e2e tests
OtavioStasiak Apr 23, 2026
adcf4fd
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Apr 23, 2026
3ed3d2b
fix: keyboard test
OtavioStasiak Apr 23, 2026
ddec498
fix: tests
OtavioStasiak Apr 23, 2026
7633486
fix: autofocus
OtavioStasiak Apr 24, 2026
1acc3d1
replace requireNativeComponent
OtavioStasiak Apr 24, 2026
2feac68
Merge branch 'develop' into fix.android-inverted-keyboard-navigation
OtavioStasiak Apr 24, 2026
160dfa7
fix: tests
OtavioStasiak Apr 24, 2026
e733aa4
fix: tests
OtavioStasiak Apr 24, 2026
bcd1acb
collapse children
OtavioStasiak Apr 24, 2026
fb23540
fix(android): prevent inverted scroll content view from consuming taps
OtavioStasiak Apr 24, 2026
afa078d
oly use customScrollview if has screenReader of keyboard enabled
OtavioStasiak Apr 24, 2026
7e15509
fix: path
OtavioStasiak Apr 24, 2026
458d783
fix: focus dev mode
OtavioStasiak Apr 27, 2026
ad95220
bump patch package
OtavioStasiak Apr 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ jobs:
secrets: inherit
strategy:
matrix:
shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
fail-fast: false
with:
shard: ${{ matrix.shard }}
Expand Down
79 changes: 77 additions & 2 deletions .github/workflows/maestro-android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ jobs:
runs-on: ubuntu-latest
env:
MAESTRO_VERSION: 2.2.0
ANDROID_AVD_HOME: /home/runner/.android/avd

steps:
- name: Checkout Repository
Expand Down Expand Up @@ -67,8 +68,82 @@ jobs:
- name: Make Maestro script executable
run: chmod +x .github/scripts/run-maestro.sh

- name: Start Android Emulator and Run Maestro Tests
uses: reactivecircus/android-emulator-runner@v2
- name: Create Keyboard-enabled AVD (shard 14)
if: ${{ inputs.shard == '14' }}
run: |
set -eux

ANDROID_SDK="${ANDROID_HOME:-${ANDROID_SDK_ROOT:-/usr/local/lib/android/sdk}}"
SDKMANAGER="$ANDROID_SDK/cmdline-tools/latest/bin/sdkmanager"
AVDMANAGER="$ANDROID_SDK/cmdline-tools/latest/bin/avdmanager"
AVD_NAME="Pixel_API_34_Keyboard"
IMAGE="system-images;android-34;google_apis;x86_64"
AVD_BASE="$ANDROID_AVD_HOME"
AVD_INI="$AVD_BASE/${AVD_NAME}.ini"

mkdir -p "$AVD_BASE"
rm -rf "$AVD_BASE/${AVD_NAME}.avd" "$AVD_INI"

"$SDKMANAGER" --install emulator "$IMAGE"
yes | "$SDKMANAGER" --licenses > /dev/null || true

echo "no" | "$AVDMANAGER" create avd -n "$AVD_NAME" -d pixel_7_pro --package "$IMAGE" --force

if [ ! -f "$AVD_INI" ]; then
echo "Expected AVD ini not found: $AVD_INI"
echo "--- avdmanager list avd ---"
"$AVDMANAGER" list avd || true
echo "--- ls AVD_BASE ---"
ls -la "$AVD_BASE" || true
exit 1
fi

AVD_PATH="$(sed -n 's/^path=//p' "$AVD_INI")"
if [ -z "$AVD_PATH" ]; then
echo "Could not resolve AVD path from: $AVD_INI"
cat "$AVD_INI"
exit 1
fi

AVD_CONFIG="$AVD_PATH/config.ini"
if [ ! -f "$AVD_CONFIG" ]; then
echo "Expected AVD config not found: $AVD_CONFIG"
ls -la "$AVD_BASE" || true
ls -la "$AVD_PATH" || true
exit 1
fi

{
echo "hw.keyboard=yes"
echo "hw.keyboard.lid=no"
echo "hw.lcd.density=440"
echo "hw.lcd.height=2280"
echo "hw.lcd.width=1080"
} >> "$AVD_CONFIG"

echo "$AVD_NAME created with physical keyboard support"

- name: Start Android Emulator and Run Maestro Tests (keyboard AVD)
if: ${{ inputs.shard == '14' }}
uses: reactivecircus/android-emulator-runner@e89f39f1abbbd05b1113a29cf4db69e7540cae5a # v2.37.0
timeout-minutes: 60
with:
api-level: 34
disk-size: 4096M
arch: x86_64
target: google_apis
avd-name: Pixel_API_34_Keyboard
cores: 4
ram-size: 4096M
force-avd-creation: false
disable-animations: true
emulator-boot-timeout: 900
emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -accel on
script: ./.github/scripts/run-maestro.sh android ${{ inputs.shard }}

- name: Start Android Emulator and Run Maestro Tests (default)
if: ${{ inputs.shard != '14' }}
uses: reactivecircus/android-emulator-runner@e89f39f1abbbd05b1113a29cf4db69e7540cae5a # v2.37.0
timeout-minutes: 60
with:
api-level: 34
Expand Down
117 changes: 117 additions & 0 deletions .maestro/tests/keyboardNavigation/keyboard-navigation-components.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
appId: chat.rocket.reactnative
name: Keyboard Navigation Components
onFlowStart:
- runFlow: '../../helpers/setup.yaml'
onFlowComplete:
- evalScript: ${output.utils.deleteCreatedUsers()}
tags:
- test-14
- android-only

---
- evalScript: ${output.user = output.utils.createUser()}

- runFlow:
file: '../../helpers/login-with-deeplink.yaml'
env:
USERNAME: ${output.user.username}
PASSWORD: ${output.user.password}

# open Accessibility & appearance
- extendedWaitUntil:
visible:
text: 'Save your encryption password'
timeout: 60000
- pressKey: enter
- extendedWaitUntil:
visible:
text: 'Accessibility & Appearance'
timeout: 60000
- pressKey: Remote Dpad Left
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: enter

# switches
- extendedWaitUntil:
visible:
text: 'Theme'
timeout: 60000
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Up
- assertVisible:
text: 'Mentions with @ symbol unchecked'
- pressKey: enter
- assertVisible:
text: 'Mentions with @ symbol checked'
- pressKey: Remote Dpad Down

# open Theme and navigate radio buttons
- pressKey: Remote Dpad Up
- pressKey: Remote Dpad Up
- pressKey: Remote Dpad Up
- pressKey: Remote Dpad Up
- pressKey: enter
- extendedWaitUntil:
visible:
id: 'theme-view'
timeout: 60000
- pressKey: Remote Dpad Down
- waitForAnimationToEnd:
timeout: 1000
- pressKey: enter
- pressKey: Remote Dpad Down
- waitForAnimationToEnd:
timeout: 1000
- pressKey: enter

# open Toasts and Dialogs action sheet and navigate through options
- tapOn:
id: 'custom-header-back'
- extendedWaitUntil:
visible:
id: 'accessibility-view-list'
timeout: 60000
- assertVisible: Show alerts as
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: enter
- waitForAnimationToEnd:
timeout: 1000
- assertVisible: 'Toasts. Dismissed automatically. Checked'
- assertVisible: 'Dialogs. Require manual dismissal. Unchecked'
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: enter
- waitForAnimationToEnd:
timeout: 1000
- assertVisible: Dialogs
- assertVisible: Show alerts as
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: enter
- waitForAnimationToEnd:
timeout: 1000
- assertVisible: 'Toasts. Dismissed automatically. Unchecked'
- assertVisible: 'Dialogs. Require manual dismissal. Checked'
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: enter
- waitForAnimationToEnd:
timeout: 1000
- assertVisible: Toasts
- assertVisible: Show alerts as
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
appId: chat.rocket.reactnative
name: Keyboard Navigation Onboarding
onFlowStart:
- runFlow: '../../helpers/setup.yaml'
onFlowComplete:
- evalScript: ${output.utils.deleteCreatedUsers()}
tags:
- test-14
- android-only

---
- evalScript: ${output.user = output.utils.createUser()}
- evalScript: ${output.keyboardMessage = 'keyboard-nav-' + output.random(6)}

- runFlow: ../../helpers/launch-app.yaml

# login from onboarding/NewServerView
- extendedWaitUntil:
visible:
id: 'new-server-view'
timeout: 60000
- inputText: ${output.data.server}
- pressKey: tab
- pressKey: enter
- extendedWaitUntil:
visible: 'Login'
timeout: 60000
- pressKey: enter

- extendedWaitUntil:
visible:
id: 'login-view'
timeout: 60000
- pressKey: Remote Dpad Down
- waitForAnimationToEnd:
timeout: 1000
- pressKey: Remote Dpad Down
- waitForAnimationToEnd:
timeout: 1000
- pressKey: Remote Dpad Down
- waitForAnimationToEnd:
timeout: 1000
- pressKey: Remote Dpad Down
- inputText: ${output.user.email}
- pressKey: enter
- waitForAnimationToEnd:
timeout: 1000
- inputText: ${output.user.password}
- pressKey: enter
- extendedWaitUntil:
visible:
id: 'rooms-list-view'
timeout: 60000
#
74 changes: 74 additions & 0 deletions .maestro/tests/keyboardNavigation/keyboard-navigation-room.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
appId: chat.rocket.reactnative
name: Keyboard Navigation Room
jsEngine: graaljs
onFlowStart:
- runFlow: '../../helpers/setup.yaml'
onFlowComplete:
- evalScript: ${output.utils.deleteCreatedUsers()}
tags:
- test-14
- android-only

---
- evalScript: ${output.user = output.utils.createUser()}
- evalScript: ${output.room = output.utils.createRandomRoom(output.user.username, output.user.password)}
- evalScript: ${output.keyboardMessage = 'keyboard-room-' + output.random(6)}

- runFlow:
file: '../../helpers/login-with-deeplink.yaml'
env:
USERNAME: ${output.user.username}
PASSWORD: ${output.user.password}
# Navigate to RoomView
- extendedWaitUntil:
visible:
text: '${output.room.name}'
timeout: 60000
- extendedWaitUntil:
visible:
text: 'Save your encryption password'
timeout: 60000
- pressKey: Remote Dpad Right
- pressKey: Remote Dpad Right
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: enter
# Submit: ComposerInput wires onSubmitEditing -> send when soft keyboard is hidden (TV / physical keyboard)
- extendedWaitUntil:
visible:
id: message-composer-input
timeout: 60000
- inputText: ${output.keyboardMessage}
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Right
- pressKey: enter
- extendedWaitUntil:
visible:
id: 'message-content-${output.keyboardMessage}'
timeout: 60000
# Open Emoji Keyboard
- pressKey: Remote Dpad Up
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Right
- pressKey: enter

# Open category emoji
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Right
- pressKey: enter

# Select emoji
- pressKey: Remote Dpad Down
- pressKey: Remote Dpad Right
- pressKey: Remote Dpad Up
- pressKey: Remote Dpad Up
- pressKey: enter

# Send emoji
- pressKey: Remote Dpad Up
- pressKey: Remote Dpad Up
- pressKey: enter
- assertVisible:
id: 'message-content-😀'
2 changes: 1 addition & 1 deletion .maestro/tests/room/jump-to-message.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ tags:
id: '.*Quote first message.*'
timeout: 60000
- longPressOn:
id: '.*Quote first message.*'
text: '.*Quote first message.*'
retryTapIfNoChange: true
- extendedWaitUntil:
visible:
Expand Down
Loading
Loading