diff --git a/app/build.gradle b/app/build.gradle index 1db73cb74..c21579f51 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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 +} diff --git a/app/src/main/java/fr/free/nrw/commons/upload/DescriptionsAdapter.java b/app/src/main/java/fr/free/nrw/commons/upload/DescriptionsAdapter.java index 9de9caba4..b467cf3c0 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/DescriptionsAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/DescriptionsAdapter.java @@ -145,8 +145,8 @@ public class DescriptionsAdapter extends RecyclerView.Adapter languageNamesList; - private List languageCodesList; - private final BiMap selectedLanguages; - public String selectedLangCode=""; - private Context context; - private boolean dropDownClicked; - private String savedLanguageValue; - - - - public SpinnerLanguagesAdapter(@NonNull Context context, - int resource, - BiMap 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 languages = getLocaleSupportedByDevice(); - - for(Language language: languages) { - if(!languageCodesList.contains(language.getLocale().getLanguage())) { - languageNamesList.add(language.getLocale().getDisplayName()); - languageCodesList.add(language.getLocale().getLanguage()); - } - } - } - - private List getLocaleSupportedByDevice() { - List 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); - } -} diff --git a/app/src/main/java/fr/free/nrw/commons/upload/SpinnerLanguagesAdapter.kt b/app/src/main/java/fr/free/nrw/commons/upload/SpinnerLanguagesAdapter.kt new file mode 100644 index 000000000..b9c5f46c6 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/upload/SpinnerLanguagesAdapter.kt @@ -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(context, -1) { + + private val languageNamesList: List + private val languageCodesList: List + + 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] diff --git a/app/src/main/res/layout/row_item_languages_spinner.xml b/app/src/main/res/layout/row_item_languages_spinner.xml index 2d60e21c8..2c8dd8feb 100644 --- a/app/src/main/res/layout/row_item_languages_spinner.xml +++ b/app/src/main/res/layout/row_item_languages_spinner.xml @@ -22,9 +22,4 @@ tools:text="en" /> -