Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bugfix/uploads #3002

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 12 additions & 45 deletions app/src/main/java/fr/free/nrw/commons/category/CategoriesModel.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,19 @@
package fr.free.nrw.commons.category;

import android.text.TextUtils;

import fr.free.nrw.commons.kvstore.JsonKvStore;
import fr.free.nrw.commons.mwapi.MediaWikiApi;
import fr.free.nrw.commons.upload.GpsCategoryModel;
import fr.free.nrw.commons.utils.StringSortingUtils;
import io.reactivex.Observable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;

import fr.free.nrw.commons.kvstore.JsonKvStore;
import fr.free.nrw.commons.mwapi.MediaWikiApi;
import fr.free.nrw.commons.upload.GpsCategoryModel;
import fr.free.nrw.commons.utils.StringSortingUtils;
import io.reactivex.Observable;
import timber.log.Timber;

/**
Expand Down Expand Up @@ -107,11 +104,14 @@ boolean cacheContainsKey(String term) {
* @return
*/
public Observable<CategoryItem> searchAll(String term, List<String> imageTitleList) {
//If user hasn't typed anything in yet, get GPS and recent items
//If query text is empty, show him category based on gps and title and recent searches
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO, the category suggestion should be shown even if query text is not empty

if (TextUtils.isEmpty(term)) {
return gpsCategories()
.concatWith(titleCategories(imageTitleList))
.concatWith(recentCategories());
Observable<CategoryItem> categoryItemObservable = gpsCategories()
.concatWith(titleCategories(imageTitleList));
if (hasDirectCategories()) {
categoryItemObservable.concatWith(directCategories().concatWith(recentCategories()));
}
return categoryItemObservable;
}

//if user types in something that is in cache, return cached category
Expand All @@ -126,18 +126,6 @@ public Observable<CategoryItem> searchAll(String term, List<String> imageTitleLi
.map(name -> new CategoryItem(name, false));
}

public Observable<CategoryItem> searchCategories(String term, List<String> imageTitleList) {
//If user hasn't typed anything in yet, get GPS and recent items
if (TextUtils.isEmpty(term)) {
return gpsCategories()
.concatWith(titleCategories(imageTitleList))
.concatWith(recentCategories());
}

return mwApi
.searchCategories(term, SEARCH_CATS_LIMIT)
.map(s -> new CategoryItem(s, false));
}

/**
* Returns cached categories
Expand All @@ -148,27 +136,6 @@ private ArrayList<String> getCachedCategories(String term) {
return categoriesCache.get(term);
}

/**
* Returns default categories
* @param titleList
* @return
*/
public Observable<CategoryItem> defaultCategories(List<String> titleList) {
Observable<CategoryItem> directCat = directCategories();
if (hasDirectCategories()) {
Timber.d("Image has direct Cat");
return directCat
.concatWith(gpsCategories())
.concatWith(titleCategories(titleList))
.concatWith(recentCategories());
} else {
Timber.d("Image has no direct Cat");
return gpsCategories()
.concatWith(titleCategories(titleList))
.concatWith(recentCategories());
}
}

/**
* Returns if we have a category in DirectKV Store
* @return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,27 +105,6 @@ public Observable<CategoryItem> searchAll(String query, List<String> imageTitleL
return categoriesModel.searchAll(query, imageTitleList);
}

/**
* searchCategories from MWApi
*
* @param query
* @param imageTitleList
* @return
*/
public Observable<CategoryItem> searchCategories(String query, List<String> imageTitleList) {
return categoriesModel.searchCategories(query, imageTitleList);
}

/**
* returns the list of default categoies
*
* @param imageTitleList
* @return
*/
public Observable<CategoryItem> defaultCategories(List<String> imageTitleList) {
return categoriesModel.defaultCategories(imageTitleList);
}

/**
* returns the string list of categories
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,27 +93,6 @@ public Observable<CategoryItem> searchAll(String query, List<String> imageTitleL
return remoteDataSource.searchAll(query, imageTitleList);
}

/**
* searchCategories from MWApi
*
* @param query
* @param imageTitleList
* @return
*/
public Observable<CategoryItem> searchCategories(String query, List<String> imageTitleList) {
return remoteDataSource.searchCategories(query, imageTitleList);
}

/**
* returns the default categorories for the list of images based on their titles
*
* @param imageTitleList
* @return
*/
public Observable<CategoryItem> defaultCategories(List<String> imageTitleList) {
return remoteDataSource.defaultCategories(imageTitleList);
}

/**
* returns the string list of categories
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,6 @@ public int getTotalNumberOfSteps() {
}

uploadCategoriesFragment = new UploadCategoriesFragment();
uploadCategoriesFragment.setMediaTitleList(presenter.getImageTitleList());
uploadCategoriesFragment.setCallback(this);

mediaLicenseFragment = new MediaLicenseFragment();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,6 @@ public interface UserActionListener extends BasePresenter<View> {

void handleSubmit();

List<String> getImageTitleList();

void deletePictureAtIndex(int index);
}
}
10 changes: 0 additions & 10 deletions app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.java
Original file line number Diff line number Diff line change
Expand Up @@ -86,16 +86,6 @@ public void onComplete() {
}
}

public List<String> getImageTitleList() {
List<String> titleList = new ArrayList<>();
for (UploadItem item : repository.getUploads()) {
if (item.getTitle().isSet()) {
titleList.add(item.getTitle().toString());
}
}
return titleList;
}

@Override
public void deletePictureAtIndex(int index) {
List<UploadableFile> uploadableFiles = view.getUploadableFiles();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package fr.free.nrw.commons.upload.categories;

import fr.free.nrw.commons.BasePresenter;
import fr.free.nrw.commons.category.CategoryClickedListener;
import fr.free.nrw.commons.category.CategoryItem;

import java.util.List;
Expand Down Expand Up @@ -32,7 +31,7 @@ public interface View {

public interface UserActionListener extends BasePresenter<View> {

void searchForCategories(String query, List<String> imageTitleList);
void searchForCategories(String query);

void verifyCategories();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,20 @@
import static fr.free.nrw.commons.di.CommonsApplicationModule.MAIN_THREAD;

import android.text.TextUtils;

import fr.free.nrw.commons.R;
import fr.free.nrw.commons.category.CategoryItem;
import fr.free.nrw.commons.repository.UploadRepository;
import fr.free.nrw.commons.upload.UploadModel.UploadItem;
import io.reactivex.Observable;
import io.reactivex.Scheduler;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;

import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;

import timber.log.Timber;

/**
Expand Down Expand Up @@ -64,14 +61,14 @@ public void onDetachView() {

/**
* asks the repository to fetch categories for the query
* @param query
*
* @param query
* @param imageTitleList
*/
@Override
public void searchForCategories(String query, List<String> imageTitleList) {
public void searchForCategories(String query) {
List<CategoryItem> categoryItems = new ArrayList<>();
Disposable searchCategoriesDisposable = Observable
List<String> imageTitleList = getImageTitleList();
Observable<CategoryItem> distinctCategoriesObservable = Observable
.fromIterable(repository.getSelectedCategories())
.subscribeOn(ioScheduler)
.observeOn(mainThreadScheduler)
Expand All @@ -83,14 +80,13 @@ public void searchForCategories(String query, List<String> imageTitleList) {
.observeOn(ioScheduler)
.concatWith(
repository.searchAll(query, imageTitleList)
.mergeWith(repository.searchCategories(query, imageTitleList))
.concatWith(TextUtils.isEmpty(query)
? repository.defaultCategories(imageTitleList)
: Observable.empty())
)
.filter(categoryItem -> !repository.containsYear(categoryItem.getName()))
.distinct()
.sorted(repository.sortBySimilarity(query))
.distinct();
if(!TextUtils.isEmpty(query)) {
distinctCategoriesObservable=distinctCategoriesObservable.sorted(repository.sortBySimilarity(query));
}
Disposable searchCategoriesDisposable = distinctCategoriesObservable
.observeOn(mainThreadScheduler)
.subscribe(
s -> categoryItems.add(s),
Expand All @@ -108,6 +104,20 @@ public void searchForCategories(String query, List<String> imageTitleList) {
compositeDisposable.add(searchCategoriesDisposable);
}

/**
* Returns image title list from UploadItem
* @return
*/
private List<String> getImageTitleList() {
List<String> titleList = new ArrayList<>();
for (UploadItem item : repository.getUploads()) {
if (item.getTitle().isSet()) {
titleList.add(item.getTitle().toString());
}
}
return titleList;
}

/**
* Verifies the number of categories selected, prompts the user if none selected
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,10 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
@Inject
CategoriesContract.UserActionListener presenter;
private RVRendererAdapter<CategoryItem> adapter;
private List<String> mediaTitleList;
private List<String> mediaTitleList=new ArrayList<>();
private Disposable subscribe;
private List<CategoryItem> categories;
private boolean isVisible;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
Expand Down Expand Up @@ -82,7 +84,14 @@ private void init() {
initRecyclerView();
addTextChangeListenerToEtSearch();
//get default categories for empty query
presenter.searchForCategories(null,mediaTitleList);
}

@Override
public void onResume() {
super.onResume();
if (presenter != null && isVisible && (categories == null || categories.isEmpty())) {
presenter.searchForCategories(null);
}
}

private void addTextChangeListenerToEtSearch() {
Expand All @@ -95,7 +104,7 @@ private void addTextChangeListenerToEtSearch() {
}

private void searchForCategory(String query) {
presenter.searchForCategories(query, mediaTitleList);
presenter.searchForCategories(query);
}

private void initRecyclerView() {
Expand Down Expand Up @@ -130,8 +139,8 @@ public void showError(int stringResourceId) {
@Override
public void setCategories(List<CategoryItem> categories) {
adapter.clear();
if (categories == null) {
} else {
if (categories != null) {
this.categories = categories;
adapter.addAll(categories);
adapter.notifyDataSetChanged();
}
Expand Down Expand Up @@ -178,4 +187,14 @@ public void onPreviousButtonClicked() {
public void categoryClicked(CategoryItem item) {
presenter.onCategoryItemClicked(item);
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isVisible = isVisibleToUser;

if (presenter != null && isResumed() && (categories == null || categories.isEmpty())) {
presenter.searchForCategories(null);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package fr.free.nrw.commons.upload.mediaDetails;

import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
Expand Down Expand Up @@ -159,6 +163,33 @@ private void init() {
}

attachImageViewScaleChangeListener();

addEtTitleTouchListener();
}

/**
* Handles the drawable click listener for Edit Text
*/
private void addEtTitleTouchListener() {
etTitle.setOnTouchListener((v, event) -> {
//2 is for drawable right
float twelveDpInPixels = convertDpToPixel(12, getContext());
if (event.getAction() == MotionEvent.ACTION_UP && etTitle.getCompoundDrawables()[2].getBounds().contains((int)(etTitle.getWidth()-(event.getX()+twelveDpInPixels)),(int)(event.getY()-twelveDpInPixels))){
showInfoAlert(R.string.media_detail_title,R.string.title_info);
return true;
}
return false;
});
}

/**
* converts dp to pixel
* @param dp
* @param context
* @return
*/
private float convertDpToPixel(float dp, Context context) {
return dp * ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

/**
Expand Down
Loading