Skip to content

Commit 71b68d3

Browse files
Ayan-10ashishkumar468
authored andcommitted
Made locale non dependent on phone OS settings, but choosable on app settings (commons-app#4366)
* setLocale added * localization added * test complete * resolved conflicts * issues resolved * minor issues fixed * Made methods concise * Issues fixed
1 parent a2582af commit 71b68d3

File tree

6 files changed

+138
-39
lines changed

6 files changed

+138
-39
lines changed

app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package fr.free.nrw.commons.contributions;
22

3+
import android.app.Activity;
34
import android.content.Context;
45
import android.content.Intent;
6+
import android.content.SharedPreferences;
57
import android.os.Build.VERSION;
68
import android.os.Build.VERSION_CODES;
79
import android.os.Bundle;
@@ -37,6 +39,7 @@
3739
import fr.free.nrw.commons.notification.NotificationActivity;
3840
import fr.free.nrw.commons.notification.NotificationController;
3941
import fr.free.nrw.commons.quiz.QuizChecker;
42+
import fr.free.nrw.commons.settings.SettingsFragment;
4043
import fr.free.nrw.commons.theme.BaseActivity;
4144
import fr.free.nrw.commons.upload.worker.UploadWorker;
4245
import fr.free.nrw.commons.utils.ViewUtilWrapper;
@@ -107,6 +110,7 @@ public boolean onSupportNavigateUp() {
107110
@Override
108111
public void onCreate(Bundle savedInstanceState) {
109112
super.onCreate(savedInstanceState);
113+
loadLocale();
110114
setContentView(R.layout.main);
111115
ButterKnife.bind(this);
112116
setSupportActionBar(toolbar);
@@ -365,4 +369,14 @@ public enum ActiveFragment {
365369
BOOKMARK,
366370
MORE
367371
}
372+
373+
/**
374+
* Load default language in onCreate from SharedPreferences
375+
*/
376+
private void loadLocale(){
377+
final SharedPreferences preferences = getSharedPreferences("Settings", Activity.MODE_PRIVATE);
378+
final String language = preferences.getString("language", "");
379+
final SettingsFragment settingsFragment = new SettingsFragment();
380+
settingsFragment.setLocale(this, language);
381+
}
368382
}

app/src/main/java/fr/free/nrw/commons/settings/Prefs.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ public class Prefs {
77
public static final String DEFAULT_LICENSE = "defaultLicense";
88
public static final String UPLOADS_SHOWING = "uploadsshowing";
99
public static final String MANAGED_EXIF_TAGS = "managed_exif_tags";
10-
public static final String KEY_LANGUAGE_VALUE = "languageDescription";
10+
public static final String DESCRIPTION_LANGUAGE = "descriptionLanguage";
11+
public static final String APP_UI_LANGUAGE = "appUiLanguage";
1112
public static final String KEY_THEME_VALUE = "appThemePref";
1213
public static final String TELEMETRY_PREFERENCE = "telemetryPref";
1314

app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java

Lines changed: 114 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
package fr.free.nrw.commons.settings;
22

3+
import static android.content.Context.MODE_PRIVATE;
4+
35
import android.Manifest;
6+
import android.app.Activity;
7+
import android.content.Intent;
8+
import android.content.SharedPreferences;
9+
import android.content.res.Configuration;
410
import android.net.Uri;
511
import android.os.Bundle;
6-
import android.text.InputFilter;
7-
import android.text.InputType;
8-
import androidx.preference.EditTextPreference;
912
import android.view.View;
1013
import androidx.preference.ListPreference;
1114
import androidx.preference.MultiSelectListPreference;
1215
import androidx.preference.Preference;
1316
import androidx.preference.PreferenceFragmentCompat;
14-
import com.google.android.material.snackbar.Snackbar;
1517
import androidx.preference.PreferenceGroupAdapter;
1618
import androidx.preference.PreferenceScreen;
1719
import androidx.preference.PreferenceViewHolder;
@@ -23,17 +25,17 @@
2325
import com.mapbox.mapboxsdk.maps.TelemetryDefinition;
2426
import fr.free.nrw.commons.R;
2527
import fr.free.nrw.commons.Utils;
28+
import fr.free.nrw.commons.contributions.MainActivity;
2629
import fr.free.nrw.commons.di.ApplicationlessInjection;
2730
import fr.free.nrw.commons.kvstore.JsonKvStore;
2831
import fr.free.nrw.commons.logging.CommonsLogSender;
29-
import fr.free.nrw.commons.upload.Language;
3032
import fr.free.nrw.commons.utils.PermissionUtils;
3133
import fr.free.nrw.commons.utils.ViewUtil;
3234
import java.util.ArrayList;
33-
import java.util.Collections;
3435
import java.util.HashSet;
3536
import java.util.List;
3637
import java.util.Locale;
38+
import java.util.Objects;
3739
import javax.inject.Inject;
3840
import javax.inject.Named;
3941
import org.wikipedia.language.AppLanguageLookUpTable;
@@ -48,7 +50,9 @@ public class SettingsFragment extends PreferenceFragmentCompat {
4850
CommonsLogSender commonsLogSender;
4951

5052
private ListPreference themeListPreference;
51-
private ListPreference langListPreference;
53+
private ListPreference descriptionLanguageListPreference;
54+
private ListPreference appUiLanguageListPreference;
55+
private String keyLanguageListPreference;
5256

5357
@Override
5458
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
@@ -73,8 +77,16 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
7377
});
7478
}
7579

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+
7890
Preference betaTesterPreference = findPreference("becomeBetaTester");
7991
betaTesterPreference.setOnPreferenceClickListener(preference -> {
8092
Utils.handleWebUrl(getActivity(), Uri.parse(getResources().getString(R.string.beta_opt_in_link)));
@@ -141,14 +153,17 @@ private void prepareTheme() {
141153

142154
/**
143155
* 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.
145158
* 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
147161
*/
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()));
152167
languageNamesList = appLanguageLookUpTable.getLocalizedNames();
153168
languageCodesList = appLanguageLookUpTable.getCodes();
154169
List<String> languageNameWithCodeList = new ArrayList<>();
@@ -157,35 +172,99 @@ private void prepareLanguages() {
157172
languageNameWithCodeList.add(languageNamesList.get(i) + "[" + languageCodesList.get(i) + "]");
158173
}
159174

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]);
162177
// Add all languages and languages codes to lists preference as pair
163-
langListPreference.setEntries(languageNames);
164-
langListPreference.setEntryValues(languageCodes);
165178

166179
// 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+
});
174223
}
224+
}
175225

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();
181240
}
182241

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+
}
185253
}
186254

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;
189268
}
190269

191270
/**

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@
3939
import fr.free.nrw.commons.utils.DialogUtil;
4040
import fr.free.nrw.commons.utils.ImageUtils;
4141
import fr.free.nrw.commons.utils.ViewUtil;
42-
import java.util.ArrayList;
43-
import java.util.Arrays;
4442
import java.util.List;
4543
import java.util.Locale;
4644
import javax.inject.Inject;
@@ -182,7 +180,7 @@ private void initPresenter() {
182180
* init the description recycler veiw and caption recyclerview
183181
*/
184182
private void initRecyclerView() {
185-
uploadMediaDetailAdapter = new UploadMediaDetailAdapter(defaultKvStore.getString(Prefs.KEY_LANGUAGE_VALUE, ""));
183+
uploadMediaDetailAdapter = new UploadMediaDetailAdapter(defaultKvStore.getString(Prefs.DESCRIPTION_LANGUAGE, ""));
186184
uploadMediaDetailAdapter.setCallback(this::showInfoAlert);
187185
uploadMediaDetailAdapter.setEventListener(this);
188186
rvDescriptions.setLayoutManager(new LinearLayoutManager(getContext()));

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,7 @@ Upload your first media by tapping on the add button.</string>
610610
<string name="media_detail_step_title">Media Details</string>
611611
<string name="menu_view_category_page">View category page</string>
612612
<string name="menu_view_item_page">View item page</string>
613+
<string name="app_ui_language">App user interface language</string>
613614
<string name="remove">Removes a caption and description</string>
614615
<string name="read_help_link">Read more</string>
615616

app/src/main/res/xml/preferences.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@
2626
android:summary="@string/use_external_storage_summary"
2727
android:title="@string/use_external_storage" />
2828

29+
<ListPreference
30+
android:key="appUiDefaultLanguagePref"
31+
app:useSimpleSummaryProvider="true"
32+
app:singleLineTitle="false"
33+
android:title="@string/app_ui_language" />
34+
2935
<ListPreference
3036
android:key="descriptionDefaultLanguagePref"
3137
app:useSimpleSummaryProvider="true"

0 commit comments

Comments
 (0)