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