-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Fixes #5743 Reduce delay between peer reviews #5897
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
base: main
Are you sure you want to change the base?
Changes from 7 commits
913d2e6
4521b5f
febed89
66f917b
55e59b8
54aeeb0
7ffa271
e617507
36dcc43
617957e
549d943
62a2a33
f8c092f
9dc81df
3a98976
d7c883d
8ec6c2f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,6 +3,7 @@ | |
import android.annotation.SuppressLint; | ||
import android.content.Context; | ||
import android.content.Intent; | ||
import android.content.SharedPreferences; | ||
import android.graphics.PorterDuff; | ||
import android.graphics.drawable.Drawable; | ||
import android.os.Bundle; | ||
|
@@ -22,19 +23,25 @@ | |
import fr.free.nrw.commons.theme.BaseActivity; | ||
import fr.free.nrw.commons.utils.DialogUtil; | ||
import fr.free.nrw.commons.utils.ViewUtil; | ||
import io.reactivex.Observable; | ||
import io.reactivex.android.schedulers.AndroidSchedulers; | ||
import io.reactivex.disposables.CompositeDisposable; | ||
import io.reactivex.schedulers.Schedulers; | ||
import java.util.ArrayList; | ||
import java.util.List; | ||
import javax.inject.Inject; | ||
|
||
public class ReviewActivity extends BaseActivity { | ||
|
||
|
||
private ActivityReviewBinding binding; | ||
|
||
MediaDetailFragment mediaDetailFragment; | ||
public ReviewPagerAdapter reviewPagerAdapter; | ||
public ReviewController reviewController; | ||
|
||
|
||
|
||
|
||
@Inject | ||
ReviewHelper reviewHelper; | ||
@Inject | ||
|
@@ -53,6 +60,13 @@ public class ReviewActivity extends BaseActivity { | |
final String SAVED_MEDIA = "saved_media"; | ||
private Media media; | ||
|
||
private List<Media> cachedMedia = new ArrayList<>(); | ||
|
||
private static final String PREF_NAME = "ReviewActivityPrefs"; | ||
private static final String LAST_CACHE_TIME_KEY = "lastCacheTime"; | ||
private static final int CACHE_SIZE = 5; | ||
private static final long CACHE_EXPIRY_TIME = 24 * 60 * 60 * 1000; | ||
|
||
@Override | ||
protected void onSaveInstanceState(Bundle outState) { | ||
super.onSaveInstanceState(outState); | ||
|
@@ -100,10 +114,10 @@ protected void onCreate(Bundle savedInstanceState) { | |
d[2].setColorFilter(getApplicationContext().getResources().getColor(R.color.button_blue), PorterDuff.Mode.SRC_IN); | ||
|
||
if (savedInstanceState != null && savedInstanceState.getParcelable(SAVED_MEDIA) != null) { | ||
updateImage(savedInstanceState.getParcelable(SAVED_MEDIA)); // Use existing media if we have one | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Any way to improve these comments rather than just remove them? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure, I have added java doc to explain why I changed this part, but my teammates pushed a old version, sorry about that. the new version included java doc and kdoc for all changed part. |
||
updateImage(savedInstanceState.getParcelable(SAVED_MEDIA)); | ||
setUpMediaDetailOnOrientation(); | ||
} else { | ||
runRandomizer(); //Run randomizer whenever everything is ready so that a first random image will be added | ||
runRandomizer(); | ||
} | ||
|
||
binding.skipImage.setOnClickListener(view -> { | ||
|
@@ -136,31 +150,66 @@ public boolean runRandomizer() { | |
hasNonHiddenCategories = false; | ||
binding.pbReviewImage.setVisibility(View.VISIBLE); | ||
binding.viewPagerReview.setCurrentItem(0); | ||
// Finds non-hidden categories from Media instance | ||
compositeDisposable.add(reviewHelper.getRandomMedia() | ||
.subscribeOn(Schedulers.io()) | ||
.observeOn(AndroidSchedulers.mainThread()) | ||
.subscribe(this::checkWhetherFileIsUsedInWikis)); | ||
|
||
if (cachedMedia.isEmpty() || isCacheExpired()) { | ||
fetchAndCacheMedia(); | ||
} else { | ||
processNextCachedMedia(); | ||
} | ||
return true; | ||
} | ||
|
||
private void fetchAndCacheMedia() { | ||
u7805486 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
compositeDisposable.add(Observable.range(0, CACHE_SIZE) | ||
.flatMap(i -> reviewHelper.getRandomMedia().toObservable()) | ||
.subscribeOn(Schedulers.io()) | ||
.observeOn(AndroidSchedulers.mainThread()) | ||
.toList() | ||
.subscribe(mediaList -> { | ||
cachedMedia.clear(); | ||
cachedMedia.addAll(mediaList); | ||
updateLastCacheTime(); | ||
processNextCachedMedia(); | ||
}, this::handleError)); | ||
} | ||
|
||
private void processNextCachedMedia() { | ||
if (!cachedMedia.isEmpty()) { | ||
Media media = cachedMedia.remove(0); | ||
checkWhetherFileIsUsedInWikis(media); | ||
} else { | ||
fetchAndCacheMedia(); | ||
} | ||
} | ||
|
||
private boolean isCacheExpired() { | ||
SharedPreferences prefs = getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); | ||
long lastCacheTime = prefs.getLong(LAST_CACHE_TIME_KEY, 0); | ||
long currentTime = System.currentTimeMillis(); | ||
return (currentTime - lastCacheTime) > CACHE_EXPIRY_TIME; | ||
} | ||
|
||
private void updateLastCacheTime() { | ||
SharedPreferences prefs = getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); | ||
SharedPreferences.Editor editor = prefs.edit(); | ||
editor.putLong(LAST_CACHE_TIME_KEY, System.currentTimeMillis()); | ||
editor.apply(); | ||
} | ||
|
||
/** | ||
* Check whether media is used or not in any Wiki Page | ||
*/ | ||
@SuppressLint("CheckResult") | ||
private void checkWhetherFileIsUsedInWikis(final Media media) { | ||
compositeDisposable.add(reviewHelper.checkFileUsage(media.getFilename()) | ||
.subscribeOn(Schedulers.io()) | ||
.observeOn(AndroidSchedulers.mainThread()) | ||
.subscribe(result -> { | ||
// result false indicates media is not used in any wiki | ||
if (!result) { | ||
// Finds non-hidden categories from Media instance | ||
findNonHiddenCategories(media); | ||
} else { | ||
runRandomizer(); | ||
processNextCachedMedia(); | ||
} | ||
})); | ||
}, this::handleError)); | ||
} | ||
|
||
/** | ||
|
@@ -181,7 +230,6 @@ private void findNonHiddenCategories(Media media) { | |
updateImage(media); | ||
} | ||
|
||
@SuppressLint("CheckResult") | ||
private void updateImage(Media media) { | ||
reviewHelper.addViewedImagesToDB(media.getPageId()); | ||
this.media = media; | ||
|
@@ -191,27 +239,26 @@ private void updateImage(Media media) { | |
return; | ||
} | ||
|
||
//If The Media User and Current Session Username is same then Skip the Image | ||
if (media.getUser() != null && media.getUser().equals(AccountUtil.getUserName(getApplicationContext()))) { | ||
runRandomizer(); | ||
processNextCachedMedia(); | ||
return; | ||
} | ||
|
||
binding.reviewImageView.setImageURI(media.getImageUrl()); | ||
|
||
reviewController.onImageRefreshed(media); //file name is updated | ||
reviewController.onImageRefreshed(media); | ||
compositeDisposable.add(reviewHelper.getFirstRevisionOfFile(fileName) | ||
.subscribeOn(Schedulers.io()) | ||
.observeOn(AndroidSchedulers.mainThread()) | ||
.subscribe(revision -> { | ||
reviewController.firstRevision = revision; | ||
reviewPagerAdapter.updateFileInformation(); | ||
@SuppressLint({"StringFormatInvalid", "LocalSuppress"}) String caption = String.format(getString(R.string.review_is_uploaded_by), fileName, revision.getUser()); | ||
binding.tvImageCaption.setText(caption); | ||
binding.pbReviewImage.setVisibility(View.GONE); | ||
reviewImageFragment = getInstanceOfReviewImageFragment(); | ||
reviewImageFragment.enableButtons(); | ||
})); | ||
.subscribeOn(Schedulers.io()) | ||
.observeOn(AndroidSchedulers.mainThread()) | ||
.subscribe(revision -> { | ||
reviewController.firstRevision = revision; | ||
reviewPagerAdapter.updateFileInformation(); | ||
String caption = String.format(getString(R.string.review_is_uploaded_by), fileName, revision.getUser()); | ||
binding.tvImageCaption.setText(caption); | ||
binding.pbReviewImage.setVisibility(View.GONE); | ||
reviewImageFragment = getInstanceOfReviewImageFragment(); | ||
reviewImageFragment.enableButtons(); | ||
}, this::handleError)); | ||
binding.viewPagerReview.setCurrentItem(0); | ||
} | ||
|
||
|
@@ -258,6 +305,11 @@ public void showReviewImageInfo() { | |
null, | ||
null); | ||
} | ||
private void handleError(Throwable error) { | ||
binding.pbReviewImage.setVisibility(View.GONE); | ||
ViewUtil.showShortSnackbar(binding.drawerLayout, R.string.error_review); | ||
|
||
} | ||
|
||
|
||
@Override | ||
|
Uh oh!
There was an error while loading. Please reload this page.