Skip to content

Commit 533ba60

Browse files
ashishkumar468misaochan
authored andcommitted
Fixed default locale and upload locales in descrptions (#3166)
1 parent 55edc34 commit 533ba60

File tree

4 files changed

+103
-108
lines changed

4 files changed

+103
-108
lines changed

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

+68-34
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@
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-
1713
import androidx.annotation.NonNull;
1814
import androidx.annotation.Nullable;
1915
import androidx.appcompat.widget.AppCompatEditText;
@@ -24,22 +20,82 @@
2420
import fr.free.nrw.commons.R;
2521
import fr.free.nrw.commons.utils.AbstractTextWatcher;
2622
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;
3132
private List<Description> descriptions;
3233
private Callback callback;
3334

3435
private BiMap<AdapterView, String> selectedLanguages;
3536
private String savedLanguageValue;
37+
private List<String> languageCodesList=new ArrayList<>();
38+
private List<String> languageNamesList=new ArrayList<>();
3639

37-
public DescriptionsAdapter(String savedLanguageValue) {
40+
public DescriptionsAdapter(String savedLanguageValue, String userDefaultLocale) {
3841
descriptions = new ArrayList<>();
3942
selectedLanguages = new BiMap<>();
43+
prepareLanguages();
44+
this.userDefaultLocale=userDefaultLocale;
4045
this.savedLanguageValue = savedLanguageValue;
4146
}
4247

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+
4399
public void setCallback(Callback callback) {
44100
this.callback = callback;
45101
}
@@ -76,11 +132,6 @@ public List<Description> getDescriptions() {
76132
return descriptions;
77133
}
78134

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

86137
@Nullable
@@ -127,7 +178,7 @@ public void init(int position) {
127178
descItemEditText.addTextChangedListener(new AbstractTextWatcher(
128179
descriptionText -> descriptions.get(position)
129180
.setDescriptionText(descriptionText)));
130-
initLanguageSpinner(position, description);
181+
initLanguageSpinner(description);
131182

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

140191
/**
141192
* Extracted out the function to init the language spinner with different system supported languages
142-
* @param position
143193
* @param description
144194
*/
145-
private void initLanguageSpinner(int position, Description description) {
195+
private void initLanguageSpinner(Description description) {
146196
SpinnerLanguagesAdapter languagesAdapter = new SpinnerLanguagesAdapter(
147197
spinnerDescriptionLanguages.getContext(),
148-
R.layout.row_item_languages_spinner, selectedLanguages,
149-
savedLanguageValue);
198+
R.layout.row_item_languages_spinner, selectedLanguages);
199+
languagesAdapter.setLanguageCodes(languageCodesList);
200+
languagesAdapter.setLanguageNames(languageNamesList);
150201
languagesAdapter.notifyDataSetChanged();
151202
spinnerDescriptionLanguages.setAdapter(languagesAdapter);
152203

@@ -169,25 +220,8 @@ public void onItemSelected(AdapterView<?> adapterView, View view, int position,
169220
public void onNothingSelected(AdapterView<?> adapterView) {
170221
}
171222
});
172-
173-
if (description.getSelectedLanguageIndex() == -1) {
174-
if (savedLanguageValue != null) {
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);
184-
}
185-
}
186-
187-
} else {
188-
spinnerDescriptionLanguages.setSelection(description.getSelectedLanguageIndex());
189-
selectedLanguages.put(spinnerDescriptionLanguages, description.getLanguageCode());
190-
}
223+
spinnerDescriptionLanguages.setSelection(description.getSelectedLanguageIndex());
224+
selectedLanguages.put(spinnerDescriptionLanguages, description.getLanguageCode());
191225
}
192226

193227
/**

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

+9-45
Original file line numberDiff line numberDiff line change
@@ -37,49 +37,27 @@ 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;
4140
private boolean dropDownClicked;
42-
private String savedLanguageValue;
43-
4441

4542

4643
public SpinnerLanguagesAdapter(@NonNull Context context,
4744
int resource,
48-
BiMap<AdapterView, String> selectedLanguages,
49-
String savedLanguageValue) {
45+
BiMap<AdapterView, String> selectedLanguages) {
5046
super(context, resource);
5147
this.resource = resource;
5248
this.layoutInflater = LayoutInflater.from(context);
5349
languageNamesList = new ArrayList<>();
5450
languageCodesList = new ArrayList<>();
55-
prepareLanguages();
5651
this.selectedLanguages = selectedLanguages;
57-
this.context = context;
5852
this.dropDownClicked = false;
59-
this.savedLanguageValue = savedLanguageValue;
6053
}
6154

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-
}
55+
public void setLanguageCodes(List<String> languageCodesList) {
56+
this.languageCodesList=languageCodesList;
7157
}
7258

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;
59+
public void setLanguageNames(List<String> languageNamesList) {
60+
this.languageNamesList = languageNamesList;
8361
}
8462

8563
@Override
@@ -101,7 +79,7 @@ public View getDropDownView(int position, @Nullable View convertView,
10179
convertView = layoutInflater.inflate(resource, parent, false);
10280
}
10381
ViewHolder holder = new ViewHolder(convertView);
104-
holder.init(position, true, savedLanguageValue);
82+
holder.init(position, true);
10583

10684
dropDownClicked = true;
10785
return convertView;
@@ -118,11 +96,10 @@ View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent
11896
} else {
11997
holder = (ViewHolder) convertView.getTag();
12098
}
121-
holder.init(position, false, savedLanguageValue);
99+
holder.init(position, false);
122100
return convertView;
123101
}
124102

125-
126103
public class ViewHolder {
127104

128105
@BindView(R.id.tv_language)
@@ -135,17 +112,12 @@ public ViewHolder(View itemView) {
135112
ButterKnife.bind(this, itemView);
136113
}
137114

138-
public void init(int position, boolean isDropDownView, String savedLanguageValue) {
115+
public void init(int position, boolean isDropDownView) {
139116
String languageCode = LangCodeUtils.fixLanguageCode(languageCodesList.get(position));
140117
final String languageName = StringUtils.capitalize(languageNamesList.get(position));
141-
142-
if(savedLanguageValue.equals("")){
143-
savedLanguageValue = Locale.getDefault().getLanguage();
144-
}
145-
146118
if (!isDropDownView) {
147119
if( !dropDownClicked){
148-
languageCode = LangCodeUtils.fixLanguageCode(savedLanguageValue);
120+
languageCode = LangCodeUtils.fixLanguageCode(languageCode);
149121
}
150122
view.setVisibility(View.GONE);
151123
if (languageCode.length() > 2)
@@ -172,12 +144,4 @@ public void init(int position, boolean isDropDownView, String savedLanguageValue
172144
String getLanguageCode(int position) {
173145
return languageCodesList.get(position);
174146
}
175-
176-
int getIndexOfUserDefaultLocale(Context context) {
177-
return languageCodesList.indexOf(context.getResources().getConfiguration().locale.getLanguage());
178-
}
179-
180-
int getIndexOfLanguageCode(String languageCode) {
181-
return languageCodesList.indexOf(languageCode);
182-
}
183147
}

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

-1
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,6 @@ public static class UploadItem {
264264
this.createdTimestampSource = createdTimestampSource;
265265
title = new Title();
266266
descriptions = new ArrayList<>();
267-
descriptions.add(new Description());
268267
this.place = place;
269268
this.mediaUri = mediaUri;
270269
this.mimeType = mimeType;

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

+26-28
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,29 @@
11
package fr.free.nrw.commons.upload.mediaDetails;
22

3+
import static fr.free.nrw.commons.utils.ImageUtils.getErrorMessageForResult;
4+
35
import android.content.Context;
46
import android.os.Bundle;
57
import android.text.TextUtils;
68
import android.util.DisplayMetrics;
7-
import android.util.Log;
8-
import android.util.Log;
99
import android.view.LayoutInflater;
1010
import android.view.MotionEvent;
1111
import android.view.View;
1212
import android.view.ViewGroup;
1313
import android.widget.EditText;
1414
import android.widget.LinearLayout;
1515
import android.widget.TextView;
16-
1716
import androidx.annotation.NonNull;
1817
import androidx.annotation.Nullable;
1918
import androidx.appcompat.widget.AppCompatButton;
2019
import androidx.appcompat.widget.AppCompatImageButton;
2120
import androidx.recyclerview.widget.LinearLayoutManager;
2221
import androidx.recyclerview.widget.RecyclerView;
23-
24-
import com.github.chrisbanes.photoview.OnScaleChangedListener;
25-
import com.github.chrisbanes.photoview.PhotoView;
26-
import com.jakewharton.rxbinding2.widget.RxTextView;
27-
28-
import org.apache.commons.lang3.StringUtils;
29-
30-
import java.util.ArrayList;
31-
import java.util.List;
32-
import java.util.Locale;
33-
34-
import javax.inject.Inject;
35-
import javax.inject.Named;
36-
3722
import butterknife.BindView;
3823
import butterknife.ButterKnife;
3924
import butterknife.OnClick;
25+
import com.github.chrisbanes.photoview.PhotoView;
26+
import com.jakewharton.rxbinding2.widget.RxTextView;
4027
import fr.free.nrw.commons.R;
4128
import fr.free.nrw.commons.Utils;
4229
import fr.free.nrw.commons.filepicker.UploadableFile;
@@ -55,10 +42,14 @@
5542
import fr.free.nrw.commons.utils.ImageUtils;
5643
import fr.free.nrw.commons.utils.ViewUtil;
5744
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;
5851
import timber.log.Timber;
5952

60-
import static fr.free.nrw.commons.utils.ImageUtils.getErrorMessageForResult;
61-
6253
public class UploadMediaDetailFragment extends UploadBaseFragment implements
6354
UploadMediaDetailsContract.View {
6455

@@ -222,12 +213,20 @@ private void initPresenter() {
222213
* init the recycler veiw
223214
*/
224215
private void initRecyclerView() {
225-
descriptionsAdapter = new DescriptionsAdapter(defaultKvStore.getString(Prefs.KEY_LANGUAGE_VALUE,""));
216+
descriptionsAdapter = new DescriptionsAdapter(defaultKvStore.getString(Prefs.KEY_LANGUAGE_VALUE,""),getUserDefaultLocale());
226217
descriptionsAdapter.setCallback(this::showInfoAlert);
227218
rvDescriptions.setLayoutManager(new LinearLayoutManager(getContext()));
228219
rvDescriptions.setAdapter(descriptionsAdapter);
229220
}
230221

222+
/**
223+
* returns the default locale value of the user's device
224+
* @return
225+
*/
226+
private String getUserDefaultLocale() {
227+
return getContext().getResources().getConfiguration().locale.getLanguage();
228+
}
229+
231230
/**
232231
* show dialog with info
233232
* @param titleStringID
@@ -395,16 +394,15 @@ public void onButtonCopyPreviousTitleDesc(){
395394
presenter.fetchPreviousTitleAndDescription(callback.getIndexInViewFlipper(this));
396395
}
397396

398-
private void setDescriptionsInAdapter(List<Description> descriptions){
399-
if(descriptions==null){
400-
descriptions=new ArrayList<>();
397+
private void setDescriptionsInAdapter(List<Description> descriptions) {
398+
if (descriptions == null) {
399+
descriptions = new ArrayList<>();
401400
}
402-
403-
if(descriptions.size()==0){
404-
descriptions.add(new Description());
401+
if (descriptions.size() == 0) {
402+
descriptionsAdapter.addDescription(new Description());
403+
} else {
404+
descriptionsAdapter.setItems(descriptions);
405405
}
406-
407-
descriptionsAdapter.setItems(descriptions);
408406
}
409407

410408
}

0 commit comments

Comments
 (0)