From 5559df1d7cf5fb8796c9948c03dbc5f0f0cf4ae0 Mon Sep 17 00:00:00 2001 From: amirisback Date: Tue, 16 Sep 2025 15:58:29 +0700 Subject: [PATCH 1/4] add surah and ayat --- app/src/main/AndroidManifest.xml | 5 +- .../kickstart/common/ext/ContextExt.kt | 21 + .../frogobox/kickstart/di/RepositoryModule.kt | 5 + .../frogobox/kickstart/di/UseCaseModule.kt | 6 + .../frogobox/kickstart/domain/model/Ayat.java | 35 + .../kickstart/domain/model/ModelAyat.java | 57 + .../kickstart/domain/model/ModelSurah.java | 57 + .../kickstart/domain/model/Surah.java | 35 + .../domain/source/quran/QuranDataSource.kt | 62 + .../quran/repository/QuranRepository.kt | 24 + .../quran/repository/QuranRepositoryImpl.kt | 46 + .../source/quran/usecase/QuranInteractor.kt | 34 + .../source/quran/usecase/QuranUseCase.kt | 25 + .../kickstart/ui/about/AboutUsActivity.kt | 38 - .../kickstart/ui/ayat/AyatActivity.kt | 118 + .../frogobox/kickstart/ui/ayat/AyatAdapter.kt | 75 + .../kickstart/ui/ayat/AyatViewModel.kt | 41 + .../kickstart/ui/detail/DetailActivity.kt | 132 - .../kickstart/ui/detail/DetailViewModel.kt | 75 - .../kickstart/ui/favorite/FavoriteFragment.kt | 96 - .../ui/favorite/FavoriteViewModel.kt | 32 - .../kickstart/ui/main/MainActivity.kt | 93 - .../kickstart/ui/main/MainFragment.kt | 87 - .../kickstart/ui/main/MainViewModel.kt | 48 - .../kickstart/ui/surah/SurahActivity.kt | 93 + .../MainAdapter.kt => surah/SurahAdapter.kt} | 43 +- .../kickstart/ui/surah/SurahViewModel.kt | 41 + .../com/frogobox/kickstart/util/RawParser.kt | 66 + .../res/drawable/background_splash_screen.xml | 30 - app/src/main/res/drawable/ic_bg_row.xml | 10 + app/src/main/res/drawable/ic_favorite.xml | 10 - app/src/main/res/drawable/ic_frogobox.png | Bin 34955 -> 0 bytes app/src/main/res/drawable/ic_movie.xml | 9 - app/src/main/res/drawable/ic_person.xml | 9 - .../res/drawable/ic_toolbar_copyright.xml | 12 - app/src/main/res/drawable/ic_tv.xml | 9 - app/src/main/res/layout/activity_about_us.xml | 41 - app/src/main/res/layout/activity_ayat.xml | 27 + app/src/main/res/layout/activity_detail.xml | 79 - app/src/main/res/layout/activity_main.xml | 29 - .../{fragment_main.xml => activity_surah.xml} | 15 +- .../res/layout/content_article_horizontal.xml | 73 - .../res/layout/content_article_vertical.xml | 65 - app/src/main/res/layout/content_category.xml | 41 - .../main/res/layout/fragment_consumable.xml | 60 - app/src/main/res/layout/fragment_favorite.xml | 42 - app/src/main/res/layout/item_ayat.xml | 63 + app/src/main/res/layout/item_surah.xml | 92 + .../main/res/menu/main_bottom_navigation.xml | 36 - app/src/main/res/menu/menu_toolbar_detail.xml | 28 - app/src/main/res/menu/menu_toolbar_main.xml | 28 - app/src/main/res/raw/ayat | 6236 +++++++++++++++++ app/src/main/res/raw/surah | 114 + buildSrc/src/main/kotlin/ProjectSetting.kt | 2 +- 54 files changed, 7417 insertions(+), 1233 deletions(-) create mode 100644 app/src/main/java/com/frogobox/kickstart/common/ext/ContextExt.kt create mode 100644 app/src/main/java/com/frogobox/kickstart/domain/model/Ayat.java create mode 100644 app/src/main/java/com/frogobox/kickstart/domain/model/ModelAyat.java create mode 100644 app/src/main/java/com/frogobox/kickstart/domain/model/ModelSurah.java create mode 100644 app/src/main/java/com/frogobox/kickstart/domain/model/Surah.java create mode 100644 app/src/main/java/com/frogobox/kickstart/domain/source/quran/QuranDataSource.kt create mode 100644 app/src/main/java/com/frogobox/kickstart/domain/source/quran/repository/QuranRepository.kt create mode 100644 app/src/main/java/com/frogobox/kickstart/domain/source/quran/repository/QuranRepositoryImpl.kt create mode 100644 app/src/main/java/com/frogobox/kickstart/domain/source/quran/usecase/QuranInteractor.kt create mode 100644 app/src/main/java/com/frogobox/kickstart/domain/source/quran/usecase/QuranUseCase.kt delete mode 100644 app/src/main/java/com/frogobox/kickstart/ui/about/AboutUsActivity.kt create mode 100644 app/src/main/java/com/frogobox/kickstart/ui/ayat/AyatActivity.kt create mode 100644 app/src/main/java/com/frogobox/kickstart/ui/ayat/AyatAdapter.kt create mode 100644 app/src/main/java/com/frogobox/kickstart/ui/ayat/AyatViewModel.kt delete mode 100644 app/src/main/java/com/frogobox/kickstart/ui/detail/DetailActivity.kt delete mode 100644 app/src/main/java/com/frogobox/kickstart/ui/detail/DetailViewModel.kt delete mode 100644 app/src/main/java/com/frogobox/kickstart/ui/favorite/FavoriteFragment.kt delete mode 100644 app/src/main/java/com/frogobox/kickstart/ui/favorite/FavoriteViewModel.kt delete mode 100644 app/src/main/java/com/frogobox/kickstart/ui/main/MainActivity.kt delete mode 100644 app/src/main/java/com/frogobox/kickstart/ui/main/MainFragment.kt delete mode 100644 app/src/main/java/com/frogobox/kickstart/ui/main/MainViewModel.kt create mode 100644 app/src/main/java/com/frogobox/kickstart/ui/surah/SurahActivity.kt rename app/src/main/java/com/frogobox/kickstart/ui/{main/MainAdapter.kt => surah/SurahAdapter.kt} (57%) create mode 100644 app/src/main/java/com/frogobox/kickstart/ui/surah/SurahViewModel.kt create mode 100644 app/src/main/java/com/frogobox/kickstart/util/RawParser.kt delete mode 100644 app/src/main/res/drawable/background_splash_screen.xml create mode 100644 app/src/main/res/drawable/ic_bg_row.xml delete mode 100644 app/src/main/res/drawable/ic_favorite.xml delete mode 100644 app/src/main/res/drawable/ic_frogobox.png delete mode 100644 app/src/main/res/drawable/ic_movie.xml delete mode 100644 app/src/main/res/drawable/ic_person.xml delete mode 100644 app/src/main/res/drawable/ic_toolbar_copyright.xml delete mode 100644 app/src/main/res/drawable/ic_tv.xml delete mode 100644 app/src/main/res/layout/activity_about_us.xml create mode 100644 app/src/main/res/layout/activity_ayat.xml delete mode 100644 app/src/main/res/layout/activity_detail.xml delete mode 100644 app/src/main/res/layout/activity_main.xml rename app/src/main/res/layout/{fragment_main.xml => activity_surah.xml} (51%) delete mode 100644 app/src/main/res/layout/content_article_horizontal.xml delete mode 100644 app/src/main/res/layout/content_article_vertical.xml delete mode 100644 app/src/main/res/layout/content_category.xml delete mode 100644 app/src/main/res/layout/fragment_consumable.xml delete mode 100644 app/src/main/res/layout/fragment_favorite.xml create mode 100644 app/src/main/res/layout/item_ayat.xml create mode 100644 app/src/main/res/layout/item_surah.xml delete mode 100644 app/src/main/res/menu/main_bottom_navigation.xml delete mode 100644 app/src/main/res/menu/menu_toolbar_detail.xml delete mode 100644 app/src/main/res/menu/menu_toolbar_main.xml create mode 100644 app/src/main/res/raw/ayat create mode 100644 app/src/main/res/raw/surah diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2953b0a..1513658 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,10 +19,9 @@ android:usesCleartextTraffic="true" tools:targetApi="n"> - - + diff --git a/app/src/main/java/com/frogobox/kickstart/common/ext/ContextExt.kt b/app/src/main/java/com/frogobox/kickstart/common/ext/ContextExt.kt new file mode 100644 index 0000000..81432a6 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/common/ext/ContextExt.kt @@ -0,0 +1,21 @@ +package com.frogobox.kickstart.common.ext + +import android.content.Context +import java.io.BufferedReader +import java.io.InputStream +import java.io.InputStreamReader + +/** + * Created by faisalamircs on 16/09/2025 + * ----------------------------------------- + * Name : Muhammad Faisal Amir + * E-mail : faisalamircs@gmail.com + * Github : github.com/amirisback + * ----------------------------------------- + */ + + +fun Context.getRawResources(res: Int): BufferedReader { + val streamReader: InputStream = resources.openRawResource(res) + return BufferedReader(InputStreamReader(streamReader)) +} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/di/RepositoryModule.kt b/app/src/main/java/com/frogobox/kickstart/di/RepositoryModule.kt index 5ed77d8..606ca22 100644 --- a/app/src/main/java/com/frogobox/kickstart/di/RepositoryModule.kt +++ b/app/src/main/java/com/frogobox/kickstart/di/RepositoryModule.kt @@ -2,6 +2,8 @@ package com.frogobox.kickstart.di import com.frogobox.kickstart.domain.source.meal.repository.MealRepository import com.frogobox.kickstart.domain.source.meal.repository.MealRepositoryImpl +import com.frogobox.kickstart.domain.source.quran.repository.QuranRepository +import com.frogobox.kickstart.domain.source.quran.repository.QuranRepositoryImpl import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -24,4 +26,7 @@ abstract class RepositoryModule { @Binds abstract fun provideMealRepository(repository: MealRepositoryImpl): MealRepository + @Binds + abstract fun provideQuranRepository(repository: QuranRepositoryImpl): QuranRepository + } \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/di/UseCaseModule.kt b/app/src/main/java/com/frogobox/kickstart/di/UseCaseModule.kt index d745dff..42597b5 100644 --- a/app/src/main/java/com/frogobox/kickstart/di/UseCaseModule.kt +++ b/app/src/main/java/com/frogobox/kickstart/di/UseCaseModule.kt @@ -2,6 +2,8 @@ package com.frogobox.kickstart.di import com.frogobox.kickstart.domain.source.meal.usecase.MealInteractor import com.frogobox.kickstart.domain.source.meal.usecase.MealUseCase +import com.frogobox.kickstart.domain.source.quran.usecase.QuranInteractor +import com.frogobox.kickstart.domain.source.quran.usecase.QuranUseCase import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -26,4 +28,8 @@ abstract class UseCaseModule { @ViewModelScoped abstract fun provideMealUseCase(useCase: MealInteractor): MealUseCase + @Binds + @ViewModelScoped + abstract fun provideQuranUseCase(useCase: QuranInteractor): QuranUseCase + } \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/domain/model/Ayat.java b/app/src/main/java/com/frogobox/kickstart/domain/model/Ayat.java new file mode 100644 index 0000000..009f0e9 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/domain/model/Ayat.java @@ -0,0 +1,35 @@ +package com.frogobox.kickstart.domain.model; + +/** + * Created by jonesrandom on 2/23/18. + * + * @site www.androidexample.web.id + * @github @alfianyusufabdullah + */ + +public class Ayat extends ModelAyat { + + public Ayat(String surah, String ayat, String arab, String terjemahan) { + super(surah, ayat, arab, terjemahan); + } + + @Override + public String getSurah() { + return super.getSurah(); + } + + @Override + public String getAyat() { + return super.getAyat(); + } + + @Override + public String getArab() { + return super.getArab(); + } + + @Override + public String getTerjemahan() { + return super.getTerjemahan(); + } +} diff --git a/app/src/main/java/com/frogobox/kickstart/domain/model/ModelAyat.java b/app/src/main/java/com/frogobox/kickstart/domain/model/ModelAyat.java new file mode 100644 index 0000000..232580f --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/domain/model/ModelAyat.java @@ -0,0 +1,57 @@ +package com.frogobox.kickstart.domain.model; + +/** + * Created by jonesrandom on 2/22/18. + * + * @site www.androidexample.web.id + * @github @alfianyusufabdullah + */ + +public class ModelAyat { + + private String surah; + private String ayat; + private String arab; + private String terjemahan; + private String terjemahanIndonesia; + private String terjemahanEnglish; + + public ModelAyat(String surah, String ayat, String arab, String terjemahan) { + this.surah = surah; + this.ayat = ayat; + this.arab = arab; + this.terjemahan = terjemahan; + } + + public ModelAyat(String surah, String ayat, String arab, String terjemahanIndonesia, String terjemahanEnglish) { + this.surah = surah; + this.ayat = ayat; + this.arab = arab; + this.terjemahanIndonesia = terjemahanIndonesia; + this.terjemahanEnglish = terjemahanEnglish; + } + + public String getSurah() { + return surah; + } + + public String getAyat() { + return ayat; + } + + public String getArab() { + return arab; + } + + public String getTerjemahan() { + return terjemahan; + } + + public String getTerjemahanIndonesia() { + return terjemahanIndonesia; + } + + public String getTerjemahanEnglish() { + return terjemahanEnglish; + } +} diff --git a/app/src/main/java/com/frogobox/kickstart/domain/model/ModelSurah.java b/app/src/main/java/com/frogobox/kickstart/domain/model/ModelSurah.java new file mode 100644 index 0000000..ca5f0c7 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/domain/model/ModelSurah.java @@ -0,0 +1,57 @@ +package com.frogobox.kickstart.domain.model; + +/** + * Created by jonesrandom on 2/22/18. + * + * @site www.androidexample.web.id + * @github @alfianyusufabdullah + */ + +public class ModelSurah { + + private String surah; + private String ayat; + private String terjemahan; + private String terjemahanIndonesia; + private String terjemahanEnglish; + private String jumlahAyat; + + public ModelSurah(String surah, String ayat, String terjemahan, String jumlahAyat) { + this.surah = surah; + this.ayat = ayat; + this.terjemahan = terjemahan; + this.jumlahAyat = jumlahAyat; + } + + public ModelSurah(String surah, String ayat, String terjemahanIndonesia, String terjemahanEnglish, String jumlahAyat) { + this.surah = surah; + this.ayat = ayat; + this.terjemahanIndonesia = terjemahanIndonesia; + this.terjemahanEnglish = terjemahanEnglish; + this.jumlahAyat = jumlahAyat; + } + + public String getSurah() { + return surah; + } + + public String getAyat() { + return ayat; + } + + public String getTerjemahan() { + return terjemahan; + } + + public String getJumlahAyat() { + return jumlahAyat; + } + + public String getTerjemahanIndonesia() { + return terjemahanIndonesia; + } + + public String getTerjemahanEnglish() { + return terjemahanEnglish; + } +} diff --git a/app/src/main/java/com/frogobox/kickstart/domain/model/Surah.java b/app/src/main/java/com/frogobox/kickstart/domain/model/Surah.java new file mode 100644 index 0000000..d200627 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/domain/model/Surah.java @@ -0,0 +1,35 @@ +package com.frogobox.kickstart.domain.model; + +/** + * Created by jonesrandom on 2/23/18. + * + * @site www.androidexample.web.id + * @github @alfianyusufabdullah + */ + +public class Surah extends ModelSurah { + + public Surah(String surah, String ayat, String terjemahan, String jumlahAyat) { + super(surah, ayat, terjemahan, jumlahAyat); + } + + @Override + public String getSurah() { + return super.getSurah(); + } + + @Override + public String getAyat() { + return super.getAyat(); + } + + @Override + public String getTerjemahan() { + return super.getTerjemahan(); + } + + @Override + public String getJumlahAyat() { + return super.getJumlahAyat(); + } +} diff --git a/app/src/main/java/com/frogobox/kickstart/domain/source/quran/QuranDataSource.kt b/app/src/main/java/com/frogobox/kickstart/domain/source/quran/QuranDataSource.kt new file mode 100644 index 0000000..c145444 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/domain/source/quran/QuranDataSource.kt @@ -0,0 +1,62 @@ +package com.frogobox.kickstart.domain.source.quran + +import android.content.Context +import com.frogobox.kickstart.common.callback.Resource +import com.frogobox.kickstart.domain.model.ModelAyat +import com.frogobox.kickstart.domain.model.ModelSurah +import com.frogobox.kickstart.util.RawParser +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOn +import javax.inject.Inject +import javax.inject.Singleton + +/** + * Created by faisalamircs on 16/09/2025 + * ----------------------------------------- + * Name : Muhammad Faisal Amir + * E-mail : faisalamircs@gmail.com + * Github : github.com/amirisback + * ----------------------------------------- + */ + + +@Singleton +class QuranDataSource @Inject constructor( + @param:ApplicationContext private val context: Context +) { + + fun getSurahs(): Flow>> = + flow { + try { + emit(Resource.Loading()) + val response = RawParser.surah(context) + if (response.isEmpty()) { + emit(Resource.Error("Data not found")) + } else { + emit(Resource.Success(response)) + } + } catch (e: Exception) { + emit(Resource.Error(e.message.toString())) + } + }.flowOn(Dispatchers.IO) + + + fun getAyats(surah: String): Flow>> = + flow { + try { + emit(Resource.Loading()) + val response = RawParser.ayat(context).filter { it.surah == surah }.toMutableList() + if (response.isEmpty()) { + emit(Resource.Error("Data not found")) + } else { + emit(Resource.Success(response)) + } + } catch (e: Exception) { + emit(Resource.Error(e.message.toString())) + } + }.flowOn(Dispatchers.IO) + +} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/domain/source/quran/repository/QuranRepository.kt b/app/src/main/java/com/frogobox/kickstart/domain/source/quran/repository/QuranRepository.kt new file mode 100644 index 0000000..7e55ab2 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/domain/source/quran/repository/QuranRepository.kt @@ -0,0 +1,24 @@ +package com.frogobox.kickstart.domain.source.quran.repository + +import com.frogobox.kickstart.common.callback.Resource +import com.frogobox.kickstart.domain.model.ModelAyat +import com.frogobox.kickstart.domain.model.ModelSurah +import kotlinx.coroutines.flow.Flow + +/** + * Created by faisalamircs on 16/09/2025 + * ----------------------------------------- + * Name : Muhammad Faisal Amir + * E-mail : faisalamircs@gmail.com + * Github : github.com/amirisback + * ----------------------------------------- + */ + + +interface QuranRepository { + + fun getSurahs(): Flow>> + + fun getAyats(surah: String): Flow>> + +} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/domain/source/quran/repository/QuranRepositoryImpl.kt b/app/src/main/java/com/frogobox/kickstart/domain/source/quran/repository/QuranRepositoryImpl.kt new file mode 100644 index 0000000..1142a48 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/domain/source/quran/repository/QuranRepositoryImpl.kt @@ -0,0 +1,46 @@ +package com.frogobox.kickstart.domain.source.quran.repository + +import android.content.Context +import com.frogobox.kickstart.common.callback.Resource +import com.frogobox.kickstart.domain.model.ModelAyat +import com.frogobox.kickstart.domain.model.ModelSurah +import com.frogobox.kickstart.domain.source.quran.QuranDataSource +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import javax.inject.Inject + +/** + * Created by faisalamircs on 16/09/2025 + * ----------------------------------------- + * Name : Muhammad Faisal Amir + * E-mail : faisalamircs@gmail.com + * Github : github.com/amirisback + * ----------------------------------------- + */ + + +class QuranRepositoryImpl @Inject constructor( + private val dataSource: QuranDataSource, +) : QuranRepository { + + override fun getSurahs(): Flow>> { + return dataSource.getSurahs().map { + return@map when (it) { + is Resource.Success -> Resource.Success(it.data ?: mutableListOf()) + is Resource.Error -> Resource.Error(it.message.toString()) + is Resource.Loading -> Resource.Loading() + } + } + } + + override fun getAyats(surah: String): Flow>> { + return dataSource.getAyats(surah).map { + return@map when (it) { + is Resource.Success -> Resource.Success(it.data ?: mutableListOf()) + is Resource.Error -> Resource.Error(it.message.toString()) + is Resource.Loading -> Resource.Loading() + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/domain/source/quran/usecase/QuranInteractor.kt b/app/src/main/java/com/frogobox/kickstart/domain/source/quran/usecase/QuranInteractor.kt new file mode 100644 index 0000000..c6cfd91 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/domain/source/quran/usecase/QuranInteractor.kt @@ -0,0 +1,34 @@ +package com.frogobox.kickstart.domain.source.quran.usecase + +import android.content.Context +import com.frogobox.kickstart.common.callback.Resource +import com.frogobox.kickstart.domain.model.ModelAyat +import com.frogobox.kickstart.domain.model.ModelSurah +import com.frogobox.kickstart.domain.source.quran.repository.QuranRepository +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +/** + * Created by faisalamircs on 16/09/2025 + * ----------------------------------------- + * Name : Muhammad Faisal Amir + * E-mail : faisalamircs@gmail.com + * Github : github.com/amirisback + * ----------------------------------------- + */ + + +class QuranInteractor @Inject constructor( + private val repository: QuranRepository, +) : QuranUseCase { + + override fun getSurahs(): Flow>> { + return repository.getSurahs() + } + + override fun getAyats(surah: String): Flow>> { + return repository.getAyats(surah) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/domain/source/quran/usecase/QuranUseCase.kt b/app/src/main/java/com/frogobox/kickstart/domain/source/quran/usecase/QuranUseCase.kt new file mode 100644 index 0000000..142a3ce --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/domain/source/quran/usecase/QuranUseCase.kt @@ -0,0 +1,25 @@ +package com.frogobox.kickstart.domain.source.quran.usecase + +import android.content.Context +import com.frogobox.kickstart.common.callback.Resource +import com.frogobox.kickstart.domain.model.ModelAyat +import com.frogobox.kickstart.domain.model.ModelSurah +import kotlinx.coroutines.flow.Flow + +/** + * Created by faisalamircs on 16/09/2025 + * ----------------------------------------- + * Name : Muhammad Faisal Amir + * E-mail : faisalamircs@gmail.com + * Github : github.com/amirisback + * ----------------------------------------- + */ + + +interface QuranUseCase { + + fun getSurahs(): Flow>> + + fun getAyats(surah: String): Flow>> + +} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/ui/about/AboutUsActivity.kt b/app/src/main/java/com/frogobox/kickstart/ui/about/AboutUsActivity.kt deleted file mode 100644 index 29eb6d7..0000000 --- a/app/src/main/java/com/frogobox/kickstart/ui/about/AboutUsActivity.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.frogobox.kickstart.ui.about - -import android.content.Context -import android.content.Intent -import android.os.Bundle -import com.frogobox.kickstart.common.base.BaseActivity -import com.frogobox.kickstart.databinding.ActivityAboutUsBinding -import dagger.hilt.android.AndroidEntryPoint - -@AndroidEntryPoint -class AboutUsActivity : BaseActivity() { - - companion object { - - fun createIntent(context: Context): Intent { - return Intent(context, AboutUsActivity::class.java).apply { - - } - } - - fun launch(context: Context) { - context.startActivity(createIntent(context)) - } - - } - - override fun setupViewBinding(): ActivityAboutUsBinding { - return ActivityAboutUsBinding.inflate(layoutInflater) - } - - override fun setupViewModel() {} - - override fun onCreateExt(savedInstanceState: Bundle?) { - super.onCreateExt(savedInstanceState) - setupDetailActivity("") - } - -} diff --git a/app/src/main/java/com/frogobox/kickstart/ui/ayat/AyatActivity.kt b/app/src/main/java/com/frogobox/kickstart/ui/ayat/AyatActivity.kt new file mode 100644 index 0000000..e086033 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/ui/ayat/AyatActivity.kt @@ -0,0 +1,118 @@ +package com.frogobox.kickstart.ui.ayat + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.View +import androidx.activity.viewModels +import androidx.recyclerview.widget.LinearLayoutManager +import com.frogobox.kickstart.common.base.BaseActivity +import com.frogobox.kickstart.common.callback.OnItemClickCallback +import com.frogobox.kickstart.common.callback.Resource +import com.frogobox.kickstart.databinding.ActivityAyatBinding +import com.frogobox.kickstart.domain.model.ModelAyat +import com.frogobox.kickstart.domain.model.ModelSurah +import com.frogobox.sdk.ext.getExtraExt +import com.frogobox.sdk.ext.gone +import com.frogobox.sdk.ext.showToast +import com.frogobox.sdk.ext.toJson +import com.frogobox.sdk.ext.visible +import dagger.hilt.android.AndroidEntryPoint + +/** + * Created by faisalamircs on 16/09/2025 + * ----------------------------------------- + * Name : Muhammad Faisal Amir + * E-mail : faisalamircs@gmail.com + * Github : github.com/amirisback + * ----------------------------------------- + */ + + +@AndroidEntryPoint +class AyatActivity : BaseActivity() { + + companion object { + const val EXTRA_DATA = "EXTRA_DATA" + + fun createIntent(context: Context, data: ModelSurah): Intent { + return Intent(context, AyatActivity::class.java).apply { + putExtra(EXTRA_DATA, data.toJson()) + } + } + + fun launch(context: Context, data: ModelSurah) { + context.startActivity(createIntent(context, data)) + } + + } + + private val viewModel : AyatViewModel by viewModels() + + private val AyatAdapter: AyatAdapter by lazy { + AyatAdapter() + } + + override fun setupViewBinding(): ActivityAyatBinding { + return ActivityAyatBinding.inflate(layoutInflater) + } + + override fun onCreateExt(savedInstanceState: Bundle?) { + super.onCreateExt(savedInstanceState) + + val extra = getExtraExt(EXTRA_DATA) + viewModel.getAyats(extra.surah) + + setupDetailActivity(extra.ayat) + + binding.apply { + rv.adapter = AyatAdapter + rv.layoutManager = + LinearLayoutManager(this@AyatActivity, LinearLayoutManager.VERTICAL, false) + + + AyatAdapter.setOnItemCallBack(object : OnItemClickCallback { + override fun onItemClick( + view: View, + objects: Any, + position: Int?, + ) { + (objects as ModelAyat).let { + + } + } + }) + + } + } + + override fun setupViewModel() { + super.setupViewModel() + viewModel.ayatState.observe(this) { + when (it) { + is Resource.Error -> { + binding.progressView.gone() + showToast(it.message.toString()) + } + + is Resource.Loading -> { + binding.progressView.visible() + } + + is Resource.Success -> { + binding.progressView.gone() + it.data?.let { items -> + AyatAdapter.setItem(items) + } + } + } + } + } + + override fun onDestroy() { + super.onDestroy() + viewModel.onClearDisposable() + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/ui/ayat/AyatAdapter.kt b/app/src/main/java/com/frogobox/kickstart/ui/ayat/AyatAdapter.kt new file mode 100644 index 0000000..61c9bbe --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/ui/ayat/AyatAdapter.kt @@ -0,0 +1,75 @@ +package com.frogobox.kickstart.ui.ayat + +import android.view.LayoutInflater +import android.view.ViewGroup +import com.frogobox.kickstart.common.base.BaseAdapter +import com.frogobox.kickstart.common.base.BaseViewHolder +import com.frogobox.kickstart.common.callback.OnItemClickCallback +import com.frogobox.kickstart.databinding.ItemAyatBinding +import com.frogobox.kickstart.domain.model.ModelAyat + +/** + * Created by faisalamircs on 16/09/2025 + * ----------------------------------------- + * Name : Muhammad Faisal Amir + * E-mail : faisalamircs@gmail.com + * Github : github.com/amirisback + * ----------------------------------------- + */ + + +class AyatAdapter : BaseAdapter() { + + override fun bindVH( + holder: AyatHolder, + position: Int, + ) { + holder.bindData(asyncListDiffer.currentList[position], position) + } + + override fun adapterAreItemsTheSame( + oldItem: ModelAyat, + newItem: ModelAyat, + ): Boolean { + return oldItem.ayat == newItem.ayat + } + + override fun adapterAreContentsTheSame( + oldItem: ModelAyat, + newItem: ModelAyat, + ): Boolean { + return oldItem == newItem + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int, + ): AyatHolder { + return AyatHolder( + binding = ItemAyatBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ), + onItemClickCallback = onItemClickCallback + ) + } + + inner class AyatHolder( + private val binding: ItemAyatBinding, + private val onItemClickCallback: OnItemClickCallback? = null, + ) : BaseViewHolder(binding.root) { + + override fun bindData(model: ModelAyat, position: Int?) { + binding.apply { + rowAyat.text = model.ayat + rowArabic.text = model.arab + rowTerjemahan.text = model.terjemahanIndonesia + + root.setOnClickListener { v -> + onItemClickCallback?.onItemClick(v, model, position) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/ui/ayat/AyatViewModel.kt b/app/src/main/java/com/frogobox/kickstart/ui/ayat/AyatViewModel.kt new file mode 100644 index 0000000..d6a3082 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/ui/ayat/AyatViewModel.kt @@ -0,0 +1,41 @@ +package com.frogobox.kickstart.ui.ayat + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope +import com.frogobox.kickstart.common.base.BaseViewModel +import com.frogobox.kickstart.common.callback.Resource +import com.frogobox.kickstart.domain.model.ModelAyat +import com.frogobox.kickstart.domain.model.ModelSurah +import com.frogobox.kickstart.domain.source.quran.usecase.QuranUseCase +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import javax.inject.Inject + +/** + * Created by faisalamircs on 16/09/2025 + * ----------------------------------------- + * Name : Muhammad Faisal Amir + * E-mail : faisalamircs@gmail.com + * Github : github.com/amirisback + * ----------------------------------------- + */ + + +@HiltViewModel +class AyatViewModel @Inject constructor( + private val useCase: QuranUseCase, +) : BaseViewModel() { + + private var _ayatState = MutableLiveData>>() + var ayatState: LiveData>> = _ayatState + + fun getAyats(surah: String) { + viewModelScope.launch { + useCase.getAyats(surah).collect { + _ayatState.postValue(it) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/ui/detail/DetailActivity.kt b/app/src/main/java/com/frogobox/kickstart/ui/detail/DetailActivity.kt deleted file mode 100644 index c8dd92f..0000000 --- a/app/src/main/java/com/frogobox/kickstart/ui/detail/DetailActivity.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.frogobox.kickstart.ui.detail - -import android.content.Context -import android.content.Intent -import android.os.Bundle -import androidx.activity.viewModels -import com.frogobox.kickstart.common.base.BaseActivity -import com.frogobox.kickstart.common.callback.Resource -import com.frogobox.kickstart.databinding.ActivityDetailBinding -import com.frogobox.kickstart.domain.model.MealModel -import com.frogobox.sdk.ext.getExtraExt -import com.frogobox.sdk.ext.gone -import com.frogobox.sdk.ext.setImageExt -import com.frogobox.sdk.ext.showLogD -import com.frogobox.sdk.ext.showToast -import com.frogobox.sdk.ext.toJson -import com.frogobox.sdk.ext.visible -import dagger.hilt.android.AndroidEntryPoint - -@AndroidEntryPoint -class DetailActivity : BaseActivity() { - - companion object { - const val EXTRA_DATA = "EXTRA_DATA" - - fun createIntent(context: Context, data: MealModel): Intent { - return Intent(context, DetailActivity::class.java).apply { - putExtra(EXTRA_DATA, data.toJson()) - } - } - - fun launch(context: Context, data: MealModel) { - context.startActivity(createIntent(context, data)) - } - - } - - private val viewModel: DetailViewModel by viewModels() - - override fun setupViewBinding(): ActivityDetailBinding { - return ActivityDetailBinding.inflate(layoutInflater) - } - - override fun setupViewModel() { - viewModel.mealsState.observe(this) { - when (it) { - is Resource.Error -> { - binding.progressView.gone() - showToast(it.message.toString()) - } - - is Resource.Loading -> { - binding.progressView.visible() - } - - is Resource.Success -> { - binding.progressView.gone() - it.data?.let { items -> - if (!items.isEmpty()) { - binding.btnInsert.gone() - binding.btnDelete.visible() - } - } - } - } - } - - viewModel.insertState.observe(this) { - when (it) { - is Resource.Error -> { - binding.progressView.gone() - showToast(it.message.toString()) - } - - is Resource.Loading -> { - binding.progressView.visible() - } - - is Resource.Success -> { - binding.progressView.gone() - binding.btnInsert.gone() - binding.btnDelete.visible() - showToast("Berhasil Menambahkan Ke Favorite ${it.data?.strMeal}") - } - } - } - - viewModel.deleteState.observe(this) { - when (it) { - is Resource.Error -> { - binding.progressView.gone() - showToast(it.message.toString()) - } - - is Resource.Loading -> { - binding.progressView.visible() - } - - is Resource.Success -> { - binding.progressView.gone() - finish() - } - } - } - } - - override fun onCreateExt(savedInstanceState: Bundle?) { - super.onCreateExt(savedInstanceState) - setupDetailActivity("Detail Meals") - - val extra = getExtraExt(EXTRA_DATA) - viewModel.mealModel = extra - viewModel.getData() - - binding.apply { - ivUrl.setImageExt(extra.strMealThumb) - tvSource.text = extra.strArea - tvTitle.text = extra.strMeal - tvContent.text = extra.strCategory - - btnInsert.setOnClickListener { - viewModel.insertToDB() - } - - btnDelete.setOnClickListener { - viewModel.removeFromDb() - } - } - - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/ui/detail/DetailViewModel.kt b/app/src/main/java/com/frogobox/kickstart/ui/detail/DetailViewModel.kt deleted file mode 100644 index fe079a8..0000000 --- a/app/src/main/java/com/frogobox/kickstart/ui/detail/DetailViewModel.kt +++ /dev/null @@ -1,75 +0,0 @@ -package com.frogobox.kickstart.ui.detail - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.viewModelScope -import com.frogobox.kickstart.common.base.BaseViewModel -import com.frogobox.kickstart.common.callback.Resource -import com.frogobox.kickstart.domain.model.MealModel -import com.frogobox.kickstart.domain.source.meal.usecase.MealUseCase -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch -import javax.inject.Inject - -/** - * Created by faisalamir on 12/07/21 - * KickStartProject - * ----------------------------------------- - * Name : Muhammad Faisal Amir - * E-mail : faisalamircs@gmail.com - * Github : github.com/amirisback - * ----------------------------------------- - * Copyright (C) 2021 Frogobox Inc. - * All rights reserved - * - */ - -@HiltViewModel -class DetailViewModel @Inject constructor( - private val useCase: MealUseCase, -) : BaseViewModel() { - - var mealModel: MealModel? = null - - private var _mealsState = MutableLiveData>>() - var mealsState: LiveData>> = _mealsState - - private var _insertState = MutableLiveData>() - var insertState: LiveData> = _insertState - - private var _deleteState = MutableLiveData>() - var deleteState: LiveData> = _deleteState - - fun getData() { - viewModelScope.launch { - mealModel?.idMeal?.let { - useCase.searchById(it).onEach { - _mealsState.postValue(it) - }.launchIn(viewModelScope) - } - } - } - - fun insertToDB() { - viewModelScope.launch { - mealModel?.let { - useCase.insertToFavorite(it).onEach { - _insertState.postValue(it) - }.launchIn(viewModelScope) - } - } - } - - fun removeFromDb() { - viewModelScope.launch { - mealModel?.idMeal?.let { - useCase.deleteFromMealId(it).onEach { - _deleteState.postValue(it) - }.launchIn(viewModelScope) - } - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/ui/favorite/FavoriteFragment.kt b/app/src/main/java/com/frogobox/kickstart/ui/favorite/FavoriteFragment.kt deleted file mode 100644 index 6ff89aa..0000000 --- a/app/src/main/java/com/frogobox/kickstart/ui/favorite/FavoriteFragment.kt +++ /dev/null @@ -1,96 +0,0 @@ -package com.frogobox.kickstart.ui.favorite - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.activityViewModels -import androidx.fragment.app.viewModels -import androidx.recyclerview.widget.LinearLayoutManager -import com.frogobox.kickstart.common.base.BaseFragment -import com.frogobox.kickstart.common.callback.OnItemClickCallback -import com.frogobox.kickstart.common.callback.Resource -import com.frogobox.kickstart.databinding.FragmentFavoriteBinding -import com.frogobox.kickstart.domain.model.MealModel -import com.frogobox.kickstart.ui.detail.DetailActivity -import com.frogobox.kickstart.ui.main.MainAdapter -import com.frogobox.sdk.ext.gone -import com.frogobox.sdk.ext.showLogD -import com.frogobox.sdk.ext.showToast -import com.frogobox.sdk.ext.visible -import dagger.hilt.android.AndroidEntryPoint - -@AndroidEntryPoint -class FavoriteFragment : BaseFragment() { - - private val viewModel : FavoriteViewModel by activityViewModels() - - private val mainAdapter: MainAdapter by lazy { - MainAdapter() - } - - override fun setupViewBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentFavoriteBinding { - return FragmentFavoriteBinding.inflate(inflater, container, false) - } - - override fun setupViewModel() { - viewModel.mealsState.observe(this) { - when (it) { - is Resource.Error -> { - binding.progressView.gone() - requireContext().showToast(it.message.toString()) - } - - is Resource.Loading -> { - binding.progressView.visible() - } - - is Resource.Success -> { - binding.progressView.gone() - it.data?.let { items -> - if (items.isEmpty()) { - binding.tvEmpty.visible() - } else { - binding.tvEmpty.gone() - } - mainAdapter.setItem(items) - } - } - } - } - } - - override fun onViewCreatedExt(view: View, savedInstanceState: Bundle?) { - super.onViewCreatedExt(view, savedInstanceState) - viewModel.getData() - binding.apply { - rv.adapter = mainAdapter - rv.layoutManager = - LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) - - - mainAdapter.setOnItemCallBack(object : OnItemClickCallback { - override fun onItemClick( - view: View, - objects: Any, - position: Int?, - ) { - (objects as MealModel).let { - mActivity.startActivityResultExt(DetailActivity.createIntent(requireContext(), it)) - } - } - }) - - } - } - - - override fun onDestroy() { - super.onDestroy() - viewModel.onClearDisposable() - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/ui/favorite/FavoriteViewModel.kt b/app/src/main/java/com/frogobox/kickstart/ui/favorite/FavoriteViewModel.kt deleted file mode 100644 index 7e00a0c..0000000 --- a/app/src/main/java/com/frogobox/kickstart/ui/favorite/FavoriteViewModel.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.frogobox.kickstart.ui.favorite - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.viewModelScope -import com.frogobox.kickstart.common.base.BaseViewModel -import com.frogobox.kickstart.common.callback.Resource -import com.frogobox.kickstart.domain.model.MealModel -import com.frogobox.kickstart.domain.source.meal.usecase.MealUseCase -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch -import javax.inject.Inject - -@HiltViewModel -class FavoriteViewModel @Inject constructor( - private val useCase: MealUseCase, -) : BaseViewModel() { - - private var _mealsState = MutableLiveData>>() - var mealsState: LiveData>> = _mealsState - - fun getData() { - viewModelScope.launch { - useCase.getAllFavorite().onEach { - _mealsState.postValue(it) - }.launchIn(viewModelScope) - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/ui/main/MainActivity.kt b/app/src/main/java/com/frogobox/kickstart/ui/main/MainActivity.kt deleted file mode 100644 index 89aa3b3..0000000 --- a/app/src/main/java/com/frogobox/kickstart/ui/main/MainActivity.kt +++ /dev/null @@ -1,93 +0,0 @@ -package com.frogobox.kickstart.ui.main - -import android.content.res.ColorStateList -import android.os.Bundle -import androidx.activity.result.ActivityResult -import androidx.activity.viewModels -import com.frogobox.kickstart.R -import com.frogobox.kickstart.common.base.BaseActivity -import com.frogobox.kickstart.databinding.ActivityMainBinding -import com.frogobox.kickstart.ui.favorite.FavoriteFragment -import com.frogobox.kickstart.ui.favorite.FavoriteViewModel -import com.frogobox.sdk.ext.getColorExt -import dagger.hilt.android.AndroidEntryPoint - -@AndroidEntryPoint -class MainActivity : BaseActivity() { - - private val favoriteViewModel : FavoriteViewModel by viewModels() - - override fun setupViewBinding(): ActivityMainBinding { - return ActivityMainBinding.inflate(layoutInflater) - } - - override fun setupActivityResultExt(result: ActivityResult) { - super.setupActivityResultExt(result) - favoriteViewModel.getData() - } - - override fun setupViewModel() {} - - override fun onCreateExt(savedInstanceState: Bundle?) { - super.onCreateExt(savedInstanceState) - setupToolbar() - setupBottomNav(binding.framelayoutMainContainer.id) - setupFragment(savedInstanceState) - } - - private fun setupToolbar() { - supportActionBar?.elevation = 0f - } - - private fun setupFragment(savedInstanceState: Bundle?) { - if (savedInstanceState == null) { - binding.bottomNavMainMenu.selectedItemId = R.id.bottom_menu_main - } - } - - private fun setupBottomNav(frameLayout: Int) { - binding.bottomNavMainMenu.apply { - clearAnimation() - - val iconColorStates = ColorStateList( - arrayOf( - intArrayOf(-android.R.attr.state_checked), - intArrayOf(android.R.attr.state_checked) - ), intArrayOf( - getColorExt(R.color.colorTextTitle), - getColorExt(R.color.colorPrimary), - ) - ) - - itemIconTintList = iconColorStates - itemTextColor = iconColorStates - - setOnItemSelectedListener { - when (it.itemId) { - - R.id.bottom_menu_favorite -> { - supportActionBar?.title = getString(R.string.title_fav) - setupChildFragment( - frameLayout, - FavoriteFragment() - ) - return@setOnItemSelectedListener true - } - - R.id.bottom_menu_main -> { - supportActionBar?.title = getString(R.string.title_main) - setupChildFragment( - frameLayout, - MainFragment() - ) - return@setOnItemSelectedListener true - } - } - - false - } - } - - } - -} diff --git a/app/src/main/java/com/frogobox/kickstart/ui/main/MainFragment.kt b/app/src/main/java/com/frogobox/kickstart/ui/main/MainFragment.kt deleted file mode 100644 index 6981800..0000000 --- a/app/src/main/java/com/frogobox/kickstart/ui/main/MainFragment.kt +++ /dev/null @@ -1,87 +0,0 @@ -package com.frogobox.kickstart.ui.main - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.activityViewModels -import androidx.recyclerview.widget.LinearLayoutManager -import com.frogobox.kickstart.common.base.BaseFragment -import com.frogobox.kickstart.common.callback.OnItemClickCallback -import com.frogobox.kickstart.common.callback.Resource -import com.frogobox.kickstart.databinding.FragmentMainBinding -import com.frogobox.kickstart.domain.model.MealModel -import com.frogobox.kickstart.ui.detail.DetailActivity -import com.frogobox.sdk.ext.gone -import com.frogobox.sdk.ext.showToast -import com.frogobox.sdk.ext.visible -import dagger.hilt.android.AndroidEntryPoint - -@AndroidEntryPoint -class MainFragment : BaseFragment() { - - private val viewModel: MainViewModel by activityViewModels() - - private val mainAdapter: MainAdapter by lazy { - MainAdapter() - } - - override fun setupViewBinding( - inflater: LayoutInflater, - container: ViewGroup?, - ): FragmentMainBinding { - return FragmentMainBinding.inflate(inflater, container, false) - } - - override fun setupViewModel() { - viewModel.mealsState.observe(this) { - when (it) { - is Resource.Error -> { - binding.progressView.gone() - requireContext().showToast(it.message.toString()) - } - - is Resource.Loading -> { - binding.progressView.visible() - } - - is Resource.Success -> { - binding.progressView.gone() - it.data?.let { items -> - mainAdapter.setItem(items) - } - } - } - } - } - - override fun onViewCreatedExt(view: View, savedInstanceState: Bundle?) { - super.onViewCreatedExt(view, savedInstanceState) - viewModel.searchMeal("Cream") - binding.apply { - rv.adapter = mainAdapter - rv.layoutManager = - LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) - - - mainAdapter.setOnItemCallBack(object : OnItemClickCallback { - override fun onItemClick( - view: View, - objects: Any, - position: Int?, - ) { - (objects as MealModel).let { - mActivity.startActivityResultExt(DetailActivity.createIntent(requireContext(), it)) - } - } - }) - - } - } - - override fun onDestroy() { - super.onDestroy() - viewModel.onClearDisposable() - } - -} diff --git a/app/src/main/java/com/frogobox/kickstart/ui/main/MainViewModel.kt b/app/src/main/java/com/frogobox/kickstart/ui/main/MainViewModel.kt deleted file mode 100644 index ec61bb5..0000000 --- a/app/src/main/java/com/frogobox/kickstart/ui/main/MainViewModel.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.frogobox.kickstart.ui.main - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.viewModelScope -import com.frogobox.kickstart.common.base.BaseViewModel -import com.frogobox.kickstart.common.callback.Resource -import com.frogobox.kickstart.domain.source.meal.usecase.MealUseCase -import com.frogobox.kickstart.domain.model.MealModel -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch -import javax.inject.Inject - -/** - * Created by Faisal Amir - * ----------------------------------------- - * Copyright (C) 28/04/2020. - * All rights reserved - * ----------------------------------------- - * Name : Muhammad Faisal Amir - * E-mail : faisalamircs@gmail.com - * Github : github.com/amirisback - * ----------------------------------------- - * Frogobox Inc - * - */ - -@HiltViewModel -class MainViewModel @Inject constructor( - private val useCase: MealUseCase, -) : BaseViewModel() { - - private var _mealsState = MutableLiveData>>() - var mealsState: LiveData>> = _mealsState - - fun searchMeal(name: String = "") { - viewModelScope.launch { - useCase.searchMeal( - nameMeal = name - ).onEach { - _mealsState.postValue(it) - }.launchIn(viewModelScope) - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/ui/surah/SurahActivity.kt b/app/src/main/java/com/frogobox/kickstart/ui/surah/SurahActivity.kt new file mode 100644 index 0000000..dc5b073 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/ui/surah/SurahActivity.kt @@ -0,0 +1,93 @@ +package com.frogobox.kickstart.ui.surah + +import android.os.Bundle +import android.view.View +import androidx.activity.viewModels +import androidx.recyclerview.widget.LinearLayoutManager +import com.frogobox.kickstart.common.base.BaseActivity +import com.frogobox.kickstart.common.callback.OnItemClickCallback +import com.frogobox.kickstart.common.callback.Resource +import com.frogobox.kickstart.databinding.ActivitySurahBinding +import com.frogobox.kickstart.domain.model.ModelSurah +import com.frogobox.kickstart.ui.ayat.AyatActivity +import com.frogobox.sdk.ext.gone +import com.frogobox.sdk.ext.showToast +import com.frogobox.sdk.ext.visible +import dagger.hilt.android.AndroidEntryPoint + +/** + * Created by faisalamircs on 16/09/2025 + * ----------------------------------------- + * Name : Muhammad Faisal Amir + * E-mail : faisalamircs@gmail.com + * Github : github.com/amirisback + * ----------------------------------------- + */ + + +@AndroidEntryPoint +class SurahActivity : BaseActivity() { + + private val viewModel: SurahViewModel by viewModels() + + private val surahAdapter: SurahAdapter by lazy { + SurahAdapter() + } + + override fun setupViewBinding(): ActivitySurahBinding { + return ActivitySurahBinding.inflate(layoutInflater) + } + + override fun onCreateExt(savedInstanceState: Bundle?) { + super.onCreateExt(savedInstanceState) + viewModel.getSurahs() + binding.apply { + rv.adapter = surahAdapter + rv.layoutManager = + LinearLayoutManager(this@SurahActivity, LinearLayoutManager.VERTICAL, false) + + + surahAdapter.setOnItemCallBack(object : OnItemClickCallback { + override fun onItemClick( + view: View, + objects: Any, + position: Int?, + ) { + (objects as ModelSurah).let { + startActivityResultExt(AyatActivity.createIntent(this@SurahActivity, it)) + } + } + }) + + } + } + + override fun setupViewModel() { + super.setupViewModel() + viewModel.surahState.observe(this) { + when (it) { + is Resource.Error -> { + binding.progressView.gone() + showToast(it.message.toString()) + } + + is Resource.Loading -> { + binding.progressView.visible() + } + + is Resource.Success -> { + binding.progressView.gone() + it.data?.let { items -> + surahAdapter.setItem(items) + } + } + } + } + } + + override fun onDestroy() { + super.onDestroy() + viewModel.onClearDisposable() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/ui/main/MainAdapter.kt b/app/src/main/java/com/frogobox/kickstart/ui/surah/SurahAdapter.kt similarity index 57% rename from app/src/main/java/com/frogobox/kickstart/ui/main/MainAdapter.kt rename to app/src/main/java/com/frogobox/kickstart/ui/surah/SurahAdapter.kt index d8986f4..dd26ebd 100644 --- a/app/src/main/java/com/frogobox/kickstart/ui/main/MainAdapter.kt +++ b/app/src/main/java/com/frogobox/kickstart/ui/surah/SurahAdapter.kt @@ -1,13 +1,12 @@ -package com.frogobox.kickstart.ui.main +package com.frogobox.kickstart.ui.surah import android.view.LayoutInflater import android.view.ViewGroup import com.frogobox.kickstart.common.base.BaseAdapter import com.frogobox.kickstart.common.base.BaseViewHolder import com.frogobox.kickstart.common.callback.OnItemClickCallback -import com.frogobox.kickstart.databinding.ContentArticleVerticalBinding -import com.frogobox.kickstart.domain.model.MealModel -import com.frogobox.sdk.ext.setImageExt +import com.frogobox.kickstart.databinding.ItemSurahBinding +import com.frogobox.kickstart.domain.model.ModelSurah /** * Created by faisalamircs on 10/09/2025 @@ -19,25 +18,25 @@ import com.frogobox.sdk.ext.setImageExt */ -class MainAdapter : BaseAdapter() { +class SurahAdapter : BaseAdapter() { override fun bindVH( - holder: MainHolder, + holder: SurahHolder, position: Int, ) { holder.bindData(asyncListDiffer.currentList[position], position) } override fun adapterAreItemsTheSame( - oldItem: MealModel, - newItem: MealModel, + oldItem: ModelSurah, + newItem: ModelSurah, ): Boolean { - return oldItem.idMeal == newItem.idMeal + return oldItem.surah == newItem.surah } override fun adapterAreContentsTheSame( - oldItem: MealModel, - newItem: MealModel, + oldItem: ModelSurah, + newItem: ModelSurah, ): Boolean { return oldItem == newItem } @@ -45,9 +44,9 @@ class MainAdapter : BaseAdapter() { override fun onCreateViewHolder( parent: ViewGroup, viewType: Int, - ): MainHolder { - return MainHolder( - binding = ContentArticleVerticalBinding.inflate( + ): SurahHolder { + return SurahHolder( + binding = ItemSurahBinding.inflate( LayoutInflater.from(parent.context), parent, false @@ -56,17 +55,17 @@ class MainAdapter : BaseAdapter() { ) } - inner class MainHolder( - private val binding: ContentArticleVerticalBinding, + inner class SurahHolder( + private val binding: ItemSurahBinding, private val onItemClickCallback: OnItemClickCallback? = null, - ) : BaseViewHolder(binding.root) { + ) : BaseViewHolder(binding.root) { - override fun bindData(model: MealModel, position: Int?) { + override fun bindData(model: ModelSurah, position: Int?) { binding.apply { - ivUrl.setImageExt(model.strMealThumb) - tvTitle.text = model.strMeal - tvDescription.text = model.strCategory - tvPublished.text = model.strArea + rowSurah.text = model.surah + rowAyat.text = model.ayat + rowTerjemahanSurah.text = model.terjemahanIndonesia + rowJumlahAyat.text = model.jumlahAyat.toString() root.setOnClickListener { v -> onItemClickCallback?.onItemClick(v, model, position) diff --git a/app/src/main/java/com/frogobox/kickstart/ui/surah/SurahViewModel.kt b/app/src/main/java/com/frogobox/kickstart/ui/surah/SurahViewModel.kt new file mode 100644 index 0000000..aeebdaa --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/ui/surah/SurahViewModel.kt @@ -0,0 +1,41 @@ +package com.frogobox.kickstart.ui.surah + +import android.content.Context +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope +import com.frogobox.kickstart.common.base.BaseViewModel +import com.frogobox.kickstart.common.callback.Resource +import com.frogobox.kickstart.domain.model.ModelSurah +import com.frogobox.kickstart.domain.source.quran.usecase.QuranUseCase +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import javax.inject.Inject + +/** + * Created by faisalamircs on 16/09/2025 + * ----------------------------------------- + * Name : Muhammad Faisal Amir + * E-mail : faisalamircs@gmail.com + * Github : github.com/amirisback + * ----------------------------------------- + */ + + +@HiltViewModel +class SurahViewModel @Inject constructor( + private val useCase: QuranUseCase, +) : BaseViewModel() { + + private var _surahState = MutableLiveData>>() + var surahState: LiveData>> = _surahState + + fun getSurahs() { + viewModelScope.launch { + useCase.getSurahs().collect { + _surahState.postValue(it) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/kickstart/util/RawParser.kt b/app/src/main/java/com/frogobox/kickstart/util/RawParser.kt new file mode 100644 index 0000000..41727d1 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/util/RawParser.kt @@ -0,0 +1,66 @@ +package com.frogobox.kickstart.util + +import android.content.Context +import com.frogobox.kickstart.R +import com.frogobox.kickstart.common.ext.getRawResources +import com.frogobox.kickstart.domain.model.ModelAyat +import com.frogobox.kickstart.domain.model.ModelSurah + + +/** + * Created by jonesrandom on 2/22/18. + * + * @site www.androidexample.web.id + * @github @alfianyusufabdullah + */ +object RawParser { + + fun ayat(context: Context): MutableList { + val reader = context.getRawResources(R.raw.ayat) + val ayatList: MutableList = ArrayList() + + var rawAyat: String? + + while ((reader.readLine().also { rawAyat = it }) != null) { + val rawAyats: Array = + rawAyat!!.split("//".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() + ayatList.add( + ModelAyat( + rawAyats[0], + rawAyats[1], + rawAyats[2], + rawAyats[3], + rawAyats[4] + ) + ) + } + + return ayatList + } + + fun surah(context: Context): MutableList { + val reader = context.getRawResources(R.raw.surah) + val surahList: MutableList = ArrayList() + + var rawSurah: String? + while ((reader.readLine().also { rawSurah = it }) != null) { + val rawSurahs: Array = + rawSurah!!.split("//".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() + + if (rawSurahs.size < 5) { + continue + } + surahList.add( + ModelSurah( + rawSurahs[0], + rawSurahs[1], + rawSurahs[2], + rawSurahs[3], + rawSurahs[4] + ) + ) + } + + return surahList + } +} diff --git a/app/src/main/res/drawable/background_splash_screen.xml b/app/src/main/res/drawable/background_splash_screen.xml deleted file mode 100644 index 5fe043e..0000000 --- a/app/src/main/res/drawable/background_splash_screen.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bg_row.xml b/app/src/main/res/drawable/ic_bg_row.xml new file mode 100644 index 0000000..9a5ae48 --- /dev/null +++ b/app/src/main/res/drawable/ic_bg_row.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_favorite.xml b/app/src/main/res/drawable/ic_favorite.xml deleted file mode 100644 index 727e6c3..0000000 --- a/app/src/main/res/drawable/ic_favorite.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_frogobox.png b/app/src/main/res/drawable/ic_frogobox.png deleted file mode 100644 index be629fff2cb95bb8455690b5017b840b9b6a9e65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34955 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 diff --git a/app/src/main/res/drawable/ic_movie.xml b/app/src/main/res/drawable/ic_movie.xml deleted file mode 100644 index a7f7b65..0000000 --- a/app/src/main/res/drawable/ic_movie.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_person.xml b/app/src/main/res/drawable/ic_person.xml deleted file mode 100644 index b2cb337..0000000 --- a/app/src/main/res/drawable/ic_person.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_toolbar_copyright.xml b/app/src/main/res/drawable/ic_toolbar_copyright.xml deleted file mode 100644 index 68ffe31..0000000 --- a/app/src/main/res/drawable/ic_toolbar_copyright.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_tv.xml b/app/src/main/res/drawable/ic_tv.xml deleted file mode 100644 index ca255f9..0000000 --- a/app/src/main/res/drawable/ic_tv.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml deleted file mode 100644 index 64df565..0000000 --- a/app/src/main/res/layout/activity_about_us.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ayat.xml b/app/src/main/res/layout/activity_ayat.xml new file mode 100644 index 0000000..487b90d --- /dev/null +++ b/app/src/main/res/layout/activity_ayat.xml @@ -0,0 +1,27 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml deleted file mode 100644 index c4f31da..0000000 --- a/app/src/main/res/layout/activity_detail.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - -