Merge remote-tracking branch 'origin/2.11-release'

This commit is contained in:
Josephine Lim 2019-07-22 00:12:21 +10:00
commit 1a60fec5da
9 changed files with 96 additions and 17 deletions

View file

@ -48,8 +48,21 @@ public class CategoriesModel{
*/
public Comparator<CategoryItem> sortBySimilarity(final String filter) {
Comparator<String> stringSimilarityComparator = StringSortingUtils.sortBySimilarity(filter);
return (firstItem, secondItem) -> stringSimilarityComparator
.compare(firstItem.getName(), secondItem.getName());
return (firstItem, secondItem) -> {
//if the category is selected, it should get precedence
if (null != firstItem && firstItem.isSelected()) {
if (null != secondItem && secondItem.isSelected()) {
return stringSimilarityComparator
.compare(firstItem.getName(), secondItem.getName());
}
return -1;
}
if (null != secondItem && secondItem.isSelected()) {
return 1;
}
return stringSimilarityComparator
.compare(firstItem.getName(), secondItem.getName());
};
}
/**
@ -255,4 +268,38 @@ public class CategoriesModel{
this.categoriesCache.clear();
this.selectedCategories.clear();
}
/**
* Search for categories
*/
public Observable<CategoryItem> searchCategories(String query, List<String> imageTitleList) {
if (TextUtils.isEmpty(query)) {
return gpsCategories()
.concatWith(titleCategories(imageTitleList))
.concatWith(recentCategories());
}
return mwApi
.searchCategories(query, SEARCH_CATS_LIMIT)
.map(s -> new CategoryItem(s, false));
}
/**
* Returns default categories
*/
public Observable<CategoryItem> getDefaultCategories(List<String> titleList) {
Observable<CategoryItem> directCategories = directCategories();
if (hasDirectCategories()) {
Timber.d("Image has direct Categories");
return directCategories
.concatWith(gpsCategories())
.concatWith(titleCategories(titleList))
.concatWith(recentCategories());
} else {
Timber.d("Image has no direct Categories");
return gpsCategories()
.concatWith(titleCategories(titleList))
.concatWith(recentCategories());
}
}
}

View file

@ -11,10 +11,8 @@ import fr.free.nrw.commons.upload.UploadModel;
import fr.free.nrw.commons.upload.UploadModel.UploadItem;
import io.reactivex.Observable;
import io.reactivex.Single;
import java.util.Comparator;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -167,7 +165,7 @@ public class UploadRemoteDataSource {
}
/**
* ask the UplaodModel for the image quality of the UploadItem
* ask the UploadModel for the image quality of the UploadItem
*
* @param uploadItem
* @param shouldValidateTitle
@ -176,4 +174,21 @@ public class UploadRemoteDataSource {
public Single<Integer> getImageQuality(UploadItem uploadItem, boolean shouldValidateTitle) {
return uploadModel.getImageQuality(uploadItem, shouldValidateTitle);
}
/**
* Ask the CategoriesModel to search categories
* @param query
* @param imageTitleList
* @return
*/
public Observable<CategoryItem> searchCategories(String query, List<String> imageTitleList) {
return categoriesModel.searchCategories(query, imageTitleList);
}
/**
* Ask the CategoriesModel for default categories
*/
public Observable<CategoryItem> getDefaultCategories(List<String> imageTitleList) {
return categoriesModel.getDefaultCategories(imageTitleList);
}
}

View file

@ -8,10 +8,8 @@ import fr.free.nrw.commons.upload.SimilarImageInterface;
import fr.free.nrw.commons.upload.UploadModel.UploadItem;
import io.reactivex.Observable;
import io.reactivex.Single;
import java.util.Comparator;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -262,4 +260,18 @@ public class UploadRepository {
public void setSelectedLicense(String licenseName) {
localDataSource.setSelectedLicense(licenseName);
}
/**
* Ask the RemoteDataSource to search for categories
*/
public Observable<CategoryItem> searchCategories(String query, List<String> imageTitleList) {
return remoteDataSource.searchCategories(query, imageTitleList);
}
/**
* Ask the RemoteDataSource to get default categories
*/
public Observable<CategoryItem> getDefaultCategories(List<String> imageTitleList) {
return remoteDataSource.getDefaultCategories(imageTitleList);
}
}

View file

@ -1,15 +1,12 @@
package fr.free.nrw.commons.settings;
import android.Manifest;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.MultiSelectListPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.preference.SwitchPreference;
import android.text.Editable;
import android.text.TextWatcher;
@ -31,6 +28,7 @@ import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.di.ApplicationlessInjection;
import fr.free.nrw.commons.kvstore.JsonKvStore;
import fr.free.nrw.commons.logging.CommonsLogSender;
import fr.free.nrw.commons.ui.LongTitlePreferences.LongTitleMultiSelectListPreference;
import fr.free.nrw.commons.utils.PermissionUtils;
import fr.free.nrw.commons.utils.ViewUtil;
import fr.free.nrw.commons.upload.Language;
@ -70,8 +68,9 @@ public class SettingsFragment extends PreferenceFragment {
return true;
});
MultiSelectListPreference multiSelectListPref = (MultiSelectListPreference) findPreference("manageExifTags");
LongTitleMultiSelectListPreference multiSelectListPref = (LongTitleMultiSelectListPreference) findPreference("manageExifTags");
if (multiSelectListPref != null) {
defaultKvStore.putJson(Prefs.MANAGED_EXIF_TAGS, multiSelectListPref.getValues());
multiSelectListPref.setOnPreferenceChangeListener((preference, newValue) -> {
defaultKvStore.putJson(Prefs.MANAGED_EXIF_TAGS, newValue);
return true;

View file

@ -105,13 +105,13 @@ public class FileProcessor implements Callback {
*/
private Set<String> getExifTagsToRedact(Context context) {
Type setType = new TypeToken<Set<String>>() {}.getType();
Set<String> prefManageEXIFTags = defaultKvStore.getJson(Prefs.MANAGED_EXIF_TAGS, setType);
Set<String> selectedExifTags = defaultKvStore.getJson(Prefs.MANAGED_EXIF_TAGS, setType);
Set<String> redactTags = new HashSet<>(Arrays.asList(
context.getResources().getStringArray(R.array.pref_exifTag_values)));
Timber.d(redactTags.toString());
if (prefManageEXIFTags != null) redactTags.removeAll(prefManageEXIFTags);
if (selectedExifTags != null) redactTags.removeAll(selectedExifTags);
else redactTags.clear();
return redactTags;
}

View file

@ -80,6 +80,9 @@ public class CategoriesPresenter implements CategoriesContract.UserActionListene
.observeOn(ioScheduler)
.concatWith(
repository.searchAll(query, imageTitleList)
.mergeWith(repository.searchCategories(query, imageTitleList))
.concatWith(TextUtils.isEmpty(query) ? repository
.getDefaultCategories(imageTitleList) : Observable.empty())
)
.filter(categoryItem -> !repository.containsYear(categoryItem.getName()))
.distinct();

View file

@ -89,7 +89,7 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
@Override
public void onResume() {
super.onResume();
if (presenter != null && isVisible && (categories == null || categories.isEmpty())) {
if (presenter != null && isVisible) {
presenter.searchForCategories(null);
}
}
@ -193,7 +193,7 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
super.setUserVisibleHint(isVisibleToUser);
isVisible = isVisibleToUser;
if (presenter != null && isResumed() && (categories == null || categories.isEmpty())) {
if (presenter != null && isResumed()) {
presenter.searchForCategories(null);
}
}

View file

@ -70,6 +70,7 @@
<fr.free.nrw.commons.ui.LongTitlePreferences.LongTitleMultiSelectListPreference
android:entries="@array/pref_exifTag_entries"
android:entryValues="@array/pref_exifTag_values"
android:defaultValue="@array/pref_exifTag_values"
android:key="manageExifTags"
android:title="@string/manage_exif_tags"
android:summary="@string/manage_exif_tags_summary"/>

View file

@ -57,7 +57,9 @@ class CategoriesPresenterTest {
fun searchForCategoriesTest() {
Mockito.`when`(repository?.sortBySimilarity(ArgumentMatchers.anyString())).thenReturn(Comparator<CategoryItem> { _, _ -> 1 })
Mockito.`when`(repository?.selectedCategories).thenReturn(categoryItems)
Mockito.`when`(repository?.searchAll(ArgumentMatchers.anyString(), ArgumentMatchers.anyList())).thenReturn(Observable.empty())
Mockito.`when`(repository?.searchAll(ArgumentMatchers.anyString(), ArgumentMatchers.anyList())).thenReturn(testObservable)
Mockito.`when`(repository?.searchCategories(ArgumentMatchers.anyString(), ArgumentMatchers.anyList())).thenReturn(testObservable)
Mockito.`when`(repository?.getDefaultCategories(ArgumentMatchers.anyList())).thenReturn(testObservable)
categoriesPresenter?.searchForCategories("test")
verify(view)?.showProgress(true)
verify(view)?.showError(null)