9ed8a44628d920776c62b67a3b413e79baf54b55
[pub/Android/ownCloud.git] / src / com / owncloud / android / ui / dialog / SamlWebViewDialog.java
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
18 package com.owncloud.android.ui.dialog;
19
20 import android.annotation.SuppressLint;
21 import android.app.Activity;
22 import android.app.Dialog;
23 import android.content.DialogInterface;
24 import android.os.Bundle;
25 import android.os.Handler;
26 import android.support.v4.app.FragmentTransaction;
27 import android.support.v4.app.FragmentManager;
28 import android.view.LayoutInflater;
29 import android.view.View;
30 import android.view.ViewGroup;
31 import android.webkit.CookieManager;
32 import android.webkit.WebBackForwardList;
33 import android.webkit.WebSettings;
34 import android.webkit.WebView;
35
36 import com.actionbarsherlock.app.SherlockDialogFragment;
37 import com.owncloud.android.Log_OC;
38 import com.owncloud.android.R;
39 import com.owncloud.android.authentication.SsoWebViewClient;
40 import com.owncloud.android.authentication.SsoWebViewClient.SsoWebViewClientListener;
41
42 import eu.alefzero.webdav.WebdavClient;
43
44 /**
45 * Dialog to show the WebView for SAML Authentication
46 *
47 * @author Maria Asensio
48 * @author David A. Velasco
49 */
50 public class SamlWebViewDialog extends SherlockDialogFragment {
51
52 public final String SAML_DIALOG_TAG = "SamlWebViewDialog";
53
54 private final static String TAG = SamlWebViewDialog.class.getSimpleName();
55
56 private static final String ARG_INITIAL_URL = "INITIAL_URL";
57 private static final String ARG_TARGET_URL = "TARGET_URL";
58 private static final String KEY_WEBVIEW_STATE = "WEBVIEW_STATE";
59
60 private WebView mSsoWebView;
61 private SsoWebViewClient mWebViewClient;
62
63 private String mInitialUrl;
64 private String mTargetUrl;
65
66 private Handler mHandler;
67
68 private SsoWebViewClientListener mSsoWebViewClientListener;
69
70 //private View mSsoRootView;
71
72
73 /**
74 * Public factory method to get dialog instances.
75 *
76 * @param handler
77 * @param Url Url to open at WebView
78 * @param targetURL mHostBaseUrl + AccountUtils.getWebdavPath(mDiscoveredVersion, mCurrentAuthTokenType)
79 * @return New dialog instance, ready to show.
80 */
81 public static SamlWebViewDialog newInstance(String url, String targetUrl) {
82 Log_OC.d(TAG, "New instance");
83 SamlWebViewDialog fragment = new SamlWebViewDialog();
84 Bundle args = new Bundle();
85 args.putString(ARG_INITIAL_URL, url);
86 args.putString(ARG_TARGET_URL, targetUrl);
87 fragment.setArguments(args);
88 return fragment;
89 }
90
91
92 public SamlWebViewDialog() {
93 super();
94 Log_OC.d(TAG, "constructor");
95 }
96
97
98 @Override
99 public void onAttach(Activity activity) {
100 Log_OC.d(TAG, "onAttach");
101 super.onAttach(activity);
102 try {
103 mSsoWebViewClientListener = (SsoWebViewClientListener) activity;
104 mHandler = new Handler();
105 mWebViewClient = new SsoWebViewClient(mHandler, mSsoWebViewClientListener);
106
107 } catch (ClassCastException e) {
108 throw new ClassCastException(activity.toString() + " must implement " + SsoWebViewClientListener.class.getSimpleName());
109 }
110 }
111
112
113 @SuppressLint("SetJavaScriptEnabled")
114 @Override
115 public void onCreate(Bundle savedInstanceState) {
116 Log_OC.d(TAG, "onCreate");
117 super.onCreate(savedInstanceState);
118
119 if (savedInstanceState == null) {
120 mInitialUrl = getArguments().getString(ARG_INITIAL_URL);
121 mTargetUrl = getArguments().getString(ARG_TARGET_URL);
122 } else {
123 mInitialUrl = savedInstanceState.getString(ARG_INITIAL_URL);
124 mTargetUrl = savedInstanceState.getString(ARG_TARGET_URL);
125 }
126
127 setStyle(SherlockDialogFragment.STYLE_NO_TITLE, R.style.Theme_ownCloud_Dialog);
128 }
129
130 @Override
131 public Dialog onCreateDialog(Bundle savedInstanceState) {
132 Log_OC.d(TAG, "onCreateDialog");
133
134 /*
135 // build the dialog
136 AlertDialog.Builder builder = new AlertDialog.Builder(getSherlockActivity());
137 if (mSsoRootView.getParent() != null) {
138 ((ViewGroup)(mSsoRootView.getParent())).removeView(mSsoRootView);
139 }
140 builder.setView(mSsoRootView);
141 //builder.setView(mSsoWebView);
142 Dialog dialog = builder.create();
143 */
144
145 return super.onCreateDialog(savedInstanceState);
146 }
147
148 @SuppressLint("SetJavaScriptEnabled")
149 @Override
150 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
151 Log_OC.d(TAG, "onCreateView");
152
153 // Inflate layout of the dialog
154 View rootView = inflater.inflate(R.layout.sso_dialog, container, false); // null parent view because it will go in the dialog layout
155 mSsoWebView = (WebView) rootView.findViewById(R.id.sso_webview);
156
157 mWebViewClient.setTargetUrl(mTargetUrl);
158 mSsoWebView.setWebViewClient(mWebViewClient);
159
160 if (savedInstanceState == null) {
161 Log_OC.d(TAG, " initWebView start");
162 CookieManager cookieManager = CookieManager.getInstance();
163 cookieManager.setAcceptCookie(true);
164 cookieManager.removeAllCookie();
165 mSsoWebView.loadUrl(mInitialUrl);
166
167 } else {
168 Log_OC.d(TAG, " restoreWebView start");
169 WebBackForwardList history = mSsoWebView.restoreState(savedInstanceState.getBundle(KEY_WEBVIEW_STATE));
170 if (history == null) {
171 Log_OC.e(TAG, "Error restoring WebView state ; back to starting URL");
172 mSsoWebView.loadUrl(mInitialUrl);
173 }
174 }
175
176 WebSettings webSettings = mSsoWebView.getSettings();
177 webSettings.setJavaScriptEnabled(true);
178 webSettings.setBuiltInZoomControls(true);
179 webSettings.setLoadWithOverviewMode(false);
180 webSettings.setSavePassword(false);
181 webSettings.setUserAgentString(WebdavClient.USER_AGENT);
182 webSettings.setSaveFormData(false);
183
184 return rootView;
185 }
186
187 @Override
188 public void onSaveInstanceState(Bundle outState) {
189 Log_OC.d(SAML_DIALOG_TAG, "onSaveInstanceState being CALLED");
190 super.onSaveInstanceState(outState);
191
192 // save URLs
193 outState.putString(ARG_INITIAL_URL, mInitialUrl);
194 outState.putString(ARG_TARGET_URL, mTargetUrl);
195
196 // Save the state of the WebView
197 Bundle webviewState = new Bundle();
198 mSsoWebView.saveState(webviewState);
199 outState.putBundle(KEY_WEBVIEW_STATE, webviewState);
200 }
201
202 @Override
203 public void onDestroyView() {
204 Log_OC.d(TAG, "onDestroyView");
205
206 mSsoWebView.setWebViewClient(null);
207
208 // Work around bug: http://code.google.com/p/android/issues/detail?id=17423
209 Dialog dialog = getDialog();
210 if ((dialog != null)) {
211 dialog.setOnDismissListener(null);
212 //dialog.dismiss();
213 //dialog.setDismissMessage(null);
214 }
215
216 super.onDestroyView();
217 }
218
219 @Override
220 public void onDestroy() {
221 Log_OC.d(TAG, "onDestroy");
222 super.onDestroy();
223 }
224
225 @Override
226 public void onDetach() {
227 Log_OC.d(TAG, "onDetach");
228 mSsoWebViewClientListener = null;
229 mWebViewClient = null;
230 super.onDetach();
231 }
232
233 @Override
234 public void onCancel (DialogInterface dialog) {
235 Log_OC.d(SAML_DIALOG_TAG, "onCancel");
236 super.onCancel(dialog);
237 }
238
239 @Override
240 public void onDismiss (DialogInterface dialog) {
241 Log_OC.d(SAML_DIALOG_TAG, "onDismiss");
242 super.onDismiss(dialog);
243 }
244
245 @Override
246 public void onStart() {
247 Log_OC.d(SAML_DIALOG_TAG, "onStart");
248 super.onStart();
249 }
250
251 @Override
252 public void onStop() {
253 Log_OC.d(SAML_DIALOG_TAG, "onStop");
254 super.onStop();
255 }
256
257 @Override
258 public void onResume() {
259 Log_OC.d(SAML_DIALOG_TAG, "onResume");
260 super.onResume();
261 }
262
263 @Override
264 public void onPause() {
265 Log_OC.d(SAML_DIALOG_TAG, "onPause");
266 super.onPause();
267 }
268
269 @Override
270 public int show (FragmentTransaction transaction, String tag) {
271 Log_OC.d(SAML_DIALOG_TAG, "show (transaction)");
272 return super.show(transaction, tag);
273 }
274
275 @Override
276 public void show (FragmentManager manager, String tag) {
277 Log_OC.d(SAML_DIALOG_TAG, "show (manager)");
278 super.show(manager, tag);
279 }
280
281 }