blob: 80e96c982dd8c294d3ae83019dddd7f22ba522be [file] [log] [blame]
package org.robolectric.integrationtests.nativegraphics.testing.util;
import android.view.ViewTreeObserver.OnDrawListener;
import android.webkit.WebView;
import android.webkit.WebView.VisualStateCallback;
import android.webkit.WebViewClient;
import java.util.concurrent.CountDownLatch;
public final class WebViewReadyHelper {
// Hacky quick-fix similar to DrawActivity's DrawCounterListener
// TODO: De-dupe this against DrawCounterListener and fix this cruft
private static final int DEBUG_REQUIRE_EXTRA_FRAMES = 1;
private int drawCount = 0;
private final CountDownLatch latch;
private final WebView webView;
public WebViewReadyHelper(WebView webView, CountDownLatch latch) {
this.webView = webView;
this.latch = latch;
this.webView.setWebViewClient(client);
}
public void loadData(String data) {
webView.loadData(data, null, null);
}
private WebViewClient client =
new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
webView.postVisualStateCallback(0, visualStateCallback);
}
};
private VisualStateCallback visualStateCallback =
new VisualStateCallback() {
@Override
public void onComplete(long requestId) {
webView.getViewTreeObserver().addOnDrawListener(onDrawListener);
webView.invalidate();
}
};
private OnDrawListener onDrawListener =
new OnDrawListener() {
@Override
public void onDraw() {
if (++drawCount <= DEBUG_REQUIRE_EXTRA_FRAMES) {
webView.postInvalidate();
return;
}
webView.post(
() -> {
webView.getViewTreeObserver().removeOnDrawListener(onDrawListener);
latch.countDown();
});
}
};
}