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