Skip to content
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
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ public abstract class AbstractFlashcardViewer extends NavigationDrawerActivity i
private CardMarker mCardMarker;

/** Handle providing help for "Image Not Found" */
private MissingImageHandler mMissingImageHandler = new MissingImageHandler(this::displayCouldNotFindImageSnackbar);
private static MissingImageHandler mMissingImageHandler = new MissingImageHandler();

// ----------------------------------------------------------------------------
// LISTENERS
Expand Down Expand Up @@ -3199,14 +3199,14 @@ public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceReque
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
mMissingImageHandler.processFailure(request);
mMissingImageHandler.processFailure(request, AbstractFlashcardViewer.this::displayCouldNotFindImageSnackbar);
}


@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
super.onReceivedHttpError(view, request, errorResponse);
mMissingImageHandler.processFailure(request);
mMissingImageHandler.processFailure(request, AbstractFlashcardViewer.this::displayCouldNotFindImageSnackbar);
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,13 @@ public class MissingImageHandler {

private int mNumberOfMissingImages = 0;
private boolean mHasExecuted = false;
@NonNull
private Consumer<String> mOnFailure;


public MissingImageHandler(@NonNull Consumer<String> onFailure) {
mOnFailure = onFailure;
public MissingImageHandler() {

}

public void processFailure(WebResourceRequest request) {
public void processFailure(WebResourceRequest request, @NonNull Consumer<String> onFailure) {
// We do not want this to trigger more than once on the same side of the card as the UI will flicker.
if (request == null || mHasExecuted) {
return;
Expand All @@ -67,7 +65,7 @@ public void processFailure(WebResourceRequest request) {

try {
String filename = URLUtil.guessFileName(url, null, null);
mOnFailure.consume(filename);
onFailure.consume(filename);
mNumberOfMissingImages++;
} catch (Exception e) {
Timber.w(e, "Failed to notify UI of media failure");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import android.os.Build;
import android.webkit.WebResourceRequest;

import com.ichi2.utils.FunctionalInterfaces;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
Expand Down Expand Up @@ -52,57 +54,74 @@ public void before() {
// couldn't get Config(minSDK) to work, as that produced multiple test calls.
assumeThat("Can't be executed < API 21", Build.VERSION.SDK_INT, greaterThanOrEqualTo(Build.VERSION_CODES.LOLLIPOP));
mFileNames = new ArrayList<>();
mSut = new MissingImageHandler((f) -> {
mSut = new MissingImageHandler();
}


@NonNull
private FunctionalInterfaces.Consumer<String> defaultHandler() {
return (f) -> {
mTimesCalled++;
mFileNames.add(f);
});
};
}


@Test
public void firstTimeOnNewCardSends() {
mSut.processFailure(getValidRequest("example.jpg"));
processFailure(getValidRequest("example.jpg"));
assertThat(mTimesCalled, is(1));
assertThat(mFileNames, contains("example.jpg"));
}

@Test
public void twoCallsOnSameSideCallsOnce() {
mSut.processFailure(getValidRequest("example.jpg"));
mSut.processFailure(getValidRequest("example2.jpg"));
processFailure(getValidRequest("example.jpg"));
processFailure(getValidRequest("example2.jpg"));
assertThat(mTimesCalled, is(1));
assertThat(mFileNames, contains("example.jpg"));
}

@Test
public void callAfterFlipIsShown() {
mSut.processFailure(getValidRequest("example.jpg"));
processFailure(getValidRequest("example.jpg"));
mSut.onCardSideChange();
mSut.processFailure(getValidRequest("example2.jpg"));
processFailure(getValidRequest("example2.jpg"));
assertThat(mTimesCalled, is(2));
assertThat(mFileNames, contains("example.jpg", "example2.jpg"));
}

@Test
public void thirdCallIsIgnored() {
mSut.processFailure(getValidRequest("example.jpg"));
processFailure(getValidRequest("example.jpg"));
mSut.onCardSideChange();
mSut.processFailure(getValidRequest("example2.jpg"));
processFailure(getValidRequest("example2.jpg"));
mSut.onCardSideChange();
mSut.processFailure(getValidRequest("example3.jpg"));
processFailure(getValidRequest("example3.jpg"));
assertThat(mTimesCalled, is(2));
assertThat(mFileNames, contains("example.jpg", "example2.jpg"));
}

@Test
public void invalidRequestIsIgnored() {
mSut.processFailure(getInvalidRequest("example.jpg"));
WebResourceRequest invalidRequest = getInvalidRequest("example.jpg");
processFailure(invalidRequest);
assertThat(mTimesCalled, is(0));
}


private void processFailure(WebResourceRequest invalidRequest) {
processFailure(invalidRequest, defaultHandler());
}

private void processFailure(WebResourceRequest invalidRequest, FunctionalInterfaces.Consumer<String> consumer) {
mSut.processFailure(invalidRequest, consumer);
}


@Test
public void uiFailureDoesNotCrash() {
MissingImageHandler sut = new MissingImageHandler((f) -> { throw new RuntimeException("expected"); });
sut.processFailure(getValidRequest("example.jpg"));
processFailure(getValidRequest("example.jpg"), (f) -> { throw new RuntimeException("expected"); });
assertThat("Irrelevant assert to stop lint warnings", mTimesCalled, is(0));
}

Expand Down