#3524 Convert SpinnerLanguagesAdapter to kotlin - converted to kotlin (#3528)

* #3524 Convert SpinnerLanguagesAdapter to kotlin - converted to kotlin

* #3524 Convert SpinnerLanguagesAdapter to kotlin - add KDoc - rework logic - format
This commit is contained in:
Seán Mac Gillicuddy 2020-03-17 11:06:56 +00:00 committed by GitHub
parent e5d5a7af92
commit cd2d530175
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 112 additions and 181 deletions

View file

@ -5,6 +5,7 @@ apply from: '../gitutils.gradle'
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt' apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'
apply plugin: "com.hiya.jacoco-android" apply plugin: "com.hiya.jacoco-android"
apply from: 'quality.gradle' apply from: 'quality.gradle'
@ -286,3 +287,7 @@ if(isRunningOnTravisAndIsNotPRBuild) {
} }
} }
} }
androidExtensions {
experimental = true
}

View file

@ -145,8 +145,8 @@ public class DescriptionsAdapter extends RecyclerView.Adapter<DescriptionsAdapte
private void initLanguageSpinner(int position, Description description) { private void initLanguageSpinner(int position, Description description) {
SpinnerLanguagesAdapter languagesAdapter = new SpinnerLanguagesAdapter( SpinnerLanguagesAdapter languagesAdapter = new SpinnerLanguagesAdapter(
spinnerDescriptionLanguages.getContext(), spinnerDescriptionLanguages.getContext(),
R.layout.row_item_languages_spinner, selectedLanguages, selectedLanguages
savedLanguageValue); );
spinnerDescriptionLanguages.setAdapter(languagesAdapter); spinnerDescriptionLanguages.setAdapter(languagesAdapter);
spinnerDescriptionLanguages.setOnItemSelectedListener(new OnItemSelectedListener() { spinnerDescriptionLanguages.setOnItemSelectedListener(new OnItemSelectedListener() {
@ -160,7 +160,7 @@ public class DescriptionsAdapter extends RecyclerView.Adapter<DescriptionsAdapte
selectedLanguages.remove(adapterView); selectedLanguages.remove(adapterView);
selectedLanguages.put(adapterView, languageCode); selectedLanguages.put(adapterView, languageCode);
((SpinnerLanguagesAdapter) adapterView ((SpinnerLanguagesAdapter) adapterView
.getAdapter()).selectedLangCode = languageCode; .getAdapter()).setSelectedLangCode(languageCode);
spinnerDescriptionLanguages.setSelection(position); spinnerDescriptionLanguages.setSelection(position);
Timber.d("Description language code is: "+languageCode); Timber.d("Description language code is: "+languageCode);
} }

View file

@ -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);
}
}

View file

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

View file

@ -22,9 +22,4 @@
tools:text="en" 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> </LinearLayout>