Bingung nonton apa? Pilih genre, selesai.
MovieTracker membantu penonton memilih film lewat alur singkat: login → pilih genre → daftar film → detail, lalu simpan ke favorit dan beri rating 1–5. Semua tersimpan di perangkat.
Menyelesaikan masalah dari ide MovieTracker
Ide awalnya sederhana: orang sering menghabiskan waktu memilih film dan tidak punya catatan pribadi tentang film yang disukai. MovieTracker memangkas pilihan menjadi alur yang pendek dan menyimpan preferensi pengguna.
Masalah
- Terlalu banyak pilihan. Katalog film panjang dan tidak terfilter sesuai suasana hati.
- Tidak ada catatan pribadi. Film yang sudah disukai dan penilaian sendiri mudah terlupa.
- Rating tersebar. Pengguna sulit melihat nilai rata-rata yang ringkas di satu tempat.
- Akses tidak personal. Favorit seharusnya terikat ke akun, bukan perangkat bersama.
Solusi di aplikasi
- Pilih genre dulu (Action, Comedy, Horror, Romance, Sci-Fi) lalu lihat 3 film per genre.
- Favorit per akun lewat tabel
favoritesdengan relasi user–film. - Rating 1–5 yang bisa diubah; rata-rata dihitung otomatis dengan
AVG(score). - Sesi login disimpan di SharedPreferences, jadi tidak perlu login ulang.
Alur navigasi (sesuai kode)
Data dikirim antar halaman lewat Intent extras: userId, genre, movieId, movieTitle. Setiap Activity memeriksa userId; bila hilang, pengguna diarahkan kembali ke Login, bukan crash.
Apa yang harus dipenuhi aplikasi
Requirement disusun dari kode yang sudah ada, lalu dibandingkan dengan target tugas untuk melihat celah yang masih perlu dikerjakan.
Kebutuhan fungsional
| ID | Kebutuhan | Implementasi | Status |
|---|---|---|---|
| FR-01 | Registrasi akun (nama, username, email, password) | RegisterActivity + registerUser(), cek username/email unik | Selesai |
| FR-02 | Login dengan username atau email | LoginActivity + loginUser(), password di-hash SHA-256 + salt | Selesai |
| FR-03 | Sesi login tetap tersimpan | SessionManager (SharedPreferences) | Selesai |
| FR-04 | Pilih genre & lihat daftar film | GenreActivity, MovieListActivity | Selesai |
| FR-05 | Detail film, sinopsis, rata-rata rating | MovieDetailActivity | Selesai |
| FR-06 | Tambah/hapus favorit | tabel favorites, FavoriteActivity | Selesai |
| FR-07 | Beri & ubah rating 1–5 | tabel ratings (CHECK 1..5, UNIQUE user+film) | Selesai |
| FR-08 | Lupa password | ForgotPasswordActivity masih kosong dan belum terdaftar di Manifest | Belum |
| FR-09 | Data film dari API publik | Film masih dari data awal SQLite | Rencana |
| FR-10 | Iklan AdMob | Belum ada dependensi / ID iklan | Rencana |
Kebutuhan non-fungsional
Keamanan
Password tidak disimpan polos; memakai salt acak 16 byte + SHA-256 dan pembandingan MessageDigest.isEqual. Rencana: ganti ke PBKDF2/bcrypt untuk produksi.
Kompatibilitas
minSdk 26 (Android 8.0), targetSdk & compileSdk 36, Java 11, Material Components, ConstraintLayout.
Keandalan & kegunaan
Foreign key SQLite diaktifkan, validasi input dengan TextInputLayout, tema gelap bergaya bioskop, pesan error berbahasa Indonesia.
Temuan analisis kode
- Tombol “Lupa password” berpotensi crash.
ForgotPasswordActivitybelum ada diAndroidManifest.xmldan tidak memanggilsetContentView()(layoutactivity_forgotpw.xmlsudah ada). Perbaikan ada di folderandroid-upgrade/. - Daftar film memakai ListView + BaseAdapter, bukan RecyclerView. Pola ViewHolder sudah ada, jadi migrasinya ringan.
- Poster hanya 5 drawable generik (satu per genre), belum poster asli per film.
onUpgrade()menghapus semua tabel; aman untuk tugas, tetapi harus diganti migrasi bertahap sebelum rilis.
Fitur untuk pengguna
Delapan fitur inti yang dilihat pengguna di aplikasi.
Akun & Login
Daftar dan masuk dengan username atau email. Sesi tetap aktif sampai logout.
Pilih Genre
Lima kartu genre berwarna: Action, Comedy, Horror, Romance, Sci-Fi.
Daftar Film
Judul, genre, tahun, dan rata-rata rating dalam satu list.
Detail Film
Poster, sinopsis, dan rating komunitas.
Favorit
Simpan dan hapus film favorit per akun, daftar langsung diperbarui.
Rating 1–5
Beri penilaian, ubah kapan saja, rata-rata dihitung otomatis.
Film dari API Rencana
Katalog film terbaru dari REST API publik.
Iklan & Premium Rencana
Versi gratis berbasis AdMob dan opsi bebas iklan.
Enam materi pengembangan yang diterapkan
Status dinilai langsung dari source code. Fitur yang belum lengkap disertai kode penerapannya di folder android-upgrade/.
| # | Materi | Bukti di kode | Status |
|---|---|---|---|
| 1 | Activity, UI/UX & widget dasar | 8 Activity; TextView, MaterialButton, TextInputLayout, ImageView, RatingBar, kartu genre | Terapan |
| 2 | Navigasi & Intent | startActivity(Intent) + putExtra/getExtra di 6 transisi; flag CLEAR_TASK saat logout | Terapan |
| 3 | SharedPreferences & SQLite | SessionManager; DatabaseHelper (users, movies, favorites, ratings) | Terapan |
| 4 | RecyclerView + Adapter + ViewHolder | Saat ini ListView + BaseAdapter + ViewHolder manual | Migrasi |
| 5 | Integrasi API publik | Belum ada; disiapkan klien TMDB | Tambah |
| 6 | Monetisasi AdMob | Belum ada; disiapkan banner + interstitial (ID uji) | Tambah |
Activity, UI/UX & widget dasar
Setiap layar adalah satu AppCompatActivity dengan layout XML sendiri. Validasi form memakai TextInputLayout yang menampilkan pesan error langsung di bawah kolom. Tema gelap memakai palet #0D0D10 / #E50914 yang sama dengan website ini.
// LoginActivity – validasi widget input
if (input.isEmpty()) {
tilUsernameOrEmail.setError("Username atau email wajib diisi");
valid = false;
}
findViewById(R.id.btnLogin).setOnClickListener(v -> attemptLogin());
Navigasi antar halaman dengan Intent
Data dikirim lewat extras, dan penerima memvalidasinya. Konstanta key dikumpulkan di Constants.java agar tidak salah ketik.
// GenreActivity -> MovieListActivity
Intent intent = new Intent(this, MovieListActivity.class);
intent.putExtra(Constants.EXTRA_GENRE, genre);
intent.putExtra(Constants.EXTRA_USER_ID, userId);
startActivity(intent);
// penerima
userId = getIntent().getIntExtra(Constants.EXTRA_USER_ID, -1);
if (userId == -1) { SessionManager.redirectToLogin(this); return; }
SharedPreferences & SQLite
SharedPreferences menyimpan sesi login. SQLite menyimpan data relasional dengan foreign key dan ON DELETE CASCADE.
// SessionManager
prefs.edit().putBoolean(PREF_IS_LOGGED_IN, true)
.putInt(PREF_USER_ID, user.getId()).apply();
// DatabaseHelper – rata-rata rating dengan JOIN
SELECT m.*, COALESCE(AVG(r.score),0) AS avg_rating, COUNT(r.id) AS rating_count
FROM movies m LEFT JOIN ratings r ON r.movie_id = m.id ...
RecyclerView, Adapter & ViewHolder
Kode saat ini memakai ListView. Berkas MovieRecyclerAdapter.java menggantikannya dengan RecyclerView.Adapter dan ViewHolder wajib, memakai layout item_movie.xml yang sama.
public class MovieRecyclerAdapter
extends RecyclerView.Adapter<MovieRecyclerAdapter.VH> {
public void onBindViewHolder(VH h, int pos) { /* bind Movie */ }
static class VH extends RecyclerView.ViewHolder { ... }
}
Integrasi REST API publik
Contoh memakai TMDB /discover/movie lewat HttpURLConnection di thread latar, tanpa library tambahan. Butuh izin INTERNET dan API key Anda sendiri. Periksa syarat penggunaan TMDB (atribusi dan lisensi untuk penggunaan komersial) sebelum rilis. Alternatif: Firebase Firestore untuk sinkronisasi favorit dan rating.
GET https://api.themoviedb.org/3/discover/movie
?api_key=YOUR_KEY&language=id-ID&with_genres=28
Monetisasi dengan AdMob
Banner di bawah daftar film dan interstitial setelah pengguna menutup detail film. Contoh memakai ID iklan uji resmi Google; ganti dengan ID akun AdMob Anda sebelum rilis.
implementation("com.google.android.gms:play-services-ads:<versi terbaru>")
<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3940256099942544~3347511713" />
Lima peran untuk membawa MovieTracker ke rilis
Nama anggota di bawah adalah placeholder, silakan ganti lewat file template-parts/section-tim.php.
Nama Anggota 1
Project Manager / Product OwnerMenyusun roadmap dan backlog, menjaga jadwal sprint, menjadi penghubung dengan dosen/stakeholder.
- Memahami Scrum/Kanban
- Menulis user story & acceptance criteria
- Komunikasi dan manajemen risiko
Nama Anggota 2
Android DeveloperMengembangkan Activity, SQLite, SessionManager, RecyclerView, dan integrasi API/AdMob.
- Java/Kotlin & Android SDK
- SQLite, SharedPreferences, REST (HTTP/JSON)
- Git & debugging dengan Logcat
Nama Anggota 3
UI/UX DesignerMerancang alur, wireframe, dan tema gelap bergaya bioskop; memastikan kontras dan keterbacaan.
- Figma & Material Design
- User flow dan usability testing
- Dasar aksesibilitas
Nama Anggota 4
Backend / API & QA EngineerMengelola integrasi TMDB/Firebase, menulis uji unit dan UI (JUnit, Espresso), memantau crash.
- REST, JSON, Firebase
- JUnit & Espresso
- Dasar keamanan data (UU PDP)
Nama Anggota 5
Marketing & GrowthMengelola ASO, konten sosial media, kemitraan komunitas, dan analitik iklan.
- Copywriting & konten video pendek
- ASO & Google Play Console
- Analitik (Firebase / AdMob)
Struktur berlapis yang mudah dikembangkan
Garis solid adalah komponen yang sudah ada di kode. Garis putus-putus adalah komponen rencana (RecyclerView, API, AdMob).
Pola
Activity-per-layar dengan lapisan data terpisah (database/, utils/, model/, adapter/). Cocok sebelum naik ke MVVM + Repository.
Aliran data
Activity → DatabaseHelper → SQLite → Model → Adapter → daftar. Data API nanti masuk lewat Repository yang menyimpan ke SQLite sebagai cache.
Rencana evolusi
Pindahkan query ke thread latar, tambah Repository, lalu ViewModel/LiveData supaya layar tidak memuat ulang saat rotasi.
Posisi strategis dan model bisnis
Analisa SWOT
Strengths (Kekuatan)
- Alur sangat singkat: genre → film → detail.
- Data tersimpan lokal; berfungsi tanpa internet.
- Keamanan dasar baik (hash + salt, foreign key).
- UI gelap konsisten dan berbahasa Indonesia.
Weaknesses (Kelemahan)
- Katalog hanya 15 film dan poster generik.
- Rating hanya lokal; belum ada “komunitas” nyata.
- Lupa password belum berfungsi.
- Belum ada API, iklan, atau pendapatan.
Opportunities (Peluang)
- Pengguna internet Indonesia 229,43 juta (APJII 2025).
- Katalog besar lewat API publik tanpa biaya konten sendiri.
- Rekomendasi berbasis mood dan rating pengguna.
- Kemitraan komunitas film dan kampus.
Threats (Ancaman)
- Pesaing besar: IMDb, Letterboxd, TMDB app, platform streaming.
- Ketergantungan pada syarat dan kuota API pihak ketiga.
- Retensi aplikasi utilitas hiburan cenderung rendah.
- Kepatuhan privasi (UU PDP) saat data pengguna di-cloud-kan.
Business Model Canvas
Key Partners
- TMDB / penyedia API film
- Google (AdMob, Play)
- Komunitas film & kampus
- Micro-influencer film
Key Activities
- Pengembangan app
- Kurasi & sinkron data
- ASO & konten
Value Propositions
- Pilih film dalam beberapa ketukan
- Favorit & rating pribadi
- Ringan, offline-friendly
- Bahasa Indonesia
Customer Relationships
- Self-service in-app
- Notifikasi rekomendasi
- Komunitas & ulasan Play Store
Customer Segments
- Penonton usia 15–34
- Mahasiswa & pekerja muda
- Pencinta genre tertentu
- Pasangan/keluarga pemilih film
Key Resources
- Tim developer & desainer
- Basis data film
- Akun AdMob/Play
Channels
- Google Play
- TikTok / Instagram
- Website ini
Cost Structure
- Gaji/honor tim & akun developer Play (sekali bayar)
- Server/Firebase (setelah melewati kuota gratis)
- Iklan akuisisi & konten
Revenue Streams
- Iklan AdMob (banner, interstitial, rewarded)
- Premium bebas iklan (langganan)
- Sponsor/penempatan film & afiliasi tautan streaming
Ukuran pasar yang masuk akal
Perhitungan memakai pendekatan bottom-up: jumlah pengguna dikalikan pendapatan per pengguna per tahun (ARPU).
TAM · Total Addressable Market
Semua pengguna internet Indonesia yang berpotensi memakai aplikasi pencari/pencatat film.
137,7 jt × Rp 15.000 ARPU = ≈ Rp 2,07 triliun
SAM · Serviceable Available Market
Pengguna Android berbahasa Indonesia usia 15–34 yang aktif menonton film dan mencari rekomendasi.
34,4 jt × Rp 15.000 = ≈ Rp 516 miliar
SOM · Serviceable Obtainable Market
Bagian yang realistis direbut dalam 3 tahun pertama dengan modal dan tim kecil.
344 ribu × Rp 15.000 = ≈ Rp 5,2 miliar
Catatan metodologi. Hanya angka 229,43 juta pengguna internet (APJII, Survei Profil Internet Indonesia 2025) yang berasal dari sumber publik. Persentase 60%, 25%, 1% dan ARPU Rp 15.000/tahun adalah asumsi tim yang harus divalidasi lewat survei pengguna dan data AdMob nyata. Ubah di tahap validasi, hasilnya ikut berubah proporsional.
Cara menjangkau penonton pertama
Target awal: mahasiswa dan pekerja muda 15–34 tahun di kota besar Pulau Jawa, yang menurut APJII menyumbang 58% pengguna internet nasional.
App Store Optimization
Kata kunci “rekomendasi film”, “pilih film”, “watchlist”. Tangkapan layar tema bioskop, deskripsi Indonesia, dan permintaan ulasan setelah pengguna memberi rating pertama.
Konten video pendek
TikTok/Reels seri “Film apa malam ini?”: pilih genre di app, tampilkan hasilnya. Format mudah ditiru dan dibagikan.
Komunitas & kampus
Kerja sama dengan komunitas film, UKM sinema, dan kelas pemrograman. Mini kuis genre dan hadiah premium gratis.
Micro-influencer
Reviewer film 5–50 ribu pengikut dengan kode undangan unik. Biaya kecil, kepercayaan tinggi.
Referral & berbagi
Tombol bagikan “Film favoritku” dan undang teman untuk membuka tema premium.
Website & SEO (situs ini)
Blog WordPress: daftar film per genre dan mood, tautan ke Google Play.
Funnel & metrik
| Tahap | Tindakan | Metrik |
|---|---|---|
| Awareness | Video pendek, influencer, SEO blog | Impresi, view, trafik organik |
| Acquisition | Halaman Play Store & ASO | Install, konversi halaman toko |
| Activation | Registrasi → pilih genre → rating pertama | % pengguna memberi rating di sesi 1 |
| Retention | Notifikasi rekomendasi mingguan | D1 / D7 / D30 |
| Revenue | Iklan AdMob, upsell Premium | eCPM, konversi ke Premium |
| Referral | Bagikan favorit & undangan | K-factor, install dari referral |
Empat sumber pendapatan
Fokus awal pada iklan AdMob yang ringan dipasang. Langganan dan kemitraan menyusul setelah basis pengguna terbentuk.
Iklan AdMob
- Banner di bawah
MovieListActivitydanFavoriteActivity. - Interstitial setelah pengguna menutup detail film, dibatasi frekuensinya (misalnya tiap 3 detail).
- Rewarded opsional: tonton iklan untuk membuka tema/avatar.
- Jangan tampilkan iklan di layar Login/Register.
Premium bebas iklan
- Langganan lewat Google Play Billing.
- Manfaat: tanpa iklan, tema tambahan, sinkronisasi cloud, statistik tontonan.
Afiliasi & sponsor
- Tautan “tonton di…” ke layanan streaming resmi dengan program afiliasi.
- Slot “Film pilihan” berlabel jelas sebagai sponsor.
Wawasan agregat (B2B)
- Tren genre populer dalam bentuk agregat dan anonim.
- Hanya dengan persetujuan pengguna dan sesuai UU PDP.
Aturan AdMob. Selama pengembangan wajib memakai ID iklan uji. Jangan mengklik iklan sendiri dan jangan menempatkan iklan yang mudah tersentuh tidak sengaja; keduanya dapat membuat akun AdMob ditangguhkan.
Gratis untuk memulai, Premium untuk bebas iklan
Harga di bawah adalah usulan awal dan perlu diuji (A/B test) sebelum rilis.
Gratis
Selamanya, didukung iklan.
- Semua fitur inti (genre, favorit, rating)
- Banner & interstitial terbatas
- Data tersimpan di perangkat
Premium
Batal kapan saja.
- Tanpa iklan
- Sinkronisasi favorit & rating (cloud)
- Tema & avatar tambahan
- Statistik tontonan pribadi
Partner / Sponsor
Untuk rumah produksi, bioskop, dan layanan streaming.
- Slot “Film pilihan” berlabel sponsor
- Laporan tren genre agregat
- Kampanye bersama komunitas
Dasar penetapan harga
Daya beli
Rp 19.000/bulan setara satu paket kopi; ditempatkan di bawah harga umum langganan streaming.
Potongan Google Play
Google memotong biaya layanan dari penjualan dalam aplikasi; tarif berubah, cek tabel resmi Play Console sebelum menghitung margin.
Titik impas
Dengan 1.000 pelanggan tahunan Rp 149.000, kotor ≈ Rp 149 juta/tahun sebelum potongan toko dan pajak. Uji harga pada 3 variasi sebelum menetapkan final.
Siap memilih film malam ini?
MovieTracker sedang dalam pengembangan. Ikuti perkembangannya atau ajak kami berkolaborasi.
Hubungi tim