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
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.
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.
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.
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
local/ - Penyimpanan Lokal
Direktori ini mengelola pembuatan dan penyuntikan dependensi menggunakan Dagger Hilt. Modul-modul dipisahkan berdasarkan fungsinya untuk memudahkan konfigurasi:
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:
(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
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