diff --git a/README.md b/README.md index d736346..cc1262d 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,8 @@ -![ScreenShoot Apps](docs/image/ss_banner.png?raw=true) +## Quran Android ## About This Project [![Android-CI](https://github.com/frogobox/frogo-kick-start-android/actions/workflows/android-ci.yml/badge.svg)](https://github.com/frogobox/frogo-kick-start-android/actions/workflows/android-ci.yml) -- Privacy Policy [Click Here](https://github.com/frogobox/frogo-kick-start-android/blob/master/PRIVACY-POLICY.md) -- License [Click Here](https://github.com/frogobox/frogo-kick-start-android/blob/master/LICENSE) -- Template Reuse Code For Monetizing Apps -- Template Code Monetize Frogobox For Android Kick Start Project +- Quran Android - Reference from https://github.com/alfianyusufabdullah/AlquranQ ## Version Release This Is Latest Release (Still Being Developed) @@ -14,9 +11,9 @@ This Is Latest Release (Still Being Developed) ## Screenshoot Apps -| UI 1 | UI 2 | UI 3 | -|:------------------------------------------------------------:|:------------------------------------------------------------:|:------------------------------------------------------------:| -| | | | +| UI 1 | UI 2 | +|:------------------------------------------------------------:|:------------------------------------------------------------:| +| | | ## Architecture - Pattern [Model-View-ViewModel](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel) (MVVM) facilitating a [separation](https://en.wikipedia.org/wiki/Separation_of_concerns) of development of the graphical user interface. 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/AyatModel.kt b/app/src/main/java/com/frogobox/kickstart/domain/model/AyatModel.kt new file mode 100644 index 0000000..dd42f18 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/domain/model/AyatModel.kt @@ -0,0 +1,11 @@ +package com.frogobox.kickstart.domain.model + + +data class AyatModel( + val surah: String? = null, + val ayat: String? = null, + val arab: String? = null, + var terjemahan: String? = null, + var terjemahanIndonesia: String? = null, + var terjemahanEnglish: String? = null, +) diff --git a/app/src/main/java/com/frogobox/kickstart/domain/model/SurahModel.kt b/app/src/main/java/com/frogobox/kickstart/domain/model/SurahModel.kt new file mode 100644 index 0000000..503e847 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/domain/model/SurahModel.kt @@ -0,0 +1,11 @@ +package com.frogobox.kickstart.domain.model + + +data class SurahModel( + var surah: String? = null, + var ayat: String? = null, + var terjemahanIndonesia: String? = null, + var terjemahanEnglish: String? = null, + var jumlahAyat: String? = null, +) + 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..40b8d66 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/domain/source/quran/QuranDataSource.kt @@ -0,0 +1,66 @@ +package com.frogobox.kickstart.domain.source.quran + +import android.content.Context +import com.frogobox.kickstart.common.callback.Resource +import com.frogobox.kickstart.domain.model.AyatModel +import com.frogobox.kickstart.domain.model.SurahModel +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(surah: String? = null): Flow>> = + flow { + try { + emit(Resource.Loading()) + val response = if (!surah.isNullOrEmpty()) { + RawParser.surah(context).filter { it.ayat?.contains(surah) == true }.toMutableList() + } else { + 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..6402957 --- /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.AyatModel +import com.frogobox.kickstart.domain.model.SurahModel +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(surah: String? = null): 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..7bcaf67 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/domain/source/quran/repository/QuranRepositoryImpl.kt @@ -0,0 +1,45 @@ +package com.frogobox.kickstart.domain.source.quran.repository + +import com.frogobox.kickstart.common.callback.Resource +import com.frogobox.kickstart.domain.model.AyatModel +import com.frogobox.kickstart.domain.model.SurahModel +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(surah: String?): Flow>> { + return dataSource.getSurahs(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() + } + } + } + + 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..775a126 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/domain/source/quran/usecase/QuranInteractor.kt @@ -0,0 +1,32 @@ +package com.frogobox.kickstart.domain.source.quran.usecase + +import com.frogobox.kickstart.common.callback.Resource +import com.frogobox.kickstart.domain.model.AyatModel +import com.frogobox.kickstart.domain.model.SurahModel +import com.frogobox.kickstart.domain.source.quran.repository.QuranRepository +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(surah: String?): Flow>> { + return repository.getSurahs(surah) + } + + 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..bc6a9be --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/domain/source/quran/usecase/QuranUseCase.kt @@ -0,0 +1,24 @@ +package com.frogobox.kickstart.domain.source.quran.usecase + +import com.frogobox.kickstart.common.callback.Resource +import com.frogobox.kickstart.domain.model.AyatModel +import com.frogobox.kickstart.domain.model.SurahModel +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(surah: String? = null): 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..5266c54 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/ui/ayat/AyatActivity.kt @@ -0,0 +1,123 @@ +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.AyatModel +import com.frogobox.kickstart.domain.model.SurahModel +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: SurahModel): Intent { + return Intent(context, AyatActivity::class.java).apply { + putExtra(EXTRA_DATA, data.toJson()) + } + } + + fun launch(context: Context, data: SurahModel) { + 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) + + extra.surah?.let { + viewModel.getAyats(it) + } + + extra.ayat?.let { + setupDetailActivity(it) + } + + 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 AyatModel).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..c1a302e --- /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.AyatModel + +/** + * 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: AyatModel, + newItem: AyatModel, + ): Boolean { + return oldItem.ayat == newItem.ayat + } + + override fun adapterAreContentsTheSame( + oldItem: AyatModel, + newItem: AyatModel, + ): 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: AyatModel, 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..8b5b249 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/ui/ayat/AyatViewModel.kt @@ -0,0 +1,40 @@ +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.AyatModel +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..d6a7949 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/ui/surah/SurahActivity.kt @@ -0,0 +1,104 @@ +package com.frogobox.kickstart.ui.surah + +import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +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.SurahModel +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 SurahModel).let { + startActivityResultExt(AyatActivity.createIntent(this@SurahActivity, it)) + } + } + }) + + etSearch.addTextChangedListener(object : TextWatcher { + override fun afterTextChanged(p0: Editable?) {} + override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {} + override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { + val query = p0.toString() + viewModel.getSurahs(query) + } + }) + + } + } + + 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..1fd354f 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.SurahModel /** * 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: SurahModel, + newItem: SurahModel, ): Boolean { - return oldItem.idMeal == newItem.idMeal + return oldItem.surah == newItem.surah } override fun adapterAreContentsTheSame( - oldItem: MealModel, - newItem: MealModel, + oldItem: SurahModel, + newItem: SurahModel, ): 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: SurahModel, 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 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..4d2ecf9 --- /dev/null +++ b/app/src/main/java/com/frogobox/kickstart/ui/surah/SurahViewModel.kt @@ -0,0 +1,40 @@ +package com.frogobox.kickstart.ui.surah + +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.SurahModel +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(query: String? = null) { + viewModelScope.launch { + useCase.getSurahs(query).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..7ab9bd0 --- /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.AyatModel +import com.frogobox.kickstart.domain.model.SurahModel + + +/** + * 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( + AyatModel( + 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( + SurahModel( + 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 be629ff..0000000 Binary files a/app/src/main/res/drawable/ic_frogobox.png and /dev/null differ 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_search.xml b/app/src/main/res/drawable/ic_search.xml new file mode 100644 index 0000000..352dc8f --- /dev/null +++ b/app/src/main/res/drawable/ic_search.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + 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 @@ - - - - - - - - - - - - - - - - - -