package org.softeg.slartus.forpdaplus.fragments; import android.content.Context; import android.content.SharedPreferences; import android.content.res.ColorStateList; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.design.widget.FloatingActionButton; import android.support.v4.widget.SwipeRefreshLayout; import android.text.TextUtils; import android.util.Log; import android.view.ContextMenu; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.Window; import android.webkit.JavascriptInterface; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; import org.softeg.slartus.forpdaplus.App; import org.softeg.slartus.forpdaplus.R; import org.softeg.slartus.forpdaplus.classes.AdvWebView; import org.softeg.slartus.forpdaplus.classes.IWebViewContainer; import org.softeg.slartus.forpdaplus.classes.SaveHtml; import org.softeg.slartus.forpdaplus.classes.WebViewExternals; import org.softeg.slartus.forpdaplus.classes.common.ExtUrl; import org.softeg.slartus.forpdaplus.common.AppLog; import org.softeg.slartus.forpdaplus.prefs.Preferences; import org.softeg.slartus.forpdaplus.prefs.PreferencesActivity; import java.util.ArrayList; /** * Created by radiationx on 17.10.15. */ public abstract class WebViewFragment extends GeneralFragment implements IWebViewContainer{ class URLHandler extends Handler{ @Override public void handleMessage(Message msg) { super.handleMessage(msg); showLinkMenu((String) msg.getData().get("url")); } } public abstract AdvWebView getWebView(); public abstract WebViewClient getWebViewClient(); public abstract String getTitle(); public abstract String getUrl(); public abstract void reload(); public abstract AsyncTask getAsyncTask(); private Handler mHandler = new Handler(); private URLHandler urlHandler = new URLHandler(); public void showLinkMenu(String url){ if (TextUtils.isEmpty(url) || url.contains("HTMLOUT.ru") || url.equals("#") || url.startsWith("file:///")) return; ExtUrl.showSelectActionDialog(mHandler, getContext(), url); } @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { switch (getWebView().getHitTestResult().getType()) { case WebView.HitTestResult.UNKNOWN_TYPE: case WebView.HitTestResult.EDIT_TEXT_TYPE: break; case WebView.HitTestResult.IMAGE_TYPE: ExtUrl.showImageSelectActionDialog(mHandler, getContext(), getWebView().getHitTestResult().getExtra()); default: { getWebView().requestFocusNodeHref(urlHandler.obtainMessage()); } } } WebViewExternals m_WebViewExternals; public WebViewExternals getWebViewExternals() { if (m_WebViewExternals == null) m_WebViewExternals = new WebViewExternals(this); return m_WebViewExternals; } public void showBody(){ getThisTab().setTitle(getTitle()).setUrl(getUrl()); getMainActivity().notifyTabAdapter(); } @Override public void onAttach(Context context) { super.onAttach(context); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); if (Preferences.System.isDevSavePage()) { menu.add(R.string.save_page).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem menuItem) { try { saveHtml(); } catch (Exception ex) { return false; } return true; } }); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setArrow(); loadPreferences(App.getInstance().getPreferences()); if (Preferences.System.isDevSavePage()| Preferences.System.isDevStyle()) Toast.makeText(getMainActivity(), R.string.dev_mode, Toast.LENGTH_SHORT).show(); } protected SwipeRefreshLayout mSwipeRefreshLayout; protected void initSwipeRefreshLayout(){ mSwipeRefreshLayout = (SwipeRefreshLayout) getView().findViewById(R.id.ptr_layout); mSwipeRefreshLayout = App.createSwipeRefreshLayout(getMainActivity(), getView(), new Runnable() { @Override public void run() { reload(); } }); } protected void setLoading(final Boolean loading) { try { if (getMainActivity() == null) return; mSwipeRefreshLayout.post(new Runnable() { @Override public void run() { mSwipeRefreshLayout.setRefreshing(loading); } }); } catch (Throwable ignore) { android.util.Log.e("TAG", ignore.toString()); } } public void setFabColors(final FloatingActionButton fab){ fab.setBackgroundTintList(ColorStateList.valueOf(App.getInstance().getColorAccent("Accent"))); fab.setRippleColor(App.getInstance().getColorAccent("Pressed")); } @Override public void onResume() { super.onResume(); if(getWebView()!=null){ getWebView().onResume(); getWebView().setWebViewClient(getWebViewClient()); } setArrow(); } @Override public void onPause() { super.onPause(); if (getWebView()!=null) { new Handler().postDelayed(new Runnable() { @Override public void run() { if (getWebView()!=null&&isFragmentPaused()) getWebView().onPause(); } }, 1500); getWebView().setWebViewClient(null); getWebView().setPictureListener(null); } } @Override public void onStop() { super.onStop(); if (getWebView()!=null) { getWebView().setWebViewClient(null); getWebView().setPictureListener(null); } } @Override public void onDestroy(){ if (getWebView() != null){ getWebView().setWebViewClient(null); getWebView().removeAllViews(); getWebView().loadUrl("about:blank"); } if(getAsyncTask()!=null) getAsyncTask().cancel(false); super.onDestroy(); } public void setHideArrows(boolean hide) { if (getWebView() == null) return; LinearLayout arrows = (LinearLayout) getView().findViewById(R.id.arrows); LinearLayout arrowsShadow = (LinearLayout) getView().findViewById(R.id.arrows_shadow); if (arrows == null) return; if(hide){ arrows.setVisibility(View.GONE); arrowsShadow.setVisibility(View.GONE); }else { arrows.setVisibility(View.VISIBLE); arrowsShadow.setVisibility(View.VISIBLE); } } /*private boolean fabIsVisible = false; private FloatingActionButton.OnVisibilityChangedListener fabListener = new FloatingActionButton.OnVisibilityChangedListener(){ @Override public void onShown(FloatingActionButton fab) { super.onShown(fab); fabIsVisible = true; } @Override public void onHidden(FloatingActionButton fab) { super.onHidden(fab); fabIsVisible = false; } };*/ public void setHideFab(final FloatingActionButton fab){ if (getWebView() == null)return; if (fab == null) return; if(Preferences.isHideFab()) { getWebView().setOnScrollChangedCallback(new AdvWebView.OnScrollChangedCallback() { @Override public void onScrollDown(Boolean inTouch) { if (!inTouch) return; fab.hide(); } @Override public void onScrollUp(Boolean inTouch) { if (!inTouch) return; fab.show(); } @Override public void onTouch() { fab.show(); } }); }else { getWebView().setOnScrollChangedCallback(null); fab.show(); } } protected void setWebViewSettings(Boolean loadImagesAutomaticallyAlways) { getWebViewExternals().setWebViewSettings(loadImagesAutomaticallyAlways); } public void setWebViewSettings() { setWebViewSettings(false); } public void onPrepareOptionsMenu() { getWebViewExternals().onPrepareOptionsMenu(); } protected void loadPreferences(SharedPreferences prefs) { getWebViewExternals().loadPreferences(prefs); } @Override public boolean dispatchKeyEvent(KeyEvent event) { return getWebViewExternals().dispatchKeyEvent(event); } public void showFontSizeDialog() { View v = getMainActivity().getLayoutInflater().inflate(R.layout.font_size_dialog, null); assert v != null; final SeekBar seekBar = (SeekBar) v.findViewById(R.id.value_seekbar); seekBar.setProgress(Preferences.getFontSize(Prefix()) - 1); final TextView textView = (TextView) v.findViewById(R.id.value_textview); textView.setText((seekBar.getProgress() + 1) + ""); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { getWebView().getSettings().setDefaultFontSize(i + 1); textView.setText((i + 1) + ""); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); MaterialDialog dialog = new MaterialDialog.Builder(getMainActivity()) .title(R.string.font_size) .customView(v, true) .positiveText(R.string.ok) .negativeText(R.string.cancel) .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(MaterialDialog dialog, DialogAction which) { Preferences.setFontSize(Prefix(), seekBar.getProgress() + 1); } }) .onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(MaterialDialog dialog, DialogAction which) { getWebView().getSettings().setDefaultFontSize(Preferences.Topic.getFontSize()); } }) .show(); dialog.setActionButton(DialogAction.NEUTRAL, R.string.reset); View neutral = dialog.getActionButton(DialogAction.NEUTRAL); neutral.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { seekBar.setProgress(15); Preferences.setFontSize(Prefix(), 16); getWebView().getSettings().setDefaultFontSize(Preferences.Topic.getFontSize()); } }); dialog.show(); } public void showStylesDialog(final SharedPreferences prefs) { try { final String currentValue = App.getInstance().getCurrentTheme(); ArrayList<CharSequence> newStyleNames = new ArrayList<CharSequence>(); final ArrayList<CharSequence> newStyleValues = new ArrayList<CharSequence>(); PreferencesActivity.getStylesList(getMainActivity(), newStyleNames, newStyleValues); final int[] selected = {newStyleValues.indexOf(currentValue)}; CharSequence[] styleNames = newStyleNames.toArray(new CharSequence[newStyleNames.size()]); new MaterialDialog.Builder(getMainActivity()) .title(R.string.theme_style) .cancelable(true) .positiveText(R.string.accept) .items(styleNames) .itemsCallbackSingleChoice(selected[0], new MaterialDialog.ListCallbackSingleChoice() { @Override public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) { if (which == -1) { Toast.makeText(getMainActivity(), R.string.ChooseStyle, Toast.LENGTH_LONG).show(); return false; } selected[0] = which; return true; } }) .alwaysCallSingleChoiceCallback() .callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog dialog) { int lastTheme = App.getInstance().getThemeStyleResID(); SharedPreferences.Editor editor = prefs.edit(); editor.putString("appstyle", newStyleValues.get(selected[0]).toString()); //editor.putBoolean("theme.BrowserStyle", checkBox.isChecked()); editor.apply(); if(App.getInstance().getThemeStyleResID()!=lastTheme) getMainActivity().recreate(); else setStyleSheet(); } }) .negativeText(R.string.cancel) .show(); } catch (Exception ex) { AppLog.e(getMainActivity(), ex); } } public void setStyleSheet() { try { getWebView().loadUrl("javascript:changeStyle('file://"+App.getInstance().getThemeCssFileName()+"');"); Log.e("Test", "setStyleSheet: " + "file://"+App.getInstance().getThemeCssFileName()); } catch (Throwable ex) { AppLog.e(getMainActivity(), ex); } } public void saveHtml() { try { getWebView().evalJs("window.HTMLOUT.saveHtml('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');"); } catch (Throwable ex) { AppLog.e(getMainActivity(), ex); } } @JavascriptInterface public void saveHtml(final String html) { getMainActivity().runOnUiThread(new Runnable() { @Override public void run() { new SaveHtml(getMainActivity(), html, Prefix()+""); } }); } @Override public String Prefix() { return null; } @Override public boolean dispatchSuperKeyEvent(KeyEvent event) { return false; } @Override public Window getWindow() { return getMainActivity().getWindow(); } @Override public void nextPage() {} @Override public void prevPage() {} }