mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 12:23:58 +01:00
* #3524 Convert SpinnerLanguagesAdapter to kotlin - converted to kotlin * #3524 Convert SpinnerLanguagesAdapter to kotlin - add KDoc - rework logic - format
This commit is contained in:
parent
e5d5a7af92
commit
cd2d530175
5 changed files with 112 additions and 181 deletions
|
|
@ -5,6 +5,7 @@ apply from: '../gitutils.gradle'
|
|||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
apply plugin: 'kotlin-kapt'
|
||||
apply plugin: 'kotlin-android-extensions'
|
||||
apply plugin: "com.hiya.jacoco-android"
|
||||
apply from: 'quality.gradle'
|
||||
|
||||
|
|
@ -286,3 +287,7 @@ if(isRunningOnTravisAndIsNotPRBuild) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
androidExtensions {
|
||||
experimental = true
|
||||
}
|
||||
|
|
|
|||
|
|
@ -145,8 +145,8 @@ public class DescriptionsAdapter extends RecyclerView.Adapter<DescriptionsAdapte
|
|||
private void initLanguageSpinner(int position, Description description) {
|
||||
SpinnerLanguagesAdapter languagesAdapter = new SpinnerLanguagesAdapter(
|
||||
spinnerDescriptionLanguages.getContext(),
|
||||
R.layout.row_item_languages_spinner, selectedLanguages,
|
||||
savedLanguageValue);
|
||||
selectedLanguages
|
||||
);
|
||||
spinnerDescriptionLanguages.setAdapter(languagesAdapter);
|
||||
|
||||
spinnerDescriptionLanguages.setOnItemSelectedListener(new OnItemSelectedListener() {
|
||||
|
|
@ -160,7 +160,7 @@ public class DescriptionsAdapter extends RecyclerView.Adapter<DescriptionsAdapte
|
|||
selectedLanguages.remove(adapterView);
|
||||
selectedLanguages.put(adapterView, languageCode);
|
||||
((SpinnerLanguagesAdapter) adapterView
|
||||
.getAdapter()).selectedLangCode = languageCode;
|
||||
.getAdapter()).setSelectedLangCode(languageCode);
|
||||
spinnerDescriptionLanguages.setSelection(position);
|
||||
Timber.d("Description language code is: "+languageCode);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,173 +0,0 @@
|
|||
package fr.free.nrw.commons.upload;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Color;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import fr.free.nrw.commons.R;
|
||||
import fr.free.nrw.commons.utils.BiMap;
|
||||
import fr.free.nrw.commons.utils.LangCodeUtils;
|
||||
|
||||
|
||||
public class SpinnerLanguagesAdapter extends ArrayAdapter {
|
||||
|
||||
private final int resource;
|
||||
private final LayoutInflater layoutInflater;
|
||||
private List<String> languageNamesList;
|
||||
private List<String> languageCodesList;
|
||||
private final BiMap<AdapterView, String> selectedLanguages;
|
||||
public String selectedLangCode="";
|
||||
private Context context;
|
||||
private boolean dropDownClicked;
|
||||
private String savedLanguageValue;
|
||||
|
||||
|
||||
|
||||
public SpinnerLanguagesAdapter(@NonNull Context context,
|
||||
int resource,
|
||||
BiMap<AdapterView, String> selectedLanguages,
|
||||
String savedLanguageValue) {
|
||||
super(context, resource);
|
||||
this.resource = resource;
|
||||
this.layoutInflater = LayoutInflater.from(context);
|
||||
languageNamesList = new ArrayList<>();
|
||||
languageCodesList = new ArrayList<>();
|
||||
prepareLanguages();
|
||||
this.selectedLanguages = selectedLanguages;
|
||||
this.context = context;
|
||||
this.dropDownClicked = false;
|
||||
this.savedLanguageValue = savedLanguageValue;
|
||||
}
|
||||
|
||||
private void prepareLanguages() {
|
||||
List<Language> languages = getLocaleSupportedByDevice();
|
||||
|
||||
for(Language language: languages) {
|
||||
if(!languageCodesList.contains(language.getLocale().getLanguage())) {
|
||||
languageNamesList.add(language.getLocale().getDisplayName());
|
||||
languageCodesList.add(language.getLocale().getLanguage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private List<Language> getLocaleSupportedByDevice() {
|
||||
List<Language> languages = new ArrayList<>();
|
||||
Locale[] localesArray = Locale.getAvailableLocales();
|
||||
for (Locale locale : localesArray) {
|
||||
languages.add(new Language(locale));
|
||||
}
|
||||
|
||||
Collections.sort(languages, (language, t1) -> language.getLocale().getDisplayName()
|
||||
.compareTo(t1.getLocale().getDisplayName()));
|
||||
return languages;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled(int position) {
|
||||
return !languageCodesList.get(position).isEmpty()&&
|
||||
(!selectedLanguages.containsKey(languageCodesList.get(position)) ||
|
||||
languageCodesList.get(position).equals(selectedLangCode));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return languageNamesList.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getDropDownView(int position, @Nullable View convertView,
|
||||
@NonNull ViewGroup parent) {
|
||||
if (convertView == null) {
|
||||
convertView = layoutInflater.inflate(resource, parent, false);
|
||||
}
|
||||
ViewHolder holder = new ViewHolder(convertView);
|
||||
holder.init(position, true, savedLanguageValue);
|
||||
|
||||
dropDownClicked = true;
|
||||
return convertView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull
|
||||
View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
|
||||
ViewHolder holder;
|
||||
if (convertView == null) {
|
||||
convertView = layoutInflater.inflate(resource, parent, false);
|
||||
holder = new ViewHolder(convertView);
|
||||
convertView.setTag(holder);
|
||||
} else {
|
||||
holder = (ViewHolder) convertView.getTag();
|
||||
}
|
||||
holder.init(position, false, savedLanguageValue);
|
||||
return convertView;
|
||||
}
|
||||
|
||||
|
||||
public class ViewHolder {
|
||||
|
||||
@BindView(R.id.tv_language)
|
||||
TextView tvLanguage;
|
||||
|
||||
@BindView(R.id.view)
|
||||
View view;
|
||||
|
||||
public ViewHolder(View itemView) {
|
||||
ButterKnife.bind(this, itemView);
|
||||
}
|
||||
|
||||
public void init(int position, boolean isDropDownView, String savedLanguageValue) {
|
||||
String languageCode = LangCodeUtils.fixLanguageCode(languageCodesList.get(position));
|
||||
final String languageName = StringUtils.capitalize(languageNamesList.get(position));
|
||||
|
||||
if (!isDropDownView) {
|
||||
view.setVisibility(View.GONE);
|
||||
if (languageCode.length() > 2)
|
||||
tvLanguage.setText(languageCode.substring(0, 2));
|
||||
else
|
||||
tvLanguage.setText(languageCode);
|
||||
} else {
|
||||
view.setVisibility(View.VISIBLE);
|
||||
if (languageCodesList.get(position).isEmpty()) {
|
||||
tvLanguage.setText(languageName);
|
||||
tvLanguage.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
|
||||
} else {
|
||||
tvLanguage.setText(
|
||||
String.format("%s [%s]", languageName, languageCode));
|
||||
if (selectedLanguages.containsKey(languageCodesList.get(position)) &&
|
||||
!languageCodesList.get(position).equals(selectedLangCode)) {
|
||||
tvLanguage.setTextColor(Color.GRAY);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String getLanguageCode(int position) {
|
||||
return languageCodesList.get(position);
|
||||
}
|
||||
|
||||
int getIndexOfUserDefaultLocale(Context context) {
|
||||
return languageCodesList.indexOf(context.getResources().getConfiguration().locale.getLanguage());
|
||||
}
|
||||
|
||||
int getIndexOfLanguageCode(String languageCode) {
|
||||
return languageCodesList.indexOf(languageCode);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,104 @@
|
|||
package fr.free.nrw.commons.upload
|
||||
|
||||
import android.content.Context
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ArrayAdapter
|
||||
import androidx.annotation.LayoutRes
|
||||
import androidx.core.os.ConfigurationCompat
|
||||
import fr.free.nrw.commons.R
|
||||
import fr.free.nrw.commons.utils.BiMap
|
||||
import fr.free.nrw.commons.utils.LangCodeUtils
|
||||
import kotlinx.android.extensions.LayoutContainer
|
||||
import kotlinx.android.synthetic.main.row_item_languages_spinner.*
|
||||
import org.apache.commons.lang3.StringUtils
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* This class handles the display of language spinners and their dropdown views for UploadMediaDetailFragment
|
||||
*
|
||||
* @property selectedLanguages - controls the enabled state of dropdown views
|
||||
*
|
||||
* @param context - required by super constructor
|
||||
*/
|
||||
class SpinnerLanguagesAdapter constructor(
|
||||
context: Context,
|
||||
private val selectedLanguages: BiMap<*, String>
|
||||
) : ArrayAdapter<Any?>(context, -1) {
|
||||
|
||||
private val languageNamesList: List<String>
|
||||
private val languageCodesList: List<String>
|
||||
|
||||
init {
|
||||
val sortedLanguages = Locale.getAvailableLocales()
|
||||
.map(::Language)
|
||||
.sortedBy { it.locale.displayName }
|
||||
languageNamesList = sortedLanguages.map { it.locale.displayName }
|
||||
languageCodesList = sortedLanguages.map { it.locale.language }
|
||||
}
|
||||
|
||||
var selectedLangCode = ""
|
||||
|
||||
override fun isEnabled(position: Int) = languageCodesList[position].let {
|
||||
it.isNotEmpty() && !selectedLanguages.containsKey(it) && it != selectedLangCode
|
||||
}
|
||||
|
||||
override fun getCount() = languageNamesList.size
|
||||
|
||||
override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup) =
|
||||
(convertView ?: parent.inflate(R.layout.row_item_languages_spinner).also {
|
||||
it.tag = DropDownViewHolder(it)
|
||||
}).apply {
|
||||
(tag as DropDownViewHolder).init(
|
||||
languageCodesList[position],
|
||||
languageNamesList[position],
|
||||
isEnabled(position)
|
||||
)
|
||||
}
|
||||
|
||||
override fun getView(position: Int, convertView: View?, parent: ViewGroup) =
|
||||
(convertView ?: parent.inflate(R.layout.row_item_languages_spinner).also {
|
||||
it.tag = SpinnerViewHolder(it)
|
||||
}).apply { (tag as SpinnerViewHolder).init(languageCodesList[position]) }
|
||||
|
||||
class SpinnerViewHolder(override val containerView: View) : LayoutContainer {
|
||||
fun init(languageCode: String) {
|
||||
LangCodeUtils.fixLanguageCode(languageCode).let {
|
||||
tv_language.text = if (it.length > 2) it.take(2) else it
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class DropDownViewHolder(override val containerView: View) : LayoutContainer {
|
||||
fun init(languageCode: String, languageName: String, enabled: Boolean) {
|
||||
tv_language.isEnabled = enabled
|
||||
if (languageCode.isEmpty()) {
|
||||
tv_language.text = StringUtils.capitalize(languageName)
|
||||
tv_language.textAlignment = View.TEXT_ALIGNMENT_CENTER
|
||||
} else {
|
||||
tv_language.text =
|
||||
"${StringUtils.capitalize(languageName)}" +
|
||||
" [${LangCodeUtils.fixLanguageCode(languageCode)}]"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getLanguageCode(position: Int): String {
|
||||
return languageCodesList[position]
|
||||
}
|
||||
|
||||
fun getIndexOfUserDefaultLocale(context: Context): Int {
|
||||
return languageCodesList.indexOf(context.locale.language)
|
||||
}
|
||||
|
||||
fun getIndexOfLanguageCode(languageCode: String): Int {
|
||||
return languageCodesList.indexOf(languageCode)
|
||||
}
|
||||
}
|
||||
|
||||
private fun ViewGroup.inflate(@LayoutRes resId: Int) =
|
||||
LayoutInflater.from(context).inflate(resId, this, false)
|
||||
|
||||
private val Context.locale: Locale
|
||||
get() = ConfigurationCompat.getLocales(resources.configuration)[0]
|
||||
|
|
@ -22,9 +22,4 @@
|
|||
tools:text="en"
|
||||
/>
|
||||
|
||||
<View
|
||||
android:id="@+id/view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/tiny_height"
|
||||
android:background="@color/item_white_background" />
|
||||
</LinearLayout>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue