package com.klarna.ondemand; import android.annotation.SuppressLint; import android.app.ActionBar; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.view.MenuItem; import android.webkit.WebView; import android.webkit.WebViewClient; import com.jockeyjs.Jockey; import com.jockeyjs.JockeyHandler; import com.jockeyjs.JockeyImpl; import java.util.Map; abstract class WebViewActivity extends Activity { private ProgressDialog progressDialog; private WebViewClient webViewClient; private Jockey jockey; private WebView webView; private static final String USER_READY_EVENT_IDENTIFIER = "userReady"; private static final String USER_ERROR_EVENT_IDENTIFIER = "userError"; private static final String OPEN_IN_BROWSER_PARAMETER = "openInBrowser=true"; public static final int RESULT_ERROR = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_webview); addSpinner(); initializeActionBar(); initializeWebView(); registerJockeyEvents(); } @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getItemId() == android.R.id.home) { setResult(homeButtonResultCode()); finish(); } return super.onOptionsItemSelected(item); } @Override protected void onDestroy() { jockey.off(USER_READY_EVENT_IDENTIFIER); jockey.off(USER_ERROR_EVENT_IDENTIFIER); dismissProgressDialog(); super.onDestroy(); } protected abstract int homeButtonResultCode(); protected abstract void handleUserReadyEvent(Map<Object, Object> payload); protected void handleUserErrorEvent() { setResult(RESULT_ERROR); finish(); } protected WebView getWebView() { if (webView == null) { webView = (WebView) findViewById(R.id.webView); } return webView; } private void initializeWebView() { WebView webView = getWebView(); webView.getSettings().setJavaScriptEnabled(true); webView.clearCache(true); webView.setWebViewClient(webViewClient = new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.contains(OPEN_IN_BROWSER_PARAMETER)) { String parameterlessUrl = url.substring(0,url.lastIndexOf("?")); Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(parameterlessUrl)); startActivity(browserIntent); return true; } return false; } @Override @SuppressLint("NewApi") public void onPageFinished(WebView view, String url) { if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && WebViewActivity.this.isDestroyed()) || WebViewActivity.this.isFinishing()) { return; } dismissProgressDialog(); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { progressDialog.dismiss(); setResult(RESULT_ERROR); finish(); } }); } private void dismissProgressDialog() { if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } } private void addSpinner() { progressDialog = new ProgressDialog(WebViewActivity.this); progressDialog.setMessage(getString(R.string.LOADING_SPINNER)); progressDialog.show(); } private void initializeActionBar() { ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); } private void registerJockeyEvents() { jockey = JockeyImpl.getDefault(); jockey.configure(getWebView()); jockey.setWebViewClient(webViewClient); jockey.on(USER_READY_EVENT_IDENTIFIER, new JockeyHandler() { @Override protected void doPerform(Map<Object, Object> payload) { handleUserReadyEvent(payload); } }); jockey.on(USER_ERROR_EVENT_IDENTIFIER, new JockeyHandler() { @Override protected void doPerform(Map<Object, Object> payload) { handleUserErrorEvent(); } }); } }