package com.evernote.client.android; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView; import android.webkit.WebViewClient; import com.evernote.client.android.helper.Cat; /** * Alternative if Evernote is not installed. * * @author rwondratschek */ @SuppressWarnings("UnusedDeclaration") public class EvernoteOAuthActivity extends FragmentActivity { private static final Cat CAT = new Cat("EvernoteOAuthActivity"); private static final String HOST_EVERNOTE = "www.evernote.com"; private static final String HOST_SANDBOX = "sandbox.evernote.com"; private static final String HOST_CHINA = "app.yinxiang.com"; public static Intent createIntent(Context context, String url) { Intent intent = new Intent(context, EvernoteOAuthActivity.class); intent.putExtra(EvernoteUtil.EXTRA_AUTHORIZATION_URL, url); return intent; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setResultUri(null); String url = getIntent().getStringExtra(EvernoteUtil.EXTRA_AUTHORIZATION_URL); if (TextUtils.isEmpty(url)) { CAT.w("no uri passed, return cancelled"); finish(); return; } Uri uri = Uri.parse(url); if (!"https".equalsIgnoreCase(uri.getScheme())) { CAT.w("https required, return cancelled"); finish(); return; } String host = uri.getHost(); if (!HOST_EVERNOTE.equalsIgnoreCase(host) && !HOST_SANDBOX.equalsIgnoreCase(host) && !HOST_CHINA.equalsIgnoreCase(host)) { CAT.w("unacceptable host, return cancelled"); finish(); return; } if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(android.R.id.content, new WebViewFragment()) .commit(); } } private void setResultUri(String clickedOAuthUri) { Intent data = new Intent(); data.putExtra(EvernoteUtil.EXTRA_OAUTH_CALLBACK_URL, clickedOAuthUri); setResult(TextUtils.isEmpty(clickedOAuthUri) ? RESULT_CANCELED : RESULT_OK, data); } public static class WebViewFragment extends Fragment { private static final String INTENT_KEY = "IntentKey"; public static WebViewFragment createInstance() { WebViewFragment fragment = new WebViewFragment(); fragment.setRetainInstance(true); return fragment; } private WebView mWebView; private boolean mIsWebViewAvailable; private String mUrl; @Override public void onAttach(Activity activity) { if (!(activity instanceof EvernoteOAuthActivity)) { throw new IllegalArgumentException(); } super.onAttach(activity); mUrl = activity.getIntent().getStringExtra(EvernoteUtil.EXTRA_AUTHORIZATION_URL); } @SuppressLint("SetJavaScriptEnabled") @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { destroyWebView(); mWebView = new WebView(getActivity()); mWebView.setWebViewClient(mWebViewClient); mWebView.getSettings().setJavaScriptEnabled(true); if (savedInstanceState == null) { mWebView.loadUrl(mUrl); } else { mWebView.restoreState(savedInstanceState); } mIsWebViewAvailable = true; return mWebView; } @Override public void onPause() { super.onPause(); mWebView.onPause(); } @Override public void onResume() { mWebView.onResume(); super.onResume(); } @Override public void onDestroyView() { mIsWebViewAvailable = false; super.onDestroyView(); } @Override public void onDestroy() { destroyWebView(); super.onDestroy(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mWebView.saveState(outState); } public WebView getWebView() { return mIsWebViewAvailable ? mWebView : null; } private void destroyWebView() { if (mWebView != null) { ViewGroup viewGroup = (ViewGroup) mWebView.getParent(); if (viewGroup != null) { viewGroup.removeView(mWebView); } mWebView.destroy(); mWebView = null; } } private WebViewClient mWebViewClient = new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Uri uri = Uri.parse(url); if (EvernoteOAuthHelper.CALLBACK_SCHEME.equals(uri.getScheme())) { ((EvernoteOAuthActivity) getActivity()).setResultUri(url); getActivity().finish(); return true; } return super.shouldOverrideUrlLoading(view, url); } }; } }