package com.powerpoint45.dtube; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.util.AttributeSet; import android.util.Log; import android.view.inputmethod.BaseInputConnection; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.webkit.CookieManager; import android.webkit.CookieSyncManager; import android.webkit.JavascriptInterface; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import static android.app.Activity.RESULT_OK; public class UploadWebView extends WebView { private boolean loadedPage; final String JS_PRE = "javascript: (function(){"; final String JS_POST = "})();"; public UploadWebView(Context context) { super(context); } @SuppressLint("SetJavaScriptEnabled") public UploadWebView(Context context, AttributeSet attrs) { super(context, attrs); CookieSyncManager.createInstance(context); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) cookieManager.setAcceptThirdPartyCookies(this, true); WebView.setWebContentsDebuggingEnabled(true); getSettings().setJavaScriptEnabled(true); getSettings().setAppCacheEnabled(true); getSettings().setDatabaseEnabled(true); getSettings().setAllowContentAccess(true); getSettings().setAllowFileAccess(true); getSettings().setAllowFileAccessFromFileURLs(true); getSettings().setAllowFileAccessFromFileURLs(true); getSettings().setDomStorageEnabled(true); getSettings().setMediaPlaybackRequiresUserGesture(false); this.getSettings().setSupportZoom(true); this.getSettings().setBuiltInZoomControls(true); this.getSettings().setDisplayZoomControls(false); this.getSettings().setPluginState(WebSettings.PluginState.ON); this.getSettings().setUseWideViewPort(true); this.getSettings().setSaveFormData(true); this.getSettings().setSavePassword(true); Log.d("DT","UPLOAD WV SETUP"); setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { loadedPage = true; view.loadUrl(JS_PRE+"window.android.onUrlChange(window.location.href);"+JS_POST); if (url.equals(DtubeAPI.DTUBE_LOGIN_URL)) { postDelayed(new Runnable() { @Override public void run() { goToSteemitLogin(); if (Preferences.darkMode){ setDarkMode(); } removeTopBar(); postDelayed(new Runnable() { @Override public void run() { setUsername(DtubeAPI.getAccountName(getContext())); setPassword(DtubeAPI.getUserPrivateKey(getContext())); clickLogin(); } },100); } }, 101); }else if (url.equals(DtubeAPI.DTUBE_UPLOAD_URL)){ removeTopBar(); if (Preferences.darkMode){ setDarkMode(); } } } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.d("DT", "shouldOverrideUrlLoading:"+url); view.loadUrl(url); return true; } }); addJavascriptInterface(new MyJavaScriptInterface(), "android"); } public UploadWebView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } class MyJavaScriptInterface { @JavascriptInterface public void onUrlChange(String url) { Log.d("DT", "onUrlChange" + url); if (url.equals(DtubeAPI.DTUBE_HOME_URL)) { postDelayed(new Runnable() { @Override public void run() { loadUrl(DtubeAPI.DTUBE_PUBLISH_URL); } },100); }else if (url.contains(DtubeAPI.DTUBE_VIDEO_URL)){ class FinishRunner implements Runnable{ private String url; private FinishRunner(String url){ this.url = url; } @Override public void run() { Intent data = new Intent(); Bundle b = new Bundle(); Video v = new Video(); v.permlink = url.substring(url.lastIndexOf("/")+1); v.user = DtubeAPI.getAccountName(getContext()); b.putSerializable("video", v); data.putExtra("video",b); ((Activity)getContext()).setResult(RESULT_OK, data); ((Activity)getContext()).finish(); } } post(new FinishRunner(url)); } } } public void goToSteemitLogin(){ Log.d("dtube","goToSteemitLogin"); loadUrl(JS_PRE+"for (i = 0; i < 3; i++) {if (document.getElementsByClassName('loginOption')[i].getAttribute(\"data-network\") == \"Steem\"){document.getElementsByClassName('loginOption')[i].click();}}"+JS_POST); loadUrl(JS_PRE+"document.getElementsByClassName('submit')[1].click();"+JS_POST); } public void setDarkMode(){ loadUrl(JS_PRE+"document.getElementsByClassName('nightMode nightmodetext')[0].click();"+JS_POST); loadUrl(JS_PRE+"document.getElementsByClassName('nightMode')[0].click();"+JS_POST); } public void removeTopBar(){ //loadUrl(JS_PRE+"document.getElementsByClassName(\"mobiletopbar\")[0].parentNode.removeChild(document.getElementsByClassName(\"mobiletopbar\")[0]);"+JS_POST); } public void setUsername(String username){ loadUrl(JS_PRE+"document.getElementsByName('username')[0].value='" + username + "';"+JS_POST); } public void setPassword(String pwd){ loadUrl(JS_PRE+"document.getElementsByName('privatekey')[0].value='" + pwd + "';"+JS_POST); } public void clickLogin(){ loadUrl(JS_PRE+"document.getElementsByName('button')[0].click();"+JS_POST); } public void queURL(String url){ if (loadedPage) { loadUrl(url); Log.d("dtube4", "open url"); }else { class LoadRunner implements Runnable{ private String url; private LoadRunner(String url){ this.url = url; } @Override public void run() { do{ Log.d("dtube4","waiting to run url"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } }while (!loadedPage); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } ((Activity)getContext()).runOnUiThread(new Runnable() { @Override public void run() { loadUrl(url); } }); } } new Thread(new LoadRunner(url)).start(); } } @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { return new BaseInputConnection(this, false); //this is needed for #dispatchKeyEvent() to be notified. } public void killWebView(){ loadUrl("about:blank"); } }