mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 12:23:58 +01:00
Merge remote-tracking branch 'origin/2.11-release'
This commit is contained in:
commit
1a60fec5da
9 changed files with 96 additions and 17 deletions
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue