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
2 changes: 2 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -178,4 +178,6 @@ dependencies {
implementation(libs.accompanist.permissions)
implementation(libs.glance)
implementation(libs.glance.appwidget)
implementation(libs.coil.compose)
implementation(libs.coil.network.okhttp)
}
3 changes: 3 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@
<activity android:name=".activities.reference.ActivityPropheticDuas" />
<activity android:name=".activities.reference.ActivityQuranScience" />
<activity android:name=".activities.reference.ActivityQuranScienceContent" />
<activity android:name=".activities.reference.ActivityQuranicTopics">

</activity>
<activity
android:name=".activities.ActivityTafsir"
android:exported="true"
Expand Down
Binary file added app/src/main/assets/db/topics.db
Binary file not shown.
1 change: 0 additions & 1 deletion app/src/main/assets/tafsir/tafsir_page.css
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,6 @@ hr {

.multiple-verse-alert {
background-color: var(--secondary-container);
border: 1px solid var(--outline-variant);
padding: 12px 16px;
border-radius: 10px;
margin: 12px 0;
Expand Down
10 changes: 10 additions & 0 deletions app/src/main/java/com/quranapp/android/QuranApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.alfaazplus.sunnah.ui.utils.shared_preference.DataStoreManager
import com.quranapp.android.compose.utils.ThemeUtils
import com.quranapp.android.compose.utils.preferences.ReaderPreferences
import com.quranapp.android.compose.utils.refreshAppLocale
import com.quranapp.android.db.DatabaseProvider
import com.quranapp.android.db.bookmark.UserDataMigrationManager
import com.quranapp.android.search.SearchIndexScheduler
import com.quranapp.android.utils.app.DownloadSourceUtils
Expand Down Expand Up @@ -61,4 +62,13 @@ class QuranApp : Application() {

SearchIndexScheduler.scheduleTranslationSearchIndexIfNeeded(applicationContext)
}

override fun onTrimMemory(level: Int) {
super.onTrimMemory(level)

@Suppress("DEPRECATION")
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE && level == TRIM_MEMORY_COMPLETE) {
DatabaseProvider.closeAll()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.quranapp.android.activities.reference

import android.os.Bundle
import android.view.View
import androidx.activity.compose.setContent
import com.quranapp.android.activities.base.BaseActivity
import com.quranapp.android.compose.screens.quranictopics.QuranicTopicsScreen
import com.quranapp.android.compose.screens.quranictopics.QuranicTopicsStart
import com.quranapp.android.compose.theme.QuranAppTheme

class ActivityQuranicTopics : BaseActivity() {

companion object {
const val KEY_SCREEN_TYPE = "screen_type"
const val KEY_TOPIC_ID = "topic_id"
const val KEY_TOPIC_TRAIL = "topic_trail"
}

override fun getLayoutResource() = 0

override fun shouldInflateAsynchronously() = false

override fun onActivityInflated(activityView: View, savedInstanceState: Bundle?) {
val screenType = intent.getStringExtra(KEY_SCREEN_TYPE)?.let {
runCatching { QuranicTopicsStart.valueOf(it) }.getOrNull()
} ?: QuranicTopicsStart.Ontology
val initialTopicId = intent.getIntExtra(KEY_TOPIC_ID, -1)
.takeIf { it > 0 }
val initialTrail = intent.getStringExtra(KEY_TOPIC_TRAIL)
.orEmpty()
.split(',')
.mapNotNull { it.toIntOrNull() }

setContent {
QuranAppTheme {
QuranicTopicsScreen(
start = screenType,
initialTopicId = initialTopicId,
initialTrail = initialTrail,
)
}
}
}
}
16 changes: 16 additions & 0 deletions app/src/main/java/com/quranapp/android/api/InventoryUrlFetch.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,24 @@
package com.quranapp.android.api

import com.quranapp.android.utils.app.DownloadSourceUtils
import okhttp3.ResponseBody
import retrofit2.Response

/**
* Resolves inventory URLs based on current download source preference.
*
* - `ghraw://relative/path` - converted into a fully qualified URL with the
* active mirror root from [DownloadSourceUtils.getDownloadSourceRoot].
* - Any other string - returned as-is.
*/
fun resolveInventoryUrl(url: String): String {
return if (url.startsWith("ghraw://")) {
DownloadSourceUtils.getDownloadSourceRoot() + url.removePrefix("ghraw://").trimStart('/')
} else {
url
}
}

/**
* Resolves inventory URLs for streaming download.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
package com.quranapp.android.components

import android.os.Bundle
import androidx.annotation.DrawableRes

sealed class ReferenceThumbnail {
data class RemoteUrl(val url: String) : ReferenceThumbnail()
data class ResourceId(@DrawableRes val id: Int) : ReferenceThumbnail()
}

data class ReferenceVerseModel(
val title: String,
val desc: String?,
val translSlugs: Set<String>,
val translSlugs: Set<String> = emptySet(),
val chapters: Set<Int>,
val verses: Set<String>,
val thumbnail: ReferenceThumbnail? = null
) {

fun toBundle(): Bundle {
Expand All @@ -17,6 +24,20 @@ data class ReferenceVerseModel(
putStringArrayList("translSlugs", ArrayList(translSlugs))
putIntegerArrayList("chapters", ArrayList(chapters))
putStringArrayList("verses", ArrayList(verses))

when (thumbnail) {
is ReferenceThumbnail.RemoteUrl -> {
putString("thumbnail_url", thumbnail.url)
}

is ReferenceThumbnail.ResourceId -> {
putInt("thumbnail_res_id", thumbnail.id)
}

else -> {
// noop
}
}
}
}

Expand All @@ -26,13 +47,21 @@ data class ReferenceVerseModel(
return null
}

val thumbnailRes = bundle.getInt("thumbnail_res_id", 0)
val thumbnailUrl = bundle.getString("thumbnail_url")

return ReferenceVerseModel(
title = bundle.getString("title") ?: "",
desc = bundle.getString("desc"),
translSlugs = bundle.getStringArray("translSlugs")?.let { it.toSet() }
?: emptySet(),
chapters = bundle.getIntegerArrayList("chapters")?.let { it.toSet() } ?: emptySet(),
verses = bundle.getStringArrayList("verses")?.let { it.toSet() } ?: emptySet(),
thumbnail = when {
thumbnailRes != 0 -> ReferenceThumbnail.ResourceId(thumbnailRes)
thumbnailUrl != null -> ReferenceThumbnail.RemoteUrl(thumbnailUrl)
else -> null
}
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.quranapp.android.components.bookmark

import android.content.Context
import com.quranapp.android.R
import com.quranapp.android.db.entities.BookmarkEntity
import com.quranapp.android.db.entities.user.BookmarkEntity
import com.quranapp.android.utils.univ.DateUtils
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.contentOrNull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ class QuranProphet(val prophets: List<Prophet>) {
val nameEn: String,
val name: String,
val honorific: String,
@param:DrawableRes val iconRes: Int = 0
@param:DrawableRes val iconRes: Int = 0,
val thumbnail: String?
) : Serializable {
var references: String? = null

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ class QuranPropheticDua(val prophets: List<Prophet>) {
val order: Int = 0,
val name: String,
val honorific: String,
@param:DrawableRes val iconRes: Int = 0
@param:DrawableRes val iconRes: Int = 0,
val thumbnail: String?
) : Serializable {
var references: String? = null

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ import com.quranapp.android.components.reader.ChapterVersePair
import com.quranapp.android.compose.components.common.IconButton
import com.quranapp.android.compose.components.common.Loader
import com.quranapp.android.compose.components.reader.LocalRecitation
import com.quranapp.android.compose.components.reader.LocalWbwState
import com.quranapp.android.compose.components.reader.QuranTextWbw
import com.quranapp.android.compose.components.reader.ReaderLayoutItem
import com.quranapp.android.compose.components.reader.ReaderProvider
Expand All @@ -76,7 +75,6 @@ import com.quranapp.android.compose.utils.preferences.VersePreferences
import com.quranapp.android.utils.mediaplayer.WbwAudioPlayer
import com.quranapp.android.utils.reader.LocalVerseActions
import com.quranapp.android.utils.reader.QuranTextStyleParams
import com.quranapp.android.utils.reader.TranslUtils
import com.quranapp.android.utils.reader.TranslationTextStyleParams
import com.quranapp.android.utils.reader.VerseActions
import com.quranapp.android.utils.reader.atlas.QuranAtlasLoader
Expand Down Expand Up @@ -161,10 +159,7 @@ internal fun VotdContent(
val verse = VerseUtils.getVOTD(context, vm.repository)
?: return@withContext null

val optimalSlug = translationSlugs.firstOrNull { !TranslUtils.isTransliteration(it) }
?: TranslUtils.TRANSL_SLUG_DEFAULT

val slugs = setOf(optimalSlug)
val slugs = setOf(ReaderPreferences.primaryTranslationSlug())

val translations = translationFactory.getTranslationsSingleVerse(
slugs,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ import com.quranapp.android.compose.components.reader.ReaderMode
import com.quranapp.android.compose.screens.subtitleLabel
import com.quranapp.android.compose.screens.titleLabel
import com.quranapp.android.compose.theme.alpha
import com.quranapp.android.db.entities.ReadHistoryEntity
import com.quranapp.android.db.entities.user.ReadHistoryEntity
import com.quranapp.android.utils.reader.ReadType
import com.quranapp.android.utils.reader.factory.ReaderFactory
import com.quranapp.android.viewModels.ReadHistoryViewModel
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import com.quranapp.android.R
import com.quranapp.android.components.ReferenceVerseModel
import com.quranapp.android.db.DatabaseProvider
import com.quranapp.android.utils.reader.factory.ReaderFactory
import com.quranapp.android.utils.recommended.Recommendation
Expand Down Expand Up @@ -89,11 +90,12 @@ private fun RecommendationCard(

ReaderFactory.startReferenceVerse(
context = context,
title = recommendation.title,
desc = recommendation.description,
translSlug = emptySet(),
chapters = chapters,
verses = verseSpecs
ReferenceVerseModel(
title = recommendation.title,
desc = recommendation.description,
chapters = chapters,
verses = verseSpecs
)
)

return@clickable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ import com.quranapp.android.R
import com.quranapp.android.activities.reference.ActivityExclusiveVerses
import com.quranapp.android.activities.reference.ActivityProphets
import com.quranapp.android.activities.reference.ActivityQuranScience
import com.quranapp.android.activities.reference.ActivityQuranicTopics
import com.quranapp.android.compose.screens.quranictopics.QuranicTopicsStart
import com.quranapp.android.compose.screens.reference.ExclusiveVersesScreenKind
import com.quranapp.android.compose.theme.alpha

Expand Down Expand Up @@ -103,7 +105,29 @@ fun HomeSectionVersesCollections() {
context.startActivity(
Intent(context, ActivityQuranScience::class.java)
)
}
},
VersesCollectionCard(
R.string.ontologyExplorer,
R.drawable.hierarchy,
) {
context.startActivity(
Intent(context, ActivityQuranicTopics::class.java).putExtra(
ActivityQuranicTopics.KEY_SCREEN_TYPE,
QuranicTopicsStart.Ontology.name
)
)
},
VersesCollectionCard(
R.string.thematicTopics,
R.drawable.dr_icon_read_quran,
) {
context.startActivity(
Intent(context, ActivityQuranicTopics::class.java).putExtra(
ActivityQuranicTopics.KEY_SCREEN_TYPE,
QuranicTopicsStart.Thematic.name
)
)
},
)
}

Expand Down
Loading
Loading