mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 20:33:53 +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: '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
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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"
|
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>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue