Skip to content

Commit 707e314

Browse files
authored
commons-app#3601 [structured-commons] Wrong thumbnails at the "depictions" step when uploading (commons-app#3696)
* commons-app#3601 [structured-commons] Wrong thumbnails at the "depictions" step when uploading - fix imageview rendering code * commons-app#3601 [structured-commons] Wrong thumbnails at the "depictions" step when uploading - show selected depictions at the top - ensure updates to nearby places are reflected * commons-app#3601 [structured-commons] Wrong thumbnails at the "depictions" step when uploading - don't set imageUrl when the url is none * commons-app#3601 [structured-commons] Wrong thumbnails at the "depictions" step when uploading - rewrite unit tests * commons-app#3601 [structured-commons] Wrong thumbnails at the "depictions" step when uploading - minor cleanup * commons-app#3601 [structured-commons] Wrong thumbnails at the "depictions" step when uploading - fix erroneous cache access
1 parent 67faa40 commit 707e314

18 files changed

+399
-358
lines changed

.idea/inspectionProfiles/Project_Default.xml

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle

+2
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ dependencies {
7878
testImplementation "org.powermock:powermock-module-junit4:2.0.0-beta.5"
7979
testImplementation "org.powermock:powermock-api-mockito2:2.0.0-beta.5"
8080
testImplementation 'org.mockito:mockito-core:2.23.0'
81+
testImplementation "com.jraska.livedata:testing-ktx:1.1.2"
82+
testImplementation "androidx.arch.core:core-testing:2.1.0"
8183

8284
// Android testing
8385
androidTestImplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$KOTLIN_VERSION"

app/src/main/java/fr/free/nrw/commons/explore/depictions/DepictsClient.java

+11-11
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class DepictsClient {
3232

3333
private final DepictsInterface depictsInterface;
3434
private final MediaInterface mediaInterface;
35-
private static final String NO_DEPICTED_IMAGE = "No Image for Depiction";
35+
public static final String NO_DEPICTED_IMAGE = "No Image for Depiction";
3636

3737
@Inject
3838
public DepictsClient(DepictsInterface depictsInterface, MediaInterface mediaInterface) {
@@ -46,14 +46,16 @@ public DepictsClient(DepictsInterface depictsInterface, MediaInterface mediaInte
4646
*/
4747
public Observable<DepictedItem> searchForDepictions(String query, int limit, int offset) {
4848
return depictsInterface.searchForDepicts(
49-
query,
50-
String.valueOf(limit),
51-
Locale.getDefault().getLanguage(),
52-
Locale.getDefault().getLanguage(),
53-
String.valueOf(offset)
49+
query,
50+
String.valueOf(limit),
51+
Locale.getDefault().getLanguage(),
52+
Locale.getDefault().getLanguage(),
53+
String.valueOf(offset)
5454
)
55-
.flatMap(depictSearchResponse ->Observable.fromIterable(depictSearchResponse.getSearch()))
56-
.map(DepictedItem::new);
55+
.toObservable()
56+
.flatMap( depictSearchResponse ->
57+
Observable.fromIterable(depictSearchResponse.getSearch()))
58+
.map(DepictedItem::new);
5759
}
5860

5961
/**
@@ -80,15 +82,13 @@ public Single<String> getP18ForItem(String entityId) {
8082
.map(claimsResponse -> {
8183
final List<Statement_partial> imageClaim = claimsResponse.getClaims()
8284
.get(WikidataProperties.IMAGE.getPropertyName());
83-
if (imageClaim != null) {
8485
final DataValueString dataValue = (DataValueString) imageClaim
8586
.get(0)
8687
.getMainSnak()
8788
.getDataValue();
8889
return getThumbnailUrl((dataValue.getValue()));
89-
}
90-
return NO_DEPICTED_IMAGE;
9190
})
91+
.onErrorReturn(throwable -> NO_DEPICTED_IMAGE)
9292
.singleOrError();
9393
}
9494

app/src/main/java/fr/free/nrw/commons/explore/depictions/SearchDepictionsRenderer.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package fr.free.nrw.commons.explore.depictions;
22

3+
import static fr.free.nrw.commons.explore.depictions.DepictsClient.NO_DEPICTED_IMAGE;
4+
35
import android.graphics.Bitmap;
46
import android.net.Uri;
57
import android.text.TextUtils;
@@ -45,9 +47,6 @@ public class SearchDepictionsRenderer extends Renderer<DepictedItem> {
4547

4648
private DepictCallback listener;
4749

48-
int size = 0;
49-
private final static String NO_IMAGE_FOR_DEPICTION = "No Image for Depiction";
50-
5150
public SearchDepictionsRenderer(DepictCallback listener) {
5251
this.listener = listener;
5352
}
@@ -84,7 +83,7 @@ public void render() {
8483

8584
Timber.e("line86"+item.getImageUrl());
8685
if (!TextUtils.isEmpty(item.getImageUrl())) {
87-
if (!item.getImageUrl().equals(NO_IMAGE_FOR_DEPICTION) && !item.getImageUrl().equals(""))
86+
if (!item.getImageUrl().equals(NO_DEPICTED_IMAGE) && !item.getImageUrl().equals(""))
8887
{
8988
ImageRequest imageRequest = ImageRequestBuilder
9089
.newBuilderWithSource(Uri.parse(item.getImageUrl()))

app/src/main/java/fr/free/nrw/commons/repository/UploadRemoteDataSource.java

+17-19
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,28 @@
11
package fr.free.nrw.commons.repository;
22

3-
import fr.free.nrw.commons.upload.ImageCoordinates;
4-
import java.io.IOException;
5-
import java.util.Comparator;
6-
import java.util.List;
7-
import java.util.Locale;
8-
9-
import javax.inject.Inject;
10-
import javax.inject.Singleton;
11-
123
import fr.free.nrw.commons.category.CategoriesModel;
134
import fr.free.nrw.commons.category.CategoryItem;
145
import fr.free.nrw.commons.contributions.Contribution;
156
import fr.free.nrw.commons.filepicker.UploadableFile;
167
import fr.free.nrw.commons.location.LatLng;
178
import fr.free.nrw.commons.nearby.NearbyPlaces;
189
import fr.free.nrw.commons.nearby.Place;
10+
import fr.free.nrw.commons.upload.ImageCoordinates;
1911
import fr.free.nrw.commons.upload.SimilarImageInterface;
2012
import fr.free.nrw.commons.upload.UploadController;
2113
import fr.free.nrw.commons.upload.UploadModel;
2214
import fr.free.nrw.commons.upload.UploadModel.UploadItem;
2315
import fr.free.nrw.commons.upload.structure.depictions.DepictModel;
2416
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem;
17+
import io.reactivex.Flowable;
2518
import io.reactivex.Observable;
2619
import io.reactivex.Single;
20+
import java.io.IOException;
21+
import java.util.Comparator;
22+
import java.util.List;
23+
import java.util.Locale;
24+
import javax.inject.Inject;
25+
import javax.inject.Singleton;
2726

2827
/**
2928
* This class would act as the data source for remote operations for UploadActivity
@@ -189,15 +188,13 @@ public Single<Integer> getImageQuality(UploadItem uploadItem) {
189188
* @param longitude
190189
* @return
191190
*/
192-
public Place getNearbyPlaces(double latitude, double longitude) {
193-
try {
194-
List<Place> fromWikidataQuery = nearbyPlaces.getFromWikidataQuery(new LatLng(latitude, longitude, 0.0f),
195-
Locale.getDefault().getLanguage(),
196-
NEARBY_RADIUS_IN_KILO_METERS);
197-
return fromWikidataQuery.size() > 0 ? fromWikidataQuery.get(0) : null;
198-
} catch (IOException e) {
199-
return null;
200-
}
191+
public Place getNearbyPlaces(double latitude, double longitude) throws IOException {
192+
List<Place> fromWikidataQuery = nearbyPlaces
193+
.getFromWikidataQuery(new LatLng(latitude, longitude, 0.0f),
194+
Locale.getDefault().getLanguage(),
195+
NEARBY_RADIUS_IN_KILO_METERS);
196+
return fromWikidataQuery.size() > 0 ? fromWikidataQuery.get(0) : null;
197+
201198
}
202199

203200
/**
@@ -220,9 +217,10 @@ public List<DepictedItem> getSelectedDepictions() {
220217

221218
/**
222219
* get all depictions
220+
* @return
223221
*/
224222

225-
public Observable<DepictedItem> searchAllEntities(String query) {
223+
public Flowable<List<DepictedItem>> searchAllEntities(String query) {
226224
return depictModel.searchAllEntities(query);
227225
}
228226

app/src/main/java/fr/free/nrw/commons/repository/UploadRepository.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package fr.free.nrw.commons.repository;
22

33
import fr.free.nrw.commons.upload.ImageCoordinates;
4+
import io.reactivex.Flowable;
5+
import java.io.IOException;
46
import java.util.Comparator;
57
import java.util.List;
68

@@ -284,7 +286,7 @@ public List<DepictedItem> getSelectedDepictions() {
284286
* @return
285287
*/
286288

287-
public Observable<DepictedItem> searchAllEntities(String query) {
289+
public Flowable<List<DepictedItem>> searchAllEntities(String query) {
288290
return remoteDataSource.searchAllEntities(query);
289291
}
290292

@@ -294,7 +296,7 @@ public Observable<DepictedItem> searchAllEntities(String query) {
294296
* @param decLongitude
295297
* @return
296298
*/
297-
public Place checkNearbyPlaces(double decLatitude, double decLongitude) {
299+
public Place checkNearbyPlaces(double decLatitude, double decLongitude) throws IOException {
298300
return remoteDataSource.getNearbyPlaces(decLatitude, decLongitude);
299301
}
300302

app/src/main/java/fr/free/nrw/commons/upload/FileProcessor.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ class FileProcessor @Inject constructor(
209209
.filter { it.size >= MIN_NEARBY_RESULTS }
210210
.take(1)
211211
.subscribe(
212-
{ depictsModel.nearbyPlaces = it },
212+
{ depictsModel.nearbyPlaces.offer(it) },
213213
{ Timber.e(it) }
214214
)
215215
}
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,20 @@
11
package fr.free.nrw.commons.upload;
22

3-
import android.graphics.Bitmap;
43
import android.net.Uri;
54
import android.text.TextUtils;
65
import android.view.LayoutInflater;
76
import android.view.View;
87
import android.view.ViewGroup;
98
import android.widget.CheckBox;
10-
import android.widget.ImageView;
119
import android.widget.TextView;
12-
13-
import androidx.annotation.Nullable;
14-
15-
import com.facebook.common.executors.CallerThreadExecutor;
16-
import com.facebook.common.references.CloseableReference;
17-
import com.facebook.datasource.DataSource;
18-
import com.facebook.drawee.backends.pipeline.Fresco;
19-
import com.facebook.imagepipeline.core.ImagePipeline;
20-
import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber;
21-
import com.facebook.imagepipeline.image.CloseableImage;
22-
import com.facebook.imagepipeline.request.ImageRequest;
23-
import com.facebook.imagepipeline.request.ImageRequestBuilder;
24-
import com.pedrogomez.renderers.Renderer;
25-
2610
import butterknife.BindView;
2711
import butterknife.ButterKnife;
12+
import com.facebook.common.util.UriUtil;
13+
import com.facebook.drawee.view.SimpleDraweeView;
14+
import com.pedrogomez.renderers.Renderer;
2815
import fr.free.nrw.commons.R;
2916
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem;
3017
import fr.free.nrw.commons.upload.structure.depictions.UploadDepictsCallback;
31-
import timber.log.Timber;
3218

3319
/**
3420
* Depicts Renderer for setting up inflating layout,
@@ -42,8 +28,7 @@ public class UploadDepictsRenderer extends Renderer<DepictedItem> {
4228
TextView depictsLabel;
4329
@BindView(R.id.description) TextView description;
4430
@BindView(R.id.depicted_image)
45-
ImageView imageView;
46-
private final static String NO_IMAGE_FOR_DEPICTION="No Image for Depiction";
31+
SimpleDraweeView imageView;
4732

4833
public UploadDepictsRenderer(UploadDepictsCallback listener) {
4934
this.listener = listener;
@@ -91,45 +76,13 @@ public void render() {
9176
checkedView.setChecked(item.isSelected());
9277
depictsLabel.setText(item.getName());
9378
description.setText(item.getDescription());
94-
if (!TextUtils.isEmpty(item.getImageUrl())) {
95-
if (!item.getImageUrl().equals(NO_IMAGE_FOR_DEPICTION))
96-
setImageView(Uri.parse(item.getImageUrl()), imageView);
97-
}else{
98-
listener.fetchThumbnailUrlForEntity(item.getId(),item.getPosition());
79+
final String imageUrl = item.getImageUrl();
80+
if (TextUtils.isEmpty(imageUrl)) {
81+
imageView.setImageURI(UriUtil.getUriForResourceId(R.drawable.ic_wikidata_logo_24dp));
82+
listener.fetchThumbnailUrlForEntity(item);
83+
} else {
84+
imageView.setImageURI(Uri.parse(imageUrl));
9985
}
10086
}
10187

102-
/**
103-
* Set thumbnail for the depicted item
104-
*/
105-
private void setImageView(Uri imageUrl, ImageView imageView) {
106-
ImageRequest imageRequest = ImageRequestBuilder
107-
.newBuilderWithSource(imageUrl)
108-
.setAutoRotateEnabled(true)
109-
.build();
110-
111-
ImagePipeline imagePipeline = Fresco.getImagePipeline();
112-
final DataSource<CloseableReference<CloseableImage>>
113-
dataSource = imagePipeline.fetchDecodedImage(imageRequest, getContext());
114-
115-
dataSource.subscribe(new BaseBitmapDataSubscriber() {
116-
117-
@Override
118-
public void onNewResultImpl(@Nullable Bitmap bitmap) {
119-
if (dataSource.isFinished() && bitmap != null) {
120-
Timber.d("Bitmap loaded from url %s", imageUrl.toString());
121-
imageView.post(() -> imageView.setImageBitmap(Bitmap.createBitmap(bitmap)));
122-
dataSource.close();
123-
}
124-
}
125-
126-
@Override
127-
public void onFailureImpl(DataSource dataSource) {
128-
Timber.d("Error getting bitmap from image url %s", imageUrl.toString());
129-
if (dataSource != null) {
130-
dataSource.close();
131-
}
132-
}
133-
}, CallerThreadExecutor.getInstance());
134-
}
13588
}

app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsContract.java

+8-12
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package fr.free.nrw.commons.upload.depicts;
22

3-
import java.util.List;
4-
3+
import androidx.lifecycle.LiveData;
54
import fr.free.nrw.commons.BasePresenter;
65
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem;
6+
import java.util.List;
7+
import org.jetbrains.annotations.NotNull;
78

89
/**
910
* The contract with which DepictsFragment and its presenter would talk to each other
@@ -41,10 +42,8 @@ interface View {
4142
*/
4243
void setDepictsList(List<DepictedItem> depictedItemList);
4344

44-
/**
45-
* Set thumbnail image for depicted item
46-
*/
47-
void onImageUrlFetched(String response, int position);
45+
46+
void onUrlFetched(@NotNull DepictedItem depictedItem, @NotNull String url);
4847
}
4948

5049
interface UserActionListener extends BasePresenter<View> {
@@ -71,11 +70,8 @@ interface UserActionListener extends BasePresenter<View> {
7170
*/
7271
void verifyDepictions();
7372

74-
/**
75-
* Fetch thumbnail for the Wikidata Item
76-
* @param entityId entityId of the item
77-
* @param position position of the item
78-
*/
79-
void fetchThumbnailForEntityId(String entityId, int position);
73+
LiveData<List<DepictedItem>> getDepictedItems();
74+
75+
void fetchThumbnailForEntityId(DepictedItem depictedItem);
8076
}
8177
}

0 commit comments

Comments
 (0)