SamlWebViewDialog.java 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. /* ownCloud Android client application
  2. * Copyright (C) 2012-2013 ownCloud Inc.
  3. *
  4. * This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2,
  6. * as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. *
  16. */
  17. package com.owncloud.android.ui.dialog;
  18. import android.annotation.SuppressLint;
  19. import android.app.Activity;
  20. import android.app.Dialog;
  21. import android.content.DialogInterface;
  22. import android.os.Bundle;
  23. import android.os.Handler;
  24. import android.support.v4.app.FragmentTransaction;
  25. import android.support.v4.app.FragmentManager;
  26. import android.view.LayoutInflater;
  27. import android.view.View;
  28. import android.view.ViewGroup;
  29. import android.webkit.CookieManager;
  30. import android.webkit.CookieSyncManager;
  31. import android.webkit.WebBackForwardList;
  32. import android.webkit.WebSettings;
  33. import android.webkit.WebView;
  34. import com.actionbarsherlock.app.SherlockDialogFragment;
  35. import com.owncloud.android.Log_OC;
  36. import com.owncloud.android.R;
  37. import com.owncloud.android.authentication.SsoWebViewClient;
  38. import com.owncloud.android.authentication.SsoWebViewClient.SsoWebViewClientListener;
  39. import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
  40. /**
  41. * Dialog to show the WebView for SAML Authentication
  42. *
  43. * @author Maria Asensio
  44. * @author David A. Velasco
  45. */
  46. public class SamlWebViewDialog extends SherlockDialogFragment {
  47. public final String SAML_DIALOG_TAG = "SamlWebViewDialog";
  48. private final static String TAG = SamlWebViewDialog.class.getSimpleName();
  49. private static final String ARG_INITIAL_URL = "INITIAL_URL";
  50. private static final String ARG_TARGET_URL = "TARGET_URL";
  51. private static final String KEY_WEBVIEW_STATE = "WEBVIEW_STATE";
  52. private WebView mSsoWebView;
  53. private SsoWebViewClient mWebViewClient;
  54. private String mInitialUrl;
  55. private String mTargetUrl;
  56. private Handler mHandler;
  57. private SsoWebViewClientListener mSsoWebViewClientListener;
  58. //private View mSsoRootView;
  59. /**
  60. * Public factory method to get dialog instances.
  61. *
  62. * @param handler
  63. * @param Url Url to open at WebView
  64. * @param targetURL mHostBaseUrl + AccountUtils.getWebdavPath(mDiscoveredVersion, mCurrentAuthTokenType)
  65. * @return New dialog instance, ready to show.
  66. */
  67. public static SamlWebViewDialog newInstance(String url, String targetUrl) {
  68. Log_OC.d(TAG, "New instance");
  69. SamlWebViewDialog fragment = new SamlWebViewDialog();
  70. Bundle args = new Bundle();
  71. args.putString(ARG_INITIAL_URL, url);
  72. args.putString(ARG_TARGET_URL, targetUrl);
  73. fragment.setArguments(args);
  74. return fragment;
  75. }
  76. public SamlWebViewDialog() {
  77. super();
  78. Log_OC.d(TAG, "constructor");
  79. }
  80. @Override
  81. public void onAttach(Activity activity) {
  82. Log_OC.d(TAG, "onAttach");
  83. super.onAttach(activity);
  84. try {
  85. mSsoWebViewClientListener = (SsoWebViewClientListener) activity;
  86. mHandler = new Handler();
  87. mWebViewClient = new SsoWebViewClient(mHandler, mSsoWebViewClientListener);
  88. } catch (ClassCastException e) {
  89. throw new ClassCastException(activity.toString() + " must implement " + SsoWebViewClientListener.class.getSimpleName());
  90. }
  91. }
  92. @SuppressLint("SetJavaScriptEnabled")
  93. @Override
  94. public void onCreate(Bundle savedInstanceState) {
  95. Log_OC.d(TAG, "onCreate");
  96. super.onCreate(savedInstanceState);
  97. CookieSyncManager.createInstance(getActivity());
  98. if (savedInstanceState == null) {
  99. mInitialUrl = getArguments().getString(ARG_INITIAL_URL);
  100. mTargetUrl = getArguments().getString(ARG_TARGET_URL);
  101. } else {
  102. mInitialUrl = savedInstanceState.getString(ARG_INITIAL_URL);
  103. mTargetUrl = savedInstanceState.getString(ARG_TARGET_URL);
  104. }
  105. setStyle(SherlockDialogFragment.STYLE_NO_TITLE, R.style.Theme_ownCloud_Dialog);
  106. }
  107. @Override
  108. public Dialog onCreateDialog(Bundle savedInstanceState) {
  109. Log_OC.d(TAG, "onCreateDialog");
  110. /*
  111. // build the dialog
  112. AlertDialog.Builder builder = new AlertDialog.Builder(getSherlockActivity());
  113. if (mSsoRootView.getParent() != null) {
  114. ((ViewGroup)(mSsoRootView.getParent())).removeView(mSsoRootView);
  115. }
  116. builder.setView(mSsoRootView);
  117. //builder.setView(mSsoWebView);
  118. Dialog dialog = builder.create();
  119. */
  120. return super.onCreateDialog(savedInstanceState);
  121. }
  122. @SuppressLint("SetJavaScriptEnabled")
  123. @Override
  124. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  125. Log_OC.d(TAG, "onCreateView");
  126. // Inflate layout of the dialog
  127. View rootView = inflater.inflate(R.layout.sso_dialog, container, false); // null parent view because it will go in the dialog layout
  128. mSsoWebView = (WebView) rootView.findViewById(R.id.sso_webview);
  129. mWebViewClient.setTargetUrl(mTargetUrl);
  130. mSsoWebView.setWebViewClient(mWebViewClient);
  131. if (savedInstanceState == null) {
  132. Log_OC.d(TAG, " initWebView start");
  133. CookieManager cookieManager = CookieManager.getInstance();
  134. cookieManager.setAcceptCookie(true);
  135. cookieManager.removeAllCookie();
  136. mSsoWebView.loadUrl(mInitialUrl);
  137. } else {
  138. Log_OC.d(TAG, " restoreWebView start");
  139. WebBackForwardList history = mSsoWebView.restoreState(savedInstanceState.getBundle(KEY_WEBVIEW_STATE));
  140. if (history == null) {
  141. Log_OC.e(TAG, "Error restoring WebView state ; back to starting URL");
  142. mSsoWebView.loadUrl(mInitialUrl);
  143. }
  144. }
  145. WebSettings webSettings = mSsoWebView.getSettings();
  146. webSettings.setJavaScriptEnabled(true);
  147. webSettings.setBuiltInZoomControls(true);
  148. webSettings.setLoadWithOverviewMode(false);
  149. webSettings.setSavePassword(false);
  150. webSettings.setUserAgentString(WebdavClient.USER_AGENT);
  151. webSettings.setSaveFormData(false);
  152. return rootView;
  153. }
  154. @Override
  155. public void onSaveInstanceState(Bundle outState) {
  156. Log_OC.d(SAML_DIALOG_TAG, "onSaveInstanceState being CALLED");
  157. super.onSaveInstanceState(outState);
  158. // save URLs
  159. outState.putString(ARG_INITIAL_URL, mInitialUrl);
  160. outState.putString(ARG_TARGET_URL, mTargetUrl);
  161. // Save the state of the WebView
  162. Bundle webviewState = new Bundle();
  163. mSsoWebView.saveState(webviewState);
  164. outState.putBundle(KEY_WEBVIEW_STATE, webviewState);
  165. }
  166. @Override
  167. public void onDestroyView() {
  168. Log_OC.d(TAG, "onDestroyView");
  169. mSsoWebView.setWebViewClient(null);
  170. // Work around bug: http://code.google.com/p/android/issues/detail?id=17423
  171. Dialog dialog = getDialog();
  172. if ((dialog != null)) {
  173. dialog.setOnDismissListener(null);
  174. //dialog.dismiss();
  175. //dialog.setDismissMessage(null);
  176. }
  177. super.onDestroyView();
  178. }
  179. @Override
  180. public void onDestroy() {
  181. Log_OC.d(TAG, "onDestroy");
  182. super.onDestroy();
  183. }
  184. @Override
  185. public void onDetach() {
  186. Log_OC.d(TAG, "onDetach");
  187. mSsoWebViewClientListener = null;
  188. mWebViewClient = null;
  189. super.onDetach();
  190. }
  191. @Override
  192. public void onCancel (DialogInterface dialog) {
  193. Log_OC.d(SAML_DIALOG_TAG, "onCancel");
  194. super.onCancel(dialog);
  195. }
  196. @Override
  197. public void onDismiss (DialogInterface dialog) {
  198. Log_OC.d(SAML_DIALOG_TAG, "onDismiss");
  199. super.onDismiss(dialog);
  200. }
  201. @Override
  202. public void onStart() {
  203. Log_OC.d(SAML_DIALOG_TAG, "onStart");
  204. super.onStart();
  205. }
  206. @Override
  207. public void onStop() {
  208. Log_OC.d(SAML_DIALOG_TAG, "onStop");
  209. super.onStop();
  210. }
  211. @Override
  212. public void onResume() {
  213. Log_OC.d(SAML_DIALOG_TAG, "onResume");
  214. super.onResume();
  215. }
  216. @Override
  217. public void onPause() {
  218. Log_OC.d(SAML_DIALOG_TAG, "onPause");
  219. super.onPause();
  220. }
  221. @Override
  222. public int show (FragmentTransaction transaction, String tag) {
  223. Log_OC.d(SAML_DIALOG_TAG, "show (transaction)");
  224. return super.show(transaction, tag);
  225. }
  226. @Override
  227. public void show (FragmentManager manager, String tag) {
  228. Log_OC.d(SAML_DIALOG_TAG, "show (manager)");
  229. super.show(manager, tag);
  230. }
  231. }