Removed the unnecessary compose dependencies from project.

* Removed the unnecessary overriding of rows since we are not showing these rows in custom apps.
* Used `KiwixTheme` instead of hardcoded colors.
* Used the `KiwixAppBar` instead of manually created `AppBar`.
* Refined the `HelpScreen` for better readability and maintainability.
This commit is contained in:
MohitMaliFtechiz 2025-03-25 16:04:54 +05:30 committed by Kelson
parent 55b6ab129d
commit 64db5ad3e5
8 changed files with 50 additions and 217 deletions

View File

@ -22,9 +22,6 @@ import org.kiwix.kiwixmobile.core.R
import org.kiwix.kiwixmobile.core.help.HelpFragment import org.kiwix.kiwixmobile.core.help.HelpFragment
class KiwixHelpFragment : HelpFragment() { class KiwixHelpFragment : HelpFragment() {
override val navHostFragmentId: Int
get() = org.kiwix.kiwixmobile.R.id.nav_host_fragment
override fun rawTitleDescriptionMap() = override fun rawTitleDescriptionMap() =
if (sharedPreferenceUtil.isPlayStoreBuildWithAndroid11OrAbove()) { if (sharedPreferenceUtil.isPlayStoreBuildWithAndroid11OrAbove()) {
listOf( listOf(

View File

@ -20,7 +20,6 @@ package plugin
import Config import Config
import Libs import Libs
import Versions
import com.android.build.api.dsl.CommonExtension import com.android.build.api.dsl.CommonExtension
import com.android.build.gradle.BaseExtension import com.android.build.gradle.BaseExtension
import io.gitlab.arturbosch.detekt.extensions.DetektExtension import io.gitlab.arturbosch.detekt.extensions.DetektExtension

View File

@ -14,7 +14,6 @@ buildscript {
plugins { plugins {
`android-library` `android-library`
id("org.jetbrains.kotlin.android") id("org.jetbrains.kotlin.android")
id("org.jetbrains.kotlin.plugin.compose") version Versions.org_jetbrains_kotlin_plugin_compose
} }
plugins.apply(KiwixConfigurationPlugin::class) plugins.apply(KiwixConfigurationPlugin::class)
apply(plugin = "io.objectbox") apply(plugin = "io.objectbox")
@ -28,12 +27,6 @@ android {
isMinifyEnabled = false isMinifyEnabled = false
} }
} }
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = Versions.kotlin_compiler_extension_version
}
} }
fun shouldUseLocalVersion() = File(projectDir, "libs").exists() fun shouldUseLocalVersion() = File(projectDir, "libs").exists()
@ -71,17 +64,4 @@ dependencies {
implementation(Libs.kotlinx_coroutines_android) implementation(Libs.kotlinx_coroutines_android)
implementation(Libs.kotlinx_coroutines_rx3) implementation(Libs.kotlinx_coroutines_rx3)
implementation(Libs.zxing) implementation(Libs.zxing)
implementation(Libs.androidx_compose_material3)
implementation(Libs.androidx_activity_compose)
implementation(Libs.androidx_compose_ui)
implementation(platform(Libs.androidx_compose_bom))
implementation(Libs.androidx_compose_ui_tooling)
implementation(Libs.androidx_compose_runtime_livedata)
implementation(Libs.androidx_compose_runtime_rxjava2)
// For Compose UI Testing
androidTestImplementation(Libs.androidx_compose_ui_test_junit4)
debugImplementation(Libs.androidx_compose_ui_tooling)
} }

View File

@ -22,14 +22,11 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toolbar
import androidx.appcompat.widget.Toolbar
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
import androidx.navigation.Navigation
import org.kiwix.kiwixmobile.core.R
import org.kiwix.kiwixmobile.core.base.BaseActivity import org.kiwix.kiwixmobile.core.base.BaseActivity
import org.kiwix.kiwixmobile.core.base.BaseFragment import org.kiwix.kiwixmobile.core.base.BaseFragment
import org.kiwix.kiwixmobile.core.main.CoreMainActivity import org.kiwix.kiwixmobile.core.main.CoreMainActivity
import org.kiwix.kiwixmobile.core.ui.components.NavigationIcon
import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
import javax.inject.Inject import javax.inject.Inject
@ -38,54 +35,30 @@ abstract class HelpFragment : BaseFragment() {
@Inject @Inject
lateinit var sharedPreferenceUtil: SharedPreferenceUtil lateinit var sharedPreferenceUtil: SharedPreferenceUtil
protected abstract val navHostFragmentId: Int
// Instead of keeping the XML binding, we now directly return a ComposeView.
protected open fun createFragmentView(
inflater: LayoutInflater,
container: ViewGroup?
): View {
return ComposeView(requireContext()).apply {
setContent {
// Create the helpScreen data using your rawTitleDescriptionMap.
val helpScreenData = transformToHelpScreenData(
requireContext(),
rawTitleDescriptionMap()
)
// Retrieve the NavController if your composable needs it.
val navController = Navigation.findNavController(requireActivity(), navHostFragmentId)
// Call your HelpScreen composable.
HelpScreen(data = helpScreenData, navController = navController)
}
}
}
// Each subclass is responsible for providing its own raw data. // Each subclass is responsible for providing its own raw data.
protected open fun rawTitleDescriptionMap(): List<Pair<Int, Any>> = emptyList() protected open fun rawTitleDescriptionMap(): List<Pair<Int, Any>> = emptyList()
// The following properties are now optional if no longer use an XML toolbar or title,
// we can remove or update these accordingly.
override val fragmentToolbar: Toolbar? by lazy {
// Already Applied ad TopAppBAr in scaffold in composable
null
}
override val fragmentTitle: String? by lazy { getString(R.string.menu_help) }
override fun inject(baseActivity: BaseActivity) { override fun inject(baseActivity: BaseActivity) {
(baseActivity as CoreMainActivity).cachedComponent.inject(this) (baseActivity as CoreMainActivity).cachedComponent.inject(this)
} }
// Remove or adjust onViewCreated if you no longer need to manipulate XML-based views.
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Any additional logic that is independent of the XML layout can be kept here.
}
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? = createFragmentView(inflater, container) ): View? = ComposeView(requireContext()).apply {
setContent {
// Create the helpScreen data using your rawTitleDescriptionMap.
val helpScreenData = transformToHelpScreenData(
requireContext(),
rawTitleDescriptionMap()
)
// Call your HelpScreen composable.
HelpScreen(data = helpScreenData) {
NavigationIcon(onClick = { activity?.onBackPressedDispatcher?.onBackPressed() })
}
}
}
} }
// Util function to modify the data accordingly // Util function to modify the data accordingly

View File

@ -25,147 +25,66 @@ import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.IconButton
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.sp
import androidx.navigation.NavController
import org.kiwix.kiwixmobile.core.R import org.kiwix.kiwixmobile.core.R
import org.kiwix.kiwixmobile.core.error.DiagnosticReportActivity import org.kiwix.kiwixmobile.core.error.DiagnosticReportActivity
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.start import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.start
import org.kiwix.kiwixmobile.core.ui.components.KiwixAppBar
import org.kiwix.kiwixmobile.core.ui.theme.KiwixTheme
import org.kiwix.kiwixmobile.core.ui.theme.MineShaftGray350
import org.kiwix.kiwixmobile.core.ui.theme.MineShaftGray600
import org.kiwix.kiwixmobile.core.utils.ComposeDimens.SIXTEEN_DP
val SendDiagnosticReportFontSize = 18.sp @Suppress("ComposableLambdaParameterNaming")
@Composable @Composable
fun HelpScreen( fun HelpScreen(
modifier: Modifier = Modifier,
data: List<HelpScreenItemDataClass>, data: List<HelpScreenItemDataClass>,
navController: NavController navigationIcon: @Composable () -> Unit
) { ) {
val isDarkTheme = isSystemInDarkTheme()
val backgroundColor =
if (isDarkTheme) colorResource(id = R.color.mine_shaft_gray900) else Color.White
val dividerColor = val dividerColor =
if (isDarkTheme) colorResource(id = R.color.mine_shaft_gray600) if (isSystemInDarkTheme()) {
else colorResource(id = R.color.mine_shaft_gray350) MineShaftGray600
} else {
MineShaftGray350
}
KiwixTheme {
Scaffold( Scaffold(
modifier = Modifier.fillMaxSize(),
topBar = { topBar = {
Row( KiwixAppBar(R.string.menu_help, navigationIcon)
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
) {
HelpTopAppBar(navController)
} }
},
containerColor = backgroundColor
) { innerPadding -> ) { innerPadding ->
HelpContent(data, dividerColor, innerPadding) Column(modifier = Modifier.padding(innerPadding)) {
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun HelpTopAppBar(navController: NavController) {
// Retrieve the actionBarSize from the current theme
val context = LocalContext.current
val actionBarHeight = with(LocalDensity.current) {
// Obtain the height defined in the theme (usually 56dp on phones)
val styledAttributes =
context.theme.obtainStyledAttributes(intArrayOf(android.R.attr.actionBarSize))
styledAttributes.getDimension(0, 0f).toDp().also { styledAttributes.recycle() }
}
TopAppBar(
modifier = Modifier.height(actionBarHeight), // set the height here
title = {
Row(
modifier = Modifier.fillMaxSize(),
verticalAlignment = Alignment.CenterVertically
) {
Text(
modifier = Modifier.padding(
start = dimensionResource(R.dimen.activity_horizontal_margin)
),
text = stringResource(id = R.string.menu_help),
color = Color.White,
fontWeight = FontWeight.SemiBold
)
}
},
navigationIcon = {
Row(modifier = Modifier.fillMaxHeight(), verticalAlignment = Alignment.CenterVertically) {
IconButton(onClick = navController::popBackStack) {
Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = "Back_Navigation",
tint = Color.White
)
}
}
},
colors = TopAppBarDefaults.topAppBarColors(
containerColor = Color.Black
)
)
}
@Composable
fun HelpContent(
data: List<HelpScreenItemDataClass>,
dividerColor: Color,
innerPadding: androidx.compose.foundation.layout.PaddingValues
) {
Column(
modifier = Modifier
.padding(innerPadding)
) {
SendReportRow() SendReportRow()
HorizontalDivider(color = dividerColor)
HelpItemList(data, dividerColor) HelpItemList(data, dividerColor)
} }
} }
}
}
@Composable @Composable
fun SendReportRow() { fun SendReportRow() {
val context = LocalContext.current val context = LocalContext.current
val isDarkTheme = isSystemInDarkTheme() // val isDarkTheme = isSystemInDarkTheme()
Row( Row(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.clickable { .clickable { (context as? Activity)?.start<DiagnosticReportActivity>() },
(context as? Activity)?.start<DiagnosticReportActivity>()
},
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Start horizontalArrangement = Arrangement.Start
) { ) {
@ -173,13 +92,13 @@ fun SendReportRow() {
painter = painterResource(R.drawable.ic_feedback_orange_24dp), painter = painterResource(R.drawable.ic_feedback_orange_24dp),
contentDescription = stringResource(R.string.send_report), contentDescription = stringResource(R.string.send_report),
modifier = Modifier modifier = Modifier
.padding(dimensionResource(R.dimen.activity_horizontal_margin)) .padding(SIXTEEN_DP)
) )
Text( Text(
text = stringResource(R.string.send_report), text = stringResource(R.string.send_report),
color = if (isDarkTheme) Color.LightGray else Color.DarkGray, // color = if (isDarkTheme) Color.LightGray else Color.DarkGray,
fontSize = SendDiagnosticReportFontSize style = MaterialTheme.typography.titleMedium
) )
} }
} }
@ -191,15 +110,8 @@ fun HelpItemList(data: List<HelpScreenItemDataClass>, dividerColor: Color) {
.fillMaxWidth() .fillMaxWidth()
) { ) {
itemsIndexed(data, key = { _, item -> item.title }) { _, item -> itemsIndexed(data, key = { _, item -> item.title }) { _, item ->
HorizontalDivider(
color = dividerColor
)
HelpScreenItem(data = item) HelpScreenItem(data = item)
} HorizontalDivider(color = dividerColor)
item {
HorizontalDivider(
color = dividerColor
)
} }
} }
} }

View File

@ -60,9 +60,9 @@ import org.kiwix.kiwixmobile.core.R
private val HelpItemTitleFontSize = 22.sp private val HelpItemTitleFontSize = 22.sp
private val HelpItemDescriptionFontSize = 17.sp private val HelpItemDescriptionFontSize = 17.sp
private val IconSize = 36.dp private val IconSize = 36.dp
private const val HelpItemAnimationDuration = 300 private const val HELP_ITEM_ANIMATION_DURATION = 300
private const val HelpItemArrowRotationOpen = 180f private const val HELP_ITEM_ARROW_ROTATION_OPEN = 180f
private const val HelpItemArrowRotationClosed = 0f private const val HELP_ITEM_ARROW_ROTATION_CLOSE = 0f
@Composable @Composable
fun HelpScreenItem( fun HelpScreenItem(
@ -99,8 +99,8 @@ fun HelpItemHeader(
onToggle: () -> Unit onToggle: () -> Unit
) { ) {
val arrowRotation by animateFloatAsState( val arrowRotation by animateFloatAsState(
targetValue = if (isOpen) HelpItemArrowRotationOpen else HelpItemArrowRotationClosed, targetValue = if (isOpen) HELP_ITEM_ARROW_ROTATION_OPEN else HELP_ITEM_ARROW_ROTATION_CLOSE,
animationSpec = tween(HelpItemAnimationDuration), animationSpec = tween(HELP_ITEM_ANIMATION_DURATION),
label = "arrowRotation" label = "arrowRotation"
) )
val interactionSource = remember(::MutableInteractionSource) val interactionSource = remember(::MutableInteractionSource)

View File

@ -18,5 +18,5 @@
package org.kiwix.kiwixmobile.core.help package org.kiwix.kiwixmobile.core.help
// same as HelpItem data class in earlier in XML // Same as HelpItem data class in earlier in XML
data class HelpScreenItemDataClass(val title: String, val description: String) data class HelpScreenItemDataClass(val title: String, val description: String)

View File

@ -20,32 +20,4 @@ package org.kiwix.kiwixmobile.custom.help
import org.kiwix.kiwixmobile.core.help.HelpFragment import org.kiwix.kiwixmobile.core.help.HelpFragment
class CustomHelpFragment : HelpFragment() { class CustomHelpFragment : HelpFragment()
override val navHostFragmentId: Int
get() = org.kiwix.kiwixmobile.custom.R.id.custom_nav_controller
override fun rawTitleDescriptionMap() =
if (sharedPreferenceUtil.isPlayStoreBuildWithAndroid11OrAbove()) {
listOf(
org.kiwix.kiwixmobile.core.R.string.help_2 to
org.kiwix.kiwixmobile.core.R.array.description_help_2,
org.kiwix.kiwixmobile.core.R.string.help_5 to
org.kiwix.kiwixmobile.core.R.array.description_help_5,
org.kiwix.kiwixmobile.core.R.string.how_to_update_content to
org.kiwix.kiwixmobile.core.R.array.update_content_description,
org.kiwix.kiwixmobile.core.R.string.why_copy_move_files_to_app_directory to
getString(
org.kiwix.kiwixmobile.core.R.string.copy_move_files_to_app_directory_description
)
)
} else {
listOf(
org.kiwix.kiwixmobile.core.R.string.help_2 to
org.kiwix.kiwixmobile.core.R.array.description_help_2,
org.kiwix.kiwixmobile.core.R.string.help_5 to
org.kiwix.kiwixmobile.core.R.array.description_help_5,
org.kiwix.kiwixmobile.core.R.string.how_to_update_content to
org.kiwix.kiwixmobile.core.R.array.update_content_description
)
}
}