Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
fca8b8e
chore: Bump version to 4.73.0 (#7318)
diegolmello May 11, 2026
d460448
fix: render Attachment file name in Thread Message preview when body …
diegolmello May 14, 2026
825d547
fix: preference value changes causing reset to other option (#7313)
Rohit3523 May 14, 2026
7f1d9de
fix: do not encrypt messages when workspace E2E is disabled (#7324)
OtavioStasiak May 14, 2026
b2bec0e
chore: migrate package manager from yarn to pnpm (#7303)
diegolmello May 18, 2026
3d01def
fix: emoji picker scroll does not reach the end (#7312)
OtavioStasiak May 19, 2026
73c5a34
chore: upgrade to react-native-mmkv v4 (#6991)
Rohit3523 May 20, 2026
66571ed
chore: begin Experimental app sunset (#7320)
diegolmello May 20, 2026
e43a4ec
feat(a11y): alt text (#7163)
OtavioStasiak May 20, 2026
054e84c
chore: stop publishing Experimental app (#7321)
diegolmello May 20, 2026
35e5ad1
chore: delete Experimental code paths and assets (#7322)
diegolmello May 21, 2026
21b0fbb
refactor(native): flatten "official" naming across Android, iOS, CI (…
diegolmello May 21, 2026
2b85573
chore(ci): point build workflows at renamed GitHub environments (#7335)
diegolmello May 21, 2026
8431ff2
feat(a11y): Message actions announcement and back focus (#7229)
OtavioStasiak May 21, 2026
85ab3f4
fix: ActionSheet cuts off the bottom content (#7326)
OtavioStasiak May 25, 2026
deb23d9
fix(android): set RC Mobile User-Agent on push notification avatar fe…
diegolmello May 25, 2026
612dd1a
chore(ci): drop iOS upload-hold gate from PR build flow (#7344)
diegolmello May 25, 2026
6b21875
fix: don't cancel login saga on 2s timeout (stranded login screen) (#…
diegolmello May 26, 2026
540d5e5
fix: prevent crash on Android devices without telecom feature (#7334)
diegolmello May 26, 2026
d0de42f
fix: Drain lost hangups on WebSocket reconnect (#7345)
diegolmello May 26, 2026
18a1039
fix: SAML login fails due to double login race (#7343)
Rohit3523 May 26, 2026
dfdd5fd
fix(a11y): replace composer auto-focus with header focus in RoomView …
OtavioStasiak May 26, 2026
9658b94
chore: align local defaults with chat.rocket.android / chat.rocket.io…
diegolmello May 27, 2026
41444f4
fix(android/voip): start microphone FGS for outgoing calls so audio s…
diegolmello May 27, 2026
3961d4d
fix(ci): restore iOS upload on develop after upload-hold removal (#7352)
diegolmello May 27, 2026
ab7f4ef
chore: Merge master into 4.73.0-master
diegolmello Jun 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
*.pbxproj -text
pnpm-lock.yaml linguist-generated=true -diff
95 changes: 20 additions & 75 deletions .github/actions/build-android/action.yml
Original file line number Diff line number Diff line change
@@ -1,44 +1,26 @@
name: 'Build Android'
description: 'Builds Android app AAB and uploads manifest and AAB'
inputs:
type:
description: 'Build type: official or experimental'
required: true
BUILD_VERSION:
description: 'Build version for build'
required: true
BUGSNAG_KEY:
description: 'Bugsnag API key for build'
required: true
KEYSTORE_EXPERIMENTAL_BASE64:
description: 'Base64 encoded keystore for experimental build'
required: true
KEYSTORE_EXPERIMENTAL:
description: 'Keystore file name for experimental build'
required: true
KEYSTORE_EXPERIMENTAL_PASSWORD:
description: 'Keystore password for experimental build'
required: true
KEYSTORE_EXPERIMENTAL_ALIAS:
description: 'Keystore alias for experimental build'
required: true
GOOGLE_SERVICES_ANDROID:
description: 'Google services JSON for experimental build'
description: 'Google services JSON'
required: true
BUGSNAG_KEY_OFFICIAL:
description: 'Bugsnag API key for official build'
description: 'Bugsnag API key'
required: true
KEYSTORE_OFFICIAL_BASE64:
description: 'Base64 encoded keystore for official build'
description: 'Base64 encoded keystore'
required: true
KEYSTORE_OFFICIAL:
description: 'Keystore file name for official build'
description: 'Keystore file name'
required: true
KEYSTORE_OFFICIAL_PASSWORD:
description: 'Keystore password for official build'
description: 'Keystore password'
required: true
KEYSTORE_OFFICIAL_ALIAS:
description: 'Keystore alias for official build'
description: 'Keystore alias'
required: true

runs:
Expand All @@ -63,16 +45,11 @@ runs:
key: gradle-${{ hashFiles('android/**.gradle*', 'android/**/gradle-wrapper.properties') }}
restore-keys: |
gradle-

- name: Decode Keystore
working-directory: android/app
run: |
if [[ "${{ inputs.type }}" == "experimental" ]]; then
echo "${{ inputs.KEYSTORE_EXPERIMENTAL_BASE64 }}" | base64 -d > "${{ inputs.KEYSTORE_EXPERIMENTAL }}"
fi
if [[ "${{ inputs.type }}" == "official" ]]; then
echo "${{ inputs.KEYSTORE_OFFICIAL_BASE64 }}" | base64 -d > "${{ inputs.KEYSTORE_OFFICIAL }}"
fi
echo "${{ inputs.KEYSTORE_OFFICIAL_BASE64 }}" | base64 -d > "${{ inputs.KEYSTORE_OFFICIAL }}"
shell: bash

- name: Set gradle.properties
Expand All @@ -86,24 +63,12 @@ runs:
echo -e "newArchEnabled=true" >> ./gradle.properties
echo -e "hermesEnabled=true" >> ./gradle.properties
echo -e "VERSIONCODE=${{ inputs.BUILD_VERSION }}" >> ./gradle.properties

if [[ "${{ inputs.type }}" == "experimental" ]]; then
echo -e "APPLICATION_ID=chat.rocket.reactnative" >> ./gradle.properties
echo -e "BugsnagAPIKey=${{ inputs.BUGSNAG_KEY }}" >> ./gradle.properties
echo -e "KEYSTORE=${{ inputs.KEYSTORE_EXPERIMENTAL }}" >> ./gradle.properties
echo -e 'KEYSTORE_PASSWORD=${{ inputs.KEYSTORE_EXPERIMENTAL_PASSWORD }}' >> ./gradle.properties
echo -e "KEY_ALIAS=${{ inputs.KEYSTORE_EXPERIMENTAL_ALIAS }}" >> ./gradle.properties
echo -e 'KEY_PASSWORD=${{ inputs.KEYSTORE_EXPERIMENTAL_PASSWORD }}' >> ./gradle.properties
fi

if [[ "${{ inputs.type }}" == "official" ]]; then
echo -e "APPLICATION_ID=chat.rocket.android" >> ./gradle.properties
echo -e "BugsnagAPIKey=${{ inputs.BUGSNAG_KEY_OFFICIAL }}" >> ./gradle.properties
echo -e "KEYSTORE=${{ inputs.KEYSTORE_OFFICIAL }}" >> ./gradle.properties
echo -e 'KEYSTORE_PASSWORD=${{ inputs.KEYSTORE_OFFICIAL_PASSWORD }}' >> ./gradle.properties
echo -e "KEY_ALIAS=${{ inputs.KEYSTORE_OFFICIAL_ALIAS }}" >> ./gradle.properties
echo -e 'KEY_PASSWORD=${{ inputs.KEYSTORE_OFFICIAL_PASSWORD }}' >> ./gradle.properties
fi
echo -e "APPLICATION_ID=chat.rocket.android" >> ./gradle.properties
echo -e "BugsnagAPIKey=${{ inputs.BUGSNAG_KEY_OFFICIAL }}" >> ./gradle.properties
echo -e "KEYSTORE=${{ inputs.KEYSTORE_OFFICIAL }}" >> ./gradle.properties
echo -e 'KEYSTORE_PASSWORD=${{ inputs.KEYSTORE_OFFICIAL_PASSWORD }}' >> ./gradle.properties
echo -e "KEY_ALIAS=${{ inputs.KEYSTORE_OFFICIAL_ALIAS }}" >> ./gradle.properties
echo -e 'KEY_PASSWORD=${{ inputs.KEYSTORE_OFFICIAL_PASSWORD }}' >> ./gradle.properties
shell: bash

- name: Set Google Services JSON
Expand All @@ -116,37 +81,17 @@ runs:

- name: Build Android Release AAB
working-directory: android
run: |
if [[ "${{ inputs.type }}" == "experimental" ]]; then
./gradlew bundleExperimentalRelease
fi
if [[ "${{ inputs.type }}" == "official" ]]; then
./gradlew bundleOfficialRelease
fi
run: ./gradlew bundleRelease
shell: bash

- name: Upload sourcemaps/NDK symbols to Bugsnag
run: |
if [[ "${{ inputs.type }}" == "official" ]]; then
yarn bugsnag:upload-android --variant officialRelease --app-manifest android/app/build/intermediates/merged_manifests/officialRelease/processOfficialReleaseManifest/AndroidManifest.xml
yarn bugsnag-cli upload android-aab android/app/build/outputs/bundle/officialRelease/app-official-release.aab
fi
if [[ "${{ inputs.type }}" == "experimental" ]]; then
yarn bugsnag:upload-android --variant experimentalRelease --app-manifest android/app/build/intermediates/merged_manifests/experimentalRelease/processExperimentalReleaseManifest/AndroidManifest.xml
yarn bugsnag-cli upload android-aab android/app/build/outputs/bundle/experimentalRelease/app-experimental-release.aab
fi
pnpm bugsnag:upload-android --variant release --app-manifest android/app/build/intermediates/merged_manifests/release/processReleaseManifest/AndroidManifest.xml
pnpm exec bugsnag-cli upload android-aab android/app/build/outputs/bundle/release/app-release.aab
shell: bash

- name: Upload Experimental AAB
if: ${{ inputs.type == 'experimental' }}
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: android-aab-experimental
path: android/app/build/outputs/bundle/experimentalRelease/app-experimental-release.aab

- name: Upload Official AAB
if: ${{ inputs.type == 'official' }}
- name: Upload AAB
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: android-aab-official
path: android/app/build/outputs/bundle/officialRelease/app-official-release.aab
name: android-aab
path: android/app/build/outputs/bundle/release/app-release.aab
77 changes: 11 additions & 66 deletions .github/actions/build-ios/action.yml
Original file line number Diff line number Diff line change
@@ -1,18 +1,12 @@
name: 'Build iOS'
description: 'Build iOS app'
inputs:
type:
description: 'Build type: official or experimental'
required: true
BUILD_VERSION:
description: 'Build version'
required: true
APP_STORE_CONNECT_API_KEY_BASE64:
description: 'Base64 encoded App Store Connect API Key'
required: true
BUGSNAG_KEY:
description: 'Bugsnag API Key'
required: true
MATCH_KEYCHAIN_NAME:
description: 'Match Keychain Name'
required: true
Expand All @@ -32,13 +26,10 @@ inputs:
description: 'Fastlane Repo PAT'
required: true
BUGSNAG_KEY_OFFICIAL:
description: 'Bugsnag API Key Official'
description: 'Bugsnag API Key'
required: true
GOOGLE_SERVICES_IOS:
description: 'Google service file for official version'
required: true
GOOGLE_SERVICES_IOS_EXPERIMENTAL:
description: 'Google service file for experimental version'
description: 'Google service file'
required: true

runs:
Expand Down Expand Up @@ -71,9 +62,9 @@ runs:
restore-keys: |
pods-v1-

- name: pod install
- name: pod install
run: |
yarn pod-install
pnpm pod-install
shell: bash

- name: Decode p8
Expand All @@ -85,43 +76,21 @@ runs:
working-directory: ios
run: |
agvtool new-version -all ${{ inputs.BUILD_VERSION }}
if [[ ${{ inputs.type }} == "official" ]]; then
/usr/libexec/PlistBuddy -c "Set :bugsnag:apiKey ${{ inputs.BUGSNAG_KEY_OFFICIAL }}" ./RocketChatRN/Info.plist
/usr/libexec/PlistBuddy -c "Set :bugsnag:apiKey ${{ inputs.BUGSNAG_KEY_OFFICIAL }}" ./ShareRocketChatRN/Info.plist
/usr/libexec/PlistBuddy -c "Set IS_OFFICIAL YES" ./RocketChatRN/Info.plist
/usr/libexec/PlistBuddy -c "Set IS_OFFICIAL YES" ./ShareRocketChatRN/Info.plist
/usr/libexec/PlistBuddy -c "Set IS_OFFICIAL YES" ./NotificationService/Info.plist
fi
if [[ ${{ inputs.type }} == "experimental" ]]; then
/usr/libexec/PlistBuddy -c "Set :bugsnag:apiKey ${{ inputs.BUGSNAG_KEY }}" ./RocketChatRN/Info.plist
/usr/libexec/PlistBuddy -c "Set :bugsnag:apiKey ${{ inputs.BUGSNAG_KEY }}" ./ShareRocketChatRN/Info.plist
/usr/libexec/PlistBuddy -c "Set IS_OFFICIAL NO" ./RocketChatRN/Info.plist
/usr/libexec/PlistBuddy -c "Set IS_OFFICIAL NO" ./ShareRocketChatRN/Info.plist
/usr/libexec/PlistBuddy -c "Set IS_OFFICIAL NO" ./NotificationService/Info.plist
fi
/usr/libexec/PlistBuddy -c "Set :bugsnag:apiKey ${{ inputs.BUGSNAG_KEY_OFFICIAL }}" ./RocketChatRN/Info.plist
/usr/libexec/PlistBuddy -c "Set :bugsnag:apiKey ${{ inputs.BUGSNAG_KEY_OFFICIAL }}" ./ShareRocketChatRN/Info.plist
shell: bash

- name: Set Google Services
working-directory: ios
run: |
if [[ $APP_STORE_CONNECT_API_KEY_BASE64 ]]; then
if [[ ${{ inputs.type }} == "official" ]]; then
echo ${{ inputs.GOOGLE_SERVICES_IOS }} | base64 --decode > GoogleService-Info.plist
else
echo ${{ inputs.GOOGLE_SERVICES_IOS_EXPERIMENTAL }} | base64 --decode > GoogleService-Info.plist
fi
echo ${{ inputs.GOOGLE_SERVICES_IOS }} | base64 --decode > GoogleService-Info.plist
fi
shell: bash

- name: Build iOS app
working-directory: ios
run: |
if [[ ${{ inputs.type }} == "official" ]]; then
bundle exec fastlane ios build_official
fi
if [[ ${{ inputs.type }} == "experimental" ]]; then
bundle exec fastlane ios build_experimental
fi
run: bundle exec fastlane ios build
env:
MATCH_KEYCHAIN_NAME: ${{ inputs.MATCH_KEYCHAIN_NAME }}
MATCH_KEYCHAIN_PASSWORD: ${{ inputs.MATCH_KEYCHAIN_PASSWORD }}
Expand All @@ -133,42 +102,18 @@ runs:

- name: Upload IPA artifact
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: ${{ inputs.type == 'experimental' }}
with:
name: ios-build-experimental
name: ios-build
path: ios/Rocket.Chat.ipa

- name: Upload IPA artifact
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: ${{ inputs.type == 'official' }}
with:
name: ios-build-official
path: ios/Rocket.Chat.ipa

- name: Upload Rocket.Chat.app.dSYM.zip
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: ${{ inputs.type == 'experimental' }}
with:
name: ios-build-experimental-dSYM
path: ios/Rocket.Chat.app.dSYM.zip

- name: Upload Rocket.Chat.app.dSYM.zip
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: ${{ inputs.type == 'official' }}
with:
name: ios-build-official-dSYM
name: ios-build-dSYM
path: ios/Rocket.Chat.app.dSYM.zip

- name: Upload RocketChatRN/Info.plist
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: ${{ inputs.type == 'experimental' }}
with:
name: ios-build-experimental-info-plist
path: ios/RocketChatRN/Info.plist

- name: Upload RocketChatRN/Info.plist
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: ${{ inputs.type == 'official' }}
with:
name: ios-build-official-info-plist
name: ios-build-info-plist
path: ios/RocketChatRN/Info.plist
18 changes: 7 additions & 11 deletions .github/actions/setup-node/action.yml
Original file line number Diff line number Diff line change
@@ -1,21 +1,17 @@
name: Setup Node
description: Setup node and cache node_modules
description: Setup node and pnpm via corepack, with pnpm store cache
runs:
using: "composite"
steps:
- name: Enable corepack
shell: bash
run: corepack enable

- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 'lts/*'
cache: 'yarn'

- name: Cache node_modules
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: node_modules
key: ${{ runner.os }}-node-modules-${{ hashFiles('**/yarn.lock', 'patches/**') }}
restore-keys: |
${{ runner.os }}-node-modules-${{ hashFiles('**/yarn.lock', 'patches/**') }}
cache: 'pnpm'

- name: Install JS dependencies
shell: bash
run: yarn install --frozen-lockfile
run: pnpm install --frozen-lockfile
39 changes: 9 additions & 30 deletions .github/actions/upload-android/action.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
name: 'Upload Android'
description: 'Downloads AAB + Manifest, uploads to Play Store'
inputs:
type:
description: 'Build type: official or experimental'
required: true
FASTLANE_GOOGLE_SERVICE_ACCOUNT:
description: 'Google service account key for upload'
required: true
Expand All @@ -17,23 +14,15 @@ inputs:
description: 'Trigger for build'
required: true
default: pr

runs:
using: "composite"
steps:
- name: Download Experimental AAB
if: ${{ inputs.type == 'experimental' }}
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: android-aab-experimental
path: android/app/build/outputs/bundle/experimentalRelease/

- name: Download Official AAB
if: ${{ inputs.type == 'official' }}
- name: Download AAB
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: android-aab-official
path: android/app/build/outputs/bundle/officialRelease/
name: android-aab
path: android/app/build/outputs/bundle/release/

- name: Set up Ruby and Bundler
uses: ruby/setup-ruby@7372622e62b60b3cb750dcd2b9e32c247ffec26a # v1.302.0
Expand Down Expand Up @@ -72,34 +61,24 @@ runs:
working-directory: android
run: |
if [[ ${{ inputs.trigger }} == "pr" ]]; then
bundle exec fastlane android beta official:${{ inputs.type == 'official' }}
bundle exec fastlane android beta
fi
if [[ ${{ inputs.trigger }} == "develop" ]] && [[ ${{ inputs.type }} == 'experimental' ]]; then
bundle exec fastlane android experimental_production
fi
if [[ ${{ inputs.trigger }} == "develop" ]] && [[ ${{ inputs.type }} == 'official' ]]; then
bundle exec fastlane android official_open_testing
if [[ ${{ inputs.trigger }} == "develop" ]]; then
bundle exec fastlane android open_testing
fi
shell: bash

- name: Leave a comment on PR
if: ${{ inputs.trigger == 'pr' }}
env:
GH_TOKEN: ${{ inputs.GITHUB_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number }}
BUILD_TYPE: ${{ inputs.type }}
BUILD_VERSION: ${{ inputs.BUILD_VERSION }}
run: |
if [[ "$BUILD_TYPE" == "official" ]]; then
app_name="Rocket.Chat"
else
app_name="Rocket.Chat Experimental"
fi

gradle_file="android/app/build.gradle"
VERSION_NAME=$(grep versionName $gradle_file | head -n 1 | sed -E 's/.*versionName[[:space:]]+"([^"]+)".*/\1/')

version_info="$app_name $VERSION_NAME.$BUILD_VERSION"
version_info="Rocket.Chat $VERSION_NAME.$BUILD_VERSION"

message="**Android Build Available**"$'\n\n'"$version_info"

Expand Down
Loading
Loading