Secure Android wallet for managing virtual and physical payment cards, built with Kotlin, Jetpack Compose, Hilt, Retrofit, and Room.
- Authentication: Email/password login, JWT storage, refresh token flow (backend‑driven).
- Wallet dashboard: Wallet balance, cards list, quick access to transactions.
- Card management: Virtual card creation hook, masked PAN, status (active/frozen/blocked).
- Card controls: Freeze/unfreeze, spending limit, online/international toggles.
- Transactions: List + basic amount filtering.
- Security: Android Keystore–backed encrypted storage, optional biometrics, screenshot blocking on card detail.
- Notifications: Firebase Cloud Messaging hook for transaction/limit alerts.
- CI/CD: GitHub Actions build that sends the release APK to a Telegram group.
- Kotlin, Coroutines
- Jetpack Compose (Material 3)
- MVVM with ViewModels
- Hilt for dependency injection
- Retrofit + Moshi
- Room Database
- DataStore + EncryptedSharedPreferences (Android Keystore)
- Firebase Cloud Messaging
app/– Android app moduleui/– Compose screens, theme, navigationviewmodel/– MVVM ViewModelsrepository/– Auth and wallet repositoriesnetwork/– Retrofit API and auth interceptordatabase/– Room database and DAOssecurity/– Token and secure storage helpersnotifications/– FCM service
-
Open the project in Android Studio (Giraffe/Flamingo+ recommended).
-
Make sure you have Android SDK 26+ and JDK 17 installed.
-
Build and run:
./gradlew assembleDebug
-
Install the resulting APK from
app/build/outputs/apk/debug/on a device or emulator.
The app is backend‑agnostic but expects a fintech API capable of issuing cards (e.g. Visa/Mastercard via card‑issuing provider).
- Set your API base URL in
AppModule.provideApiService:app/src/main/java/com/flowstable/cardwallet/di/AppModule.kt
- Align the DTOs in
network/ApiService.ktandmodel/Models.ktwith your backend contracts.
Firebase is optional for CI builds. The project currently does not apply the com.google.gms.google-services plugin so that GitHub Actions can build without a google-services.json file.
To fully enable Firebase Cloud Messaging:
- Create a Firebase project and enable Cloud Messaging.
- Download
google-services.jsoninto theapp/module root. - Uncomment the
com.google.gms:google-servicesclasspath andapply plugin: 'com.google.gms.google-services'lines in the Gradle files. - Configure notification payloads so
FlowstableFirebaseMessagingServicecan show useful alerts.
The workflow .github/workflows/android-build-telegram.yml:
- Runs on push to
mainor manual dispatch. - Uses the custom
./gradlewbootstrap script to:- Download a compatible Gradle distribution.
- Build the release APK via
assembleRelease(currently unsigned for CI).
- Uploads
app/build/outputs/apk/release/app-release.apkas a build artifact. - Sends that APK to a Telegram group using the Telegram Bot API.
In your repo, go to Settings → Secrets and variables → Actions and create:
TELEGRAM_BOT_TOKEN– the bot token (do not commit it to the repo).TELEGRAM_CHAT_ID– the target group/channel chat ID.
Once configured, any successful push to main that builds the release APK will automatically send the latest Stable App APK to the configured Telegram group.