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 @@ - - - - - - - - - -