package me.devsaki.hentoid.activities; import android.annotation.TargetApi; import android.graphics.Bitmap; import android.os.AsyncTask; import android.os.Build; import android.support.annotation.NonNull; import android.webkit.WebResourceRequest; import android.webkit.WebResourceResponse; import android.webkit.WebView; import java.io.ByteArrayInputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import me.devsaki.hentoid.database.domains.Content; import me.devsaki.hentoid.enums.Site; import me.devsaki.hentoid.parsers.HitomiParser; import me.devsaki.hentoid.util.ConstsPrefs; import me.devsaki.hentoid.util.Helper; import me.devsaki.hentoid.util.LogHelper; import me.devsaki.hentoid.views.ObservableWebView; import static me.devsaki.hentoid.util.Helper.TYPE; import static me.devsaki.hentoid.util.Helper.executeAsyncTask; import static me.devsaki.hentoid.util.Helper.getWebResourceResponseFromAsset; import static me.devsaki.hentoid.util.Helper.getWebViewInitialZoomPrefs; import static me.devsaki.hentoid.util.Helper.getWebViewOverviewPrefs; /** * Created by Shiro on 1/20/2016. * Implements Hitomi.la source */ public class HitomiActivity extends BaseWebActivity { private static final String TAG = LogHelper.makeLogTag(HitomiActivity.class); @Override void setSite(Site site) { super.setSite(Site.HITOMI); } @Override void setWebView(ObservableWebView webView) { webView.setWebViewClient(new HitomiWebViewClient()); boolean bWebViewOverview = getWebViewOverviewPrefs(); int webViewInitialZoom = getWebViewInitialZoomPrefs(); if (bWebViewOverview) { webView.getSettings().setLoadWithOverviewMode(false); webView.setInitialScale(webViewInitialZoom); LogHelper.d(TAG, "WebView Initial Scale: " + webViewInitialZoom + "%"); } else { webView.setInitialScale(ConstsPrefs.PREF_WEBVIEW_INITIAL_ZOOM_DEFAULT); webView.getSettings().setLoadWithOverviewMode(true); } super.setWebView(webView); } @Override void backgroundRequest(String extra) { LogHelper.d(TAG, extra); Helper.toast("Processing..."); executeAsyncTask(new HtmlLoader(), extra); } private class HitomiWebViewClient extends CustomWebViewClient { final ByteArrayInputStream nothing = new ByteArrayInputStream("".getBytes()); @SuppressWarnings("deprecation") // From API 24 we should use another overload @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { try { URL u = new URL(url); return !(u.getHost().endsWith("hitomi.la")); } catch (MalformedURLException e) { LogHelper.d(TAG, "Malformed URL"); } return false; } @TargetApi(Build.VERSION_CODES.N) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { try { URL u = new URL(request.getUrl().toString()); return !(u.getHost().endsWith("hitomi.la")); } catch (MalformedURLException e) { LogHelper.d(TAG, "Malformed URL"); } return false; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); if (url.contains("//hitomi.la/galleries/")) { executeAsyncTask(new HtmlLoader(), url); } } @SuppressWarnings("deprecation") // From API 21 we should use another overload @Override public WebResourceResponse shouldInterceptRequest(@NonNull WebView view, @NonNull String url) { if (url.contains("hitomi.js")) { return getWebResourceResponseFromAsset(getSite(), "hitomi.js", TYPE.JS); } else if (url.contains("hitomi-horizontal.js") || url.contains("hitomi-vertical.js")) { return new WebResourceResponse("text/plain", "utf-8", nothing); } else { return super.shouldInterceptRequest(view, url); } } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public WebResourceResponse shouldInterceptRequest(@NonNull WebView view, @NonNull WebResourceRequest request) { String url = request.getUrl().toString(); if (url.contains("hitomi.js")) { return getWebResourceResponseFromAsset(getSite(), "hitomi.js", TYPE.JS); } else if (url.contains("hitomi-horizontal.js") || url.contains("hitomi-vertical.js")) { return new WebResourceResponse("text/plain", "utf-8", nothing); } else { return super.shouldInterceptRequest(view, request); } } } private class HtmlLoader extends AsyncTask<String, Integer, Content> { @Override protected Content doInBackground(String... params) { String url = params[0]; try { processContent(HitomiParser.parseContent(url)); } catch (IOException e) { LogHelper.e(TAG, e, "Error parsing content."); } return null; } } }