Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
14 commits
Select commit Hold shift + click to select a range
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
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,6 @@ local.properties
app/version.properties

# SonarQube
.sonar/
.sonar/

gradle/gradle-daemon-jvm.properties
30 changes: 30 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Agent Project Guidelines & Android Skills Enforcement

## Instruksi Penggunaan Skill Android
Setiap kali mengembangkan, memodifikasi, merombak (*refactoring*), mengoptimalkan, atau menguji proyek Android **piano-tiles** ini, Agent WAJIB secara aktif membaca dan menerapkan petunjuk dari **Skills Agent Android** yang relevan sebelum melakukan perubahan kode:

### 1. Pengembangan & Arsitektur UI
- **`frogo-sdk`**: Gunakan panduan dan komponen Frogo SDK untuk pengembangan UI (Compose/XML), integrasi iklan (AdMob), helper RecyclerView, dan utilitas Android core.
- **`edge-to-edge`**: Terapkan panduan adaptif edge-to-edge untuk memastikan komponen UI tidak tertutup status bar, navigation bar, atau IME/keyboard inset.
- **`migrate-xml-views-to-jetpack-compose`**: Ikuti alur kerja terstruktur saat melakukan migrasi layout dari legacy XML View ke Jetpack Compose.
- **`jetpack-compose-m3`** & **`android-jetpack-compose-expert`**: Gunakan praktik terbaik Material Design 3 dan pengoptimalan performa Jetpack Compose.

### 2. Navigasi & Monetisasi
- **`navigation-3`**: Gunakan panduan Jetpack Navigation 3 untuk manajemen navigasi halaman, deep link, multiple backstack, dan scene transitions.
- **`play-billing-library-version-upgrade`**: Ikuti panduan pembaruan Google Play Billing Library (PBL) saat menangani in-app purchase atau langganan.

### 3. Build Optimization & CLI Operations
- **`android-cli`**: Gunakan skill `android-cli` untuk otomasi perintah Android CLI, pengujian, deployment, emulator, dan diagnosa lingkungan pengembangan.
- **`agp-9-upgrade`**: Ikuti aturan & panduan migrasi saat memperbarui Android Gradle Plugin (AGP) ke versi 9.
- **`r8-analyzer`**: Analisis file build dan Proguard/R8 keep rules untuk mengeliminasi aturan redundan dan meminimalkan ukuran APK.

### 4. Performa & Asinkron
- **`kotlin-coroutines-expert`**: Gunakan praktik terbaik penanganan Coroutines, Flow, dan operasi asinkron tanpa memblokir Main UI Thread.
- **`diagnose-android-overheating`**: Periksa dan hindari kebocoran memori (*memory leak*) atau pemakaian CPU tinggi yang dapat menyebabkan perangkat cepat panas.

---

## Prosedur Eksekusi Agent
1. **Periksa Skill**: Sebelum mulai menulis atau merombak kode, identifikasi skill Android di atas yang relevan dengan tugas.
2. **Baca `SKILL.md`**: Gunakan `view_file` pada `SKILL.md` dari skill yang relevan untuk membaca dokumentasi & petunjuk teknisnya.
3. **Patuhi Panduan**: Ikuti standar coding, arsitektur, dan keamanan yang tertera pada skill tersebut secara konsisten.
17 changes: 16 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ plugins {
alias(libs.plugins.ksp)
alias(libs.plugins.hilt)
alias(libs.plugins.kotlinParcelize)
alias(libs.plugins.kotlin.compose)
}

ksp {
Expand All @@ -21,7 +22,7 @@ base {

android {

namespace = "com.frogobox.kickstart"
namespace = "io.github.amirisback.androidapp"
compileSdk = ProjectSetting.PROJECT_COMPILE_SDK

defaultConfig {
Expand Down Expand Up @@ -98,6 +99,7 @@ android {
viewBinding = true
buildConfig = true
resValues = true
compose = true
}

compileOptions {
Expand Down Expand Up @@ -138,4 +140,17 @@ dependencies {
ksp(libs.androidx.room.compiler)
ksp(libs.github.glide.compiler)

// Compose
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.compose.ui)
implementation(libs.androidx.compose.ui.graphics)
implementation(libs.androidx.compose.ui.tooling.preview)
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.compose.foundation)
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.lifecycle.runtime.compose)
implementation(libs.androidx.lifecycle.viewmodel.compose)
implementation(libs.coil.compose)
debugImplementation(libs.androidx.compose.ui.tooling)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,286 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "55fd7d6098321df8bda0298c83bc17c7",
"entities": [
{
"tableName": "meal",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`table_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `idMeal` TEXT, `strMeal` TEXT, `strDrinkAlternate` TEXT, `strCategory` TEXT, `strArea` TEXT, `strInstructions` TEXT, `strMealThumb` TEXT, `strTags` TEXT, `strYoutube` TEXT, `strIngredient1` TEXT, `strIngredient2` TEXT, `strIngredient3` TEXT, `strIngredient4` TEXT, `strIngredient5` TEXT, `strIngredient6` TEXT, `strIngredient7` TEXT, `strIngredient8` TEXT, `strIngredient9` TEXT, `strIngredient10` TEXT, `strIngredient11` TEXT, `strIngredient12` TEXT, `strIngredient13` TEXT, `strIngredient14` TEXT, `strIngredient15` TEXT, `strIngredient16` TEXT, `strIngredient17` TEXT, `strIngredient18` TEXT, `strIngredient19` TEXT, `strIngredient20` TEXT, `strMeasure1` TEXT, `strMeasure2` TEXT, `strMeasure3` TEXT, `strMeasure4` TEXT, `strMeasure5` TEXT, `strMeasure6` TEXT, `strMeasure7` TEXT, `strMeasure8` TEXT, `strMeasure9` TEXT, `strMeasure10` TEXT, `strMeasure11` TEXT, `strMeasure12` TEXT, `strMeasure13` TEXT, `strMeasure14` TEXT, `strMeasure15` TEXT, `strMeasure16` TEXT, `strMeasure17` TEXT, `strMeasure18` TEXT, `strMeasure19` TEXT, `strMeasure20` TEXT, `strSource` TEXT, `dateModified` TEXT)",
"fields": [
{
"fieldPath": "table_id",
"columnName": "table_id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "idMeal",
"columnName": "idMeal",
"affinity": "TEXT"
},
{
"fieldPath": "strMeal",
"columnName": "strMeal",
"affinity": "TEXT"
},
{
"fieldPath": "strDrinkAlternate",
"columnName": "strDrinkAlternate",
"affinity": "TEXT"
},
{
"fieldPath": "strCategory",
"columnName": "strCategory",
"affinity": "TEXT"
},
{
"fieldPath": "strArea",
"columnName": "strArea",
"affinity": "TEXT"
},
{
"fieldPath": "strInstructions",
"columnName": "strInstructions",
"affinity": "TEXT"
},
{
"fieldPath": "strMealThumb",
"columnName": "strMealThumb",
"affinity": "TEXT"
},
{
"fieldPath": "strTags",
"columnName": "strTags",
"affinity": "TEXT"
},
{
"fieldPath": "strYoutube",
"columnName": "strYoutube",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient1",
"columnName": "strIngredient1",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient2",
"columnName": "strIngredient2",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient3",
"columnName": "strIngredient3",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient4",
"columnName": "strIngredient4",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient5",
"columnName": "strIngredient5",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient6",
"columnName": "strIngredient6",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient7",
"columnName": "strIngredient7",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient8",
"columnName": "strIngredient8",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient9",
"columnName": "strIngredient9",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient10",
"columnName": "strIngredient10",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient11",
"columnName": "strIngredient11",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient12",
"columnName": "strIngredient12",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient13",
"columnName": "strIngredient13",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient14",
"columnName": "strIngredient14",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient15",
"columnName": "strIngredient15",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient16",
"columnName": "strIngredient16",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient17",
"columnName": "strIngredient17",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient18",
"columnName": "strIngredient18",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient19",
"columnName": "strIngredient19",
"affinity": "TEXT"
},
{
"fieldPath": "strIngredient20",
"columnName": "strIngredient20",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure1",
"columnName": "strMeasure1",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure2",
"columnName": "strMeasure2",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure3",
"columnName": "strMeasure3",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure4",
"columnName": "strMeasure4",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure5",
"columnName": "strMeasure5",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure6",
"columnName": "strMeasure6",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure7",
"columnName": "strMeasure7",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure8",
"columnName": "strMeasure8",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure9",
"columnName": "strMeasure9",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure10",
"columnName": "strMeasure10",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure11",
"columnName": "strMeasure11",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure12",
"columnName": "strMeasure12",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure13",
"columnName": "strMeasure13",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure14",
"columnName": "strMeasure14",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure15",
"columnName": "strMeasure15",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure16",
"columnName": "strMeasure16",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure17",
"columnName": "strMeasure17",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure18",
"columnName": "strMeasure18",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure19",
"columnName": "strMeasure19",
"affinity": "TEXT"
},
{
"fieldPath": "strMeasure20",
"columnName": "strMeasure20",
"affinity": "TEXT"
},
{
"fieldPath": "strSource",
"columnName": "strSource",
"affinity": "TEXT"
},
{
"fieldPath": "dateModified",
"columnName": "dateModified",
"affinity": "TEXT"
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"table_id"
]
}
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '55fd7d6098321df8bda0298c83bc17c7')"
]
}
}
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<activity android:name=".ui.detail.DetailActivity" />
<activity android:name=".ui.about.AboutUsActivity" />
<activity
android:name=".ui.main.MainActivity"
android:name=".ui.features.main.MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand Down
Loading
Loading