Skip to content

Commit 5892229

Browse files
ashishkumar468misaochan
authored andcommitted
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)
1 parent d897cfe commit 5892229

File tree

3 files changed

+92
-91
lines changed

3 files changed

+92
-91
lines changed

app/src/main/java/fr/free/nrw/commons/upload/DescriptionsAdapter.java

Lines changed: 35 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010
import android.view.ViewGroup;
1111
import android.widget.AdapterView;
1212
import android.widget.AdapterView.OnItemSelectedListener;
13+
14+
import java.util.ArrayList;
15+
import java.util.List;
16+
1317
import androidx.annotation.NonNull;
1418
import androidx.annotation.Nullable;
1519
import androidx.appcompat.widget.AppCompatEditText;
@@ -20,82 +24,22 @@
2024
import fr.free.nrw.commons.R;
2125
import fr.free.nrw.commons.utils.AbstractTextWatcher;
2226
import fr.free.nrw.commons.utils.BiMap;
23-
import java.util.ArrayList;
24-
import java.util.Collections;
25-
import java.util.List;
26-
import java.util.Locale;
2727
import timber.log.Timber;
2828

2929
public class DescriptionsAdapter extends RecyclerView.Adapter<DescriptionsAdapter.ViewHolder> {
3030

31-
private final String userDefaultLocale;
3231
private List<Description> descriptions;
3332
private Callback callback;
3433

3534
private BiMap<AdapterView, String> selectedLanguages;
3635
private String savedLanguageValue;
37-
private List<String> languageCodesList=new ArrayList<>();
38-
private List<String> languageNamesList=new ArrayList<>();
3936

40-
public DescriptionsAdapter(String savedLanguageValue, String userDefaultLocale) {
37+
public DescriptionsAdapter(String savedLanguageValue) {
4138
descriptions = new ArrayList<>();
4239
selectedLanguages = new BiMap<>();
43-
prepareLanguages();
44-
this.userDefaultLocale=userDefaultLocale;
4540
this.savedLanguageValue = savedLanguageValue;
4641
}
4742

48-
private void prepareLanguages() {
49-
List<Language> languages = getLocaleSupportedByDevice();
50-
51-
for(Language language: languages) {
52-
if(!languageCodesList.contains(language.getLocale().getLanguage())) {
53-
languageNamesList.add(language.getLocale().getDisplayName());
54-
languageCodesList.add(language.getLocale().getLanguage());
55-
}
56-
}
57-
}
58-
59-
private List<Language> getLocaleSupportedByDevice() {
60-
List<Language> languages = new ArrayList<>();
61-
Locale[] localesArray = Locale.getAvailableLocales();
62-
for (Locale locale : localesArray) {
63-
languages.add(new Language(locale));
64-
}
65-
66-
Collections.sort(languages, (language, t1) -> language.getLocale().getDisplayName()
67-
.compareTo(t1.getLocale().getDisplayName()));
68-
return languages;
69-
}
70-
71-
int getIndexOfLanguageCode(String languageCode) {
72-
return languageCodesList.indexOf(languageCode);
73-
}
74-
75-
public void addDescription(Description description) {
76-
if (description.getSelectedLanguageIndex() == -1) {
77-
int localeIndex = 0;
78-
String languageValue;
79-
if (!TextUtils.isEmpty(savedLanguageValue)) {
80-
// If user has chosen a default language from settings activity savedLanguageValue is not null
81-
localeIndex = getIndexOfLanguageCode(savedLanguageValue);
82-
languageValue = savedLanguageValue;
83-
} else {
84-
if (descriptions.isEmpty()) {//If this is the first description, lets let him add the description of his locale
85-
localeIndex =
86-
getIndexOfLanguageCode(
87-
userDefaultLocale);
88-
}
89-
languageValue = languageCodesList.get(localeIndex);
90-
}
91-
description.setSelectedLanguageIndex(localeIndex);
92-
description.setLanguageCode(languageValue);
93-
}
94-
this.descriptions.add(description);
95-
notifyItemInserted(descriptions.size());
96-
}
97-
98-
9943
public void setCallback(Callback callback) {
10044
this.callback = callback;
10145
}
@@ -132,6 +76,11 @@ public List<Description> getDescriptions() {
13276
return descriptions;
13377
}
13478

79+
public void addDescription(Description description) {
80+
this.descriptions.add(description);
81+
notifyItemInserted(descriptions.size());
82+
}
83+
13584
public class ViewHolder extends RecyclerView.ViewHolder {
13685

13786
@Nullable
@@ -178,7 +127,7 @@ public void init(int position) {
178127
descItemEditText.addTextChangedListener(new AbstractTextWatcher(
179128
descriptionText -> descriptions.get(position)
180129
.setDescriptionText(descriptionText)));
181-
initLanguageSpinner(description);
130+
initLanguageSpinner(position, description);
182131

183132
//If the description was manually added by the user, it deserves focus, if not, let the user decide
184133
if (description.isManuallyAdded()) {
@@ -190,15 +139,14 @@ public void init(int position) {
190139

191140
/**
192141
* Extracted out the function to init the language spinner with different system supported languages
142+
* @param position
193143
* @param description
194144
*/
195-
private void initLanguageSpinner(Description description) {
145+
private void initLanguageSpinner(int position, Description description) {
196146
SpinnerLanguagesAdapter languagesAdapter = new SpinnerLanguagesAdapter(
197147
spinnerDescriptionLanguages.getContext(),
198-
R.layout.row_item_languages_spinner, selectedLanguages);
199-
languagesAdapter.setLanguageCodes(languageCodesList);
200-
languagesAdapter.setLanguageNames(languageNamesList);
201-
languagesAdapter.notifyDataSetChanged();
148+
R.layout.row_item_languages_spinner, selectedLanguages,
149+
savedLanguageValue);
202150
spinnerDescriptionLanguages.setAdapter(languagesAdapter);
203151

204152
spinnerDescriptionLanguages.setOnItemSelectedListener(new OnItemSelectedListener() {
@@ -213,15 +161,33 @@ public void onItemSelected(AdapterView<?> adapterView, View view, int position,
213161
selectedLanguages.put(adapterView, languageCode);
214162
((SpinnerLanguagesAdapter) adapterView
215163
.getAdapter()).selectedLangCode = languageCode;
164+
spinnerDescriptionLanguages.setSelection(position);
216165
Timber.d("Description language code is: "+languageCode);
217166
}
218167

219168
@Override
220169
public void onNothingSelected(AdapterView<?> adapterView) {
221170
}
222171
});
223-
spinnerDescriptionLanguages.setSelection(description.getSelectedLanguageIndex());
224-
selectedLanguages.put(spinnerDescriptionLanguages, description.getLanguageCode());
172+
173+
if (description.getSelectedLanguageIndex() == -1) {
174+
if (!TextUtils.isEmpty(savedLanguageValue)) {
175+
// If user has chosen a default language from settings activity savedLanguageValue is not null
176+
spinnerDescriptionLanguages.setSelection(languagesAdapter.getIndexOfLanguageCode(savedLanguageValue));
177+
} else {
178+
if (position == 0) {
179+
int defaultLocaleIndex = languagesAdapter
180+
.getIndexOfUserDefaultLocale(spinnerDescriptionLanguages.getContext());
181+
spinnerDescriptionLanguages.setSelection(defaultLocaleIndex, true);
182+
} else {
183+
spinnerDescriptionLanguages.setSelection(0,true);
184+
}
185+
}
186+
187+
} else {
188+
spinnerDescriptionLanguages.setSelection(description.getSelectedLanguageIndex());
189+
selectedLanguages.put(spinnerDescriptionLanguages, description.getLanguageCode());
190+
}
225191
}
226192

227193
/**

app/src/main/java/fr/free/nrw/commons/upload/SpinnerLanguagesAdapter.java

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,27 +37,49 @@ public class SpinnerLanguagesAdapter extends ArrayAdapter {
3737
private List<String> languageCodesList;
3838
private final BiMap<AdapterView, String> selectedLanguages;
3939
public String selectedLangCode="";
40+
private Context context;
4041
private boolean dropDownClicked;
42+
private String savedLanguageValue;
43+
4144

4245

4346
public SpinnerLanguagesAdapter(@NonNull Context context,
4447
int resource,
45-
BiMap<AdapterView, String> selectedLanguages) {
48+
BiMap<AdapterView, String> selectedLanguages,
49+
String savedLanguageValue) {
4650
super(context, resource);
4751
this.resource = resource;
4852
this.layoutInflater = LayoutInflater.from(context);
4953
languageNamesList = new ArrayList<>();
5054
languageCodesList = new ArrayList<>();
55+
prepareLanguages();
5156
this.selectedLanguages = selectedLanguages;
57+
this.context = context;
5258
this.dropDownClicked = false;
59+
this.savedLanguageValue = savedLanguageValue;
5360
}
5461

55-
public void setLanguageCodes(List<String> languageCodesList) {
56-
this.languageCodesList=languageCodesList;
62+
private void prepareLanguages() {
63+
List<Language> languages = getLocaleSupportedByDevice();
64+
65+
for(Language language: languages) {
66+
if(!languageCodesList.contains(language.getLocale().getLanguage())) {
67+
languageNamesList.add(language.getLocale().getDisplayName());
68+
languageCodesList.add(language.getLocale().getLanguage());
69+
}
70+
}
5771
}
5872

59-
public void setLanguageNames(List<String> languageNamesList) {
60-
this.languageNamesList = languageNamesList;
73+
private List<Language> getLocaleSupportedByDevice() {
74+
List<Language> languages = new ArrayList<>();
75+
Locale[] localesArray = Locale.getAvailableLocales();
76+
for (Locale locale : localesArray) {
77+
languages.add(new Language(locale));
78+
}
79+
80+
Collections.sort(languages, (language, t1) -> language.getLocale().getDisplayName()
81+
.compareTo(t1.getLocale().getDisplayName()));
82+
return languages;
6183
}
6284

6385
@Override
@@ -79,7 +101,7 @@ public View getDropDownView(int position, @Nullable View convertView,
79101
convertView = layoutInflater.inflate(resource, parent, false);
80102
}
81103
ViewHolder holder = new ViewHolder(convertView);
82-
holder.init(position, true);
104+
holder.init(position, true, savedLanguageValue);
83105

84106
dropDownClicked = true;
85107
return convertView;
@@ -96,10 +118,11 @@ View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent
96118
} else {
97119
holder = (ViewHolder) convertView.getTag();
98120
}
99-
holder.init(position, false);
121+
holder.init(position, false, savedLanguageValue);
100122
return convertView;
101123
}
102124

125+
103126
public class ViewHolder {
104127

105128
@BindView(R.id.tv_language)
@@ -112,13 +135,11 @@ public ViewHolder(View itemView) {
112135
ButterKnife.bind(this, itemView);
113136
}
114137

115-
public void init(int position, boolean isDropDownView) {
138+
public void init(int position, boolean isDropDownView, String savedLanguageValue) {
116139
String languageCode = LangCodeUtils.fixLanguageCode(languageCodesList.get(position));
117140
final String languageName = StringUtils.capitalize(languageNamesList.get(position));
141+
118142
if (!isDropDownView) {
119-
if( !dropDownClicked){
120-
languageCode = LangCodeUtils.fixLanguageCode(languageCode);
121-
}
122143
view.setVisibility(View.GONE);
123144
if (languageCode.length() > 2)
124145
tvLanguage.setText(languageCode.substring(0, 2));
@@ -144,4 +165,12 @@ public void init(int position, boolean isDropDownView) {
144165
String getLanguageCode(int position) {
145166
return languageCodesList.get(position);
146167
}
168+
169+
int getIndexOfUserDefaultLocale(Context context) {
170+
return languageCodesList.indexOf(context.getResources().getConfiguration().locale.getLanguage());
171+
}
172+
173+
int getIndexOfLanguageCode(String languageCode) {
174+
return languageCodesList.indexOf(languageCode);
175+
}
147176
}

app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package fr.free.nrw.commons.upload.mediaDetails;
22

3-
import static fr.free.nrw.commons.utils.ImageUtils.getErrorMessageForResult;
4-
53
import android.content.Context;
64
import android.os.Bundle;
75
import android.text.TextUtils;
@@ -13,17 +11,29 @@
1311
import android.widget.EditText;
1412
import android.widget.LinearLayout;
1513
import android.widget.TextView;
14+
1615
import androidx.annotation.NonNull;
1716
import androidx.annotation.Nullable;
1817
import androidx.appcompat.widget.AppCompatButton;
1918
import androidx.appcompat.widget.AppCompatImageButton;
2019
import androidx.recyclerview.widget.LinearLayoutManager;
2120
import androidx.recyclerview.widget.RecyclerView;
21+
22+
import com.github.chrisbanes.photoview.PhotoView;
23+
import com.jakewharton.rxbinding2.widget.RxTextView;
24+
25+
import org.apache.commons.lang3.StringUtils;
26+
27+
import java.util.ArrayList;
28+
import java.util.List;
29+
import java.util.Locale;
30+
31+
import javax.inject.Inject;
32+
import javax.inject.Named;
33+
2234
import butterknife.BindView;
2335
import butterknife.ButterKnife;
2436
import butterknife.OnClick;
25-
import com.github.chrisbanes.photoview.PhotoView;
26-
import com.jakewharton.rxbinding2.widget.RxTextView;
2737
import fr.free.nrw.commons.R;
2838
import fr.free.nrw.commons.Utils;
2939
import fr.free.nrw.commons.filepicker.UploadableFile;
@@ -42,14 +52,10 @@
4252
import fr.free.nrw.commons.utils.ImageUtils;
4353
import fr.free.nrw.commons.utils.ViewUtil;
4454
import io.reactivex.disposables.Disposable;
45-
import java.util.ArrayList;
46-
import java.util.List;
47-
import java.util.Locale;
48-
import javax.inject.Inject;
49-
import javax.inject.Named;
50-
import org.apache.commons.lang3.StringUtils;
5155
import timber.log.Timber;
5256

57+
import static fr.free.nrw.commons.utils.ImageUtils.getErrorMessageForResult;
58+
5359
public class UploadMediaDetailFragment extends UploadBaseFragment implements
5460
UploadMediaDetailsContract.View {
5561

@@ -213,7 +219,7 @@ private void initPresenter() {
213219
* init the recycler veiw
214220
*/
215221
private void initRecyclerView() {
216-
descriptionsAdapter = new DescriptionsAdapter(defaultKvStore.getString(Prefs.KEY_LANGUAGE_VALUE,""),getUserDefaultLocale());
222+
descriptionsAdapter = new DescriptionsAdapter(defaultKvStore.getString(Prefs.KEY_LANGUAGE_VALUE, ""));
217223
descriptionsAdapter.setCallback(this::showInfoAlert);
218224
rvDescriptions.setLayoutManager(new LinearLayoutManager(getContext()));
219225
rvDescriptions.setAdapter(descriptionsAdapter);

0 commit comments

Comments
 (0)