Skip to content

Commit dd50e83

Browse files
neslihanturanmisaochan
authored andcommitted
Fixes previous PR - FIX commons-app#2918 Add option for default language for file descriptions (commons-app#3020)
* FIX commons-app#2918 Add option for default language for file descriptions * navigation menu error fixed and improvement of code quality * error language description default fixed * adapter language selected fixed * local language selected per default in description language * Use a better string and variable name as required in review 1 * Add comments * Add previously missing setValue methods so that list item will be chosen along with the summary * Add missing Javadocs * Fix capitalization * Lint and formatting issues * Rename methods so it's clearer they are to do with languages * Use default kv store instead of shared preferences variable * Make sure saved language code from settings activity is handled on init
1 parent 2837748 commit dd50e83

File tree

8 files changed

+150
-29
lines changed

8 files changed

+150
-29
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public class Prefs {
88
public static final String UPLOADS_SHOWING = "uploadsshowing";
99
public static final String IS_CONTRIBUTION_COUNT_CHANGED = "ccontributionCountChanged";
1010
public static final String MANAGED_EXIF_TAGS = "managedExifTags";
11+
public static final String KEY_LANGUAGE_VALUE = "languageDescription";
1112

1213
public static class Licenses {
1314
public static final String CC_BY_SA_3 = "CC BY-SA 3.0";

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

Lines changed: 78 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package fr.free.nrw.commons.settings;
22

33
import android.Manifest;
4+
import android.content.SharedPreferences;
45
import android.net.Uri;
56
import android.os.Bundle;
67
import android.preference.EditTextPreference;
78
import android.preference.MultiSelectListPreference;
9+
import android.preference.ListPreference;
810
import android.preference.Preference;
911
import android.preference.PreferenceFragment;
12+
import android.preference.PreferenceManager;
1013
import android.preference.SwitchPreference;
1114
import android.text.Editable;
1215
import android.text.TextWatcher;
@@ -15,10 +18,10 @@
1518
import com.karumi.dexter.listener.PermissionGrantedResponse;
1619
import com.karumi.dexter.listener.single.BasePermissionListener;
1720

18-
import java.util.Arrays;
1921
import java.util.Collections;
20-
import java.util.HashSet;
21-
import java.util.Set;
22+
import java.util.ArrayList;
23+
import java.util.List;
24+
import java.util.Locale;
2225

2326
import javax.inject.Inject;
2427
import javax.inject.Named;
@@ -30,6 +33,7 @@
3033
import fr.free.nrw.commons.logging.CommonsLogSender;
3134
import fr.free.nrw.commons.utils.PermissionUtils;
3235
import fr.free.nrw.commons.utils.ViewUtil;
36+
import fr.free.nrw.commons.upload.Language;
3337

3438
public class SettingsFragment extends PreferenceFragment {
3539

@@ -38,6 +42,7 @@ public class SettingsFragment extends PreferenceFragment {
3842
JsonKvStore defaultKvStore;
3943
@Inject
4044
CommonsLogSender commonsLogSender;
45+
private ListPreference listPreference;
4146

4247
@Override
4348
public void onCreate(Bundle savedInstanceState) {
@@ -108,6 +113,8 @@ public void afterTextChanged(Editable s) {
108113
}
109114
});
110115

116+
listPreference = (ListPreference) findPreference("descriptionDefaultLanguagePref");
117+
prepareLanguages();
111118
Preference betaTesterPreference = findPreference("becomeBetaTester");
112119
betaTesterPreference.setOnPreferenceClickListener(preference -> {
113120
Utils.handleWebUrl(getActivity(), Uri.parse(getResources().getString(R.string.beta_opt_in_link)));
@@ -133,6 +140,74 @@ public void afterTextChanged(Editable s) {
133140
}
134141
}
135142

143+
/**
144+
* Prepares language summary and language codes list and adds them to list preference as pairs.
145+
* Uses previously saved language if there is any, if not uses phone local as initial language.
146+
* Adds preference changed listener and saves value choosen by user to shared preferences
147+
* to remember later
148+
*/
149+
private void prepareLanguages() {
150+
List<String> languageNamesList = new ArrayList<>();
151+
List<String> languageCodesList = new ArrayList<>();
152+
List<Language> languages = getLanguagesSupportedByDevice();
153+
154+
for(Language language: languages) {
155+
// Go through all languages and add them to lists
156+
if(!languageCodesList.contains(language.getLocale().getLanguage())) {
157+
// This if prevents us from adding same language twice
158+
languageNamesList.add(language.getLocale().getDisplayName());
159+
languageCodesList.add(language.getLocale().getLanguage());
160+
}
161+
}
162+
163+
CharSequence[] languageNames = languageNamesList.toArray(new CharSequence[0]);
164+
CharSequence[] languageCodes = languageCodesList.toArray(new CharSequence[0]);
165+
// Add all languages and languages codes to lists preference as pair
166+
listPreference.setEntries(languageNames);
167+
listPreference.setEntryValues(languageCodes);
168+
169+
// Gets current language code from shared preferences
170+
String languageCode = getCurrentLanguageCode();
171+
if(languageCode.equals("")){
172+
// If current language code is empty, means none selected by user yet so use phone local
173+
listPreference.setSummary(Locale.getDefault().getDisplayLanguage());
174+
listPreference.setValue(Locale.getDefault().getLanguage());
175+
} else {
176+
// If any language is selected by user previously, use it
177+
int prefIndex = listPreference.findIndexOfValue(languageCode);
178+
listPreference.setSummary(listPreference.getEntries()[prefIndex]);
179+
listPreference.setValue(languageCode);
180+
}
181+
182+
listPreference.setOnPreferenceChangeListener((preference, newValue) -> {
183+
String userSelectedValue = (String) newValue;
184+
int prefIndex = listPreference.findIndexOfValue(userSelectedValue);
185+
listPreference.setSummary(listPreference.getEntries()[prefIndex]);
186+
saveLanguageValue(userSelectedValue);
187+
return true;
188+
});
189+
}
190+
191+
private void saveLanguageValue(String userSelectedValue) {
192+
defaultKvStore.putString(Prefs.KEY_LANGUAGE_VALUE, userSelectedValue);
193+
}
194+
195+
private String getCurrentLanguageCode() {
196+
return defaultKvStore.getString(Prefs.KEY_LANGUAGE_VALUE, "");
197+
}
198+
199+
private List<Language> getLanguagesSupportedByDevice() {
200+
List<Language> languages = new ArrayList<>();
201+
Locale[] localesArray = Locale.getAvailableLocales();
202+
for (Locale locale : localesArray) {
203+
languages.add(new Language(locale));
204+
}
205+
206+
Collections.sort(languages, (language, t1) -> language.getLocale().getDisplayName()
207+
.compareTo(t1.getLocale().getDisplayName()));
208+
return languages;
209+
}
210+
136211
/**
137212
* First checks for external storage permissions and then sends logs via email
138213
*/

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

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ public class DescriptionsAdapter extends RecyclerView.Adapter<DescriptionsAdapte
3232
private Callback callback;
3333

3434
private BiMap<AdapterView, String> selectedLanguages;
35+
private String savedLanguageValue;
3536

36-
public DescriptionsAdapter() {
37+
public DescriptionsAdapter(String savedLanguageValue) {
3738
descriptions = new ArrayList<>();
3839
selectedLanguages = new BiMap<>();
40+
this.savedLanguageValue = savedLanguageValue;
3941
}
4042

4143
public void setCallback(Callback callback) {
@@ -143,14 +145,15 @@ public void init(int position) {
143145
private void initLanguageSpinner(int position, Description description) {
144146
SpinnerLanguagesAdapter languagesAdapter = new SpinnerLanguagesAdapter(
145147
spinnerDescriptionLanguages.getContext(),
146-
R.layout.row_item_languages_spinner, selectedLanguages);
148+
R.layout.row_item_languages_spinner, selectedLanguages,
149+
savedLanguageValue);
147150
languagesAdapter.notifyDataSetChanged();
148151
spinnerDescriptionLanguages.setAdapter(languagesAdapter);
149152

150153
spinnerDescriptionLanguages.setOnItemSelectedListener(new OnItemSelectedListener() {
151154
@Override
152155
public void onItemSelected(AdapterView<?> adapterView, View view, int position,
153-
long l) {
156+
long l) {
154157
description.setSelectedLanguageIndex(position);
155158
String languageCode = ((SpinnerLanguagesAdapter) adapterView.getAdapter())
156159
.getLanguageCode(position);
@@ -159,22 +162,28 @@ public void onItemSelected(AdapterView<?> adapterView, View view, int position,
159162
selectedLanguages.put(adapterView, languageCode);
160163
((SpinnerLanguagesAdapter) adapterView
161164
.getAdapter()).selectedLangCode = languageCode;
165+
Timber.d("Description language code is: "+languageCode);
162166
}
163167

164168
@Override
165169
public void onNothingSelected(AdapterView<?> adapterView) {
166-
167170
}
168171
});
169172

170173
if (description.getSelectedLanguageIndex() == -1) {
171-
if (position == 0) {
172-
int defaultLocaleIndex = languagesAdapter
173-
.getIndexOfUserDefaultLocale(spinnerDescriptionLanguages.getContext());
174-
spinnerDescriptionLanguages.setSelection(defaultLocaleIndex, true);
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));
175177
} else {
176-
spinnerDescriptionLanguages.setSelection(0);
178+
if (position == 0) {
179+
int defaultLocaleIndex = languagesAdapter
180+
.getIndexOfUserDefaultLocale(spinnerDescriptionLanguages.getContext());
181+
spinnerDescriptionLanguages.setSelection(defaultLocaleIndex, true);
182+
} else {
183+
spinnerDescriptionLanguages.setSelection(0);
184+
}
177185
}
186+
178187
} else {
179188
spinnerDescriptionLanguages.setSelection(description.getSelectedLanguageIndex());
180189
selectedLanguages.put(spinnerDescriptionLanguages, description.getLanguageCode());

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import java.util.Locale;
44

5-
class Language {
5+
public class Language {
66
private Locale locale;
77
private boolean isSet = false;
88

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

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

33
import android.content.Context;
4+
import android.content.SharedPreferences;
45
import android.graphics.Color;
6+
import android.preference.PreferenceManager;
57
import android.view.LayoutInflater;
68
import android.view.View;
79
import android.view.ViewGroup;
@@ -16,15 +18,16 @@
1618

1719
import androidx.annotation.NonNull;
1820
import androidx.annotation.Nullable;
21+
22+
import org.apache.commons.lang3.StringUtils;
23+
1924
import butterknife.BindView;
2025
import butterknife.ButterKnife;
2126
import fr.free.nrw.commons.R;
27+
import fr.free.nrw.commons.settings.Prefs;
2228
import fr.free.nrw.commons.utils.BiMap;
2329
import fr.free.nrw.commons.utils.LangCodeUtils;
24-
import java.util.ArrayList;
25-
import java.util.Collections;
26-
import java.util.List;
27-
import java.util.Locale;
30+
2831

2932
public class SpinnerLanguagesAdapter extends ArrayAdapter {
3033

@@ -34,18 +37,26 @@ public class SpinnerLanguagesAdapter extends ArrayAdapter {
3437
private List<String> languageCodesList;
3538
private final BiMap<AdapterView, String> selectedLanguages;
3639
public String selectedLangCode="";
40+
private Context context;
41+
private boolean dropDownClicked;
42+
private String savedLanguageValue;
3743

3844

3945

4046
public SpinnerLanguagesAdapter(@NonNull Context context,
41-
int resource, BiMap<AdapterView, String> selectedLanguages) {
47+
int resource,
48+
BiMap<AdapterView, String> selectedLanguages,
49+
String savedLanguageValue) {
4250
super(context, resource);
4351
this.resource = resource;
4452
this.layoutInflater = LayoutInflater.from(context);
4553
languageNamesList = new ArrayList<>();
4654
languageCodesList = new ArrayList<>();
4755
prepareLanguages();
4856
this.selectedLanguages = selectedLanguages;
57+
this.context = context;
58+
this.dropDownClicked = false;
59+
this.savedLanguageValue = savedLanguageValue;
4960
}
5061

5162
private void prepareLanguages() {
@@ -90,7 +101,9 @@ public View getDropDownView(int position, @Nullable View convertView,
90101
convertView = layoutInflater.inflate(resource, parent, false);
91102
}
92103
ViewHolder holder = new ViewHolder(convertView);
93-
holder.init(position, true);
104+
holder.init(position, true, savedLanguageValue);
105+
106+
dropDownClicked = true;
94107
return convertView;
95108
}
96109

@@ -105,7 +118,7 @@ View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent
105118
} else {
106119
holder = (ViewHolder) convertView.getTag();
107120
}
108-
holder.init(position, false);
121+
holder.init(position, false, savedLanguageValue);
109122
return convertView;
110123
}
111124

@@ -122,17 +135,23 @@ public ViewHolder(View itemView) {
122135
ButterKnife.bind(this, itemView);
123136
}
124137

125-
public void init(int position, boolean isDropDownView) {
126-
final String languageCode = LangCodeUtils.fixLanguageCode(languageCodesList.get(position));
127-
final String languageName = String.format("%s%s", languageNamesList.get(position)
128-
.substring(0, 1).toUpperCase(), languageNamesList.get(position).substring(1));
138+
public void init(int position, boolean isDropDownView, String savedLanguageValue) {
139+
String languageCode = LangCodeUtils.fixLanguageCode(languageCodesList.get(position));
140+
final String languageName = StringUtils.capitalize(languageNamesList.get(position));
141+
142+
if(savedLanguageValue.equals("")){
143+
savedLanguageValue = Locale.getDefault().getLanguage();
144+
}
145+
129146
if (!isDropDownView) {
147+
if( !dropDownClicked){
148+
languageCode = LangCodeUtils.fixLanguageCode(savedLanguageValue);
149+
}
130150
view.setVisibility(View.GONE);
131-
if(languageCode.length()>2)
132-
tvLanguage.setText(languageCode.subSequence(0,2));
151+
if (languageCode.length() > 2)
152+
tvLanguage.setText(languageCode.substring(0, 2));
133153
else
134154
tvLanguage.setText(languageCode);
135-
136155
} else {
137156
view.setVisibility(View.VISIBLE);
138157
if (languageCodesList.get(position).isEmpty()) {
@@ -141,7 +160,7 @@ public void init(int position, boolean isDropDownView) {
141160
} else {
142161
tvLanguage.setText(
143162
String.format("%s [%s]", languageName, languageCode));
144-
if(selectedLanguages.containsKey(languageCodesList.get(position))&&
163+
if (selectedLanguages.containsKey(languageCodesList.get(position)) &&
145164
!languageCodesList.get(position).equals(selectedLangCode)) {
146165
tvLanguage.setTextColor(Color.GRAY);
147166
}
@@ -158,4 +177,7 @@ int getIndexOfUserDefaultLocale(Context context) {
158177
return languageCodesList.indexOf(context.getResources().getConfiguration().locale.getLanguage());
159178
}
160179

180+
int getIndexOfLanguageCode(String languageCode) {
181+
return languageCodesList.indexOf(languageCode);
182+
}
161183
}

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,18 @@
3232
import java.util.Locale;
3333

3434
import javax.inject.Inject;
35+
import javax.inject.Named;
3536

3637
import butterknife.BindView;
3738
import butterknife.ButterKnife;
3839
import butterknife.OnClick;
3940
import fr.free.nrw.commons.R;
4041
import fr.free.nrw.commons.Utils;
4142
import fr.free.nrw.commons.filepicker.UploadableFile;
43+
import fr.free.nrw.commons.kvstore.JsonKvStore;
4244
import fr.free.nrw.commons.location.LatLng;
4345
import fr.free.nrw.commons.nearby.Place;
46+
import fr.free.nrw.commons.settings.Prefs;
4447
import fr.free.nrw.commons.upload.Description;
4548
import fr.free.nrw.commons.upload.DescriptionsAdapter;
4649
import fr.free.nrw.commons.upload.SimilarImageDialogFragment;
@@ -86,6 +89,11 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
8689

8790
@Inject
8891
UploadMediaDetailsContract.UserActionListener presenter;
92+
93+
@Inject
94+
@Named("default_preferences")
95+
JsonKvStore defaultKvStore;
96+
8997
private UploadableFile uploadableFile;
9098
private String source;
9199
private Place place;
@@ -214,7 +222,7 @@ private void initPresenter() {
214222
* init the recycler veiw
215223
*/
216224
private void initRecyclerView() {
217-
descriptionsAdapter = new DescriptionsAdapter();
225+
descriptionsAdapter = new DescriptionsAdapter(defaultKvStore.getString(Prefs.KEY_LANGUAGE_VALUE,""));
218226
descriptionsAdapter.setCallback(this::showInfoAlert);
219227
rvDescriptions.setLayoutManager(new LinearLayoutManager(getContext()));
220228
rvDescriptions.setAdapter(descriptionsAdapter);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,4 +558,5 @@ Upload your first media by tapping on the add button.</string>
558558
<string name="upload_cancelled">Cancelled Upload</string>
559559
<string name="previous_image_title_description_not_found">There is no data for previous image\'s title or description</string>
560560
<string name="dialog_box_text_nomination">Why should %1$s be deleted?</string>
561+
<string name="default_description_language">Default description language</string>
561562
</resources>

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@
2929
android:inputType="number"
3030
android:maxLength="3" />
3131

32+
<fr.free.nrw.commons.ui.LongTitlePreferences.LongTitleListPreference
33+
android:key="descriptionDefaultLanguagePref"
34+
android:title= "@string/default_description_language"
35+
android:summary="English" />
36+
3237
<fr.free.nrw.commons.ui.LongTitlePreferences.LongTitleSwitchPreference
3338
android:key="useAuthorName"
3439
android:title="@string/preference_author_name_toggle"

0 commit comments

Comments
 (0)