3e241a63bcc37bc0b2280a07b45c818f8d59c7c3
[pub/Android/ownCloud.git] / src / com / owncloud / android / ui / dialog / SamlWebViewDialog.java
1 /* ownCloud Android client application
2 *
3 * @author Maria Asensio
4 * @author David A. Velasco
5 * Copyright (C) 2012-2014 ownCloud Inc.
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2,
9 * as published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 *
19 */
20
21 package com.owncloud.android.ui.dialog;
22
23 import android.annotation.SuppressLint;
24 import android.app.Activity;
25 import android.app.Dialog;
26 import android.content.DialogInterface;
27 import android.os.Bundle;
28 import android.os.Handler;
29 import android.support.v4.app.FragmentTransaction;
30 import android.support.v4.app.FragmentManager;
31 import android.view.LayoutInflater;
32 import android.view.View;
33 import android.view.ViewGroup;
34 import android.webkit.CookieManager;
35 import android.webkit.CookieSyncManager;
36 import android.webkit.WebSettings;
37 import android.webkit.WebView;
38 import android.widget.RelativeLayout;
39
40 import com.actionbarsherlock.app.SherlockDialogFragment;
41 import com.owncloud.android.R;
42 import com.owncloud.android.authentication.SsoWebViewClient;
43 import com.owncloud.android.authentication.SsoWebViewClient.SsoWebViewClientListener;
44 import com.owncloud.android.lib.common.OwnCloudClient;
45 import com.owncloud.android.lib.common.utils.Log_OC;
46
47
48 /**
49 * Dialog to show the WebView for SAML Authentication
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 SamlWebViewDialog fragment = new SamlWebViewDialog();
80 Bundle args = new Bundle();
81 args.putString(ARG_INITIAL_URL, url);
82 args.putString(ARG_TARGET_URL, targetUrl);
83 fragment.setArguments(args);
84 return fragment;
85 }
86
87
88 public SamlWebViewDialog() {
89 super();
90 }
91
92
93 @Override
94 public void onAttach(Activity activity) {
95 Log_OC.v(TAG, "onAttach");
96 super.onAttach(activity);
97 try {
98 mSsoWebViewClientListener = (SsoWebViewClientListener) activity;
99 mHandler = new Handler();
100 mWebViewClient = new SsoWebViewClient(activity, mHandler, mSsoWebViewClientListener);
101
102 } catch (ClassCastException e) {
103 throw new ClassCastException(activity.toString() + " must implement " + SsoWebViewClientListener.class.getSimpleName());
104 }
105 }
106
107
108 @SuppressLint("SetJavaScriptEnabled")
109 @Override
110 public void onCreate(Bundle savedInstanceState) {
111 Log_OC.v(TAG, "onCreate, savedInstanceState is " + savedInstanceState);
112 super.onCreate(savedInstanceState);
113
114 setRetainInstance(true);
115
116 CookieSyncManager.createInstance(getSherlockActivity().getApplicationContext());
117
118 if (savedInstanceState == null) {
119 mInitialUrl = getArguments().getString(ARG_INITIAL_URL);
120 mTargetUrl = getArguments().getString(ARG_TARGET_URL);
121 } else {
122 mInitialUrl = savedInstanceState.getString(ARG_INITIAL_URL);
123 mTargetUrl = savedInstanceState.getString(ARG_TARGET_URL);
124 }
125
126 setStyle(SherlockDialogFragment.STYLE_NO_TITLE, R.style.Theme_ownCloud_Dialog);
127 }
128
129 @SuppressWarnings("deprecation")
130 @SuppressLint("SetJavaScriptEnabled")
131 @Override
132 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
133 Log_OC.v(TAG, "onCreateView, savedInsanceState is " + savedInstanceState);
134
135 // Inflate layout of the dialog
136 RelativeLayout ssoRootView = (RelativeLayout) inflater.inflate(R.layout.sso_dialog, container, false); // null parent view because it will go in the dialog layout
137
138 if (mSsoWebView == null) {
139 // initialize the WebView
140 mSsoWebView = new SsoWebView(getSherlockActivity().getApplicationContext());
141 mSsoWebView.setFocusable(true);
142 mSsoWebView.setFocusableInTouchMode(true);
143 mSsoWebView.setClickable(true);
144
145 WebSettings webSettings = mSsoWebView.getSettings();
146 webSettings.setJavaScriptEnabled(true);
147 webSettings.setBuiltInZoomControls(false);
148 webSettings.setLoadWithOverviewMode(false);
149 webSettings.setSavePassword(false);
150 webSettings.setUserAgentString(OwnCloudClient.USER_AGENT);
151 webSettings.setSaveFormData(false);
152
153 CookieManager cookieManager = CookieManager.getInstance();
154 cookieManager.setAcceptCookie(true);
155 cookieManager.removeAllCookie();
156
157 mSsoWebView.loadUrl(mInitialUrl);
158 }
159
160 mWebViewClient.setTargetUrl(mTargetUrl);
161 mSsoWebView.setWebViewClient(mWebViewClient);
162
163 // add the webview into the layout
164 RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
165 RelativeLayout.LayoutParams.WRAP_CONTENT,
166 RelativeLayout.LayoutParams.WRAP_CONTENT
167 );
168 ssoRootView.addView(mSsoWebView, layoutParams);
169 ssoRootView.requestLayout();
170
171 return ssoRootView;
172 }
173
174 @Override
175 public void onSaveInstanceState(Bundle outState) {
176 Log_OC.v(TAG, "onSaveInstanceState being CALLED");
177 super.onSaveInstanceState(outState);
178
179 // save URLs
180 outState.putString(ARG_INITIAL_URL, mInitialUrl);
181 outState.putString(ARG_TARGET_URL, mTargetUrl);
182 }
183
184 @Override
185 public void onDestroyView() {
186 Log_OC.v(TAG, "onDestroyView");
187
188 if ((ViewGroup)mSsoWebView.getParent() != null) {
189 ((ViewGroup)mSsoWebView.getParent()).removeView(mSsoWebView);
190 }
191
192 mSsoWebView.setWebViewClient(null);
193
194 // Work around bug: http://code.google.com/p/android/issues/detail?id=17423
195 Dialog dialog = getDialog();
196 if ((dialog != null)) {
197 dialog.setOnDismissListener(null);
198 }
199
200 super.onDestroyView();
201 }
202
203 @Override
204 public void onDestroy() {
205 Log_OC.v(TAG, "onDestroy");
206 super.onDestroy();
207 }
208
209 @Override
210 public void onDetach() {
211 Log_OC.v(TAG, "onDetach");
212 mSsoWebViewClientListener = null;
213 mWebViewClient = null;
214 super.onDetach();
215 }
216
217 @Override
218 public void onCancel (DialogInterface dialog) {
219 Log_OC.d(TAG, "onCancel");
220 super.onCancel(dialog);
221 }
222
223 @Override
224 public void onDismiss (DialogInterface dialog) {
225 Log_OC.d(TAG, "onDismiss");
226 super.onDismiss(dialog);
227 }
228
229 @Override
230 public void onStart() {
231 Log_OC.v(TAG, "onStart");
232 super.onStart();
233 }
234
235 @Override
236 public void onStop() {
237 Log_OC.v(TAG, "onStop");
238 super.onStop();
239 }
240
241 @Override
242 public void onResume() {
243 Log_OC.v(TAG, "onResume");
244 super.onResume();
245 mSsoWebView.onResume();
246 }
247
248 @Override
249 public void onPause() {
250 Log_OC.v(TAG, "onPause");
251 mSsoWebView.onPause();
252 super.onPause();
253 }
254
255 @Override
256 public int show (FragmentTransaction transaction, String tag) {
257 Log_OC.v(TAG, "show (transaction)");
258 return super.show(transaction, tag);
259 }
260
261 @Override
262 public void show (FragmentManager manager, String tag) {
263 Log_OC.v(TAG, "show (manager)");
264 super.show(manager, tag);
265 }
266
267 }