Move WebView to Dialog
[pub/Android/ownCloud.git] / src / com / owncloud / android / ui / dialog / SamlWebViewDialog.java
1 package com.owncloud.android.ui.dialog;
2
3 import android.annotation.SuppressLint;
4 import android.app.AlertDialog;
5 import android.app.Dialog;
6 import android.os.Bundle;
7 import android.os.Handler;
8 import android.support.v4.app.DialogFragment;
9 import android.webkit.CookieManager;
10 import android.webkit.WebSettings;
11 import android.webkit.WebView;
12
13 import com.owncloud.android.Log_OC;
14 import com.owncloud.android.authentication.AuthenticatorActivity;
15 import com.owncloud.android.authentication.SsoWebViewClient;
16 import com.owncloud.android.authentication.SsoWebViewClient.SsoWebViewClientListener;
17
18 import eu.alefzero.webdav.WebdavClient;
19
20 /**
21 * Dialog to show the WebView for SAML Authentication
22 *
23 * @author Maria Asensio
24 */
25 public class SamlWebViewDialog extends DialogFragment
26 implements SsoWebViewClientListener{
27
28 public final String SAML_DIALOG_TAG = "SamlWebViewDialog";
29
30 private final static String TAG = SamlWebViewDialog.class.getSimpleName();
31
32 private WebView mSsoWebView;
33 private SsoWebViewClient mWebViewClient;
34
35 private static String mUrl;
36 private static String mTargetUrl;
37
38 private static Handler mHandler;
39
40
41 /**
42 * Public factory method to get dialog instances.
43 *
44 * @param handler
45 * @param Url Url to open at WebView
46 * @param targetURL mHostBaseUrl + AccountUtils.getWebdavPath(mDiscoveredVersion, mCurrentAuthTokenType)
47 * @return New dialog instance, ready to show.
48 */
49 public static SamlWebViewDialog newInstance(Handler handler,String url, String targetUrl) {
50 SamlWebViewDialog fragment = new SamlWebViewDialog();
51 mHandler = handler;
52 mUrl = url;
53 mTargetUrl = targetUrl;
54 return fragment;
55 }
56
57
58 @Override
59 public void onSaveInstanceState(Bundle outState) {
60 super.onSaveInstanceState(outState);
61
62 // Save the state of the WebView
63 mSsoWebView.saveState(outState);
64 }
65
66
67 @Override
68 public Dialog onCreateDialog(Bundle savedInstanceState) {
69 Log_OC.d(TAG, "On Create Dialog");
70
71 /// load the dialog
72 initWebView(savedInstanceState);
73 setRetainInstance(true);
74 /// build the dialog
75 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
76
77 Dialog dialog = builder.setView(mSsoWebView).create();
78
79 return dialog;
80 }
81
82
83 @SuppressLint("SetJavaScriptEnabled")
84 private void initWebView(Bundle savedInstanceState) {
85 CookieManager cookieManager = CookieManager.getInstance();
86 cookieManager.setAcceptCookie(true);
87 //cookieManager.removeSessionCookie();
88
89 mWebViewClient = new SsoWebViewClient(mHandler, this);
90 mWebViewClient.setTargetUrl(mTargetUrl);
91 if (savedInstanceState == null) {
92
93 Log_OC.d(TAG, "Saved Instance State NULL");
94 mSsoWebView = new WebView(getActivity()) {
95 @Override
96 public boolean onCheckIsTextEditor() {
97 return true;
98 }
99 };
100
101 mSsoWebView.setWebViewClient(mWebViewClient);
102 mSsoWebView.setFocusable(true);
103 mSsoWebView.setFocusableInTouchMode(true);
104 mSsoWebView.setClickable(true);
105
106 WebSettings webSettings = mSsoWebView.getSettings();
107 webSettings.setJavaScriptEnabled(true);
108 webSettings.setBuiltInZoomControls(true);
109 webSettings.setLoadWithOverviewMode(false);
110 webSettings.setSavePassword(false);
111 webSettings.setUserAgentString(WebdavClient.USER_AGENT);
112
113 mSsoWebView.loadUrl(mUrl);
114 }
115 else {
116 Log_OC.d(TAG, "Saved Instance State NOT NULL");
117
118 mSsoWebView.restoreState(savedInstanceState);
119 }
120
121 }
122
123 @Override
124 public void onDestroyView() {
125 Dialog dialog = getDialog();
126 Log_OC.d(TAG, "On Destroy");
127 // Work around bug: http://code.google.com/p/android/issues/detail?id=17423
128 if ((dialog != null) && getRetainInstance())
129 getDialog().setOnDismissListener(null);
130
131 super.onDestroyView();
132 }
133
134
135 @Override
136 public void onSsoFinished(String sessionCookie) {
137 //Toast.makeText(this, "got cookies: " + sessionCookie, Toast.LENGTH_LONG).show();
138
139 if (sessionCookie != null && sessionCookie.length() > 0) {
140 Log_OC.d(TAG, "Successful SSO - time to save the account");
141 ((AuthenticatorActivity) getActivity()).onSamlDialogSuccess(sessionCookie);
142 dismiss();
143
144 } else {
145 // TODO - show fail
146 Log_OC.d(TAG, "SSO failed");
147 }
148 }
149
150 }