package com.erakk.lnreader.helper; import android.os.Build; import android.os.Handler; import android.support.v7.app.ActionBar; import android.support.v7.widget.Toolbar; import android.util.Log; import android.util.TypedValue; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.webkit.WebView; import android.widget.EditText; import android.widget.ImageButton; import android.widget.RelativeLayout; import android.widget.TextView; import com.erakk.lnreader.R; import com.erakk.lnreader.UI.activity.DisplayLightNovelContentActivity; import java.lang.reflect.Method; public class DisplayNovelContentUIHelper { private static final String TAG = DisplayNovelContentUIHelper.class.toString(); private final DisplayLightNovelContentActivity parent; private final Handler mHandler = new Handler(); private ImageButton goTop; private ImageButton goBottom; private Runnable hideBottom; private Runnable hideTop; private Runnable hideToolbarDelayed; public DisplayNovelContentUIHelper(DisplayLightNovelContentActivity parent) { this.parent = parent; } // region Compatibility search method for older android version public void prepareCompatSearchBox(final WebView webView) { final EditText searchText = (EditText) parent.findViewById(R.id.searchText); searchText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { search(webView, searchText.getText().toString()); return false; } }); } @SuppressWarnings("deprecation") private void search(WebView webView, String string) { if (string != null && string.length() > 0) webView.findAll(string); try { Method m = NonLeakingWebView.class.getMethod("setFindIsUp", Boolean.TYPE); m.invoke(webView, true); } catch (NoSuchMethodException me) { } catch (Exception e) { Log.e(TAG, "Error when searching", e); } } public void closeSearchBox(WebView webView) { RelativeLayout searchBox = (RelativeLayout) parent.findViewById(R.id.searchBox); searchBox.setVisibility(View.GONE); webView.clearMatches(); } // endregion Compatibility search method for older android version public void prepareTopDownButton() { goTop = (ImageButton) parent.findViewById(R.id.webview_go_top); goBottom = (ImageButton) parent.findViewById(R.id.webview_go_bottom); // Hide button after a certain time being shown hideBottom = new Runnable() { @Override public void run() { goBottom.setVisibility(ImageButton.GONE); } }; hideTop = new Runnable() { @Override public void run() { goTop.setVisibility(ImageButton.GONE); } }; } public void toggleTopButton(boolean enable) { if (enable) { goTop.setVisibility(ImageButton.VISIBLE); mHandler.removeCallbacks(hideTop); mHandler.postDelayed(hideTop, 1500); } else goTop.setVisibility(ImageButton.GONE); if (parent.getFullscreenPreferences()) { mHandler.removeCallbacks(hideToolbarDelayed); mHandler.post(hideToolbarDelayed); } } public void toggleBottomButton(boolean enable) { if (enable) { goBottom.setVisibility(ImageButton.VISIBLE); mHandler.removeCallbacks(hideBottom); mHandler.postDelayed(hideBottom, 1500); } else goBottom.setVisibility(ImageButton.GONE); if (parent.getFullscreenPreferences()) { mHandler.removeCallbacks(hideToolbarDelayed); mHandler.post(hideToolbarDelayed); } } public void toggleFullscreen(boolean hideToolbar) { Log.d(TAG, "Hide Toolbar: " + hideToolbar); if (hideToolbar) { hideToolbar(); } else { if (Build.VERSION.SDK_INT >= 11) parent.getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(null); showToolbar(); } } private void hideToolbar() { final ActionBar actionBar = parent.getSupportActionBar(); if (actionBar == null) return; if (!actionBar.isShowing()) return; final Animation mSlideUp = AnimationUtils.loadAnimation(parent, R.anim.abc_slide_out_top); final Toolbar mToolBar = (Toolbar) parent.findViewById(R.id.toolbar); final View root = parent.findViewById(R.id.txtDebug); final View decorView = parent.getWindow().getDecorView(); if (root == null || decorView == null) return; mToolBar.startAnimation(mSlideUp); actionBar.hide(); // claim the empty space from toolbar. if (parent.getFullscreenPreferences()) { final ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) root.getLayoutParams(); lp.topMargin = 0; lp.bottomMargin = 0; root.setLayoutParams(lp); } parent.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); if (Build.VERSION.SDK_INT >= 14) { int uiFlag = decorView.getSystemUiVisibility(); uiFlag ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; if (Build.VERSION.SDK_INT >= 16) { uiFlag ^= View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; } if (Build.VERSION.SDK_INT >= 19) { uiFlag ^= View.SYSTEM_UI_FLAG_IMMERSIVE; } decorView.setSystemUiVisibility(uiFlag); } } private void showToolbar() { final ActionBar actionBar = parent.getSupportActionBar(); if (actionBar == null) return; // auto hide only if fullscreen is enabled mHandler.removeCallbacks(hideToolbarDelayed); if (parent.getFullscreenPreferences()) { mHandler.postDelayed(hideToolbarDelayed, 10000); } final Toolbar mToolBar = (Toolbar) parent.findViewById(R.id.toolbar); final View root = parent.findViewById(R.id.txtDebug); // adjust the layout to provide empty space for the toolbar if (!parent.getFullscreenPreferences()) { final ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) root.getLayoutParams(); final TypedValue tv = new TypedValue(); parent.getTheme().resolveAttribute(R.attr.actionBarSize, tv, true); lp.topMargin = TypedValue.complexToDimensionPixelSize(tv.data, parent.getResources().getDisplayMetrics()); root.setLayoutParams(lp); // also nav bar? // http://stackoverflow.com/a/29609679 } if (actionBar.isShowing()) return; final Animation mSlideDown = AnimationUtils.loadAnimation(parent, R.anim.abc_slide_in_top); final View decorView = parent.getWindow().getDecorView(); if (root == null || decorView == null) return; mToolBar.startAnimation(mSlideDown); actionBar.show(); parent.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); if (Build.VERSION.SDK_INT >= 14) { decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); } } public void prepareFullscreenHandler(NonLeakingWebView webView) { hideToolbarDelayed = new Runnable() { @Override public void run() { hideToolbar(); } }; /// adapted from http://stackoverflow.com/a/16485989 webView.setOnTouchListener(new View.OnTouchListener() { private float mDownX; private float mDownY; private final float SCROLL_THRESHOLD = 10; private boolean isOnClick; @Override public boolean onTouch(View v, MotionEvent ev) { switch (ev.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: mDownX = ev.getX(); mDownY = ev.getY(); isOnClick = true; break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: if (isOnClick) { // Log.i(TAG, "onClick "); showToolbar(); } break; case MotionEvent.ACTION_MOVE: if (isOnClick && (Math.abs(mDownX - ev.getX()) > SCROLL_THRESHOLD || Math.abs(mDownY - ev.getY()) > SCROLL_THRESHOLD)) { // Log.i(TAG, "movement detected"); isOnClick = false; } break; default: break; } return false; } }); } }