/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package com.linkbubble.articlerender; import android.content.Context; import android.graphics.Bitmap; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.webkit.DownloadListener; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import com.linkbubble.Constant; import com.linkbubble.MainApplication; import com.linkbubble.MainController; import com.linkbubble.Settings; import com.linkbubble.util.Util; import com.squareup.otto.Subscribe; public class ArticleRenderer { public interface Controller { public void onUrlLongClick(WebView webView, String url, int type); public void onDownloadStart(String urlAsString); public boolean onBackPressed(); public void onShowBrowserPrompt(); public void onFirstPageLoadStarted(); } private Context mContext; private WebView mWebView; private boolean mIsDestroyed = false; private boolean mFirstPageLoadTriggered = false; private Controller mController; private boolean mRegisteredForBus; public ArticleRenderer(Context context, Controller controller, ArticleContent articleContent, View articleRendererPlaceholder) { mContext = context; mController = controller; Log.e(BATTERY_SAVE_TAG, "create: " + this.getClass().getSimpleName()); mWebView = new WebView(context); mWebView.setLayoutParams(articleRendererPlaceholder.getLayoutParams()); Util.replaceViewAtPosition(articleRendererPlaceholder, mWebView); mWebView.setDownloadListener(mDownloadListener); mWebView.setOnLongClickListener(mOnWebViewLongClickListener); mWebView.setOnKeyListener(mOnKeyListener); mWebView.setWebViewClient(mWebViewClient); WebSettings webSettings = mWebView.getSettings(); webSettings.setSupportZoom(true); webSettings.setTextZoom(Settings.get().getWebViewTextZoom()); webSettings.setTextZoom(Settings.get().getWebViewTextZoom()); webSettings.setBuiltInZoomControls(true); webSettings.setDisplayZoomControls(false); display(articleContent, false); Log.d("Article", "ArticleRenderer()"); MainApplication.registerForBus(context, this); mRegisteredForBus = true; } public void display(ArticleContent articleContent) { display(articleContent, true); } private void display(ArticleContent articleContent, boolean reuse) { mWebView.stopLoading(); String urlAsString = articleContent.mUrl.toString(); mWebView.loadDataWithBaseURL(urlAsString, articleContent.mPageHtml, "text/html", "utf-8", urlAsString); Log.d("Article", ".display() - " + (reuse ? "REUSE" : "NEW") + ", url:" + articleContent.mUrl.toString()); } public void destroy() { if (mRegisteredForBus) { MainApplication.unregisterForBus(mContext, this); mRegisteredForBus = false; } mIsDestroyed = true; if (mWebView != null) { mWebView.destroy(); Log.d("Article", "ArticleRenderer.destroy()"); } } public View getView() { return mWebView; } public void stopLoading() { if (mWebView != null) { mWebView.stopLoading(); } } WebViewClient mWebViewClient = new WebViewClient() { @Override public void onPageStarted(WebView view, String urlAsString, Bitmap favIcon) { if (mFirstPageLoadTriggered == false) { mController.onFirstPageLoadStarted(); } } }; DownloadListener mDownloadListener = new DownloadListener() { @Override public void onDownloadStart(String urlAsString, String userAgent, String contentDisposition, String mimetype, long contentLength) { mController.onDownloadStart(urlAsString); } }; View.OnLongClickListener mOnWebViewLongClickListener = new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { WebView.HitTestResult hitTestResult = mWebView.getHitTestResult(); //Log.d(TAG, "onLongClick type: " + hitTestResult.getType()); switch (hitTestResult.getType()) { case WebView.HitTestResult.IMAGE_TYPE: case WebView.HitTestResult.SRC_ANCHOR_TYPE: case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE: { final String url = hitTestResult.getExtra(); if (url == null) { return false; } mController.onUrlLongClick(mWebView, url, hitTestResult.getType()); return true; } case WebView.HitTestResult.UNKNOWN_TYPE: default: if (Constant.ACTIVITY_WEBVIEW_RENDERING == false) { mController.onShowBrowserPrompt(); } return false; } } }; View.OnKeyListener mOnKeyListener = new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN && mIsDestroyed == false) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: { return mController.onBackPressed(); } } } return false; } }; private static final String BATTERY_SAVE_TAG = "BatterySaveArticleRenderer"; private void webviewPause(String via) { String msg = "PAUSE (" + via + ") "; if (mWebView != null && mIsDestroyed == false) { mWebView.onPause(); } Log.d(BATTERY_SAVE_TAG, msg); } private void webviewResume(String via) { String msg = "RESUME (" + via + ") "; if (mWebView != null && mIsDestroyed == false) { mWebView.onResume(); } Log.d(BATTERY_SAVE_TAG, msg); } @SuppressWarnings("unused") @Subscribe public void onUserPresentEvent(MainController.UserPresentEvent event) { switch (Settings.get().getWebViewBatterySaveMode()) { case Default: webviewResume("userPresent"); break; } } @SuppressWarnings("unused") @Subscribe public void onScreenOffEvent(MainController.ScreenOffEvent event) { switch (Settings.get().getWebViewBatterySaveMode()) { case Aggressive: case Default: webviewPause("screenOff"); break; } } @SuppressWarnings("unused") @Subscribe public void onBeginCollapseTransitionEvent(MainController.BeginCollapseTransitionEvent event) { switch (Settings.get().getWebViewBatterySaveMode()) { case Aggressive: webviewPause("beginCollapse"); break; } } @SuppressWarnings("unused") @Subscribe public void onBeginExpandTransitionEvent(MainController.BeginExpandTransitionEvent event) { switch (Settings.get().getWebViewBatterySaveMode()) { case Aggressive: webviewResume("beginExpand"); break; } } @SuppressWarnings("unused") @Subscribe public void onHideContentEvent(MainController.HideContentEvent event) { switch (Settings.get().getWebViewBatterySaveMode()) { case Aggressive: case Default: webviewPause("hide event"); break; } } @SuppressWarnings("unused") @Subscribe public void onUnhideContentEvent(MainController.UnhideContentEvent event) { switch (Settings.get().getWebViewBatterySaveMode()) { case Default: webviewResume("unhide event"); break; } } }