From 5892229a63008f60d6ca3e724b2c1f517ee9deef Mon Sep 17 00:00:00 2001 From: Ashish Kumar Date: Sun, 28 Jul 2019 21:33:49 +0530 Subject: [PATCH] Closes #3094 (#3095) * BugFix in SpinnerDescriptionsAdapter and SpinnerLanguagesAdapter (use the langguage code provided by the spinner, donot set the language to the one returned by the locale) --- .../commons/upload/DescriptionsAdapter.java | 104 ++++++------------ .../upload/SpinnerLanguagesAdapter.java | 51 +++++++-- .../UploadMediaDetailFragment.java | 28 +++-- 3 files changed, 92 insertions(+), 91 deletions(-) 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 c2da4da56..946118c3a 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 @@ -10,6 +10,10 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; + +import java.util.ArrayList; +import java.util.List; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.widget.AppCompatEditText; @@ -20,82 +24,22 @@ import butterknife.ButterKnife; import fr.free.nrw.commons.R; import fr.free.nrw.commons.utils.AbstractTextWatcher; import fr.free.nrw.commons.utils.BiMap; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Locale; import timber.log.Timber; public class DescriptionsAdapter extends RecyclerView.Adapter { - private final String userDefaultLocale; private List descriptions; private Callback callback; private BiMap selectedLanguages; private String savedLanguageValue; - private List languageCodesList=new ArrayList<>(); - private List languageNamesList=new ArrayList<>(); - public DescriptionsAdapter(String savedLanguageValue, String userDefaultLocale) { + public DescriptionsAdapter(String savedLanguageValue) { descriptions = new ArrayList<>(); selectedLanguages = new BiMap<>(); - prepareLanguages(); - this.userDefaultLocale=userDefaultLocale; 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; - } - - int getIndexOfLanguageCode(String languageCode) { - return languageCodesList.indexOf(languageCode); - } - - public void addDescription(Description description) { - if (description.getSelectedLanguageIndex() == -1) { - int localeIndex = 0; - String languageValue; - if (!TextUtils.isEmpty(savedLanguageValue)) { - // If user has chosen a default language from settings activity savedLanguageValue is not null - localeIndex = getIndexOfLanguageCode(savedLanguageValue); - languageValue = savedLanguageValue; - } else { - if (descriptions.isEmpty()) {//If this is the first description, lets let him add the description of his locale - localeIndex = - getIndexOfLanguageCode( - userDefaultLocale); - } - languageValue = languageCodesList.get(localeIndex); - } - description.setSelectedLanguageIndex(localeIndex); - description.setLanguageCode(languageValue); - } - this.descriptions.add(description); - notifyItemInserted(descriptions.size()); - } - - public void setCallback(Callback callback) { this.callback = callback; } @@ -132,6 +76,11 @@ public class DescriptionsAdapter extends RecyclerView.Adapter descriptions.get(position) .setDescriptionText(descriptionText))); - initLanguageSpinner(description); + initLanguageSpinner(position, description); //If the description was manually added by the user, it deserves focus, if not, let the user decide if (description.isManuallyAdded()) { @@ -190,15 +139,14 @@ public class DescriptionsAdapter extends RecyclerView.Adapter adapterView) { } }); - spinnerDescriptionLanguages.setSelection(description.getSelectedLanguageIndex()); - selectedLanguages.put(spinnerDescriptionLanguages, description.getLanguageCode()); + + if (description.getSelectedLanguageIndex() == -1) { + if (!TextUtils.isEmpty(savedLanguageValue)) { + // If user has chosen a default language from settings activity savedLanguageValue is not null + spinnerDescriptionLanguages.setSelection(languagesAdapter.getIndexOfLanguageCode(savedLanguageValue)); + } else { + if (position == 0) { + int defaultLocaleIndex = languagesAdapter + .getIndexOfUserDefaultLocale(spinnerDescriptionLanguages.getContext()); + spinnerDescriptionLanguages.setSelection(defaultLocaleIndex, true); + } else { + spinnerDescriptionLanguages.setSelection(0,true); + } + } + + } else { + spinnerDescriptionLanguages.setSelection(description.getSelectedLanguageIndex()); + selectedLanguages.put(spinnerDescriptionLanguages, description.getLanguageCode()); + } } /** diff --git a/app/src/main/java/fr/free/nrw/commons/upload/SpinnerLanguagesAdapter.java b/app/src/main/java/fr/free/nrw/commons/upload/SpinnerLanguagesAdapter.java index f51f5f261..256c841b9 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/SpinnerLanguagesAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/SpinnerLanguagesAdapter.java @@ -37,27 +37,49 @@ public class SpinnerLanguagesAdapter extends ArrayAdapter { 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) { + 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; } - public void setLanguageCodes(List languageCodesList) { - this.languageCodesList=languageCodesList; + 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()); + } + } } - public void setLanguageNames(List languageNamesList) { - this.languageNamesList = languageNamesList; + 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 @@ -79,7 +101,7 @@ public class SpinnerLanguagesAdapter extends ArrayAdapter { convertView = layoutInflater.inflate(resource, parent, false); } ViewHolder holder = new ViewHolder(convertView); - holder.init(position, true); + holder.init(position, true, savedLanguageValue); dropDownClicked = true; return convertView; @@ -96,10 +118,11 @@ public class SpinnerLanguagesAdapter extends ArrayAdapter { } else { holder = (ViewHolder) convertView.getTag(); } - holder.init(position, false); + holder.init(position, false, savedLanguageValue); return convertView; } + public class ViewHolder { @BindView(R.id.tv_language) @@ -112,13 +135,11 @@ public class SpinnerLanguagesAdapter extends ArrayAdapter { ButterKnife.bind(this, itemView); } - public void init(int position, boolean isDropDownView) { + 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) { - if( !dropDownClicked){ - languageCode = LangCodeUtils.fixLanguageCode(languageCode); - } view.setVisibility(View.GONE); if (languageCode.length() > 2) tvLanguage.setText(languageCode.substring(0, 2)); @@ -144,4 +165,12 @@ public class SpinnerLanguagesAdapter extends ArrayAdapter { 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/mediaDetails/UploadMediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java index e71d2f098..a634b5381 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java @@ -1,7 +1,5 @@ package fr.free.nrw.commons.upload.mediaDetails; -import static fr.free.nrw.commons.utils.ImageUtils.getErrorMessageForResult; - import android.content.Context; import android.os.Bundle; import android.text.TextUtils; @@ -13,17 +11,29 @@ import android.view.ViewGroup; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.widget.AppCompatButton; import androidx.appcompat.widget.AppCompatImageButton; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; + +import com.github.chrisbanes.photoview.PhotoView; +import com.jakewharton.rxbinding2.widget.RxTextView; + +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import javax.inject.Inject; +import javax.inject.Named; + import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; -import com.github.chrisbanes.photoview.PhotoView; -import com.jakewharton.rxbinding2.widget.RxTextView; import fr.free.nrw.commons.R; import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.filepicker.UploadableFile; @@ -42,14 +52,10 @@ import fr.free.nrw.commons.utils.DialogUtil; import fr.free.nrw.commons.utils.ImageUtils; import fr.free.nrw.commons.utils.ViewUtil; import io.reactivex.disposables.Disposable; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import javax.inject.Inject; -import javax.inject.Named; -import org.apache.commons.lang3.StringUtils; import timber.log.Timber; +import static fr.free.nrw.commons.utils.ImageUtils.getErrorMessageForResult; + public class UploadMediaDetailFragment extends UploadBaseFragment implements UploadMediaDetailsContract.View { @@ -213,7 +219,7 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements * init the recycler veiw */ private void initRecyclerView() { - descriptionsAdapter = new DescriptionsAdapter(defaultKvStore.getString(Prefs.KEY_LANGUAGE_VALUE,""),getUserDefaultLocale()); + descriptionsAdapter = new DescriptionsAdapter(defaultKvStore.getString(Prefs.KEY_LANGUAGE_VALUE, "")); descriptionsAdapter.setCallback(this::showInfoAlert); rvDescriptions.setLayoutManager(new LinearLayoutManager(getContext())); rvDescriptions.setAdapter(descriptionsAdapter);