package triaina.webview; import com.google.inject.Inject; import triaina.commons.utils.SystemUtils; import triaina.injector.TriainaEnvironment; import triaina.injector.activity.TriainaActivity; import triaina.webview.annotation.Bridge; import triaina.webview.config.WebViewBridgeConfigurator; import triaina.webview.entity.Params; import triaina.webview.entity.device.EnvironmentSetParams; import triaina.webview.entity.device.FormPictureSelectParams; import triaina.webview.entity.device.FormPictureSelectResult; import triaina.webview.entity.device.NetBrowserOpenParams; import triaina.webview.entity.device.NewWindowParams; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; public abstract class AbstractWebViewBridgeActivity extends TriainaActivity { private static final String TAG = AbstractWebViewBridgeActivity.class.getSimpleName(); public static final String EXTRA_URL = "_url"; private WebViewBridge mWebViewBridge; @Inject private WebViewBridgeConfigurator mConfigurator; @Inject private WebViewRestoreManager mRestoreManager; @Inject private TriainaEnvironment mEnvironment; final public String[] getDomains() { return mWebViewBridge.getDomainConfig().getDomains(); } public void call(String dest, Params params) { mWebViewBridge.call(dest, params); } public void call(String dest, Params params, Callback<?> callback) { mWebViewBridge.call(dest, params, callback); } final public WebViewBridge getWebViewBridge() { return mWebViewBridge; } final public WebViewBridgeConfigurator getConfigurator() { return mConfigurator; } @Bridge("system.environment.set") public void doEnvironmentSet(EnvironmentSetParams params) { mEnvironment.set(params.getName(), params.getValue()); } @Bridge("system.form.picture.select") public void doFormPictureSelect(FormPictureSelectParams params, Callback<FormPictureSelectResult> callback) { // TODO need to implement Triaina Framework original logic } @Bridge("system.window.open") public void doOpenNewWindow(NewWindowParams params) { startActivityForResult(this, getClass(), params.getUrl()); } @Bridge("system.net.browser.open") public void doNetBrowserOpen(NetBrowserOpenParams params) { SystemUtils.launchExternalBrowser(this, Uri.parse(params.getUrl())); } @Bridge("system.web.error") public void doWebError() { // ignore } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mWebViewBridge = mConfigurator.loadWebViewBridge(this); mConfigurator.configure(mWebViewBridge); configureSettings(); configureClients(); loadViews(); loadUrl(savedInstanceState); } protected void configureSettings() { mConfigurator.configureSetting(mWebViewBridge); } protected void configureClients() { mWebViewBridge.setWebChromeClient(new TriainaWebChromeClient(this)); mWebViewBridge.setWebViewClient(new TriainaWebViewClient()); } protected void loadViews() { } protected void loadUrl(Bundle savedInstanceState) { if (mRestoreManager.restoreWebView(mWebViewBridge, savedInstanceState)) return; String url = getIntent().getStringExtra(EXTRA_URL); getWebViewBridge().loadUrl(url); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && getWebViewBridge().canGoBack()) { getWebViewBridge().goBack(); return true; } return super.onKeyDown(keyCode, event); } protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); storeWebView(outState); } protected void storeWebView(Bundle outState) { mRestoreManager.storeWebView(mWebViewBridge, outState); } @Override protected void onResume() { super.onResume(); mWebViewBridge.resume(); } @Override protected void onPause() { mWebViewBridge.pause(); super.onPause(); } @Override protected void onDestroy() { try { mWebViewBridge.destroy(); } catch (Exception exp) { Log.w(TAG, exp.getMessage() + "", exp); } super.onDestroy(); } public static void startActivityForResult(Activity activity, Class<?> clazz, String url) { Intent intent = new Intent(activity, clazz); intent.putExtra(EXTRA_URL, url); activity.startActivityForResult(intent, 0); } }