Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
0383f95
Add SMS history screen with retry option for failed SMS forwarding
illia-rudakov Jan 30, 2025
bb28eee
Rename files, classes, methods; refactor code; update retry forwardin…
illia-rudakov Feb 5, 2025
8551649
Remove redundant with()
illia-rudakov Feb 5, 2025
25f7d6a
[OSF-14] Refactor use case messages
skrebniou Mar 5, 2025
0bf125f
Add parallax onboardin effect
dmorskoi Mar 9, 2025
5529f79
Merge pull request #18 from Mobile-Innowise-Group/feature/parallax-on…
dmorskoi Mar 9, 2025
44044ba
Merge branch 'refs/heads/main' into develop
dmorskoi Mar 9, 2025
e5fe540
Merge remote-tracking branch 'origin/develop' into refactor/osf-14-us…
skrebniou Mar 10, 2025
d7dd7c9
Merge pull request #15 from Mobile-Innowise-Group/refactor/osf-14-use…
dmorskoi Mar 10, 2025
caf61e1
Merge remote-tracking branch 'origin/develop' into feature/sms-histor…
skrebniou Mar 14, 2025
2072954
[OSF-3] Minor fixes #2
skrebniou Mar 14, 2025
03ee535
[OSF-14] Comment fixes #2
skrebniou Mar 17, 2025
e7b6cdd
[OSF-21] Accessibility compliance
skrebniou Apr 11, 2025
b1acd50
[OSF-21] Linter fix #1
skrebniou Apr 11, 2025
653deca
Remove retry logic, clean up code
dmorskoi Apr 14, 2025
aab4209
Merge pull request #14 from Mobile-Innowise-Group/feature/sms-history…
dmorskoi Apr 14, 2025
d56aa00
Merge remote-tracking branch 'origin/develop' into eaa-compliance
skrebniou Apr 14, 2025
7ee8104
[OSF-21] Dev pull, history accessibility, comment fix #1
skrebniou Apr 14, 2025
853e83e
[OSF-21] Comment fix #2
skrebniou Apr 14, 2025
c3508af
[OSF-21] Comment fix #2
skrebniou Apr 15, 2025
bcf195e
[OSF-21] Comment fix #3
skrebniou Apr 15, 2025
b73798b
[OSF-21] Comment fix #4
skrebniou Apr 15, 2025
f526d53
Merge pull request #20 from Mobile-Innowise-Group/eaa-compliance
dmorskoi Apr 15, 2025
4a3a7cf
[OSF-18] New onboarding UX
skrebniou Apr 15, 2025
3801f80
[OSF-18] Comment changes #1
skrebniou Apr 15, 2025
c0f2baa
Merge pull request #22 from Mobile-Innowise-Group/feature/osf-18-new-…
dmorskoi Apr 15, 2025
ad433b7
Add telegram forwarding type
dmorskoi Jul 10, 2025
b15cfd5
Fix lint issues
dmorskoi Jul 10, 2025
48f2d54
Merge pull request #24 from Mobile-Innowise-Group/feature/telegram_fo…
dmorskoi Jul 10, 2025
14f30a1
Merge branch 'main' into develop
dmorskoi Jul 10, 2025
3550ac9
Remove forwarding by sms, add room schema check on CI
dmorskoi Jul 10, 2025
8cc2ecc
Fix CI script
dmorskoi Jul 10, 2025
a54f200
Fix CI script
dmorskoi Jul 10, 2025
3b381a7
Add actions for instrumentations tests
dmorskoi Jul 10, 2025
897fcbe
Fix CI
dmorskoi Jul 10, 2025
f3a4eb1
Test room integrity
dmorskoi Jul 10, 2025
9204cfd
Fix room schema files
dmorskoi Jul 11, 2025
741cf58
Fix room schema
dmorskoi Jul 11, 2025
d90a115
Add room scheme files
dmorskoi Jul 11, 2025
96f85ea
Merge branch 'develop' into breaking/remove_sms_forwarding_method
dmorskoi Jul 11, 2025
6472211
Add sh script for distinct pull request integrity check and push inte…
dmorskoi Jul 11, 2025
5808436
Fix sh base branch fetching on PRs
dmorskoi Jul 11, 2025
d6ef4da
Test Room integrity with new fix in .sh
dmorskoi Jul 11, 2025
2aedbe7
Revert schema changes after success failed
dmorskoi Jul 11, 2025
332a447
Merge pull request #25 from Mobile-Innowise-Group/breaking/remove_sms…
dmorskoi Jul 11, 2025
55c89d6
Refactor google auth flow
dmorskoi Jul 14, 2025
765269e
Fix lint issues
dmorskoi Jul 14, 2025
d55c47d
Add safe runcatching for proper handling CancellationException for co…
dmorskoi Jul 14, 2025
98adbe6
Move Google client to presentation layer, add abstractions on Credent…
dmorskoi Jul 16, 2025
1dee115
Update proguard rules for release
dmorskoi Jul 16, 2025
920a72c
Fix unit tests
dmorskoi Jul 16, 2025
f3c9b37
Merge pull request #26 from Mobile-Innowise-Group/refactor/OSF-16-goo…
dmorskoi Jul 16, 2025
d547d22
Unhide feadback feature, claen up code, add appCheck dependency
dmorskoi Jul 18, 2025
e46331e
Merge pull request #27 from Mobile-Innowise-Group/feature/feadback
dmorskoi Jul 18, 2025
fc1d54c
Bump code version
dmorskoi Jul 18, 2025
45900ac
Bump code version
dmorskoi Jul 18, 2025
c2bd1f7
Bump code version
dmorskoi Jul 18, 2025
fa4047a
Update terget API to 35
dmorskoi Jul 21, 2025
20b9fa3
Completly remove SEND_SMS permission
dmorskoi Jul 21, 2025
5d370e3
Fix NBSP character, normalize it to whitespace
dmorskoi Jul 21, 2025
235c9de
Bump code version
dmorskoi Jul 21, 2025
99a41f7
Remove READ_SMS permission
dmorskoi Jul 23, 2025
4bd18b8
Bump code version
dmorskoi Jul 23, 2025
e410294
Add network observer, handle network errors
dmorskoi Jul 25, 2025
dc8e470
Fix test
dmorskoi Jul 25, 2025
bc5fad5
Merge pull request #28 from Mobile-Innowise-Group/feature/internet-co…
dmorskoi Jul 25, 2025
9419b57
Update onboarding screen instructions
dmorskoi Jul 27, 2025
127c360
Add auto-versioning
dmorskoi Jul 27, 2025
31dfdff
Change to manual release trigger
dmorskoi Jul 27, 2025
f67e93e
Add Viewmodel unit tests
dmorskoi Jul 27, 2025
8d3d473
Add more unit tests
dmorskoi Jul 27, 2025
0815553
Create extension for test utils
dmorskoi Jul 27, 2025
c824dd8
Add tests for mappers
dmorskoi Jul 27, 2025
8119f8e
Unpack wild card in imports
dmorskoi Jul 28, 2025
837be7b
Modify Room schema drift script to fail only if schema changed or mod…
dmorskoi Jul 28, 2025
bf08c3f
Use Emulator Snapshots to start it faster on CI
dmorskoi Jul 28, 2025
b8edde7
Optimize buold yaml CI file
dmorskoi Jul 28, 2025
e95a877
Fix google-services.json location for CI script
dmorskoi Jul 28, 2025
faabe82
Fix CI
dmorskoi Jul 28, 2025
daa3d82
Fix CI
dmorskoi Jul 28, 2025
e29ce2b
Fix CI
dmorskoi Jul 28, 2025
40a1b3f
Fix CI
dmorskoi Jul 28, 2025
8c4b31a
Fix CI
dmorskoi Jul 28, 2025
8a41aac
Fix CI
dmorskoi Jul 28, 2025
5d24af5
Fix CI: disable cache temporarily
dmorskoi Jul 28, 2025
4d0e6aa
Fix CI
dmorskoi Jul 28, 2025
738933d
Fix CI
dmorskoi Jul 28, 2025
cfe4452
Fix CI
dmorskoi Jul 28, 2025
48399ff
Fix CI
dmorskoi Jul 28, 2025
a6ca7ce
Fix CI
dmorskoi Jul 28, 2025
5fc4ecd
Fix CI
dmorskoi Jul 29, 2025
c5ed852
Fix CI
dmorskoi Jul 29, 2025
3c8ae9b
Fix CI
dmorskoi Jul 29, 2025
bdd549d
Fix versioning yml typo
dmorskoi Jul 29, 2025
1097a1a
Add full history for checkout while checking room schema diffs
dmorskoi Jul 29, 2025
2ef0dae
Move decoding key logic in separate action
dmorskoi Jul 29, 2025
253e468
Fix action.yml
dmorskoi Jul 29, 2025
e82e4a3
Fix build.yml
dmorskoi Jul 29, 2025
c56551f
Fix action.yml
dmorskoi Jul 29, 2025
9882df4
Fix CI
dmorskoi Jul 29, 2025
a66a76a
Fix CI
dmorskoi Jul 29, 2025
2290508
Fix CI and update readme
dmorskoi Jul 29, 2025
a05a2a3
Fix CI
dmorskoi Jul 29, 2025
7e4f714
Fix CI
dmorskoi Jul 30, 2025
49b8cc6
Update project dependencies versions
dmorskoi Jul 30, 2025
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
21 changes: 21 additions & 0 deletions .github/actions/decode-secrets/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: "Decode Secrets"
description: "Decode keystores and google-services.json"
inputs:
DEBUG_KEY_BASE_64:
required: true
DEBUG_KEY_PROPERTIES:
required: true
GOOGLE_SERVICES_JSON:
required: true
RELEASE_KEY_BASE_64:
required: true
runs:
using: "composite"
steps:
- run: |
echo "${{ inputs.RELEASE_KEY_BASE_64 }}" | base64 -d > release.jks
mkdir -p app/keystore/debug
echo "${{ inputs.DEBUG_KEY_BASE_64 }}" | base64 -d > app/keystore/debug/debug.jks
echo "${{ inputs.DEBUG_KEY_PROPERTIES }}" | base64 -d > app/keystore/debug/debug.properties
echo "${{ inputs.GOOGLE_SERVICES_JSON }}" | base64 -d > app/google-services.json
shell: bash
174 changes: 129 additions & 45 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -1,94 +1,178 @@
name: Build, run static analysis, run tests, generate release APK, AAB
name: Open SMS Forwarder CI

on:
push:
branches:
- main
- develop
branches: [ main, develop ]
pull_request:
branches:
- main
- develop
branches: [ main, develop ]

env:
RELEASE_KEYSTORE_PASSWORD: ${{ secrets.RELEASE_KEYSTORE_PASSWORD }}
RELEASE_KEYSTORE_ALIAS: ${{ secrets.RELEASE_KEYSTORE_ALIAS }}
RELEASE_KEY_PASSWORD: ${{ secrets.RELEASE_KEY_PASSWORD }}

CLIENT_ID: ${{ secrets.CLIENT_ID }}
CLIENT_SECRET: ${{ secrets.CLIENT_SECRET }}
REDIRECT_URI: ${{ secrets.REDIRECT_URI }}
FEEDBACK_DB_PATH: ${{ secrets.FEEDBACK_DB_PATH }}

defaults:
run:
shell: bash

jobs:
build:
prepare:
name: Setup & Cache
runs-on: ubuntu-latest

steps:
- name: Checking out branch
- name: Checkout
uses: actions/checkout@v4

- name: Setup Java (JDK)
- name: Setup JDK
uses: actions/setup-java@v4
with:
distribution: 'oracle'
java-version: '17'

- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Cache Gradle
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
.gradle
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: gradle-${{ runner.os }}-

static-analysis:
name: Static Analysis
runs-on: ubuntu-latest
needs: prepare
steps:
- uses: actions/checkout@v4
- run: ./gradlew detekt --build-cache --parallel

- name: Run static code analysis
run: ./gradlew detekt
unit-tests:
name: Unit Tests
runs-on: ubuntu-latest
needs: prepare
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/decode-secrets
with:
DEBUG_KEY_BASE_64: ${{ secrets.DEBUG_KEY_BASE_64 }}
DEBUG_KEY_PROPERTIES: ${{ secrets.DEBUG_KEY_PROPERTIES }}
GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }}
- run: ./gradlew testDebugUnitTest --build-cache --parallel

- name: Decode Release Keystore
env:
ENCODED_RELEASE_STRING: ${{ secrets.RELEASE_KEY_BASE_64 }}
instrumentation-tests:
name: Instrumentation Tests
runs-on: ubuntu-latest
env:
ANDROID_AVD_HOME: ${{ github.workspace }}/.android/avd
if: github.ref == 'refs/heads/main' || github.event.pull_request.base.ref == 'main'
needs: prepare
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/decode-secrets
with:
DEBUG_KEY_BASE_64: ${{ secrets.DEBUG_KEY_BASE_64 }}
DEBUG_KEY_PROPERTIES: ${{ secrets.DEBUG_KEY_PROPERTIES }}
GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }}

- name: Setup Android SDK
uses: android-actions/setup-android@v3

- name: Install system image
run: sdkmanager "system-images;android-29;google_apis;x86"

- name: Create AVD
run: |
echo $ENCODED_RELEASE_STRING > release-keystore-b64.txt
base64 -di release-keystore-b64.txt > release.jks
mkdir -p $ANDROID_AVD_HOME
echo "no" | avdmanager create avd -n test -k "system-images;android-29;google_apis;x86" --device "pixel"
avdmanager list avd
ls -l $ANDROID_AVD_HOME

- name: Decode Debug Keystore
env:
ENCODED_DEBUG_STRING: ${{ secrets.DEBUG_KEY_BASE_64 }}
ENCODED_DEBUG_PROPERTIES: ${{ secrets.DEBUG_KEY_PROPERTIES }}
- name: Start Emulator
run: |
echo $ENCODED_DEBUG_STRING > debug-keystore-b64.txt
base64 -di debug-keystore-b64.txt > app/keystore/debug/debug.jks
echo $ENCODED_DEBUG_PROPERTIES > debug-key-properties-b64.txt
base64 -di debug-key-properties-b64.txt > app/keystore/debug/debug.properties
$ANDROID_HOME/emulator/emulator -avd test -accel off -no-snapshot-save -no-window -no-audio -gpu swiftshader_indirect -no-boot-anim &
echo $! > emulator.pid

- name: Load Google Service file
env:
DATA: ${{ secrets.GOOGLE_SERVICES_JSON }}
run: echo $DATA | base64 -di > app/google-services.json
- name: Wait for Emulator to Boot
run: |
echo "Waiting for emulator to start..."
adb wait-for-device

boot_completed=""
until [ "$boot_completed" = "1" ]; do
sleep 5
boot_completed=$(adb shell getprop sys.boot_completed | tr -d '\r')
echo "Waiting... boot_completed=$boot_completed"
done

until adb shell pm list packages > /dev/null 2>&1; do
echo "Waiting for package manager to become available..."
sleep 5
done

api_level=""
until [ -n "$api_level" ] && [ "$api_level" != "unknown" ]; do
sleep 5
api_level=$(adb shell getprop ro.build.version.sdk 2>/dev/null | tr -d '\r')
echo "Waiting for emulator to report API level... api_level=$api_level"
done

echo "Emulator fully ready with API level $api_level"

- name: Run Instrumentation Tests
run: ./gradlew connectedCheck --build-cache --parallel

- name: Kill Emulator
if: always()
run: |
if [ -f emulator.pid ]; then
kill $(cat emulator.pid) || true
fi

- name: Build
run: ./gradlew build
build-release:
name: Build APK & AAB
runs-on: ubuntu-latest
needs: [ static-analysis, unit-tests ]
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: ./.github/actions/decode-secrets
with:
RELEASE_KEY_BASE_64: ${{ secrets.RELEASE_KEY_BASE_64 }}
GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }}

- name: Run unit tests
run: ./gradlew test
- name: Make schema check executable
run: chmod +x scripts/check_room_schema_drift.sh

- name: Build Release apk
run: ./gradlew assembleRelease --stacktrace
- name: Run Room schema drift check
run: ./scripts/check_room_schema_drift.sh
env:
GITHUB_EVENT_NAME: ${{ github.event_name }}
GITHUB_BASE_REF: ${{ github.base_ref }}

- name: Build Release bundle
run: ./gradlew bundleRelease --stacktrace
- name: Build Release APK and AAB
run: ./gradlew assembleRelease bundleRelease --build-cache --parallel

- name: Get release apk file path
- name: Get release apk path
id: releaseApk
run: echo "apkfile=$(find app/build/outputs/apk/release/*.apk)" >> $GITHUB_OUTPUT

- name: Get release aab file path
- name: Get release aab path
id: releaseAab
run: echo "aabfile=$(find app/build/outputs/bundle/release/*.aab)" >> $GITHUB_OUTPUT

- name: Upload Release APK to Artifacts
- name: Upload Release APK
uses: actions/upload-artifact@v4
with:
name: release-apk-artifacts
path: ${{ steps.releaseApk.outputs.apkfile }}

- name: Upload Release AAB to Artifacts
- name: Upload Release AAB
uses: actions/upload-artifact@v4
with:
name: release-aab-artifacts
Expand Down
47 changes: 47 additions & 0 deletions .github/workflows/versioning.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Bump Version and Tag

on:
workflow_dispatch:

jobs:
bump-version:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v3

- name: Set up Git (GitHub Actions bot)
run: |
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git config --global user.name "github-actions[bot]"

- name: Read and bump version
id: bump
run: |
VERSION=$(grep VERSION_NAME version.properties | cut -d= -f2)
MAJOR=$(echo $VERSION | cut -d. -f1)
MINOR=$(echo $VERSION | cut -d. -f2)
PATCH=$(echo $VERSION | cut -d. -f3)

PATCH=$((PATCH + 1))
NEW_VERSION="$MAJOR.$MINOR.$PATCH"
NEW_CODE=$((MAJOR * 10000 + MINOR * 100 + PATCH))

echo "New version: $NEW_VERSION ($NEW_CODE)"
echo "new_version=$NEW_VERSION" >> "$GITHUB_OUTPUT"
echo "new_code=$NEW_CODE" >> "$GITHUB_OUTPUT"

echo "VERSION_NAME=$NEW_VERSION" > version.properties
echo "VERSION_CODE=$NEW_CODE" >> version.properties

- name: Commit version bump
run: |
git add version.properties
git commit -m "ci: bump version to ${{ steps.bump.outputs.new_version }}"
git push

- name: Create Git Tag
run: |
git tag v${{ steps.bump.outputs.new_version }}
git push origin v${{ steps.bump.outputs.new_version }}
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
<img width="20" height="20" src="https://github.com/Mobile-Innowise-Group/opensmsforwarder/assets/79689735/3ba6195c-4f30-4134-840b-8d736074b132"/> [View on Google Play](https://play.google.com/store/apps/details?id=org.open.smsforwarder)


The application for forwarding incoming SMS messages by email or via SMS to your colleagues and friends.
You can create a set of forwarding rules that will act as a filter for all incoming messages. All SMS that will meet the forwarding rules will be redirected to a chosen reciever's phone or email.
The application for forwarding incoming SMS messages by email or other forwarding types to your colleagues and friends.
You can create a set of forwarding rules that will act as a filter for all incoming messages. All SMS that will meet the forwarding rules will be redirected to a chosen receiver's phone or email.

# The idea

Expand Down
Loading