diff --git a/app/src/main/java/org/wikipedia/activitytab/ActivityTabFragment.kt b/app/src/main/java/org/wikipedia/activitytab/ActivityTabFragment.kt index faae05b6d4e..c67d6371ab4 100644 --- a/app/src/main/java/org/wikipedia/activitytab/ActivityTabFragment.kt +++ b/app/src/main/java/org/wikipedia/activitytab/ActivityTabFragment.kt @@ -10,7 +10,6 @@ import android.view.ViewGroup import androidx.compose.animation.core.rememberInfiniteTransition import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -22,6 +21,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.rememberScrollState @@ -58,13 +58,11 @@ import androidx.compose.ui.layout.positionInParent import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import androidx.core.net.toUri import androidx.core.view.MenuProvider import androidx.fragment.app.Fragment @@ -95,6 +93,7 @@ import org.wikipedia.auth.AccountUtil import org.wikipedia.categories.CategoryActivity import org.wikipedia.categories.db.Category import org.wikipedia.compose.components.HtmlText +import org.wikipedia.compose.components.WikiLangCodeBox import org.wikipedia.compose.components.error.WikiErrorClickEvents import org.wikipedia.compose.extensions.shimmerEffect import org.wikipedia.compose.theme.BaseTheme @@ -482,37 +481,26 @@ class ActivityTabFragment : Fragment() { ) { if (modules.isModuleVisible(ModuleType.EDITING_INSIGHTS) || modules.isModuleVisible(ModuleType.IMPACT)) { Row( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .padding(start = 16.dp, end = 16.dp, top = 24.dp) + .fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically ) { Text( modifier = Modifier - .padding(start = 16.dp, end = 16.dp, top = 24.dp) .weight(1f), text = stringResource(R.string.activity_tab_impact), style = MaterialTheme.typography.titleLarge, fontWeight = FontWeight.Medium, color = WikipediaTheme.colors.primaryColor ) - Box( + WikiLangCodeBox( modifier = Modifier - .padding(start = 16.dp, end = 16.dp, top = 24.dp) - .align(Alignment.CenterVertically) - .background(color = WikipediaTheme.colors.paperColor) - .border( - 1.5.dp, - WikipediaTheme.colors.primaryColor, - RoundedCornerShape(4.dp) - ) - ) { - Text( - modifier = Modifier.padding(start = 4.dp, end = 4.5.dp, top = 3.5.dp, bottom = 3.dp), - text = languageCode.uppercase(), - fontSize = 10.sp, - fontFamily = FontFamily.Monospace, - fontWeight = FontWeight.Bold, - color = WikipediaTheme.colors.primaryColor - ) - } + .height(20.dp) + .widthIn(min = 20.dp), + languageCode = languageCode + ) } } diff --git a/app/src/main/java/org/wikipedia/compose/components/WikiLangCodeBox.kt b/app/src/main/java/org/wikipedia/compose/components/WikiLangCodeBox.kt new file mode 100644 index 00000000000..126cbc0b91f --- /dev/null +++ b/app/src/main/java/org/wikipedia/compose/components/WikiLangCodeBox.kt @@ -0,0 +1,79 @@ +package org.wikipedia.compose.components + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import org.wikipedia.compose.theme.BaseTheme +import org.wikipedia.compose.theme.WikipediaTheme +import org.wikipedia.theme.Theme + +@Composable +fun WikiLangCodeBox( + modifier: Modifier = Modifier, + languageCode: String, + backgroundColor: Color = WikipediaTheme.colors.paperColor, + borderColor: Color = WikipediaTheme.colors.primaryColor, + shape: RoundedCornerShape = RoundedCornerShape(4.dp), + textColor: Color = WikipediaTheme.colors.primaryColor, + fontSize: TextUnit = 10.sp, +) { + Box( + modifier = modifier + .background(color = backgroundColor, shape = shape) + .border(width = 1.5.dp, color = borderColor, shape = shape), + contentAlignment = Alignment.Center + ) { + Text( + modifier = Modifier.padding(horizontal = 4.dp), + text = languageCode.uppercase(), + fontSize = fontSize, + fontFamily = FontFamily.Monospace, + fontWeight = FontWeight.Bold, + color = textColor + ) + } +} + +@Preview +@Composable +private fun WikiLangCodeBoxRegularPreview() { + BaseTheme(currentTheme = Theme.LIGHT) { + WikiLangCodeBox( + modifier = Modifier + .height(20.dp) + .widthIn(min = 20.dp), + languageCode = "en" + ) + } +} + +@Preview(showBackground = true) +@Composable +private fun WikiLangCodeBoxDarkPreview() { + BaseTheme(currentTheme = Theme.LIGHT) { + WikiLangCodeBox( + modifier = Modifier + .height(20.dp) + .widthIn(min = 20.dp), + languageCode = "en", + backgroundColor = WikipediaTheme.colors.primaryColor, + borderColor = WikipediaTheme.colors.primaryColor, + textColor = WikipediaTheme.colors.paperColor + ) + } +} diff --git a/app/src/main/java/org/wikipedia/dataclient/WikiSite.kt b/app/src/main/java/org/wikipedia/dataclient/WikiSite.kt index 5069ce2985d..91445dfa12e 100644 --- a/app/src/main/java/org/wikipedia/dataclient/WikiSite.kt +++ b/app/src/main/java/org/wikipedia/dataclient/WikiSite.kt @@ -162,6 +162,10 @@ data class WikiSite( } } + fun preview(languageCode: String = "en"): WikiSite { + return WikiSite("https://$languageCode.wikipedia.org/".toUri(), languageCode) + } + private fun languageCodeToSubdomain(languageCode: String): String { return WikipediaApp.instance.languageState.getDefaultLanguageCode(languageCode) ?: normalizeLanguageCode(languageCode) } diff --git a/app/src/main/java/org/wikipedia/feed/CommunityModuleHeader.kt b/app/src/main/java/org/wikipedia/feed/CommunityModuleHeader.kt index ca2598d7d1a..a053a1d3a3f 100644 --- a/app/src/main/java/org/wikipedia/feed/CommunityModuleHeader.kt +++ b/app/src/main/java/org/wikipedia/feed/CommunityModuleHeader.kt @@ -14,24 +14,28 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.wikipedia.R import org.wikipedia.compose.theme.BaseTheme import org.wikipedia.compose.theme.WikipediaTheme +import org.wikipedia.dataclient.WikiSite +import org.wikipedia.extensions.getString import org.wikipedia.theme.Theme @Composable fun CommunityModuleHeader( modifier: Modifier = Modifier, + wikiSite: WikiSite, @StringRes titleResId: Int, @StringRes subTitleResId: Int, @DrawableRes contextIconResId: Int? = null, onOverflowClick: () -> Unit = {}, ) { + val context = LocalContext.current Column( modifier = modifier ) { @@ -41,7 +45,7 @@ fun CommunityModuleHeader( ) { Text( modifier = Modifier.weight(1f).padding(horizontal = 16.dp), - text = stringResource(titleResId), + text = context.getString(wikiSite.languageCode, titleResId), color = WikipediaTheme.colors.primaryColor, style = MaterialTheme.typography.headlineSmall, fontWeight = FontWeight.W500 @@ -62,7 +66,7 @@ fun CommunityModuleHeader( ) { Icon( painter = painterResource(R.drawable.ic_more_vert_white_24dp), - contentDescription = stringResource(R.string.menu_feed_overflow_label), + contentDescription = context.getString(wikiSite.languageCode, R.string.menu_feed_overflow_label), tint = WikipediaTheme.colors.primaryColor, modifier = Modifier.size(24.dp) ) @@ -70,7 +74,7 @@ fun CommunityModuleHeader( } Text( modifier = Modifier.padding(start = 16.dp, end = 16.dp, bottom = 16.dp), - text = stringResource(subTitleResId), + text = context.getString(wikiSite.languageCode, subTitleResId), color = WikipediaTheme.colors.secondaryColor, style = MaterialTheme.typography.bodyMedium ) @@ -82,6 +86,7 @@ fun CommunityModuleHeader( fun CommunityModuleHeaderPreview() { BaseTheme(currentTheme = Theme.LIGHT) { CommunityModuleHeader( + wikiSite = WikiSite("en.wikipedia.org"), titleResId = R.string.view_featured_image_card_title, subTitleResId = R.string.explore_feed_potd_subtitle, contextIconResId = R.drawable.ic_commons_logo diff --git a/app/src/main/java/org/wikipedia/feed/HomeFragment.kt b/app/src/main/java/org/wikipedia/feed/HomeFragment.kt index 5784bad83fd..25fd3253ce9 100644 --- a/app/src/main/java/org/wikipedia/feed/HomeFragment.kt +++ b/app/src/main/java/org/wikipedia/feed/HomeFragment.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import androidx.activity.compose.LocalActivity import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.gestures.snapping.rememberSnapFlingBehavior import androidx.compose.foundation.layout.Arrangement @@ -22,13 +23,19 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton @@ -38,6 +45,9 @@ import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -49,21 +59,24 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels -import androidx.lifecycle.viewmodel.compose.viewModel import coil3.compose.AsyncImage +import org.wikipedia.Constants import org.wikipedia.R import org.wikipedia.WikipediaApp +import org.wikipedia.compose.components.AppButton +import org.wikipedia.compose.components.WikiLangCodeBox import org.wikipedia.compose.components.error.WikiErrorClickEvents import org.wikipedia.compose.components.error.WikiErrorView import org.wikipedia.compose.theme.BaseTheme import org.wikipedia.compose.theme.WikipediaTheme +import org.wikipedia.dataclient.WikiSite +import org.wikipedia.extensions.getString import org.wikipedia.feed.featured.FeaturedArticleModule import org.wikipedia.feed.image.FeaturedImage import org.wikipedia.feed.image.FeaturedImageModule @@ -74,10 +87,12 @@ import org.wikipedia.feed.topread.TopReadArticlesActivity import org.wikipedia.feed.topread.TopReadListCard import org.wikipedia.feed.topread.TopReadModule import org.wikipedia.history.HistoryEntry +import org.wikipedia.language.AppLanguageState import org.wikipedia.main.MainActivity import org.wikipedia.main.MainFragment import org.wikipedia.navtab.NavTab import org.wikipedia.settings.Prefs +import org.wikipedia.settings.languages.WikipediaLanguagesActivity import org.wikipedia.theme.Theme import org.wikipedia.util.DimenUtil import org.wikipedia.util.ShareUtil @@ -102,10 +117,12 @@ class HomeFragment : Fragment() { return ComposeView(requireActivity()).apply { setContent { val selectedTab by viewModel.selectedTab.collectAsState() + val wikiSite by viewModel.wikiSite.collectAsState() BaseTheme(currentTheme = if (selectedTab == HomeTab.FOR_YOU) Theme.BLACK else WikipediaApp.instance.currentTheme) { HomeScreen( - viewModel = viewModel, + wikiSite = wikiSite, + languageState = WikipediaApp.instance.languageState, selectedTab = selectedTab, communityContentState = viewModel.communityState.collectAsState().value, forYouContentState = viewModel.forYouState.collectAsState().value, @@ -113,6 +130,13 @@ class HomeFragment : Fragment() { viewModel.selectTab(it) (requireActivity() as? MainActivity)?.onTabChanged(NavTab.HOME) }, + onRefreshTab = { + if (it == HomeTab.COMMUNITY) { + viewModel.refreshCommunityContent() + } else { + viewModel.refreshForYouContent() + } + }, onLoadMoreCommunityContent = viewModel::loadCommunityContent, onLoadMoreForYouContent = viewModel::loadForYouContent, onPageClick = { @@ -125,7 +149,7 @@ class HomeFragment : Fragment() { ShareUtil.shareText(requireContext(), it.title) }, onNewsClick = { newsItem -> - (parentFragment as? MainFragment)?.onFeedNewsItemSelected(newsItem, viewModel.wikiSite) + (parentFragment as? MainFragment)?.onFeedNewsItemSelected(newsItem, wikiSite) }, onImageClick = { (parentFragment as? MainFragment)?.onFeaturedImageSelected(it) @@ -135,6 +159,12 @@ class HomeFragment : Fragment() { }, onImageDownloadClick = { (parentFragment as? MainFragment)?.onFeedDownloadImage(it) + }, + onLanguageSelected = { languageCode -> + viewModel.updateLanguage(languageCode) + }, + onManageLanguagesClick = { + requireActivity().startActivity(WikipediaLanguagesActivity.newIntent(requireContext(), invokeSource = Constants.InvokeSource.FEED)) } ) } @@ -155,11 +185,13 @@ class HomeFragment : Fragment() { @Composable fun HomeScreen( - viewModel: HomeViewModel, + wikiSite: WikiSite, + languageState: AppLanguageState? = null, selectedTab: HomeTab, communityContentState: CommunityContentState, forYouContentState: ForYouContentState, onSelectTab: (HomeTab) -> Unit = {}, + onRefreshTab: (HomeTab) -> Unit = {}, onLoadMoreCommunityContent: () -> Unit = {}, onLoadMoreForYouContent: () -> Unit = {}, onPageClick: (historyEntry: HistoryEntry) -> Unit = {}, @@ -168,7 +200,9 @@ fun HomeScreen( onNewsClick: (newsItem: NewsItem) -> Unit = {}, onImageClick: (image: FeaturedImage) -> Unit = {}, onImageDownloadClick: (image: FeaturedImage) -> Unit = {}, - onImageShareClick: (image: FeaturedImage, age: Int) -> Unit = { _, _ -> } + onImageShareClick: (image: FeaturedImage, age: Int) -> Unit = { _, _ -> }, + onLanguageSelected: (String) -> Unit = {}, + onManageLanguagesClick: () -> Unit = {} ) { val context = LocalContext.current val topInset = if (context is MainActivity) { @@ -181,13 +215,7 @@ fun HomeScreen( modifier = Modifier.fillMaxSize(), state = pullToRefreshState, isRefreshing = isRefreshing, - onRefresh = { - if (selectedTab == HomeTab.COMMUNITY) { - viewModel.refreshCommunityContent() - } else { - viewModel.refreshForYouContent() - } - }, + onRefresh = { onRefreshTab(selectedTab) }, indicator = { Indicator( modifier = Modifier.align(Alignment.TopCenter), @@ -223,13 +251,21 @@ fun HomeScreen( // Tab selector HomeTabBar( modifier = Modifier.padding(top = 8.dp), + wikiSite = wikiSite, selectedTab = selectedTab, - onTabSelected = onSelectTab + languageState = languageState, + onTabSelected = onSelectTab, + onLanguageSelected = { + onLanguageSelected(it) + }, + onManageLanguagesClick = { + onManageLanguagesClick() + } ) CommunityContentTab( modifier = Modifier.weight(1f), - viewModel = viewModel, + wikiSite = wikiSite, state = communityContentState, onLoadMore = onLoadMoreCommunityContent, onPageClick = onPageClick, @@ -246,6 +282,7 @@ fun HomeScreen( HomeTab.FOR_YOU -> { ForYouContentTab( state = forYouContentState, + wikiSite = wikiSite, onLoadMore = onLoadMoreForYouContent ) @@ -282,8 +319,16 @@ fun HomeScreen( // Tab selector HomeTabBar( modifier = Modifier.padding(top = 8.dp, bottom = 32.dp), + wikiSite = wikiSite, selectedTab = selectedTab, - onTabSelected = onSelectTab + languageState = languageState, + onTabSelected = onSelectTab, + onLanguageSelected = { + onLanguageSelected(it) + }, + onManageLanguagesClick = { + onManageLanguagesClick() + } ) } } @@ -295,55 +340,70 @@ fun HomeScreen( @Composable fun HomeTabBar( modifier: Modifier, + wikiSite: WikiSite, selectedTab: HomeTab, - onTabSelected: (HomeTab) -> Unit + languageState: AppLanguageState? = null, + onTabSelected: (HomeTab) -> Unit, + onLanguageSelected: (String) -> Unit, + onManageLanguagesClick: () -> Unit ) { Row( modifier = modifier .fillMaxWidth() .padding(horizontal = 8.dp, vertical = 8.dp), - horizontalArrangement = Arrangement.Start + horizontalArrangement = Arrangement.Start, + verticalAlignment = Alignment.CenterVertically ) { - HomeTab.entries.forEach { tab -> - val isSelected = tab == selectedTab - val label = when (tab) { - HomeTab.COMMUNITY -> stringResource(R.string.explore_feed_community_tab_label) - HomeTab.FOR_YOU -> stringResource(R.string.explore_feed_for_you_tab_label) - } - Column( - horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier - .width(IntrinsicSize.Max) - .clickable { onTabSelected(tab) } - .padding(horizontal = 12.dp, vertical = 8.dp) - ) { - Text( - text = label, - color = if (selectedTab == HomeTab.FOR_YOU) WikipediaTheme.colors.primaryColor else if (isSelected) WikipediaTheme.colors.progressiveColor else WikipediaTheme.colors.primaryColor, - style = MaterialTheme.typography.titleSmall - ) - Spacer(modifier = Modifier.height(4.dp)) - Box( + Row( + modifier = Modifier.weight(1f) + ) { + HomeTab.entries.forEach { tab -> + val isSelected = tab == selectedTab + val label = when (tab) { + HomeTab.COMMUNITY -> LocalContext.current.getString(wikiSite.languageCode, R.string.explore_feed_community_tab_label) + HomeTab.FOR_YOU -> LocalContext.current.getString(wikiSite.languageCode, R.string.explore_feed_for_you_tab_label) + } + Column( + horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier - .fillMaxWidth() - .height(3.dp) - .clip(RoundedCornerShape(1.5.dp)) - .background( - if (isSelected) { - if (selectedTab == HomeTab.FOR_YOU) WikipediaTheme.colors.primaryColor - else WikipediaTheme.colors.progressiveColor - } else Color.Transparent - ) - ) + .width(IntrinsicSize.Max) + .clickable { onTabSelected(tab) } + .padding(horizontal = 12.dp, vertical = 8.dp) + ) { + Text( + text = label, + color = if (selectedTab == HomeTab.FOR_YOU) WikipediaTheme.colors.primaryColor else if (isSelected) WikipediaTheme.colors.progressiveColor else WikipediaTheme.colors.primaryColor, + style = MaterialTheme.typography.titleSmall + ) + Spacer(modifier = Modifier.height(4.dp)) + Box( + modifier = Modifier + .fillMaxWidth() + .height(3.dp) + .clip(RoundedCornerShape(1.5.dp)) + .background( + if (isSelected) { + if (selectedTab == HomeTab.FOR_YOU) WikipediaTheme.colors.primaryColor + else WikipediaTheme.colors.progressiveColor + } else Color.Transparent + ) + ) + } } } + LanguageDropDownMenu( + selectedLanguageCode = wikiSite.languageCode, + onLanguageSelected = { onLanguageSelected(it) }, + onManageLanguagesClick = { onManageLanguagesClick() }, + languageState = languageState + ) } } @Composable fun CommunityContentTab( modifier: Modifier = Modifier, - viewModel: HomeViewModel, + wikiSite: WikiSite, state: CommunityContentState, onLoadMore: () -> Unit, onPageClick: (historyEntry: HistoryEntry) -> Unit, @@ -367,6 +427,15 @@ fun CommunityContentTab( modifier = modifier.fillMaxSize(), contentPadding = PaddingValues(top = 16.dp, bottom = 16.dp) ) { + item { + CommunityDisclaimer( + modifier = Modifier + .padding(horizontal = 16.dp) + .fillMaxWidth(), + wikiSite = wikiSite + ) + Spacer(modifier = Modifier.height(16.dp)) + } state.days.forEach { day -> item(key = "day-header-${day.age}") { @@ -376,43 +445,34 @@ fun CommunityContentTab( day.featuredArticle?.let { article -> item(key = "tfa-${day.age}") { FeaturedArticleModule( + wikiSite = wikiSite, article, onPageClick = { - onPageClick(it.getHistoryEntry(viewModel.wikiSite, HistoryEntry.SOURCE_FEED_FEATURED)) + onPageClick(it.getHistoryEntry(wikiSite, HistoryEntry.SOURCE_FEED_FEATURED)) }, onOverflowClick = { // TODO }, onShareClick = { - onPageShareClick(it.getHistoryEntry(viewModel.wikiSite, HistoryEntry.SOURCE_FEED_FEATURED)) + onPageShareClick(it.getHistoryEntry(wikiSite, HistoryEntry.SOURCE_FEED_FEATURED)) }, onBookmarkClick = { - onPageBookmarkClick(it.getHistoryEntry(viewModel.wikiSite, HistoryEntry.SOURCE_FEED_FEATURED)) + onPageBookmarkClick(it.getHistoryEntry(wikiSite, HistoryEntry.SOURCE_FEED_FEATURED)) } ) } } - day.featuredImage?.let { image -> - item(key = "tfi-${day.age}") { - FeaturedImageModule( - image, - onClick = onImageClick, - onDownloadClick = onImageDownloadClick, - onShareClick = { onImageShareClick(image, day.age) } - ) - } - } - day.topRead?.let { item(key = "top-read-${day.age}") { TopReadModule( + wikiSite = wikiSite, topRead = it, onOverflowClick = { // TODO: implement overflow menu }, onPageClick = { entry -> - onPageClick(entry.getHistoryEntry(viewModel.wikiSite, HistoryEntry.SOURCE_FEED_MOST_READ)) + onPageClick(entry.getHistoryEntry(wikiSite, HistoryEntry.SOURCE_FEED_MOST_READ)) }, onPageOverflowClick = { pageSummary -> // TODO: implement page overflow menu @@ -420,16 +480,20 @@ fun CommunityContentTab( onFooterClick = { // TODO: simplify TopReadListCard after we remove the old feed UIs. activity?.startActivity( - TopReadArticlesActivity.newIntent(activity, TopReadListCard(it, viewModel.wikiSite)) + TopReadArticlesActivity.newIntent(activity, TopReadListCard(it, wikiSite)) ) } ) } } + // TODO: insert Today's Featured Picture module here + // TODO: insert DYK module here + if (day.news.isNotEmpty()) { item(key = "news-${day.age}") { NewsModule( + wikiSite = wikiSite, newsItems = day.news, onNewsClick = { newsItem -> onNewsClick(newsItem) @@ -441,14 +505,32 @@ fun CommunityContentTab( } } - // TODO: all the other types of content for this day. + // TODO: insert On this day module here + + day.featuredImage?.let { image -> + item(key = "tfi-${day.age}") { + FeaturedImageModule( + wikiSite = wikiSite, + featuredImage = image, + onClick = onImageClick, + onDownloadClick = onImageDownloadClick, + onShareClick = { onImageShareClick(image, day.age) } + ) + } + } + + // TODO: insert Media of the day (Commons) module here } item(key = "load-more-community") { if (state.isLoadingMore) { LoadingIndicator() } else if (state.canLoadMore) { - LoadMoreButton(label = stringResource(R.string.explore_feed_load_previous_day_label), onClick = onLoadMore) + LoadMoreButton( + wikiSite = wikiSite, + isCommunity = true, + onClick = onLoadMore + ) } } @@ -465,6 +547,7 @@ fun CommunityContentTab( @Composable fun ForYouContentTab( state: ForYouContentState, + wikiSite: WikiSite, onLoadMore: () -> Unit ) { val context = LocalContext.current @@ -510,7 +593,11 @@ fun ForYouContentTab( if (state.isLoadingMore) { LoadingIndicator() } else if (state.canLoadMore) { - LoadMoreButton(label = "Load more recommendations", onClick = onLoadMore) + LoadMoreButton( + wikiSite = wikiSite, + isCommunity = false, + onClick = onLoadMore + ) } } @@ -525,6 +612,39 @@ fun ForYouContentTab( } } +@Composable +fun CommunityDisclaimer( + modifier: Modifier, + wikiSite: WikiSite +) { + Box( + modifier = modifier + ) { + Row( + modifier = Modifier + .fillMaxSize() + .background( + color = WikipediaTheme.colors.borderColor, + shape = RoundedCornerShape(24.dp) + ) + .padding(16.dp), + horizontalArrangement = Arrangement.spacedBy(10.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + modifier = Modifier.weight(1f), + text = LocalContext.current.getString(wikiSite.languageCode, R.string.explore_feed_community_disclaimer), + style = MaterialTheme.typography.bodyMedium, + color = WikipediaTheme.colors.secondaryColor + ) + Image( + modifier = Modifier.size(45.dp), + painter = painterResource(R.drawable.w_nav_mark), + contentDescription = null + ) + } + } +} @Composable fun DayHeader(date: LocalDate) { Text( @@ -537,19 +657,53 @@ fun DayHeader(date: LocalDate) { } @Composable -fun LoadMoreButton(label: String, onClick: () -> Unit) { +fun LoadMoreButton( + wikiSite: WikiSite, + isCommunity: Boolean = true, + onClick: () -> Unit +) { Box( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), + modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center ) { - TextButton(onClick = onClick) { - Text( - text = label, - color = WikipediaTheme.colors.progressiveColor, - fontWeight = FontWeight.Medium - ) + if (isCommunity) { + AppButton( + modifier = Modifier.padding(horizontal = 24.dp, vertical = 16.dp), + onClick = onClick, + ) { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(R.drawable.ic_dynamic_feed_24dp), + tint = WikipediaTheme.colors.paperColor, + contentDescription = null + ) + + Spacer(modifier = Modifier.width(16.dp)) + + Text( + text = LocalContext.current.getString(wikiSite.languageCode, R.string.explore_feed_community_load_more_label), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.Medium, + color = WikipediaTheme.colors.paperColor + ) + } + } + } else { + Box( + modifier = Modifier + .padding(16.dp), + contentAlignment = Alignment.Center + ) { + TextButton(onClick = onClick) { + Text( + text = "Load more recommendations", + color = WikipediaTheme.colors.progressiveColor, + fontWeight = FontWeight.Medium + ) + } + } } } } @@ -591,12 +745,119 @@ fun ErrorState(caught: Throwable, onRetry: () -> Unit) { } } +@Composable +fun LanguageDropDownMenu( + selectedLanguageCode: String, + onLanguageSelected: (String) -> Unit, + onManageLanguagesClick: () -> Unit, + languageState: AppLanguageState? = null +) { + var expanded by remember { mutableStateOf(false) } + Box( + modifier = Modifier + .padding(horizontal = 8.dp) + .clip(RoundedCornerShape(8.dp)) + .clickable { + expanded = true + }, + contentAlignment = Alignment.Center + ) { + Row( + modifier = Modifier + .border(width = 1.dp, color = WikipediaTheme.colors.primaryColor.copy(alpha = 0.8f), shape = RoundedCornerShape(8.dp)) + .padding(4.dp), + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically + ) { + WikiLangCodeBox( + modifier = Modifier + .height(20.dp) + .widthIn(min = 20.dp), + languageCode = selectedLanguageCode, + backgroundColor = WikipediaTheme.colors.primaryColor.copy(alpha = 0.8f), + borderColor = Color.Transparent, + textColor = WikipediaTheme.colors.paperColor, + ) + Icon( + modifier = Modifier.size(16.dp), + painter = painterResource(R.drawable.ic_arrow_down_24), + contentDescription = null, + tint = WikipediaTheme.colors.primaryColor + ) + } + DropdownMenu( + expanded = expanded, + containerColor = WikipediaTheme.colors.paperColor, + onDismissRequest = { expanded = false } + ) { + val languageCodes = languageState?.appLanguageCodes.orEmpty() + repeat(languageCodes.size) { + val langCode = languageCodes[it] + DropdownMenuItem( + leadingIcon = { + WikiLangCodeBox( + modifier = Modifier + .height(20.dp) + .widthIn(min = 20.dp), + languageCode = langCode, + borderColor = WikipediaTheme.colors.secondaryColor, + textColor = WikipediaTheme.colors.secondaryColor, + ) + }, + trailingIcon = { + if (langCode == selectedLanguageCode) { + Icon( + painter = painterResource(R.drawable.ic_check_black_24dp), + contentDescription = null, + tint = WikipediaTheme.colors.secondaryColor + ) + } + }, + text = { + Text( + text = languageState?.getAppLanguageLocalizedName(langCode) ?: langCode, + style = MaterialTheme.typography.bodyLarge, + color = WikipediaTheme.colors.primaryColor + ) + }, + onClick = { + onLanguageSelected(langCode) + expanded = false + } + ) + } + + HorizontalDivider( + modifier = Modifier.padding(vertical = 8.dp), + color = WikipediaTheme.colors.borderColor + ) + + Column( + modifier = Modifier + .fillMaxWidth() + .clickable { + onManageLanguagesClick() + expanded = false + } + .padding(vertical = 8.dp), + ) { + Text( + modifier = Modifier.padding(horizontal = 16.dp), + text = LocalContext.current.getString(selectedLanguageCode, R.string.explore_feed_manage_languages_label), + style = MaterialTheme.typography.bodyLarge, + color = WikipediaTheme.colors.primaryColor + ) + } + } + } +} + @Preview(showBackground = true) @Composable fun HomeScreenCommunityPreview() { BaseTheme(currentTheme = Theme.LIGHT) { HomeScreen( - viewModel = viewModel(), + wikiSite = WikiSite.preview(), selectedTab = HomeTab.COMMUNITY, communityContentState = CommunityContentState(isInitialLoading = true), forYouContentState = ForYouContentState(isInitialLoading = true) @@ -609,10 +870,47 @@ fun HomeScreenCommunityPreview() { fun HomeScreenForYouPreview() { BaseTheme(currentTheme = Theme.LIGHT) { HomeScreen( - viewModel = viewModel(), + wikiSite = WikiSite.preview(), selectedTab = HomeTab.FOR_YOU, communityContentState = CommunityContentState(isInitialLoading = true), forYouContentState = ForYouContentState(isInitialLoading = true) ) } } + +@Preview(showBackground = true, backgroundColor = 0xFFFFFFFF) +@Composable +fun CommunityDisclaimerPreview() { + BaseTheme(currentTheme = Theme.LIGHT) { + CommunityDisclaimer( + modifier = Modifier + .padding(16.dp) + .height(72.dp), + wikiSite = WikiSite.preview() + ) + } +} + +@Preview(showBackground = true) +@Composable +fun LoadMoreButtonPreview() { + BaseTheme(currentTheme = Theme.LIGHT) { + LoadMoreButton( + wikiSite = WikiSite.preview(), + isCommunity = true, + onClick = {} + ) + } +} + +@Preview(showBackground = true) +@Composable +fun LanguageDropDownMenuPreview() { + BaseTheme(currentTheme = Theme.LIGHT) { + LanguageDropDownMenu( + selectedLanguageCode = "en", + onLanguageSelected = {}, + onManageLanguagesClick = {} + ) + } +} diff --git a/app/src/main/java/org/wikipedia/feed/HomeViewModel.kt b/app/src/main/java/org/wikipedia/feed/HomeViewModel.kt index d2df818fb0c..61a99e3bc3d 100644 --- a/app/src/main/java/org/wikipedia/feed/HomeViewModel.kt +++ b/app/src/main/java/org/wikipedia/feed/HomeViewModel.kt @@ -7,13 +7,14 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import org.wikipedia.WikipediaApp import org.wikipedia.dataclient.ServiceFactory +import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.page.PageSummary import org.wikipedia.feed.image.FeaturedImage import org.wikipedia.feed.news.NewsItem import org.wikipedia.feed.onthisday.OnThisDay import org.wikipedia.feed.topread.TopRead +import org.wikipedia.settings.Prefs import java.time.LocalDate enum class HomeTab { COMMUNITY, FOR_YOU } @@ -53,8 +54,8 @@ data class ForYouContentState( ) class HomeViewModel : ViewModel() { - - val wikiSite get() = WikipediaApp.instance.wikiSite + private val _wikiSite = MutableStateFlow(WikiSite.forLanguageCode(Prefs.homeLanguageCode)) + val wikiSite = _wikiSite.asStateFlow() private val _selectedTab = MutableStateFlow(HomeTab.COMMUNITY) val selectedTab = _selectedTab.asStateFlow() @@ -113,6 +114,16 @@ class HomeViewModel : ViewModel() { } } + fun updateLanguage(langCode: String) { + _wikiSite.value = WikiSite.forLanguageCode(langCode) + Prefs.homeLanguageCode = langCode + if (selectedTab.value == HomeTab.COMMUNITY) { + refreshCommunityContent() + } else { + refreshForYouContent() + } + } + /** * Loads the next day's community content (today on first call, then progressively older). * Safe to call as a retry — the age only advances after a successful fetch. @@ -130,8 +141,8 @@ class HomeViewModel : ViewModel() { val age = nextCommunityAge val date = LocalDate.now().minusDays(nextCommunityAge.toLong()) - val content = ServiceFactory.getRest(wikiSite) - .getFeedFeatured(date.year.toString(), "%02d".format(date.monthValue), "%02d".format(date.dayOfMonth), wikiSite.languageCode) + val content = ServiceFactory.getRest(wikiSite.value) + .getFeedFeatured(date.year.toString(), "%02d".format(date.monthValue), "%02d".format(date.dayOfMonth), wikiSite.value.languageCode) val dayContent = DayContent( age = age, diff --git a/app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleModule.kt b/app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleModule.kt index bea200eacb2..ca47c14687e 100644 --- a/app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleModule.kt +++ b/app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleModule.kt @@ -27,7 +27,6 @@ import androidx.compose.ui.graphics.painter.ColorPainter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview @@ -37,13 +36,16 @@ import org.wikipedia.R import org.wikipedia.compose.components.HtmlText import org.wikipedia.compose.theme.BaseTheme import org.wikipedia.compose.theme.WikipediaTheme +import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.page.PageSummary +import org.wikipedia.extensions.getString import org.wikipedia.feed.CommunityModuleHeader import org.wikipedia.theme.Theme import org.wikipedia.views.imageservice.ImageService @Composable fun FeaturedArticleModule( + wikiSite: WikiSite, article: PageSummary, onPageClick: (article: PageSummary) -> Unit = {}, onOverflowClick: () -> Unit = {}, @@ -58,6 +60,7 @@ fun FeaturedArticleModule( .background(color = WikipediaTheme.colors.paperColor) ) { CommunityModuleHeader( + wikiSite = wikiSite, titleResId = R.string.view_featured_article_card_title, subTitleResId = R.string.explore_feed_featured_article_subtitle, onOverflowClick = onOverflowClick @@ -102,7 +105,7 @@ fun FeaturedArticleModule( ) { Icon( painter = painterResource(R.drawable.ic_bookmark_border_white_24dp), - contentDescription = stringResource(R.string.feed_card_add_to_default_list), + contentDescription = context.getString(wikiSite.languageCode, R.string.feed_card_add_to_default_list), tint = WikipediaTheme.colors.primaryColor, modifier = Modifier.size(24.dp) ) @@ -123,7 +126,7 @@ fun FeaturedArticleModule( ) { Icon( painter = painterResource(R.drawable.ic_share), - contentDescription = stringResource(R.string.view_featured_image_card_share), + contentDescription = context.getString(wikiSite.languageCode, R.string.view_featured_image_card_share), tint = WikipediaTheme.colors.primaryColor, modifier = Modifier.size(24.dp) ) @@ -181,6 +184,7 @@ fun FeaturedArticleModule( fun FeaturedArticleCardPreview() { BaseTheme(currentTheme = Theme.LIGHT) { FeaturedArticleModule( + wikiSite = WikiSite("en.wikipedia.org"), article = PageSummary("Lorem ipsum", "Lorem ipsum", "Lorem ipsum", "Lorem ipsum", thumbnail = "", "") ) } diff --git a/app/src/main/java/org/wikipedia/feed/image/FeaturedImageModule.kt b/app/src/main/java/org/wikipedia/feed/image/FeaturedImageModule.kt index 27dc7c094cf..69de4b17256 100644 --- a/app/src/main/java/org/wikipedia/feed/image/FeaturedImageModule.kt +++ b/app/src/main/java/org/wikipedia/feed/image/FeaturedImageModule.kt @@ -23,7 +23,6 @@ import androidx.compose.ui.graphics.painter.ColorPainter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.TextLinkStyles import androidx.compose.ui.text.style.TextDecoration @@ -34,12 +33,15 @@ import org.wikipedia.R import org.wikipedia.compose.components.HtmlText import org.wikipedia.compose.theme.BaseTheme import org.wikipedia.compose.theme.WikipediaTheme +import org.wikipedia.dataclient.WikiSite +import org.wikipedia.extensions.getString import org.wikipedia.feed.CommunityModuleHeader import org.wikipedia.theme.Theme import org.wikipedia.views.imageservice.ImageService @Composable fun FeaturedImageModule( + wikiSite: WikiSite, featuredImage: FeaturedImage, onClick: (featuredImage: FeaturedImage) -> Unit = {}, onOverflowClick: (featuredImage: FeaturedImage) -> Unit = {}, @@ -52,6 +54,7 @@ fun FeaturedImageModule( Modifier.background(color = WikipediaTheme.colors.paperColor) ) { CommunityModuleHeader( + wikiSite = wikiSite, titleResId = R.string.view_featured_image_card_title, subTitleResId = R.string.explore_feed_potd_subtitle, contextIconResId = R.drawable.ic_commons_logo, @@ -96,7 +99,7 @@ fun FeaturedImageModule( ) { Icon( painter = painterResource(R.drawable.ic_download_24px), - contentDescription = stringResource(R.string.view_featured_image_card_download), + contentDescription = context.getString(wikiSite.languageCode, R.string.view_featured_image_card_download), tint = WikipediaTheme.colors.primaryColor, modifier = Modifier.size(24.dp) ) @@ -117,7 +120,7 @@ fun FeaturedImageModule( ) { Icon( painter = painterResource(R.drawable.ic_share), - contentDescription = stringResource(R.string.view_featured_image_card_share), + contentDescription = context.getString(wikiSite.languageCode, R.string.view_featured_image_card_share), tint = WikipediaTheme.colors.primaryColor, modifier = Modifier.size(24.dp) ) @@ -212,6 +215,7 @@ fun FeaturedImageModule( fun FeaturedImageCardPreview() { BaseTheme(currentTheme = Theme.LIGHT) { FeaturedImageModule( + wikiSite = WikiSite("en.wikipedia.org"), FeaturedImage("Lorem ipsum") ) } diff --git a/app/src/main/java/org/wikipedia/feed/news/NewsModule.kt b/app/src/main/java/org/wikipedia/feed/news/NewsModule.kt index 557236df454..a9985a735ed 100644 --- a/app/src/main/java/org/wikipedia/feed/news/NewsModule.kt +++ b/app/src/main/java/org/wikipedia/feed/news/NewsModule.kt @@ -27,6 +27,7 @@ import org.wikipedia.R import org.wikipedia.compose.components.PageIndicator import org.wikipedia.compose.theme.BaseTheme import org.wikipedia.compose.theme.WikipediaTheme +import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.page.PageSummary import org.wikipedia.feed.CommunityModuleHeader import org.wikipedia.theme.Theme @@ -35,6 +36,7 @@ import org.wikipedia.views.imageservice.ImageService @Composable fun NewsModule( + wikiSite: WikiSite, newsItems: List, onNewsClick: (item: NewsItem) -> Unit = {}, onOverflowClick: () -> Unit = {} @@ -48,6 +50,7 @@ fun NewsModule( val pagerState = rememberPagerState(pageCount = { newsItems.size }) CommunityModuleHeader( + wikiSite = wikiSite, titleResId = R.string.view_card_news_title, subTitleResId = R.string.explore_feed_in_the_news_subtitle, onOverflowClick = onOverflowClick @@ -131,6 +134,7 @@ fun NewsCardPreview() { ) BaseTheme(currentTheme = Theme.LIGHT) { NewsModule( + wikiSite = WikiSite("en.wikipedia.org"), newsItems = listOf( NewsItem( story = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", diff --git a/app/src/main/java/org/wikipedia/feed/topread/TopReadModule.kt b/app/src/main/java/org/wikipedia/feed/topread/TopReadModule.kt index 0e739bb4cda..e3af2b35047 100644 --- a/app/src/main/java/org/wikipedia/feed/topread/TopReadModule.kt +++ b/app/src/main/java/org/wikipedia/feed/topread/TopReadModule.kt @@ -25,7 +25,6 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview @@ -36,13 +35,16 @@ import org.wikipedia.R import org.wikipedia.compose.components.HtmlText import org.wikipedia.compose.theme.BaseTheme import org.wikipedia.compose.theme.WikipediaTheme +import org.wikipedia.dataclient.WikiSite import org.wikipedia.dataclient.page.PageSummary +import org.wikipedia.extensions.getString import org.wikipedia.feed.CommunityModuleHeader import org.wikipedia.theme.Theme import org.wikipedia.util.StringUtil @Composable fun TopReadModule( + wikiSite: WikiSite, topRead: TopRead, onOverflowClick: () -> Unit, onPageClick: (PageSummary) -> Unit, @@ -57,6 +59,7 @@ fun TopReadModule( .background(color = WikipediaTheme.colors.backgroundColor) ) { CommunityModuleHeader( + wikiSite = wikiSite, titleResId = R.string.view_top_read_card_title, subTitleResId = R.string.view_top_read_card_description, onOverflowClick = onOverflowClick @@ -74,6 +77,7 @@ fun TopReadModule( TopReadItem( context = context, + wikiSite = wikiSite, rank = index + 1, isTrendingUp = isTrendingUp, pageSummary = article, @@ -90,7 +94,7 @@ fun TopReadModule( onClick = onFooterClick ) { Text( - text = stringResource(R.string.view_top_read_card_action), + text = context.getString(wikiSite.languageCode, R.string.view_top_read_card_action), style = MaterialTheme.typography.labelLarge, color = WikipediaTheme.colors.progressiveColor, fontWeight = FontWeight.Medium @@ -98,7 +102,7 @@ fun TopReadModule( Spacer(modifier = Modifier.width(8.dp)) Icon( painter = painterResource(R.drawable.ic_arrow_forward_black_24dp), - contentDescription = stringResource(R.string.view_top_read_card_action), + contentDescription = context.getString(wikiSite.languageCode, R.string.view_top_read_card_action), tint = WikipediaTheme.colors.progressiveColor ) } @@ -108,6 +112,7 @@ fun TopReadModule( @Composable fun TopReadItem( context: Context, + wikiSite: WikiSite, rank: Int, isTrendingUp: Boolean, pageSummary: PageSummary, @@ -171,7 +176,7 @@ fun TopReadItem( Icon( modifier = Modifier.size(24.dp), painter = painterResource(trendingIcon), - contentDescription = stringResource(R.string.search_clear_query_content_description), + contentDescription = null, tint = trendingIconTint ) Spacer(modifier = Modifier.width(16.dp)) @@ -183,7 +188,7 @@ fun TopReadItem( ) Spacer(modifier = Modifier.width(4.dp)) Text( - text = stringResource(R.string.view_top_read_card_pageviews_views_suffix), + text = context.getString(wikiSite.languageCode, R.string.view_top_read_card_pageviews_views_suffix), style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.Medium, color = WikipediaTheme.colors.secondaryColor @@ -209,7 +214,7 @@ fun TopReadItem( content = { Icon( painter = painterResource(R.drawable.ic_more_vert_white_24dp), - contentDescription = stringResource(R.string.search_clear_query_content_description), + contentDescription = context.getString(wikiSite.languageCode, R.string.menu_feed_overflow_label), tint = WikipediaTheme.colors.placeholderColor ) } @@ -231,6 +236,7 @@ fun TopReadCardPreview() { ) BaseTheme(currentTheme = Theme.LIGHT) { TopReadModule( + wikiSite = WikiSite("en.wikipedia.org"), topRead = TopRead( articles = listOf(article, article, article, article, article) ), diff --git a/app/src/main/java/org/wikipedia/settings/Prefs.kt b/app/src/main/java/org/wikipedia/settings/Prefs.kt index c9476e684e3..c84f314df75 100644 --- a/app/src/main/java/org/wikipedia/settings/Prefs.kt +++ b/app/src/main/java/org/wikipedia/settings/Prefs.kt @@ -884,4 +884,8 @@ object Prefs { var isExploreFeedUpdatePromptShown get() = PrefsIoUtil.getBoolean(R.string.preference_key_explore_feed_update_prompt_shown, false) set(value) = PrefsIoUtil.setBoolean(R.string.preference_key_explore_feed_update_prompt_shown, value) + + var homeLanguageCode + get() = PrefsIoUtil.getString(R.string.preference_key_home_language_code, WikipediaApp.instance.appOrSystemLanguageCode)!! + set(value) = PrefsIoUtil.setString(R.string.preference_key_home_language_code, value) } diff --git a/app/src/main/res/drawable/ic_dynamic_feed_24dp.xml b/app/src/main/res/drawable/ic_dynamic_feed_24dp.xml new file mode 100644 index 00000000000..b21f3fa7d5e --- /dev/null +++ b/app/src/main/res/drawable/ic_dynamic_feed_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index a1811df0000..b5e18ccd879 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -2233,4 +2233,7 @@ Description of the Picture of the Day card in the Home feed. Description of the Featured Article card in the Home feed. Description of the In the News card in the Home feed. + Text for the disclaimer at the top of the community tab in the Home feed. + Label text for the community tab in Home feed to load more content. + Label text in the languages pop-up menu in the Home feed to manauge the app languages. diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index f6aba38d434..69611d4d3de 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -209,4 +209,5 @@ hybridSearchEnabled gameStatsSnackbarShown exploreFeedUpdatePromptShown + homeLanguageCode diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 537d9c1f7af..b9535fa2969 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2477,7 +2477,7 @@ Customize my feed Set it up for me Let\'s build your feed… - From the community + Community For you Load previous day Follow your curiosity @@ -2486,4 +2486,7 @@ Daily images on Wikimedia Commons, selected by volunteer contributors Featured articles are some of the best articles on Wikipedia and they are updated daily Articles that have been substantially updated to reflect recent or current events of wide interest + Content and resources selected by and about the Wikimedia community + See past community content + Manage languages \ No newline at end of file