Skip to content

Commit a003e97

Browse files
maskaravivekashishkumar468
authored andcommitted
Do not use erroneous thumb url util function (#2901)
* Do not use erroneous thumb url util function * Remove unused code * Fix image loading for peer review * Clear disposable
1 parent 70b1975 commit a003e97

File tree

8 files changed

+28
-88
lines changed

8 files changed

+28
-88
lines changed

app/src/main/java/fr/free/nrw/commons/Media.java

-3
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,6 @@ public Uri getLocalUri() {
173173
*/
174174
@Nullable
175175
public String getImageUrl() {
176-
if (imageUrl == null && this.getFilename() != null) {
177-
imageUrl = Utils.makeThumbBaseUrl(this.getFilename());
178-
}
179176
return imageUrl;
180177
}
181178

app/src/main/java/fr/free/nrw/commons/Utils.java

-15
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,8 @@
99
import android.view.View;
1010
import android.widget.Toast;
1111

12-
import org.apache.commons.codec.binary.Hex;
13-
import org.apache.commons.codec.digest.DigestUtils;
1412
import org.wikipedia.dataclient.WikiSite;
1513
import org.wikipedia.page.PageTitle;
16-
import org.wikipedia.util.UriUtil;
1714

1815
import java.util.Locale;
1916
import java.util.regex.Pattern;
@@ -34,18 +31,6 @@ public static PageTitle getPageTitle(@NonNull String title) {
3431
return new PageTitle(title, new WikiSite(BuildConfig.COMMONS_URL));
3532
}
3633

37-
/**
38-
* Creates an URL for thumbnail
39-
*
40-
* @param filename Thumbnail file name
41-
* @return URL of thumbnail
42-
*/
43-
public static String makeThumbBaseUrl(@NonNull String filename) {
44-
String name = getPageTitle(filename).getPrefixedText();
45-
String sha = new String(Hex.encodeHex(DigestUtils.md5(name)));
46-
return String.format("%s/%s/%s/%s", BuildConfig.IMAGE_URL_BASE, sha.substring(0, 1), sha.substring(0, 2), UriUtil.encodeURL(name));
47-
}
48-
4934
/**
5035
* Generates licence name with given ID
5136
* @param license License ID

app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,8 @@ public void onPerformSync(Account account, Bundle bundle, String authority,
118118
Timber.d("Skipping %s", filename);
119119
continue;
120120
}
121-
String thumbUrl = Utils.makeThumbBaseUrl(filename);
122121
Date dateUpdated = image.getDateUpdated();
123-
Contribution contrib = new Contribution(null, thumbUrl, filename,
122+
Contribution contrib = new Contribution(null, null, filename,
124123
"", -1, dateUpdated, dateUpdated, user,
125124
"", "");
126125
contrib.setState(STATE_COMPLETED);

app/src/main/java/fr/free/nrw/commons/review/ReviewActivity.java

+14-26
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,20 @@
1818

1919
import javax.inject.Inject;
2020

21-
import androidx.appcompat.app.AlertDialog;
2221
import androidx.appcompat.widget.Toolbar;
2322
import androidx.drawerlayout.widget.DrawerLayout;
2423
import butterknife.BindView;
2524
import butterknife.ButterKnife;
26-
import butterknife.OnClick;
2725
import fr.free.nrw.commons.Media;
2826
import fr.free.nrw.commons.R;
29-
import fr.free.nrw.commons.Utils;
30-
import fr.free.nrw.commons.achievements.AchievementsActivity;
3127
import fr.free.nrw.commons.auth.AuthenticatedActivity;
3228
import fr.free.nrw.commons.delete.DeleteHelper;
3329
import fr.free.nrw.commons.mwapi.MediaWikiApi;
3430
import fr.free.nrw.commons.utils.DialogUtil;
35-
import fr.free.nrw.commons.utils.MediaDataExtractorUtil;
3631
import fr.free.nrw.commons.utils.ViewUtil;
3732
import io.reactivex.android.schedulers.AndroidSchedulers;
3833
import io.reactivex.disposables.CompositeDisposable;
39-
import io.reactivex.disposables.Disposable;
4034
import io.reactivex.schedulers.Schedulers;
41-
import timber.log.Timber;
4235

4336
public class ReviewActivity extends AuthenticatedActivity {
4437

@@ -125,45 +118,34 @@ public boolean runRandomizer() {
125118
progressBar.setVisibility(View.VISIBLE);
126119
reviewPager.setCurrentItem(0);
127120
compositeDisposable.add(reviewHelper.getRandomMedia()
128-
.map(Media::getFilename)
129121
.subscribeOn(Schedulers.io())
130122
.observeOn(AndroidSchedulers.mainThread())
131123
.subscribe(this::updateImage));
132124
return true;
133125
}
134126

135127
@SuppressLint("CheckResult")
136-
private void updateImage(String fileName) {
128+
private void updateImage(Media media) {
129+
String fileName = media.getFilename();
137130
if (fileName.length() == 0) {
138131
ViewUtil.showShortSnackbar(drawerLayout, R.string.error_review);
139132
return;
140133
}
141-
simpleDraweeView.setImageURI(Utils.makeThumbBaseUrl(fileName));
134+
135+
simpleDraweeView.setImageURI(media.getImageUrl());
136+
142137
reviewController.onImageRefreshed(fileName); //file name is updated
143-
compositeDisposable.add(reviewHelper.getFirstRevisionOfFile("File:" + fileName)
138+
compositeDisposable.add(reviewHelper.getFirstRevisionOfFile(fileName)
144139
.subscribeOn(Schedulers.io())
145140
.observeOn(AndroidSchedulers.mainThread())
146141
.subscribe(revision -> {
147142
reviewController.firstRevision = revision;
148143
reviewPagerAdapter.updateFileInformation(fileName);
149-
((TextView) imageCaption).setText(fileName + " is uploaded by: " + revision.getUser());
144+
imageCaption.setText(fileName + " is uploaded by: " + revision.getUser());
150145
progressBar.setVisibility(View.GONE);
151146
}));
152147
reviewPager.setCurrentItem(0);
153-
154-
Disposable disposable = mwApi.fetchMediaByFilename("File:" + fileName)
155-
.subscribeOn(Schedulers.io())
156-
.observeOn(AndroidSchedulers.mainThread())
157-
.subscribe(mediaResult -> {
158-
ArrayList<String> categories = MediaDataExtractorUtil.extractCategories(mediaResult.getWikiSource());
159-
updateCategories(categories);
160-
}, this::categoryFetchError);
161-
compositeDisposable.add(disposable);
162-
}
163-
164-
private void categoryFetchError(Throwable throwable) {
165-
Timber.e(throwable, "Error fetching categories");
166-
ViewUtil.showShortSnackbar(drawerLayout, R.string.error_review_categories);
148+
updateCategories(media.getCategories());
167149
}
168150

169151
private void updateCategories(ArrayList<String> categories) {
@@ -180,6 +162,12 @@ public void swipeToNext() {
180162
}
181163
}
182164

165+
@Override
166+
public void onDestroy() {
167+
super.onDestroy();
168+
compositeDisposable.clear();
169+
}
170+
183171
public void showSkipImageInfo(){
184172
DialogUtil.showAlertDialog(ReviewActivity.this,
185173
getString(R.string.skip_image),

app/src/main/java/fr/free/nrw/commons/review/ReviewHelper.java

+8-3
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,28 @@ public ReviewHelper(OkHttpJsonApiClient okHttpJsonApiClient, MediaWikiApi mediaW
3131
this.mediaWikiApi = mediaWikiApi;
3232
}
3333

34+
Single<Media> getRandomMedia() {
35+
return getRandomFileChange()
36+
.flatMap(fileName -> okHttpJsonApiClient.getMedia(fileName, false));
37+
}
38+
3439
/**
35-
* Gets a random media file for review.
40+
* Gets a random file change for review.
3641
* - Picks the most recent changes in the last 30 day window
3742
* - Picks a random file from those changes
3843
* - Checks if the file is nominated for deletion
3944
* - Retries upto 5 times for getting a file which is not nominated for deletion
4045
*
4146
* @return
4247
*/
43-
Single<Media> getRandomMedia() {
48+
private Single<String> getRandomFileChange() {
4449
return okHttpJsonApiClient.getRecentFileChanges()
4550
.map(this::findImageInRecentChanges)
4651
.flatMap(title -> mediaWikiApi.pageExists("Commons:Deletion_requests/" + title)
4752
.map(pageExists -> new Pair<>(title, pageExists)))
4853
.map((Pair<String, Boolean> pair) -> {
4954
if (!pair.second) {
50-
return new Media(pair.first.replace("File:", ""));
55+
return pair.first;
5156
}
5257
throw new Exception("Already nominated for deletion");
5358
}).retry(MAX_RANDOM_TRIES);

app/src/main/java/fr/free/nrw/commons/utils/MediaDataExtractorUtil.java

-20
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,6 @@
88
import java.util.regex.Pattern;
99

1010
public class MediaDataExtractorUtil {
11-
12-
/**
13-
* We could fetch all category links from API, but we actually only want the ones
14-
* directly in the page source so they're editable. In the future this may change.
15-
*
16-
* @param source wikitext source code
17-
*/
18-
public static ArrayList<String> extractCategories(String source) {
19-
ArrayList<String> categories = new ArrayList<>();
20-
Pattern regex = Pattern.compile("\\[\\[\\s*Category\\s*:([^]]*)\\s*\\]\\]", Pattern.CASE_INSENSITIVE);
21-
Matcher matcher = regex.matcher(source);
22-
while (matcher.find()) {
23-
String cat = matcher.group(1).trim();
24-
categories.add(cat);
25-
}
26-
27-
return categories;
28-
}
29-
30-
3111
/**
3212
* Extracts a list of categories from | separated category string
3313
*

app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionDaoTest.kt

-17
Original file line numberDiff line numberDiff line change
@@ -180,23 +180,6 @@ class ContributionDaoTest {
180180
}
181181
}
182182

183-
@Test
184-
fun saveNewContribution_nullableImageUrlUsesFileAsBackup() {
185-
whenever(client.insert(isA(), isA())).thenReturn(contentUri)
186-
val contribution = createContribution(true, null, null, null, "filePath")
187-
188-
testObject.save(contribution)
189-
190-
assertEquals(contentUri, contribution.contentUri)
191-
verify(client).insert(eq(BASE_URI), captor.capture())
192-
captor.firstValue.let {
193-
// Nullable fields are absent if null
194-
assertFalse(it.containsKey(Table.COLUMN_LOCAL_URI))
195-
assertFalse(it.containsKey(Table.COLUMN_UPLOADED))
196-
assertEquals(Utils.makeThumbBaseUrl("filePath"), it.getAsString(Table.COLUMN_IMAGE_URL))
197-
}
198-
}
199-
200183
@Test
201184
fun saveNewContribution_nullableFieldsAreNonNull() {
202185
whenever(client.insert(isA(), isA())).thenReturn(contentUri)

app/src/test/kotlin/fr/free/nrw/commons/review/ReviewHelperTest.kt

+5-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ import org.junit.Test
1010
import org.mockito.ArgumentMatchers
1111
import org.mockito.InjectMocks
1212
import org.mockito.Mock
13-
import org.mockito.Mockito.`when`
14-
import org.mockito.Mockito.mock
13+
import org.mockito.Mockito.*
1514
import org.mockito.MockitoAnnotations
1615
import org.wikipedia.dataclient.mwapi.MwQueryPage
1716
import org.wikipedia.dataclient.mwapi.RecentChange
@@ -51,6 +50,10 @@ class ReviewHelperTest {
5150

5251
`when`(mediaWikiApi?.pageExists(ArgumentMatchers.anyString()))
5352
.thenReturn(Single.just(false))
53+
`when`(okHttpJsonApiClient?.getMedia(ArgumentMatchers.anyString(), ArgumentMatchers.anyBoolean()))
54+
.thenReturn(Single.just(mock(Media::class.java)))
55+
56+
5457
val randomMedia = reviewHelper?.randomMedia?.blockingGet()
5558

5659
assertTrue(randomMedia is Media)

0 commit comments

Comments
 (0)