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