Lewati ke konten

Sesi 5: Capstone Showcase: Remote API, Coil, Native WallpaperManager, R8 & Final Project Submission

Langkah 1: Pasang Dependensi OkHttp & Coil

Section titled “Langkah 1: Pasang Dependensi OkHttp & Coil”

Pustaka okhttp dan coil-compose sudah terdaftar di gradle/libs.versions.toml. Buka berkas app/build.gradle.kts, lalu panggil di dalam blok dependencies:

dependencies {
// Remote API HTTP Client
implementation(libs.okhttp)
// Asynchronous Image Loading untuk Jetpack Compose
implementation(libs.coil.compose)
}

Klik tombol Sync Now di sudut kanan atas editor.


Langkah 2: Ambil Data API di WallpaperRepository.kt

Section titled “Langkah 2: Ambil Data API di WallpaperRepository.kt”

Buka berkas app/src/main/kotlin/com/gdgoc/luminawalls/data/repository/WallpaperRepository.kt:

object WallpaperRepository {
private val client = OkHttpClient()
private const val API_URL = "https://lumiwalls-api.gdgoc.workers.dev/wallpapers"
suspend fun fetchWallpapers(): List<Wallpaper> = withContext(Dispatchers.IO) {
val request = Request.Builder().url(API_URL).build()
client.newCall(request).execute().use { response ->
if (!response.isSuccessful) throw IOException("Gagal memuat data: ${response.code}")
val body = response.body?.string() ?: return@withContext emptyList()
parseWallpapersJson(body)
}
}
}

Langkah 3: Load Gambar Online di NetworkImage.kt

Section titled “Langkah 3: Load Gambar Online di NetworkImage.kt”

Buka berkas app/src/main/kotlin/com/gdgoc/luminawalls/ui/components/NetworkImage.kt:

@Composable
fun NetworkImage(
url: String,
contentDescription: String?,
modifier: Modifier = Modifier,
contentScale: ContentScale = ContentScale.Crop,
) {
SubcomposeAsyncImage(
model = ImageRequest.Builder(LocalContext.current)
.data(url)
.crossfade(true)
.build(),
contentDescription = contentDescription,
contentScale = contentScale,
loading = {
Box(
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colorScheme.surfaceContainerHigh),
contentAlignment = Alignment.Center,
) {
CircularProgressIndicator(
modifier = Modifier.size(24.dp),
strokeWidth = 2.dp,
color = MaterialTheme.colorScheme.primary,
)
}
},
error = {
Box(
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colorScheme.surfaceContainerHighest),
contentAlignment = Alignment.Center,
) {
Icon(
imageVector = Icons.Rounded.BrokenImage,
contentDescription = null,
tint = MaterialTheme.colorScheme.outline,
)
}
},
modifier = modifier,
)
}

Langkah 4: Pasang Wallpaper Native via WallpaperManager

Section titled “Langkah 4: Pasang Wallpaper Native via WallpaperManager”

1. Izin di app/src/main/AndroidManifest.xml

Section titled “1. Izin di app/src/main/AndroidManifest.xml”

Tambahkan baris berikut di atas tag <application>:

<uses-permission android:name="android.permission.SET_WALLPAPER" />

2. Eksekusi di ApplyWallpaperBottomSheet.kt

Section titled “2. Eksekusi di ApplyWallpaperBottomSheet.kt”

Buka berkas app/src/main/kotlin/com/gdgoc/luminawalls/ui/screens/preview/ApplyWallpaperBottomSheet.kt:

suspend fun applyWallpaper(
context: Context,
bitmap: Bitmap,
target: WallpaperTarget,
) = withContext(Dispatchers.IO) {
val manager = WallpaperManager.getInstance(context)
val flag = when (target) {
WallpaperTarget.HOME -> WallpaperManager.FLAG_SYSTEM
WallpaperTarget.LOCK -> WallpaperManager.FLAG_LOCK
WallpaperTarget.BOTH -> WallpaperManager.FLAG_SYSTEM or WallpaperManager.FLAG_LOCK
}
manager.setBitmap(bitmap, null, true, flag)
}

Buka berkas app/build.gradle.kts. Pada blok buildTypes -> release:

android {
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}

Kompilasi APK rilis lewat Terminal:

Terminal window
./gradlew assembleRelease

Hasil file APK ada di app/build/outputs/apk/release/app-release.apk.


Langkah 6: Simpan ke Git & Submit Proyek Capstone

Section titled “Langkah 6: Simpan ke Git & Submit Proyek Capstone”
  1. Push seluruh kode final ke repositori GitHub pribadimu:

    Terminal window
    git status
    git add .
    git commit -m "feat(sesi-5): complete capstone project with remote api, coil, wallpaper manager, and r8"
    git push origin main
  2. Kumpulkan tautan repositori proyekmu ke form / repositori submission: Repositori Submission Capstone GDGoC