10
10
import android .view .ViewGroup ;
11
11
import android .widget .AdapterView ;
12
12
import android .widget .AdapterView .OnItemSelectedListener ;
13
-
14
- import java .util .ArrayList ;
15
- import java .util .List ;
16
-
17
13
import androidx .annotation .NonNull ;
18
14
import androidx .annotation .Nullable ;
19
15
import androidx .appcompat .widget .AppCompatEditText ;
24
20
import fr .free .nrw .commons .R ;
25
21
import fr .free .nrw .commons .utils .AbstractTextWatcher ;
26
22
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 ;
27
27
import timber .log .Timber ;
28
28
29
29
public class DescriptionsAdapter extends RecyclerView .Adapter <DescriptionsAdapter .ViewHolder > {
30
30
31
+ private final String userDefaultLocale ;
31
32
private List <Description > descriptions ;
32
33
private Callback callback ;
33
34
34
35
private BiMap <AdapterView , String > selectedLanguages ;
35
36
private String savedLanguageValue ;
37
+ private List <String > languageCodesList =new ArrayList <>();
38
+ private List <String > languageNamesList =new ArrayList <>();
36
39
37
- public DescriptionsAdapter (String savedLanguageValue ) {
40
+ public DescriptionsAdapter (String savedLanguageValue , String userDefaultLocale ) {
38
41
descriptions = new ArrayList <>();
39
42
selectedLanguages = new BiMap <>();
43
+ prepareLanguages ();
44
+ this .userDefaultLocale =userDefaultLocale ;
40
45
this .savedLanguageValue = savedLanguageValue ;
41
46
}
42
47
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
+
43
99
public void setCallback (Callback callback ) {
44
100
this .callback = callback ;
45
101
}
@@ -76,11 +132,6 @@ public List<Description> getDescriptions() {
76
132
return descriptions ;
77
133
}
78
134
79
- public void addDescription (Description description ) {
80
- this .descriptions .add (description );
81
- notifyItemInserted (descriptions .size ());
82
- }
83
-
84
135
public class ViewHolder extends RecyclerView .ViewHolder {
85
136
86
137
@ Nullable
@@ -127,7 +178,7 @@ public void init(int position) {
127
178
descItemEditText .addTextChangedListener (new AbstractTextWatcher (
128
179
descriptionText -> descriptions .get (position )
129
180
.setDescriptionText (descriptionText )));
130
- initLanguageSpinner (position , description );
181
+ initLanguageSpinner (description );
131
182
132
183
//If the description was manually added by the user, it deserves focus, if not, let the user decide
133
184
if (description .isManuallyAdded ()) {
@@ -139,14 +190,14 @@ public void init(int position) {
139
190
140
191
/**
141
192
* Extracted out the function to init the language spinner with different system supported languages
142
- * @param position
143
193
* @param description
144
194
*/
145
- private void initLanguageSpinner (int position , Description description ) {
195
+ private void initLanguageSpinner (Description description ) {
146
196
SpinnerLanguagesAdapter languagesAdapter = new SpinnerLanguagesAdapter (
147
197
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 );
150
201
languagesAdapter .notifyDataSetChanged ();
151
202
spinnerDescriptionLanguages .setAdapter (languagesAdapter );
152
203
@@ -169,25 +220,8 @@ public void onItemSelected(AdapterView<?> adapterView, View view, int position,
169
220
public void onNothingSelected (AdapterView <?> adapterView ) {
170
221
}
171
222
});
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 ());
191
225
}
192
226
193
227
/**
0 commit comments