Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrated about page from XML to Jetpack Compose #260

Merged
Merged
176 changes: 28 additions & 148 deletions app/src/main/java/be/scri/fragments/AboutFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,23 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.addCallback
import androidx.recyclerview.widget.LinearLayoutManager
import be.scri.BuildConfig
import androidx.appcompat.app.AppCompatDelegate
import androidx.compose.ui.platform.ComposeView
import be.scri.R
import be.scri.activities.MainActivity
import be.scri.databinding.FragmentAboutBinding
import be.scri.extensions.addCustomItemDecoration
import be.scri.helpers.CustomAdapter
import be.scri.helpers.HintUtils
import be.scri.helpers.PreferencesHelper
import be.scri.helpers.RatingHelper
import be.scri.helpers.ShareHelper
import be.scri.models.ItemsViewModel
import be.scri.ui.screens.AboutScreen
import be.scri.ui.theme.ScribeTheme

class AboutFragment : ScribeFragment("About") {
private lateinit var binding: FragmentAboutBinding

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View {
binding = FragmentAboutBinding.inflate(inflater, container, false)
val callback =
requireActivity().onBackPressedDispatcher.addCallback(this) {
getParentFragmentManager().popBackStack()
Expand All @@ -34,149 +30,33 @@ class AboutFragment : ScribeFragment("About") {
(requireActivity() as MainActivity).setActionBarTitle(R.string.app_about_title)
(requireActivity() as MainActivity).setActionBarVisibility(false)
(requireActivity() as MainActivity).setActionBarButtonVisibility(false)
return binding.root
}

override fun onViewCreated(
view: View,
savedInstanceState: Bundle?,
) {
super.onViewCreated(view, savedInstanceState)
setupRecyclerViews()
}

private fun setupRecyclerViews() {
val recyclerView1 = binding.recycleView2
recyclerView1.layoutManager = LinearLayoutManager(context)
recyclerView1.adapter = CustomAdapter(getFirstRecyclerViewData(), requireContext())
recyclerView1.suppressLayout(true)
recyclerView1.apply {
addCustomItemDecoration(requireContext())
}
val recyclerView2 = binding.recycleView
recyclerView2.layoutManager = LinearLayoutManager(context)
recyclerView2.adapter = CustomAdapter(getSecondRecyclerViewData(), requireContext())
recyclerView2.suppressLayout(true)
recyclerView2.apply {
addCustomItemDecoration(requireContext())
}
val recyclerView3 = binding.recycleView3
recyclerView3.layoutManager = LinearLayoutManager(context)
recyclerView3.adapter = CustomAdapter(getThirdRecyclerViewData(), requireContext())
recyclerView3.suppressLayout(true)
recyclerView3.apply {
addCustomItemDecoration(requireContext())
return ComposeView(requireContext()).apply {
setContent {
ScribeTheme(
useDarkTheme =
PreferencesHelper.getUserDarkModePreference(requireContext())
== AppCompatDelegate.MODE_NIGHT_YES,
) {
AboutScreen(
onWikimediaAndScribeClick = {
loadOtherFragment(WikimediaScribeFragment(), "WikimediaScribePage")
},
onShareScribeClick = { ShareHelper.shareScribe(requireContext()) },
onPrivacyPolicyClick = { loadOtherFragment(PrivacyPolicyFragment(), null) },
onThirdPartyLicensesClick = { loadOtherFragment(ThirdPartyFragment(), null) },
onRateScribeClick = {
RatingHelper.rateScribe(requireContext(), activity as MainActivity)
},
onMailClick = { ShareHelper.sendEmail(requireContext()) },
onResetHintsClick = ::resetHints,
context = requireContext(),
)
}
}
}
}

private fun getFirstRecyclerViewData(): List<Any> =
listOf(
ItemsViewModel(
image = R.drawable.github_logo,
text = ItemsViewModel.Text(R.string.app_about_community_github),
image2 = R.drawable.external_link,
url = "https://github.com/scribe-org/Scribe-Android",
activity = null,
action = null,
),
ItemsViewModel(
image = R.drawable.matrix_icon,
text = ItemsViewModel.Text(R.string.app_about_community_matrix),
image2 = R.drawable.external_link,
url = "https://matrix.to/%23/%23scribe_community:matrix.org",
activity = null,
action = null,
),
ItemsViewModel(
image = R.drawable.mastodon_svg_icon,
text = ItemsViewModel.Text(R.string.app_about_community_mastodon),
image2 = R.drawable.external_link,
url = "https://wikis.world/@scribe",
activity = null,
action = null,
),
ItemsViewModel(
image = R.drawable.share_icon,
text = ItemsViewModel.Text(R.string.app_about_community_share_scribe),
image2 = R.drawable.external_link,
url = null,
activity = null,
action = ({ ShareHelper.shareScribe(requireContext()) }),
),
ItemsViewModel(
image = R.drawable.wikimedia_logo_black,
text = ItemsViewModel.Text(R.string.app_about_community_wikimedia),
image2 = R.drawable.right_arrow,
url = null,
activity = null,
action = ({ loadOtherFragment(WikimediaScribeFragment(), "WikimediaScribePage") }),
),
)

private fun getSecondRecyclerViewData(): List<Any> =
listOf(
ItemsViewModel(
image = R.drawable.star,
text = ItemsViewModel.Text(R.string.app_about_feedback_rate_scribe),
image2 = R.drawable.external_link,
url = null,
activity = null,
action = ({ RatingHelper.rateScribe(requireContext(), activity as MainActivity) }),
),
ItemsViewModel(
image = R.drawable.bug_report_icon,
text = ItemsViewModel.Text(R.string.app_about_feedback_bug_report),
image2 = R.drawable.external_link,
url = "https://github.com/scribe-org/Scribe-Android/issues",
activity = null,
action = null,
),
ItemsViewModel(
image = R.drawable.mail_icon,
text = ItemsViewModel.Text(R.string.app_about_feedback_email),
image2 = R.drawable.external_link,
url = null,
activity = null,
action = ({ ShareHelper.sendEmail(requireContext()) }),
),
ItemsViewModel(
image = R.drawable.bookmark_icon,
text = ItemsViewModel.Text(R.string.app_about_feedback_version, BuildConfig.VERSION_NAME),
image2 = R.drawable.external_link,
url = "https://github.com/scribe-org/Scribe-Android/releases/",
activity = null,
action = null,
),
ItemsViewModel(
image = R.drawable.light_bulb_icon,
text = ItemsViewModel.Text(R.string.app_about_feedback_app_hints),
image2 = R.drawable.counter_clockwise_icon,
url = null,
activity = null,
action = ::resetHints,
),
)

private fun getThirdRecyclerViewData(): List<ItemsViewModel> =
listOf(
ItemsViewModel(
image = R.drawable.shield_lock,
text = ItemsViewModel.Text(R.string.app_about_legal_privacy_policy),
image2 = R.drawable.right_arrow,
url = null,
activity = null,
action = ({ loadOtherFragment(PrivacyPolicyFragment(), null) }),
),
ItemsViewModel(
image = R.drawable.license_icon,
text = ItemsViewModel.Text(R.string.app_about_legal_third_party),
image2 = R.drawable.right_arrow,
url = null,
activity = null,
action = ({ loadOtherFragment(ThirdPartyFragment(), null) }),
),
)

private fun resetHints() {
HintUtils.resetHints(requireContext())
(activity as MainActivity).showHint("hint_shown_about", R.string.app_about_app_hint)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package be.scri.ui.common.components

import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import be.scri.R

@Composable
fun AboutPageItemComp(
title: String,
leadingIcon: Int,
trailingIcon: Int,
onClick: () -> Unit,
modifier: Modifier = Modifier,
) {
Row(
modifier =
modifier
.fillMaxWidth()
.padding(
start = 12.dp,
end = 20.dp,
top = 10.dp,
bottom = 10.dp,
).clip(RoundedCornerShape(12.dp))
.clickable(onClick = onClick),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
painter = painterResource(leadingIcon),
modifier =
Modifier
.padding(start = 2.dp)
.size(22.dp),
tint = colorResource(R.color.app_text_color),
contentDescription = "Right Arrow",
)
Spacer(modifier = Modifier.width(8.dp))
Text(
text = title,
modifier = Modifier.weight(1f).padding(start = 4.dp),
fontSize = 16.sp,
color = colorResource(R.color.app_text_color),
style = MaterialTheme.typography.bodyMedium,
)
Icon(
painter = painterResource(trailingIcon),
modifier =
Modifier
.padding(start = 6.dp)
.size(24.dp),
contentDescription = "Right Arrow",
tint = Color.Gray,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ fun ItemsCardContainer(
Column(
modifier =
Modifier
.padding(vertical = 4.dp, horizontal = 4.dp),
.padding(vertical = 10.dp, horizontal = 4.dp),
) {
cardItemsList.items.forEach { item ->
when (item) {
Expand All @@ -52,6 +52,12 @@ fun ItemsCardContainer(
}

is ScribeItem.ExternalLinkItem -> {
AboutPageItemComp(
title = item.title,
leadingIcon = item.leadingIcon,
trailingIcon = item.trailingIcon,
onClick = item.onClick,
)
}
}

Expand All @@ -60,7 +66,7 @@ fun ItemsCardContainer(
cardItemsList.items.indexOf(item) != cardItemsList.items.lastIndex
) {
HorizontalDivider(
color = Color.Gray.copy(alpha = 0.25f),
color = Color.Gray.copy(alpha = 0.3f),
thickness = 1.dp,
modifier =
Modifier.padding(
Expand Down
10 changes: 7 additions & 3 deletions app/src/main/java/be/scri/ui/models/ScribeItem.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package be.scri.ui.models

import androidx.annotation.DrawableRes

sealed class ScribeItem(
open val title: String,
open val desc: String?,
Expand All @@ -19,9 +21,11 @@ sealed class ScribeItem(

data class ExternalLinkItem(
override val title: String,
override val desc: String,
val url: String,
val onClick: (String) -> Unit,
override val desc: String? = null,
@DrawableRes val leadingIcon: Int,
@DrawableRes val trailingIcon: Int,
val url: String?,
val onClick: () -> Unit,
) : ScribeItem(title, desc)

data class CustomItem(
Expand Down
Loading
Loading