Dark Mode

Overview


Aplikasi ini bernama iamra course, iamra merupakan nama saya sendiri yaitu Ilham Rahmat Akbar. Awalnya aplikasi ini dibuat untuk dokumentasi materi programming yang telah saya pelajari setelah saya lulus kuliah tahun 2022. Kemudian seiring waktu, materi tersebut cukup banyak dan ketika ingin dibuka lagi melihat kodingan lama, cukup berantakan. Maka dari itu supaya rapi saya buat folder dan disusun ulang berdasarkan bahasa programming. Sebenarnya sudah cukup rapi, tapi ketika di perjalanan semisal di krl atau di transjakarta ingin melihat materi kodingan, harapannya dengan adanya aplikasi ini bisa melihat materi programming secara online.


Tech stack : Java Android XML


No Nama Package Fungsi
1. androidx.appcompat Library untuk mendukung kompatibilitas UI di berbagai versi Android
2. com.google.android.material Material Design components untuk UI modern dan konsisten
3. androidx.constraintlayout Layout manager untuk membuat UI yang fleksibel dan responsif
4. androidx.lifecycle (LiveData & ViewModel) Komponen lifecycle-aware untuk manajemen data dan UI state
5. androidx.navigation (Fragment & UI) Navigation component untuk navigasi antar fragment/screen
6. Retrofit & Gson Converter HTTP client untuk mengakses REST API dan konversi JSON
7. OkHttp & Logging Interceptor HTTP client library dan interceptor untuk logging request/response
8. uCrop Library untuk crop/edit gambar
9. Room (Runtime & Compiler) Database lokal SQLite dengan abstraksi yang mudah digunakan
10. Midtrans UIKit (Sandbox) Payment gateway Midtrans untuk proses pembayaran (mode sandbox)
11. MPAndroidChart Library untuk membuat grafik dan chart
12. androidx.security.crypto Enkripsi data sensitif seperti token dan credentials
13. Glide & Compiler Image loading library untuk load dan cache gambar dari URL
14. ViewPager2 Widget untuk swipe antar halaman (digunakan untuk onboarding)
15. Google Play Services (Auth & Recaptcha) Login dengan Google dan verifikasi keamanan device
16. SwipeRefreshLayout Widget untuk pull-to-refresh data
17. CameraX (Core, Camera2, Lifecycle, View) Library kamera modern untuk capture foto/video
18. ML Kit Barcode Scanning Scan barcode dan QR code menggunakan ML Kit
19. OSMDroid Library untuk menampilkan peta OpenStreetMap
20. Dagger Hilt Dependency Injection framework untuk manajemen dependencies
21. JUnit & Espresso Testing framework untuk unit test dan UI test

Installation


1
Klik Tombol Download
Klik tombol download untuk mengunduh file app-release.apk dari GitHub Release
Langkah 1
2
Buka File APK
Buka file app-release.apk yang sudah terdownload di folder Downloads perangkat Android Anda
Langkah 2
3
Izinkan Instalasi
Izinkan instalasi dari sumber tidak dikenal jika diminta. Buka Pengaturan > Keamanan > centang "Sumber Tidak Dikenal"
Langkah 3
4
Install Aplikasi
Tekan tombol Install dan tunggu hingga proses instalasi selesai
Langkah 4
5
Buka Aplikasi
Tekan tombol Buka atau cari aplikasi di menu dan jalankan aplikasi
Selesai

Untuk menggunakan aplikasi secara langsung ini bisa melalui Web atau bisa juga melalui aplikasi android. Silahkan klik tombol download dibawah ini


Download APK

MVVM


Aplikasi ini dikembangkan menggunakan Clean Architecture yang dikombinasikan dengan pola desain MVVM (Model-View-ViewModel). Struktur direktori disusun secara modular untuk memisahkan business logic, UI logic, dan data handling. Pendekatan ini dipilih untuk memastikan kode yang scalable, mudah diuji (testable), dan memfasilitasi kolaborasi pengembangan fitur secara independen.


graph TB subgraph "Presentation Layer" A[Activity/Fragment] --> B[ViewModel] end subgraph "Domain Layer" B --> C[Repository] end subgraph "Data Layer" C --> D[Remote Data Source
Retrofit API] C --> E[Local Data Source
Room Database] end style A fill:#4A90E2,stroke:#357ABD,stroke-width:2px,color:#fff style B fill:#7B61FF,stroke:#6347e6,stroke-width:2px,color:#fff style C fill:#FF6B6B,stroke:#ee5a52,stroke-width:2px,color:#fff style D fill:#4ECDC4,stroke:#3db8b0,stroke-width:2px,color:#fff style E fill:#F7B731,stroke:#e6a621,stroke-width:2px,color:#fff

Layer ini merupakan lapisan terluar yang berinteraksi langsung dengan pengguna. Pengorganisasian paket di dalamnya menggunakan pendekatan Package by Feature, di mana setiap fitur memiliki direktori sendiri yang mencakup seluruh kebutuhan UI-nya.


Fragment/Activity
: Bertanggung jawab hanya untuk merender tampilan dan menangkap input pengguna (contoh: `CoursesFragment.java`, `EarningsFragment.java`).
ViewModel
: Menangani logika presentasi dan menyimpan state UI menggunakan `LiveData`/`StateFlow`. ViewModel berkomunikasi dengan Domain Layer untuk mendapatkan data (contoh: `CoursesViewModel.java`, `LoginViewModel.java`).
Adapter
: Menghubungkan data ke komponen list seperti RecyclerView (contoh: `CoursesAdapter.java`, `GroupAdapter.java`).

Ini adalah inti dari aplikasi yang berisi aturan bisnis murni dan tidak memiliki ketergantungan pada framework Android maupun library pihak ketiga. Layer ini mendefinisikan "apa" yang bisa dilakukan aplikasi.


/model/
: Mendefinisikan entitas data atau POJO (Plain Old Java Object) yang digunakan di seluruh aplikasi (contoh: `Course.java`, `User.java`, `Certificate.java`).
/repository/
: Berisi Interface yang berfungsi sebagai kontrak data. Interface ini menjelaskan data apa yang dibutuhkan oleh domain tanpa peduli dari mana asalnya (contoh: `StudentCoursesRepository.java`, `AuthRepository.java`).
/usecase/
: (Opsional) Menangani logika bisnis spesifik yang kompleks (contoh: `LogoutUseCase.java`).

Layer ini bertugas mengelola sumber data dan merupakan implementasi konkret dari kontrak yang ada di Domain Layer. Layer ini menerapkan pola Repository Pattern.


remote/ - Komunikasi Jaringan

/api/
: Definisi endpoint Retrofit (contoh: `StudentApi.java`, `InstructorApi.java`).
/dto/
: Data Transfer Objects untuk memetakan respons JSON dari server (Request & Response bodies).

local/ - Penyimpanan Lokal

/entity/
: Representasi tabel database (contoh: `StudentCoursesEntity.java`).
/dao/
: Data Access Objects yang berisi query SQL (contoh: `StudentCoursesDao.java`).

/mapper
: Bertugas mentransformasi data dari format DTO (Network) atau Entity (Database) menjadi format Model (Domain) agar lapisan domain tetap bersih (contoh: `CourseMapper.java`).
/repository
: Implementasi logika Single Source of Truth. Kelas ini (contoh: `StudentCoursesRepositoryImpl.java`) memutuskan apakah data diambil dari cache lokal atau API.

Direktori ini mengelola pembuatan dan penyuntikan dependensi menggunakan Dagger Hilt. Modul-modul dipisahkan berdasarkan fungsinya untuk memudahkan konfigurasi:


NetworkModule.java
: Menyediakan dependensi jaringan (Retrofit, OkHttp).
DatabaseModule.java
: Menyediakan dependensi database (Room).
RepositoryModule.java
: Menghubungkan Interface Repository di Domain dengan implementasinya di Data layer.

Modul pendukung yang berisi kode dasar dan fungsi bantuan yang digunakan secara global.

Alur Data (Data Flow)


Berikut adalah sequence diagram yang menggambarkan bagaimana data mengalir dari user interaction hingga update UI:


sequenceDiagram participant U as User participant V as View
(Activity/Fragment) participant VM as ViewModel participant R as Repository participant API as Remote API
(Retrofit) participant DB as Local DB
(Room) U->>V: Klik Button Refresh V->>VM: fetchUserData() VM->>R: getUserData() alt Data dari API R->>API: getUser() API-->>R: User Data R->>DB: insertUser(data) DB-->>R: Success else API Error R->>DB: getUser() from cache DB-->>R: Cached User Data end R-->>VM: Return User VM->>VM: _userData.value = user VM-->>V: LiveData Update V->>V: Update UI V-->>U: Tampilkan Data

Struktur Folder


plaintext
ilhamrhmtkbr@ilhamrhmtkbr:/mnt/ssd_external/project/mobile-app/iamra-course-java/app/src/main/java/com/ilhamrhmtkbr$ tree
.
├── core
│    ├── auth
│    │   ├── AuthStateManager.java
│    │   ├── SessionRepository.java
│    │   └── TokenManager.java
│    ├── base
│    │   ├── BaseProtectedActivity.java
│    │   ├── BaseResponseApi.java
│    │   ├── BaseValidation.java
│    │   └── ValidationHelper.java
│    ├── network
│    │   ├── callback
│    │   │   └── FormCallback.java
│    │   ├── cookie
│    │   │   └── SecureCookieJar.java
│    │   ├── CookieManager.java
│    │   ├── interceptor
│    │   │   ├── FormDataInterceptor.java
│    │   │   └── TokenRefreshInterceptor.java
│    │   └── NetworkManager.java
│    ├── state
│    │   ├── FormState.java
│    │   └── Resource.java
│    └── utils
│        ├── notif
│        │   ├── DialogUtil.java
│        │   └── ModalFilter.java
│        ├── system
│        │   ├── NavigationAndroidBarUtil.java
│        │   ├── StatusBarUtil.java
│        │   └── ToolbarUtil.java
│        ├── tools
│        │   ├── FragmentUtil.java
│        │   ├── LangUtil.java
│        │   ├── NotificationUtil.java
│        │   ├── PermissionUtil.java
│        │   └── RedirectUtil.java
│        └── ui
│            ├── LayoutUtil.java
│            ├── TextUtil.java
│            └── ThemeUtil.java
├── data
│    ├── local
│    │   ├── dao
│    │   │   ├── InstructorAnswersDao.java
│    │   │   ├── InstructorAnswersPagination.java
│    │   │   ├── StudentCartsDao.java
│    │   │   ├── StudentCartsPagination.java
│    │   │   └── ...
│    │   ├── database
│    │   │   ├── AppDatabaseSingleton.java
│    │   │   ├── InstructorDatabase.java
│    │   │   └── StudentDatabase.java
│    │   └── entity
│    │       ├── InstructorAnswersEntity.java
│    │       ├── InstructorAnswersPaginationEntity.java
│    │       ├── StudentCartsEntity.java
│    │       ├── StudentCartsPaginationEntity.java
│    │       └── ...
│    ├── mapper
│    │   ├── forum
│    │   │   ├── ChatMapper.java
│    │   │   └── GroupMapper.java
│    │   ├── guest
│    │   │   ├── CertificateMapper.java
│    │   │   ├── CourseMapper.java
│    │   │   └── SectionMapper.java
│    │   ├── instructor
│    │   │   ├── AnswerMapper.java
│    │   │   └── ...
│    │   ├── student
│    │   │   ├── CartMapper.java
│    │   │   └── ...
│    │   ├── UserMapper.java
│    │   └── ValidationErrorMapper.java
│    ├── remote
│    │   ├── api
│    │   │   ├── ForumApi.java
│    │   │   ├── InstructorApi.java
│    │   │   ├── PublicApi.java
│    │   │   ├── StudentApi.java
│    │   │   └── UserApi.java
│    │   ├── dto
│    │   │   ├── request
│    │   │   │   ├── ForumMessageRequest.java
│    │   │   │   ├── InstructorAccountUpSertRequest.java
│    │   │   │   ├── StudentCartStoreRequest.java
│    │   │   │   ├── UserAuthLoginRequest.java
│    │   │   │   └── ...
│    │   │   └── response
│    │   │       ├── ForumChatResponse.java
│    │   │       ├── InstructorAccountResponse.java
│    │   │       ├── PublicCertificateVerifyResponse.java
│    │   │       ├── PublicCoursesResponse.java
│    │   │       ├── StudentCartResponse.java
│    │   │       └── ...
│    │   └── websocket
│    │       └── CustomWebSocketListener.java
│    └── repository
│        ├── AuthRepositoryImpl.java
│        ├── ForumRepositoryImpl.java
│        ├── InstructorAccountRepositoryImpl.java
│        ├── MemberRepositoryImpl.java
│        ├── PublicRepositoryImpl.java
│        ├── StudentCartRepositoryImpl.java
│        └── ...
├── di
│    ├── AuthModule.java
│    ├── DatabaseModule.java
│    ├── ManagerModule.java
│    ├── NetworkModule.java
│    └── RepositoryModule.java
├── domain
│    ├── model
│    │   ├── common
│    │   │   ├── Course.java
│    │   │   └── ...
│    │   ├── forum
│    │   │   ├── Chat.java
│    │   │   └── ...
│    │   ├── instructor
│    │   │   ├── Account.java
│    │   │   └── ...
│    │   ├── student
│    │   │   ├── Cart.java
│    │   │   └── ...
│    │   └── User.java
│    ├── repository
│    │   ├── AuthRepository.java
│    │   ├── ForumRepository.java
│    │   ├── InstructorAccountRepository.java
│    │   ├── MemberRepository.java
│    │   ├── PublicRepository.java
│    │   ├── StudentCartRepository.java
│    │   └── ...
│    └── usecase
│        └── LogoutUseCase.java
├── Ilhamrhmtkbr.java
└── presentation
    ├── auth
    │    ├── AuthActivity.java
    │    ├── login
    │    │   ├── LoginFragment.java
    │    │   └── LoginViewModel.java
    │    └── register
    │        ├── RegisterFragment.java
    │        └── RegisterViewModel.java
    ├── forum
    │    ├── ForumActivity.java
    │    ├── group
    │    │   ├── GroupAdapter.java
    │    │   ├── GroupFragment.java
    │    │   └── GroupViewModel.java
    │    ├── message
    │    │   ├── MessageAdapter.java
    │    │   ├── MessageFragment.java
    │    │   ├── MessageViewModel.java
    │    │   └── MessageWebSocket.java
    │    ├── SetupBottomNav.java
    │    └── SetupNavigationDrawer.java
    ├── guest
    │    ├── certificates
    │    │   ├── CertificatesFragment.java
    │    │   └── CertificatesViewModel.java
    │    ├── coursedetail
    │    │   ├── CourseDetailFragment.java
    │    │   ├── CourseDetailSectionAdapter.java
    │    │   ├── CourseDetailSectionBottomSheet.java
    │    │   └── CourseDetailViewModel.java
    │    ├── courses
    │    │   ├── CourseFilterParams.java
    │    │   ├── CoursesAdapter.java
    │    │   ├── CoursesFragment.java
    │    │   └── CoursesViewModel.java
    │    ├── CustomCondition.java
    │    ├── GuestActivity.java
    │    ├── home
    │    │   ├── HomeFragment.java
    │    │   ├── HomeImageAdapter.java
    │    │   ├── HomeInfoAdapter.java
    │    │   ├── HomeSettingAdapter.java
    │    │   ├── HomeViewPagerInstructor.java
    │    │   └── HomeViewPagerStudent.java
    │    ├── SetupBottomNav.java
    │    ├── SetupExtraListener.java
    │    ├── SetupFragmentManager.java
    │    ├── SetupNavigationDrawer.java
    │    ├── SetupOptionsMenu.java
    │    ├── SetupOverlay.java
    │    └── SetupSearchView.java
    ├── instructor
    │    ├── account
    │    │   ├── AccountBanksAdapter.java
    │    │   ├── AccountFragment.java
    │    │   ├── AccountViewModels.java
    │    │   └── SetupBanks.java
    │    ├── InstructorActivity.java
    │    ├── SetupBottomNav.java
    │    ├── SetupExtraListener.java
    │    ├── SetupNavigationDrawer.java
    │    └── ...
    ├── member
    │    ├── additionalinfo
    │    │   ├── AdditionalInfoBottomSheetMap.java
    │    │   ├── AdditionalInfoFragment.java
    │    │   └── AdditionalInfoViewModel.java
    │    ├── MemberActivity.java
    │    ├── SetupBottomNav.java
    │    ├── SetupExtraListener.java
    │    ├── SetupNavigationDrawer.java
    │    ├── SetupNotification.java
    │    ├── SetupToolbar.java
    │    ├── SetupUserData.java
    |	└── ...
    ├── onboarding
    │    ├── OnboardingActivity.java
    │    ├── OnboardingAdapter.java
    │    ├── OnboardingItem.java
    │    ├── SetupAppFlow.java
    │    └── SetupPrefs.java
    ├── qrscanner
    │    ├── CameraInterface.java
    │    ├── CertificateInterface.java
    │    ├── QrCodeInterface.java
    │    └── QrScannerActivity.java
    ├── student
    │    ├── SetupBottomNav.java
    │    ├── SetupExtraListener.java
    │    ├── SetupNavigationDrawer.java
    │    ├── StudentActivity.java
    │    ├── transactiondetail
    │    │   ├── TransactionDetailFragment.java
    │    │   └── TransactionDetailViewModel.java
    │    └── ...
    └── utils
        ├── adapter
        │    ├── AccordionAdapter.java
        │    └── PaginationAdapter.java
        ├── behavior
        │    ├── BottomNavBehavior.java
        │    └── ToolbarBehavior.java
        ├── component
        │    ├── ButtonSubmit.java
        │    ├── DataInfo.java
        │    ├── InputText.java
        │    └── ScrollIndicator.java
        ├── helper
        │    ├── ImageViewUtil.java
        │    ├── LoadingUtil.java
        │    ├── RecyclerViewsUtil.java
        │    └── TableLayoutUtil.java
        └── tools
            ├── FormStateHandler.java
            ├── SingleLiveEvent.java
            └── ValidationFrontend.java

Guest

Member

Instructor

Student

Forum