diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 20daf4103ee..5af55b867d4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -152,10 +152,9 @@
android:theme="@style/AppTheme.ActionBar"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize" />
+ android:name=".language.addlanguages.AddLanguagesListActivity"
+ android:windowSoftInputMode="adjustResize"
+ android:configChanges="orientation|keyboardHidden|keyboard|screenSize"/>
{
- if (actionMode == null) {
- actionMode = startSupportActionMode(searchActionModeCallback)
- }
- true
- }
- else -> super.onOptionsItemSelected(item)
- }
- }
-
- override fun onBackPressed() {
- DeviceUtil.hideSoftKeyboard(this)
- val returnIntent = Intent()
- returnIntent.putExtra(LANGUAGE_SEARCHED, isLanguageSearched)
- setResult(RESULT_OK, returnIntent)
- super.onBackPressed()
- }
-
- private inner class LanguageSearchCallback : SearchActionModeCallback() {
- override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
- // currentSearchQuery is cleared here, instead of onDestroyActionMode
- // in order to make the most recent search string available to analytics
- currentSearchQuery = ""
- isLanguageSearched = true
- actionMode = mode
- return super.onCreateActionMode(mode, menu)
- }
-
- override fun onQueryChange(s: String) {
- currentSearchQuery = s.trim()
- languageAdapter.setFilterText(currentSearchQuery)
- if (binding.languagesListRecycler.adapter?.itemCount == 0) {
- binding.languagesListEmptyView.visibility = View.VISIBLE
- } else {
- binding.languagesListEmptyView.visibility = View.GONE
- }
- }
-
- override fun onDestroyActionMode(mode: ActionMode) {
- super.onDestroyActionMode(mode)
- binding.languagesListEmptyView.visibility = View.GONE
- languageAdapter.setFilterText(null)
- actionMode = null
- }
-
- override fun getSearchHintString(): String {
- return resources.getString(R.string.search_hint_search_languages)
- }
-
- override fun getParentContext(): Context {
- return this@LanguagesListActivity
- }
- }
-
- private inner class LanguagesListAdapter : RecyclerView.Adapter(), View.OnClickListener {
- var listItems = listOf()
-
- init {
- setFilterText(null)
- }
-
- override fun getItemViewType(position: Int): Int {
- return if (listItems[position].isHeader) Companion.VIEW_TYPE_HEADER else Companion.VIEW_TYPE_ITEM
- }
-
- override fun getItemCount(): Int {
- return listItems.size
- }
-
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
- val inflater = LayoutInflater.from(parent.context)
- return if (viewType == Companion.VIEW_TYPE_HEADER) {
- HeaderViewHolder(inflater.inflate(R.layout.view_section_header, parent, false))
- } else {
- LanguagesListItemHolder(inflater.inflate(R.layout.item_language_list_entry, parent, false))
- }
- }
-
- override fun onBindViewHolder(holder: RecyclerView.ViewHolder, pos: Int) {
- if (holder is HeaderViewHolder) {
- holder.bindItem(listItems[pos])
- } else if (holder is LanguagesListItemHolder) {
- holder.bindItem(listItems[pos])
- holder.itemView.setOnClickListener(this)
- }
- holder.itemView.tag = pos
- }
-
- fun setFilterText(filterText: String?) {
- val newListItems = viewModel.getListBySearchTerm(this@LanguagesListActivity, filterText)
- val diff = DiffUtil.calculateDiff(object : DiffUtil.Callback() {
- override fun getOldListSize(): Int {
- return listItems.size
- }
-
- override fun getNewListSize(): Int {
- return newListItems.size
- }
-
- override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
- if (listItems.size <= oldItemPosition || newListItems.size <= newItemPosition) {
- return false
- }
- return listItems[oldItemPosition] == newListItems[newItemPosition]
- }
-
- override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
- return true
- }
- })
- listItems = newListItems
- diff.dispatchUpdatesTo(this)
- }
-
- override fun onClick(v: View) {
- val item = listItems[v.tag as Int]
- if (item.code != app.appOrSystemLanguageCode) {
- app.languageState.addAppLanguageCode(item.code)
- }
- interactionsCount++
- DeviceUtil.hideSoftKeyboard(this@LanguagesListActivity)
- val returnIntent = Intent()
- returnIntent.putExtra(WikipediaLanguagesFragment.ADD_LANGUAGE_INTERACTIONS, interactionsCount)
- returnIntent.putExtra(LANGUAGE_SEARCHED, isLanguageSearched)
- setResult(RESULT_OK, returnIntent)
- finish()
- }
- }
-
- private inner class HeaderViewHolder constructor(itemView: View) : RecyclerView.ViewHolder(itemView) {
- fun bindItem(listItem: LanguagesListViewModel.LanguageListItem) {
- itemView.findViewById(R.id.section_header_text).text = listItem.code
- }
- }
-
- private inner class LanguagesListItemHolder constructor(itemView: View) : RecyclerView.ViewHolder(itemView) {
- fun bindItem(listItem: LanguagesListViewModel.LanguageListItem) {
- val languageCode = listItem.code
- itemView.findViewById(R.id.localized_language_name).text =
- StringUtil.capitalize(app.languageState.getAppLanguageLocalizedName(languageCode).orEmpty())
- val canonicalName = viewModel.getCanonicalName(languageCode)
- if (binding.languagesListLoadProgress.visibility != View.VISIBLE) {
- itemView.findViewById(R.id.language_subtitle).text =
- if (canonicalName.isNullOrEmpty()) app.languageState.getAppLanguageCanonicalName(languageCode) else canonicalName
- }
- }
- }
-
- companion object {
- private const val VIEW_TYPE_HEADER = 0
- private const val VIEW_TYPE_ITEM = 1
- const val LANGUAGE_SEARCHED = "language_searched"
- }
-}
diff --git a/app/src/main/java/org/wikipedia/language/LanguagesListViewModel.kt b/app/src/main/java/org/wikipedia/language/LanguagesListViewModel.kt
deleted file mode 100644
index 832c27ffabd..00000000000
--- a/app/src/main/java/org/wikipedia/language/LanguagesListViewModel.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.wikipedia.language
-
-import android.content.Context
-import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.viewModelScope
-import kotlinx.coroutines.CoroutineExceptionHandler
-import kotlinx.coroutines.launch
-import org.apache.commons.lang3.StringUtils
-import org.wikipedia.R
-import org.wikipedia.WikipediaApp
-import org.wikipedia.dataclient.ServiceFactory
-import org.wikipedia.dataclient.mwapi.SiteMatrix
-import org.wikipedia.util.Resource
-import org.wikipedia.util.log.L
-
-class LanguagesListViewModel : ViewModel() {
-
- private val suggestedLanguageCodes = WikipediaApp.instance.languageState.remainingSuggestedLanguageCodes
- private val nonSuggestedLanguageCodes = WikipediaApp.instance.languageState.appMruLanguageCodes.filterNot {
- suggestedLanguageCodes.contains(it) || WikipediaApp.instance.languageState.appLanguageCodes.contains(it)
- }
-
- private val handler = CoroutineExceptionHandler { _, throwable ->
- L.e(throwable)
- }
-
- val siteListData = MutableLiveData>>()
-
- init {
- fetchData()
- }
-
- private fun fetchData() {
- viewModelScope.launch(handler) {
- val siteMatrix = ServiceFactory.get(WikipediaApp.instance.wikiSite).getSiteMatrix()
- val sites = SiteMatrix.getSites(siteMatrix)
- siteListData.postValue(Resource.Success(sites))
- }
- }
-
- fun getListBySearchTerm(context: Context, searchTerm: String?): List {
- val results = mutableListOf()
- val filter = StringUtils.stripAccents(searchTerm.orEmpty())
-
- addFilteredLanguageListItems(filter, suggestedLanguageCodes,
- context.getString(R.string.languages_list_suggested_text), results)
-
- addFilteredLanguageListItems(filter, nonSuggestedLanguageCodes,
- context.getString(R.string.languages_list_all_text), results)
-
- return results
- }
-
- private fun addFilteredLanguageListItems(filter: String, codes: List, headerText: String,
- results: MutableList) {
- var first = true
- for (code in codes) {
- val localizedName = StringUtils.stripAccents(WikipediaApp.instance.languageState.getAppLanguageLocalizedName(code).orEmpty())
- val canonicalName = StringUtils.stripAccents(getCanonicalName(code).orEmpty())
- if (filter.isEmpty() || code.contains(filter, true) ||
- localizedName.contains(filter, true) ||
- canonicalName.contains(filter, true)) {
- if (first) {
- results.add(LanguageListItem(headerText, true))
- first = false
- }
- results.add(LanguageListItem(code))
- }
- }
- }
-
- fun getCanonicalName(code: String): String? {
- val value = siteListData.value
- if (value !is Resource.Success) {
- return null
- }
- return value.data.find { it.code == code }?.localname.orEmpty()
- .ifEmpty { WikipediaApp.instance.languageState.getAppLanguageCanonicalName(code) }
- }
-
- class LanguageListItem(val code: String, val isHeader: Boolean = false)
-}
diff --git a/app/src/main/java/org/wikipedia/language/addlanguages/AddLanguagesListActivity.kt b/app/src/main/java/org/wikipedia/language/addlanguages/AddLanguagesListActivity.kt
new file mode 100644
index 00000000000..9333843dd4f
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/language/addlanguages/AddLanguagesListActivity.kt
@@ -0,0 +1,71 @@
+package org.wikipedia.language.addlanguages
+
+import android.content.Intent
+import android.os.Bundle
+import androidx.activity.compose.setContent
+import androidx.activity.viewModels
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.collectAsState
+import androidx.compose.ui.Modifier
+import org.wikipedia.WikipediaApp
+import org.wikipedia.activity.BaseActivity
+import org.wikipedia.compose.components.error.WikiErrorClickEvents
+import org.wikipedia.compose.theme.BaseTheme
+import org.wikipedia.settings.languages.WikipediaLanguagesFragment
+import org.wikipedia.util.DeviceUtil
+
+class AddLanguagesListActivity : BaseActivity() {
+ private var isLanguageSearched: Boolean = false
+ private val viewModel: AddLanguagesViewModel by viewModels()
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContent {
+ BaseTheme {
+ val uiState = viewModel.uiState.collectAsState().value
+
+ LanguagesListScreen(
+ modifier = Modifier
+ .fillMaxSize(),
+ uiState = uiState,
+ onBackButtonClick = {
+ finish()
+ },
+ onSearchQueryChange = { query ->
+ viewModel.updateSearchTerm(query)
+ },
+ onListItemClick = { languageCode ->
+ val app = WikipediaApp.instance
+ if (languageCode != app.appOrSystemLanguageCode) {
+ app.languageState.addAppLanguageCode(languageCode)
+ }
+ val returnIntent = Intent()
+ returnIntent.putExtra(WikipediaLanguagesFragment.ADD_LANGUAGE_INTERACTIONS, 1)
+ returnIntent.putExtra(LANGUAGE_SEARCHED, isLanguageSearched)
+ setResult(RESULT_OK, returnIntent)
+ finish()
+ },
+ onLanguageSearched = {
+ isLanguageSearched = it
+ },
+ wikiErrorClickEvents = WikiErrorClickEvents(
+ backClickListener = { onBackPressed() },
+ retryClickListener = { viewModel.fetchAllData() }
+ )
+ )
+ }
+ }
+ }
+
+ override fun onBackPressed() {
+ DeviceUtil.hideSoftKeyboard(this)
+ val returnIntent = Intent()
+ returnIntent.putExtra(LANGUAGE_SEARCHED, isLanguageSearched)
+ setResult(RESULT_OK, returnIntent)
+ super.onBackPressed()
+ }
+
+ companion object {
+ const val LANGUAGE_SEARCHED = "language_searched"
+ }
+}
diff --git a/app/src/main/java/org/wikipedia/language/addlanguages/AddLanguagesListScreen.kt b/app/src/main/java/org/wikipedia/language/addlanguages/AddLanguagesListScreen.kt
new file mode 100644
index 00000000000..5e1a033a619
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/language/addlanguages/AddLanguagesListScreen.kt
@@ -0,0 +1,217 @@
+package org.wikipedia.language.addlanguages
+
+import android.os.Build
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.ime
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
+import androidx.compose.material3.CircularProgressIndicator
+import androidx.compose.material3.Scaffold
+import androidx.compose.material3.Text
+import androidx.compose.material3.ripple
+import androidx.compose.runtime.Composable
+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.platform.LocalContext
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.dp
+import org.wikipedia.R
+import org.wikipedia.WikipediaApp
+import org.wikipedia.compose.components.SearchEmptyView
+import org.wikipedia.compose.components.WikiTopAppBarWithSearch
+import org.wikipedia.compose.components.error.ComposeWikiErrorParentView
+import org.wikipedia.compose.components.error.WikiErrorClickEvents
+import org.wikipedia.compose.theme.WikipediaTheme
+import org.wikipedia.util.StringUtil
+import org.wikipedia.util.UiState
+
+@Composable
+fun LanguagesListScreen(
+ modifier: Modifier = Modifier,
+ uiState: UiState>,
+ onBackButtonClick: () -> Unit,
+ onSearchQueryChange: (String) -> Unit,
+ onListItemClick: (code: String) -> Unit,
+ onLanguageSearched: (Boolean) -> Unit,
+ wikiErrorClickEvents: WikiErrorClickEvents? = null
+) {
+ val context = LocalContext.current
+ var searchQuery by remember { mutableStateOf("") }
+
+ val (imeHeight, isKeyboardVisible) = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
+ // Handle IME (keyboard) insets
+ val windowInsets = WindowInsets.ime
+ val height = with(LocalDensity.current) { windowInsets.getBottom(this).toDp() }
+ Pair(height, height > 0.dp)
+ } else Pair(0.dp, false)
+
+ Scaffold(
+ modifier = modifier,
+ topBar = {
+ WikiTopAppBarWithSearch(
+ appBarTitle = context.getString(R.string.languages_list_activity_title),
+ placeHolderTitle = context.getString(R.string.search_hint_search_languages),
+ searchQuery = searchQuery,
+ onBackButtonClick = onBackButtonClick,
+ onSearchQueryChange = { value ->
+ onLanguageSearched(true)
+ searchQuery = value
+ onSearchQueryChange(value)
+ }
+ )
+ },
+ containerColor = WikipediaTheme.colors.paperColor
+ ) { paddingValues ->
+ when (uiState) {
+ UiState.Loading -> {
+ Box(
+ modifier = modifier
+ .fillMaxSize()
+ .padding(paddingValues)
+ ) {
+ CircularProgressIndicator(
+ modifier = Modifier
+ .align(Alignment.BottomEnd)
+ .padding(24.dp),
+ color = WikipediaTheme.colors.progressiveColor
+ )
+ }
+ }
+ is UiState.Error -> {
+ Box(
+ modifier = modifier
+ .fillMaxSize()
+ .padding(paddingValues)
+ // Add bottom padding when keyboard is visible for android 15 and above
+ .padding(bottom = if (isKeyboardVisible) imeHeight else 0.dp),
+ contentAlignment = Alignment.Center
+ ) {
+ ComposeWikiErrorParentView(
+ modifier = Modifier
+ .fillMaxWidth(),
+ caught = uiState.error,
+ errorClickEvents = wikiErrorClickEvents
+ )
+ }
+ }
+ is UiState.Success -> {
+ val languagesItems = uiState.data
+ if (languagesItems.isEmpty()) {
+ Box(
+ modifier = modifier
+ .fillMaxSize()
+ .padding(paddingValues)
+ // Add bottom padding when keyboard is visible for android 15 and above
+ .padding(bottom = if (isKeyboardVisible) imeHeight else 0.dp),
+ contentAlignment = Alignment.Center
+ ) {
+ SearchEmptyView(
+ modifier = Modifier
+ .fillMaxWidth(),
+ emptyTexTitle = context.getString(R.string.langlinks_no_match)
+ )
+ }
+ return@Scaffold
+ }
+
+ LazyColumn(
+ modifier = modifier
+ .fillMaxSize()
+ .padding(paddingValues),
+ ) {
+ items(languagesItems) { languageItem ->
+ if (languageItem.headerText.isNotEmpty()) {
+ ListHeader(
+ modifier = Modifier
+ .height(56.dp)
+ .fillMaxWidth()
+ .padding(horizontal = 16.dp)
+ .padding(bottom = 4.dp),
+ title = languageItem.headerText
+ )
+ } else {
+ val localizedLanguageName = StringUtil.capitalize(WikipediaApp.instance.languageState.getAppLanguageLocalizedName(languageItem.code).orEmpty()) ?: ""
+ LanguageListItemView(
+ modifier = Modifier
+ .clickable(
+ interactionSource = remember { MutableInteractionSource() },
+ indication = ripple(bounded = true),
+ onClick = {
+ onListItemClick(languageItem.code)
+ }
+ )
+ .fillMaxWidth()
+ .padding(16.dp),
+ localizedLanguageName = localizedLanguageName,
+ subtitle = languageItem.canonicalName
+ )
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun ListHeader(
+ title: String,
+ modifier: Modifier = Modifier,
+ titleStyle: TextStyle = WikipediaTheme.typography.h4.copy(
+ color = WikipediaTheme.colors.primaryColor,
+ )
+) {
+ Box(
+ modifier = modifier
+ ) {
+ Text(
+ modifier = Modifier
+ .align(Alignment.CenterStart),
+ text = title,
+ style = titleStyle,
+ )
+ }
+}
+
+@Composable
+fun LanguageListItemView(
+ modifier: Modifier = Modifier,
+ localizedLanguageName: String,
+ subtitle: String? = null
+) {
+ Column(
+ modifier = modifier,
+ verticalArrangement = Arrangement.Center,
+ ) {
+ Text(
+ text = localizedLanguageName,
+ style = WikipediaTheme.typography.h3.copy(
+ color = WikipediaTheme.colors.primaryColor,
+ )
+ )
+ if (subtitle != null) {
+ Text(
+ text = subtitle,
+ style = WikipediaTheme.typography.list.copy(
+ color = WikipediaTheme.colors.secondaryColor,
+ textAlign = TextAlign.Center
+ )
+ )
+ }
+ }
+}
diff --git a/app/src/main/java/org/wikipedia/language/addlanguages/AddLanguagesViewModel.kt b/app/src/main/java/org/wikipedia/language/addlanguages/AddLanguagesViewModel.kt
new file mode 100644
index 00000000000..0e9e7b43199
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/language/addlanguages/AddLanguagesViewModel.kt
@@ -0,0 +1,141 @@
+package org.wikipedia.language.addlanguages
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import kotlinx.coroutines.CoroutineExceptionHandler
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.isActive
+import kotlinx.coroutines.launch
+import org.apache.commons.lang3.StringUtils
+import org.wikipedia.R
+import org.wikipedia.WikipediaApp
+import org.wikipedia.dataclient.ServiceFactory
+import org.wikipedia.dataclient.mwapi.SiteMatrix
+import org.wikipedia.util.UiState
+import org.wikipedia.util.log.L
+
+class AddLanguagesViewModel : ViewModel() {
+ private val suggestedLanguageCodes = WikipediaApp.instance.languageState.remainingSuggestedLanguageCodes
+ private val nonSuggestedLanguageCodes = WikipediaApp.instance.languageState.appMruLanguageCodes.filterNot {
+ suggestedLanguageCodes.contains(it) || WikipediaApp.instance.languageState.appLanguageCodes.contains(it)
+ }
+
+ private val _siteInfoList = MutableStateFlow>(emptyList())
+
+ // UI state exposed to Compose
+ private val _uiState = MutableStateFlow>>(UiState.Loading)
+ val uiState = _uiState.asStateFlow()
+
+ private val handler = CoroutineExceptionHandler { _, throwable ->
+ L.e(throwable)
+ _uiState.value = UiState.Error(throwable)
+ }
+
+ private var fetchJob: Job? = null
+
+ init {
+ fetchAllData()
+ }
+
+ fun fetchAllData() {
+ fetchJob?.cancel()
+
+ // Set to loading state
+ _uiState.value = UiState.Loading
+
+ // fetch site matrix
+ fetchJob = viewModelScope.launch(handler) {
+ _uiState.value = UiState.Loading
+ val siteMatrix = ServiceFactory.get(WikipediaApp.instance.wikiSite).getSiteMatrix()
+ val sites = SiteMatrix.getSites(siteMatrix)
+ _siteInfoList.value = sites
+
+ // isActive checks if the job is still active
+ // does not update the list if the coroutine has been cancelled
+ if (isActive) {
+ updateSearchTerm("")
+ }
+ }
+ }
+
+ fun updateSearchTerm(term: String) {
+ viewModelScope.launch {
+ _uiState.value = UiState.Success(getFilteredLanguageList(term))
+ }
+ }
+
+ private fun getFilteredLanguageList(
+ searchTerm: String,
+ ): List {
+ val results = mutableListOf()
+ val filter = StringUtils.stripAccents(searchTerm)
+
+ addFilteredLanguageListItems(
+ filter,
+ suggestedLanguageCodes,
+ WikipediaApp.instance.getString(R.string.languages_list_suggested_text),
+ results
+ )
+
+ addFilteredLanguageListItems(
+ filter,
+ nonSuggestedLanguageCodes,
+ WikipediaApp.instance.getString(R.string.languages_list_all_text),
+ results
+ )
+
+ return results
+ }
+
+ private fun addFilteredLanguageListItems(
+ filter: String,
+ codes: List,
+ headerText: String,
+ results: MutableList,
+ ) {
+ var first = true
+ for (code in codes) {
+ val localizedName = StringUtils.stripAccents(
+ WikipediaApp.instance.languageState.getAppLanguageLocalizedName(code).orEmpty()
+ )
+
+ // Only attempt to get canonical name if the site is available
+ val canonicalName = StringUtils.stripAccents(getCanonicalName(code))
+
+ if (filter.isEmpty() || code.contains(filter, true) ||
+ localizedName.contains(filter, true) ||
+ canonicalName.contains(filter, true)) {
+
+ if (first) {
+ results.add(
+ LanguageListItem(
+ code = "",
+ headerText = headerText,
+ )
+ )
+ first = false
+ }
+ results.add(
+ LanguageListItem(
+ code = code,
+ canonicalName = canonicalName
+ )
+ )
+ }
+ }
+ }
+
+ private fun getCanonicalName(code: String): String {
+ return _siteInfoList.value.find { it.code == code }?.localname.orEmpty()
+ .ifEmpty { WikipediaApp.instance.languageState.getAppLanguageCanonicalName(code).orEmpty() }
+ }
+}
+
+data class LanguageListItem(
+ val code: String,
+ val localizedName: String = "",
+ val canonicalName: String = "",
+ val headerText: String = "",
+)
diff --git a/app/src/main/java/org/wikipedia/settings/languages/WikipediaLanguagesFragment.kt b/app/src/main/java/org/wikipedia/settings/languages/WikipediaLanguagesFragment.kt
index b149edea7b0..1143eb07f5a 100644
--- a/app/src/main/java/org/wikipedia/settings/languages/WikipediaLanguagesFragment.kt
+++ b/app/src/main/java/org/wikipedia/settings/languages/WikipediaLanguagesFragment.kt
@@ -21,7 +21,7 @@ import org.wikipedia.R
import org.wikipedia.WikipediaApp
import org.wikipedia.databinding.FragmentWikipediaLanguagesBinding
import org.wikipedia.json.JsonUtil
-import org.wikipedia.language.LanguagesListActivity
+import org.wikipedia.language.addlanguages.AddLanguagesListActivity
import org.wikipedia.push.WikipediaFirebaseMessagingService
import org.wikipedia.settings.Prefs
import org.wikipedia.settings.SettingsActivity
@@ -59,7 +59,7 @@ class WikipediaLanguagesFragment : Fragment(), MenuProvider, WikipediaLanguagesI
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == Constants.ACTIVITY_REQUEST_ADD_A_LANGUAGE && resultCode == Activity.RESULT_OK) {
interactionsCount += data!!.getIntExtra(ADD_LANGUAGE_INTERACTIONS, 0)
- isLanguageSearched = isLanguageSearched || data.getBooleanExtra(LanguagesListActivity.LANGUAGE_SEARCHED, false)
+ isLanguageSearched = isLanguageSearched || data.getBooleanExtra(AddLanguagesListActivity.LANGUAGE_SEARCHED, false)
prepareWikipediaLanguagesList()
requireActivity().invalidateOptionsMenu()
adapter.notifyDataSetChanged()
@@ -192,7 +192,7 @@ class WikipediaLanguagesFragment : Fragment(), MenuProvider, WikipediaLanguagesI
} else if (holder is FooterViewHolder) {
holder.view.visibility = if (checkboxEnabled) View.GONE else View.VISIBLE
holder.view.setOnClickListener {
- Intent(requireActivity(), LanguagesListActivity::class.java).let {
+ Intent(requireActivity(), AddLanguagesListActivity::class.java).let {
startActivityForResult(it, Constants.ACTIVITY_REQUEST_ADD_A_LANGUAGE)
actionMode?.finish()
}
diff --git a/app/src/main/java/org/wikipedia/util/Resource.kt b/app/src/main/java/org/wikipedia/util/Resource.kt
index 9dc3c827856..06d37effbb4 100644
--- a/app/src/main/java/org/wikipedia/util/Resource.kt
+++ b/app/src/main/java/org/wikipedia/util/Resource.kt
@@ -5,3 +5,9 @@ open class Resource {
class Success(val data: T) : Resource()
class Error(val throwable: Throwable) : Resource()
}
+
+sealed interface UiState {
+ data object Loading : UiState
+ data class Success(val data: T) : UiState
+ data class Error(val error: Throwable) : UiState
+}
diff --git a/app/src/main/res/layout/activity_languages_list.xml b/app/src/main/res/layout/activity_languages_list.xml
deleted file mode 100644
index 82b7abdfea7..00000000000
--- a/app/src/main/res/layout/activity_languages_list.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-