π App Introduction: Android application automating manual gas usage management for Cubaβs national Manufactured Gas Company
π Duration: February 20, 2021 ~ March 18, 2021 (1 month)
π± Platform: Native Android app
π’ Company: Desoft (Cubaβs national software development company)
π₯ Team Size: 1 developer
πΌ Role: Full Android app development
π οΈ Key Technologies: Android Kotlin Coroutines MVVM Room VideoView Jetpack Material Design Data Binding Navigation MPAndroidChart
π GitHub: daehan-lim/gas-consumption-manager
  
  
  
  
  
Cubaβs national Manufactured Gas Company faced operational inefficiencies due to their manual gas consumption recording and billing calculation. All procedures from gas meter readings to billing calculations required manual work, leading to time-intensive operations and increased risk of calculation errors. Additionally, customers lacked systematic educational resources for gas meter reading methods and had limited access to customer support. This project developed a comprehensive mobile solution to automate usage calculations, provide educational resources through a video guide, and implement offline-first design for reliable operation.
βββ features/                           # Feature-based modular structure
β   βββ consumption/                    # Gas consumption calculation feature
β   β   βββ ConsumptionFragment.kt      # Consumption input and calculation UI
β   β   βββ ConsumptionViewModel.kt     # Consumption calculation business logic
β   β   βββ ConsumptionViewModelFactory.kt
β   βββ history/                        # Usage history and chart analytics
β   β   βββ HistoryActivity.kt          # Chart-based analysis screen
β   β   βββ HistoryViewModel.kt         # Chart data processing logic
β   β   βββ HistoryViewModelFactory.kt
β   βββ offices/                        # Branch office contact directory
β   β   βββ ComercialOfficesFragment.kt # Branch office list UI
β   β   βββ ComercialOfficesAdapter.kt  # RecyclerView adapter
β   β   βββ ComercialOfficesViewModel.kt
β   βββ readcounter/                    # Meter reading guide
β   β   βββ ReadCounterFragment.kt      # Video guide screen
β   β   βββ ReadCounterViewModel.kt
β   βββ about/                          # App information and contacts
β   β   βββ AboutActivity.kt
β   βββ splash/                         # Splash screen
β       βββ SplashActivity.kt
βββ database/                           # Room database layer
β   βββ Consumption.kt                  # Consumption data entity
β   βββ ConsumptionDao.kt               # Data access object
β   βββ ConsumptionDatabase.kt          # Database configuration
βββ model/                              # Data models
β   βββ ComercialOffice.kt              # Branch office information model
βββ util/                               # Utility classes
β   βββ BindingUtils.kt                 # Data binding adapters
β   βββ Util.kt                         # Common utility functions
βββ MainActivity.kt                     # Main activity and navigation
ConsumptionDao to separate business logicCoroutines and suspend functions for asynchronous database operations, preventing UI thread blockingLiveData and ViewModel for lifecycle-aware data bindingfallbackToDestructiveMigration() for stable database managementTextInputLayoutβs errorEnabled propertyPAYMENT_COEFFICIENT constant (2.5)AlertDialog interfaceBarChart visualization for monthly gas consumption patterns with animation effects, enhancing user experienceMonthPickerDialog for intuitive year selection interfaceMediaController with full-screen button and screen rotation controlsSystemUI hiding during orientation changesonStart(), onStop(), and onPause() lifecycle eventsraw resources for offline video playback, eliminating network dependenciesIntent.ACTION_CALL and SMS via Intent.ACTION_SENDTOCALL_PHONE permission handling with fallback to dialer app when permission is denied@BindingAdaptersetupWithNavController()onBackPressed() overridesegoe_ui and seguisb fonts for distinctive brandingIntent.ACTION_VIEWfindViewById() calls@{viewModel.property} syntaxexecutePendingBindings() for immediate binding processing to prevent UI flickering