Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 5 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -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)
Expand All @@ -14,9 +11,9 @@ This Is Latest Release (Still Being Developed)


## Screenshoot Apps
| UI 1 | UI 2 | UI 3 |
|:------------------------------------------------------------:|:------------------------------------------------------------:|:------------------------------------------------------------:|
| <img width="200px" height="360px" src="docs/image/ss_1.png"> | <img width="200px" height="360px" src="docs/image/ss_2.png"> | <img width="200px" height="360px" src="docs/image/ss_3.png"> |
| UI 1 | UI 2 |
|:------------------------------------------------------------:|:------------------------------------------------------------:|
| <img width="200px" height="480px" src="docs/image/ss_1.jpg"> | <img width="200px" height="480px" src="docs/image/ss_2.jpg"> |

## 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.
Expand Down
5 changes: 2 additions & 3 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,9 @@
android:usesCleartextTraffic="true"
tools:targetApi="n">

<activity android:name=".ui.detail.DetailActivity" />
<activity android:name=".ui.about.AboutUsActivity" />
<activity android:name=".ui.ayat.AyatActivity" />
<activity
android:name=".ui.main.MainActivity"
android:name=".ui.surah.SurahActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand Down
21 changes: 21 additions & 0 deletions app/src/main/java/com/frogobox/kickstart/common/ext/ContextExt.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.frogobox.kickstart.common.ext

Check warning

Code scanning / detekt

Checks whether files end with a line separator. Warning

The file /home/runner/work/quran-android/quran-android/app/src/main/java/com/frogobox/kickstart/common/ext/ContextExt.kt is not ending with a new line.

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))
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -24,4 +26,7 @@ abstract class RepositoryModule {
@Binds
abstract fun provideMealRepository(repository: MealRepositoryImpl): MealRepository

@Binds
abstract fun provideQuranRepository(repository: QuranRepositoryImpl): QuranRepository

}
6 changes: 6 additions & 0 deletions app/src/main/java/com/frogobox/kickstart/di/UseCaseModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -26,4 +28,8 @@ abstract class UseCaseModule {
@ViewModelScoped
abstract fun provideMealUseCase(useCase: MealInteractor): MealUseCase

@Binds
@ViewModelScoped
abstract fun provideQuranUseCase(useCase: QuranInteractor): QuranUseCase

}
11 changes: 11 additions & 0 deletions app/src/main/java/com/frogobox/kickstart/domain/model/AyatModel.kt
Original file line number Diff line number Diff line change
@@ -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,
)
Original file line number Diff line number Diff line change
@@ -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,
)

Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.frogobox.kickstart.domain.source.quran

Check warning

Code scanning / detekt

Checks whether files end with a line separator. Warning

The file /home/runner/work/quran-android/quran-android/app/src/main/java/com/frogobox/kickstart/domain/source/quran/QuranDataSource.kt is not ending with a new line.

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<Resource<MutableList<SurahModel>>> =
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) {

Check warning

Code scanning / detekt

Caught exception is too generic. Prefer catching specific exceptions to the case that is currently handled. Warning

Caught exception is too generic. Prefer catching specific exceptions to the case that is currently handled.
emit(Resource.Error(e.message.toString()))
}
}.flowOn(Dispatchers.IO)


fun getAyats(surah: String): Flow<Resource<MutableList<AyatModel>>> =
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) {

Check warning

Code scanning / detekt

Caught exception is too generic. Prefer catching specific exceptions to the case that is currently handled. Warning

Caught exception is too generic. Prefer catching specific exceptions to the case that is currently handled.
emit(Resource.Error(e.message.toString()))
}
}.flowOn(Dispatchers.IO)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.frogobox.kickstart.domain.source.quran.repository

Check warning

Code scanning / detekt

Checks whether files end with a line separator. Warning

The file /home/runner/work/quran-android/quran-android/app/src/main/java/com/frogobox/kickstart/domain/source/quran/repository/QuranRepository.kt is not ending with a new line.

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<Resource<MutableList<SurahModel>>>

fun getAyats(surah: String): Flow<Resource<MutableList<AyatModel>>>

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.frogobox.kickstart.domain.source.quran.repository

Check warning

Code scanning / detekt

Checks whether files end with a line separator. Warning

The file /home/runner/work/quran-android/quran-android/app/src/main/java/com/frogobox/kickstart/domain/source/quran/repository/QuranRepositoryImpl.kt is not ending with a new line.

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<Resource<MutableList<SurahModel>>> {
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<Resource<MutableList<AyatModel>>> {
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()
}
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.frogobox.kickstart.domain.source.quran.usecase

Check warning

Code scanning / detekt

Checks whether files end with a line separator. Warning

The file /home/runner/work/quran-android/quran-android/app/src/main/java/com/frogobox/kickstart/domain/source/quran/usecase/QuranInteractor.kt is not ending with a new line.

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<Resource<MutableList<SurahModel>>> {
return repository.getSurahs(surah)
}

override fun getAyats(surah: String): Flow<Resource<MutableList<AyatModel>>> {
return repository.getAyats(surah)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.frogobox.kickstart.domain.source.quran.usecase

Check warning

Code scanning / detekt

Checks whether files end with a line separator. Warning

The file /home/runner/work/quran-android/quran-android/app/src/main/java/com/frogobox/kickstart/domain/source/quran/usecase/QuranUseCase.kt is not ending with a new line.

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<Resource<MutableList<SurahModel>>>

fun getAyats(surah: String): Flow<Resource<MutableList<AyatModel>>>

}

This file was deleted.

Loading
Loading