1
1
package fr .free .nrw .commons .settings ;
2
2
3
+ import static android .content .Context .MODE_PRIVATE ;
4
+
3
5
import android .Manifest ;
6
+ import android .app .Activity ;
7
+ import android .content .Intent ;
8
+ import android .content .SharedPreferences ;
9
+ import android .content .res .Configuration ;
4
10
import android .net .Uri ;
5
11
import android .os .Bundle ;
6
- import android .text .InputFilter ;
7
- import android .text .InputType ;
8
- import androidx .preference .EditTextPreference ;
9
12
import android .view .View ;
10
13
import androidx .preference .ListPreference ;
11
14
import androidx .preference .MultiSelectListPreference ;
12
15
import androidx .preference .Preference ;
13
16
import androidx .preference .PreferenceFragmentCompat ;
14
- import com .google .android .material .snackbar .Snackbar ;
15
17
import androidx .preference .PreferenceGroupAdapter ;
16
18
import androidx .preference .PreferenceScreen ;
17
19
import androidx .preference .PreferenceViewHolder ;
23
25
import com .mapbox .mapboxsdk .maps .TelemetryDefinition ;
24
26
import fr .free .nrw .commons .R ;
25
27
import fr .free .nrw .commons .Utils ;
28
+ import fr .free .nrw .commons .contributions .MainActivity ;
26
29
import fr .free .nrw .commons .di .ApplicationlessInjection ;
27
30
import fr .free .nrw .commons .kvstore .JsonKvStore ;
28
31
import fr .free .nrw .commons .logging .CommonsLogSender ;
29
- import fr .free .nrw .commons .upload .Language ;
30
32
import fr .free .nrw .commons .utils .PermissionUtils ;
31
33
import fr .free .nrw .commons .utils .ViewUtil ;
32
34
import java .util .ArrayList ;
33
- import java .util .Collections ;
34
35
import java .util .HashSet ;
35
36
import java .util .List ;
36
37
import java .util .Locale ;
38
+ import java .util .Objects ;
37
39
import javax .inject .Inject ;
38
40
import javax .inject .Named ;
39
41
import org .wikipedia .language .AppLanguageLookUpTable ;
@@ -48,7 +50,9 @@ public class SettingsFragment extends PreferenceFragmentCompat {
48
50
CommonsLogSender commonsLogSender ;
49
51
50
52
private ListPreference themeListPreference ;
51
- private ListPreference langListPreference ;
53
+ private ListPreference descriptionLanguageListPreference ;
54
+ private ListPreference appUiLanguageListPreference ;
55
+ private String keyLanguageListPreference ;
52
56
53
57
@ Override
54
58
public void onCreatePreferences (Bundle savedInstanceState , String rootKey ) {
@@ -73,8 +77,16 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
73
77
});
74
78
}
75
79
76
- langListPreference = findPreference ("descriptionDefaultLanguagePref" );
77
- prepareLanguages ();
80
+ appUiLanguageListPreference = findPreference ("appUiDefaultLanguagePref" );
81
+ assert appUiLanguageListPreference != null ;
82
+ keyLanguageListPreference = appUiLanguageListPreference .getKey ();
83
+ prepareAppLanguages (keyLanguageListPreference );
84
+
85
+ descriptionLanguageListPreference = findPreference ("descriptionDefaultLanguagePref" );
86
+ assert descriptionLanguageListPreference != null ;
87
+ keyLanguageListPreference = descriptionLanguageListPreference .getKey ();
88
+ prepareAppLanguages (keyLanguageListPreference );
89
+
78
90
Preference betaTesterPreference = findPreference ("becomeBetaTester" );
79
91
betaTesterPreference .setOnPreferenceClickListener (preference -> {
80
92
Utils .handleWebUrl (getActivity (), Uri .parse (getResources ().getString (R .string .beta_opt_in_link )));
@@ -141,14 +153,17 @@ private void prepareTheme() {
141
153
142
154
/**
143
155
* Prepares language summary and language codes list and adds them to list preference as pairs.
144
- * Uses previously saved language if there is any, if not uses phone local as initial language.
156
+ * Uses previously saved language if there is any, if not uses phone locale as initial language.
157
+ * Get ListPreference key and act accordingly for each ListPreference.
145
158
* Adds preference changed listener and saves value chosen by user to shared preferences
146
- * to remember later
159
+ * to remember later and recall MainActivity to reflect language changes
160
+ * @param keyListPreference
147
161
*/
148
- private void prepareLanguages () {
149
- List <String > languageNamesList ;
150
- List <String > languageCodesList ;
151
- AppLanguageLookUpTable appLanguageLookUpTable = new AppLanguageLookUpTable (getContext ());
162
+ private void prepareAppLanguages (final String keyListPreference ) {
163
+ final List <String > languageNamesList ;
164
+ final List <String > languageCodesList ;
165
+ final AppLanguageLookUpTable appLanguageLookUpTable = new AppLanguageLookUpTable (
166
+ Objects .requireNonNull (getContext ()));
152
167
languageNamesList = appLanguageLookUpTable .getLocalizedNames ();
153
168
languageCodesList = appLanguageLookUpTable .getCodes ();
154
169
List <String > languageNameWithCodeList = new ArrayList <>();
@@ -157,35 +172,99 @@ private void prepareLanguages() {
157
172
languageNameWithCodeList .add (languageNamesList .get (i ) + "[" + languageCodesList .get (i ) + "]" );
158
173
}
159
174
160
- CharSequence [] languageNames = languageNameWithCodeList .toArray (new CharSequence [0 ]);
161
- CharSequence [] languageCodes = languageCodesList .toArray (new CharSequence [0 ]);
175
+ final CharSequence [] languageNames = languageNamesList .toArray (new CharSequence [0 ]);
176
+ final CharSequence [] languageCodes = languageCodesList .toArray (new CharSequence [0 ]);
162
177
// Add all languages and languages codes to lists preference as pair
163
- langListPreference .setEntries (languageNames );
164
- langListPreference .setEntryValues (languageCodes );
165
178
166
179
// Gets current language code from shared preferences
167
- String languageCode = getCurrentLanguageCode ();
168
- if (languageCode .equals ("" )) {
169
- // If current language code is empty, means none selected by user yet so use phone local
170
- langListPreference .setValue (Locale .getDefault ().getLanguage ());
171
- } else {
172
- // If any language is selected by user previously, use it
173
- langListPreference .setValue (languageCode );
180
+ final String languageCode = getCurrentLanguageCode (keyListPreference );
181
+
182
+ if (keyListPreference .equals ("appUiDefaultLanguagePref" )) {
183
+ appUiLanguageListPreference .setEntries (languageNames );
184
+ appUiLanguageListPreference .setEntryValues (languageCodes );
185
+
186
+ assert languageCode != null ;
187
+ if (languageCode .equals ("" )) {
188
+ // If current language code is empty, means none selected by user yet so use phone local
189
+ appUiLanguageListPreference .setValue (Locale .getDefault ().getLanguage ());
190
+ } else {
191
+ // If any language is selected by user previously, use it
192
+ appUiLanguageListPreference .setValue (languageCode );
193
+ }
194
+
195
+ appUiLanguageListPreference .setOnPreferenceChangeListener ((preference , newValue ) -> {
196
+ final String userSelectedValue = (String ) newValue ;
197
+ setLocale (Objects .requireNonNull (getActivity ()), userSelectedValue );
198
+ saveLanguageValue (userSelectedValue , keyListPreference );
199
+ getActivity ().recreate ();
200
+ final Intent intent = new Intent (getActivity (), MainActivity .class );
201
+ startActivity (intent );
202
+ return true ;
203
+ });
204
+
205
+ } else if (keyListPreference .equals ("descriptionDefaultLanguagePref" )) {
206
+ descriptionLanguageListPreference .setEntries (languageNames );
207
+ descriptionLanguageListPreference .setEntryValues (languageCodes );
208
+
209
+ assert languageCode != null ;
210
+ if (languageCode .equals ("" )) {
211
+ // If current language code is empty, means none selected by user yet so use phone local
212
+ descriptionLanguageListPreference .setValue (Locale .getDefault ().getLanguage ());
213
+ } else {
214
+ // If any language is selected by user previously, use it
215
+ descriptionLanguageListPreference .setValue (languageCode );
216
+ }
217
+
218
+ descriptionLanguageListPreference .setOnPreferenceChangeListener ((preference , newValue ) -> {
219
+ final String userSelectedValue = (String ) newValue ;
220
+ saveLanguageValue (userSelectedValue , keyListPreference );
221
+ return true ;
222
+ });
174
223
}
224
+ }
175
225
176
- langListPreference .setOnPreferenceChangeListener ((preference , newValue ) -> {
177
- String userSelectedValue = (String ) newValue ;
178
- saveLanguageValue (userSelectedValue );
179
- return true ;
180
- });
226
+ /**
227
+ * Changing the default app language with selected one and save it to SharedPreferences
228
+ */
229
+ public void setLocale (final Activity activity , final String userSelectedValue ) {
230
+ final Locale locale = new Locale (userSelectedValue );
231
+ Locale .setDefault (locale );
232
+ final Configuration configuration = new Configuration ();
233
+ configuration .locale = locale ;
234
+ activity .getBaseContext ().getResources ().updateConfiguration (configuration ,
235
+ activity .getBaseContext ().getResources ().getDisplayMetrics ());
236
+
237
+ final SharedPreferences .Editor editor = activity .getSharedPreferences ("Settings" , MODE_PRIVATE ).edit ();
238
+ editor .putString ("language" , userSelectedValue );
239
+ editor .apply ();
181
240
}
182
241
183
- private void saveLanguageValue (String userSelectedValue ) {
184
- defaultKvStore .putString (Prefs .KEY_LANGUAGE_VALUE , userSelectedValue );
242
+ /**
243
+ * Save userselected language in List Preference
244
+ * @param userSelectedValue
245
+ * @param preferenceKey
246
+ */
247
+ private void saveLanguageValue (final String userSelectedValue , final String preferenceKey ) {
248
+ if (preferenceKey .equals ("appUiDefaultLanguagePref" )) {
249
+ defaultKvStore .putString (Prefs .APP_UI_LANGUAGE , userSelectedValue );
250
+ } else if (preferenceKey .equals ("descriptionDefaultLanguagePref" )) {
251
+ defaultKvStore .putString (Prefs .DESCRIPTION_LANGUAGE , userSelectedValue );
252
+ }
185
253
}
186
254
187
- private String getCurrentLanguageCode () {
188
- return defaultKvStore .getString (Prefs .KEY_LANGUAGE_VALUE , "" );
255
+ /**
256
+ * Gets current language code from shared preferences
257
+ * @param preferenceKey
258
+ * @return
259
+ */
260
+ private String getCurrentLanguageCode (final String preferenceKey ) {
261
+ if (preferenceKey .equals ("appUiDefaultLanguagePref" )) {
262
+ return defaultKvStore .getString (Prefs .APP_UI_LANGUAGE , "" );
263
+ }
264
+ if (preferenceKey .equals ("descriptionDefaultLanguagePref" )) {
265
+ return defaultKvStore .getString (Prefs .DESCRIPTION_LANGUAGE , "" );
266
+ }
267
+ return null ;
189
268
}
190
269
191
270
/**
0 commit comments