An Android app built with Jetpack Compose that displays a catalogue of Warframe characters. Browse the list, search by name, view per-frame stats, and dynamically add or remove entries at runtime.
- Scrollable, alphabetically-grouped Warframe list with sticky headers
- Live search / filter by name
- Detail screen per Warframe (stats, lore, portrait)
- Add Limbo Prime to the list at runtime
- Delete the first entry from the list at runtime
- Animated scroll-to-top button
- About screen with developer info
- Dark-themed UI (Material 2, custom color palette)
| Layer | Technology |
|---|---|
| Language | Kotlin |
| UI | Jetpack Compose (Material 2) |
| Architecture | MVVM — ViewModel + StateFlow |
| Image loading | Coil (AsyncImage) |
| Navigation | Intent-based per detail Activity |
| Build | Gradle 7.4, AGP 7.2.1, Kotlin 1.7.0 |
| Min SDK | 21 (Android 5.0 Lollipop) |
| Target SDK | 33 (Android 13) |
app/src/main/java/com/example/jetwarframes/
├── MainActivity.kt # Entry point — hosts JetWarframesApp composable
├── JettWarframesApp.kt # Root composable: list, search, option menu
├── JetWarframesViewModel.kt # State owner: warframe list, search, add/delete
├── WarframeRepository.kt # Provides initial warframe data
├── WarframesData.kt # Static seed data (immutable list)
├── Warframe.kt # Data model
├── ActivityAbout.kt # About / developer screen
├── AshPrime.kt # Detail screen — Ash Prime
├── AtlasPrime.kt # Detail screen — Atlas Prime
├── BansheePrime.kt # Detail screen — Banshee Prime
├── BaruukPrime.kt # Detail screen — Baruuk Prime
├── Citrine.kt # Detail screen — Citrine
├── EmberPrime.kt # Detail screen — Ember Prime
├── ExcaliburUmbra.kt # Detail screen — Excalibur Umbra
├── FrostPrime.kt # Detail screen — Frost Prime
├── KhoraPrime.kt # Detail screen — Khora Prime
└── RhinoPrime.kt # Detail screen — Rhino Prime
- Android Studio Dolphin (2021.3.1) or newer
- JDK 8+
- Android SDK with API 33 platform installed
git clone https://github.com/Akumaaaaaa/JetWarframe.gitOpen the project folder in Android Studio and let Gradle sync complete.
Connect a device or start an emulator (API 21+), then press Run (⇧F10) or:
./gradlew assembleDebug
adb install app/build/outputs/apk/debug/app-debug.apk./gradlew assembleReleaseThe release build has R8 minification and resource shrinking enabled.
UI (Composables)
│ collectAsState / State<T>
▼
JetWarframesViewModel ← single source of truth for the list
│ getWarframes()
▼
WarframeRepository
│ reads
▼
WarframesData (immutable seed)
WarframesData provides the initial immutable list.
WarframeRepository wraps it for DI / testability.
JetWarframesViewModel owns _allWarframes: MutableStateFlow<List<Warframe>> and derives the grouped, filtered view exposed to the UI. All mutations (add / delete) go through the ViewModel so the UI reacts immediately via StateFlow.
| # | Name | Element |
|---|---|---|
| 1 | Ash Prime | Radiation |
| 2 | Atlas Prime | Toxin |
| 3 | Banshee Prime | Electricity |
| 4 | Baruuk Prime | Impact |
| 5 | Citrine | Magnetic |
| 6 | Ember Prime | Heat |
| 7 | Excalibur Umbra | Electricity |
| 8 | Frost Prime | Cold |
| 9 | Khora Prime | Toxin |
| 10 | Rhino Prime | Impact |
| +1 | Limbo Prime (addable at runtime) | — |
- Detail screens use local drawable resources (bundled images), not the network URLs shown in the list. Adding a new warframe via the menu will not have a matching detail screen unless code is added for it.
- The profile photo URL in the About screen (
res/values/strings.xml→profile_photo_url) points to a GitHub avatar; replace it with your own stable photo URL. - Navigation from list → detail is driven by a
when (warframe.name)string match. Adding new warframes requires updating bothWarframesData.ktand thatwhenblock.
This project is for educational / portfolio purposes. Warframe assets belong to Digital Extremes.