X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/54679a521d5126d586969c234e6f1536f27dae81..388fdd2265b24b78808d1e51a994cc543d2a43c8:/src/com/owncloud/android/ui/dialog/SamlWebViewDialog.java diff --git a/src/com/owncloud/android/ui/dialog/SamlWebViewDialog.java b/src/com/owncloud/android/ui/dialog/SamlWebViewDialog.java index 17a1e13f..a90a7adb 100644 --- a/src/com/owncloud/android/ui/dialog/SamlWebViewDialog.java +++ b/src/com/owncloud/android/ui/dialog/SamlWebViewDialog.java @@ -1,44 +1,75 @@ +/* ownCloud Android client application + * Copyright (C) 2012-2013 ownCloud Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + package com.owncloud.android.ui.dialog; import android.annotation.SuppressLint; import android.app.Activity; -import android.app.AlertDialog; import android.app.Dialog; +import android.content.DialogInterface; import android.os.Bundle; import android.os.Handler; -import android.support.v4.app.DialogFragment; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.app.FragmentManager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import android.webkit.CookieManager; +import android.webkit.CookieSyncManager; +import android.webkit.WebBackForwardList; import android.webkit.WebSettings; import android.webkit.WebView; -import com.owncloud.android.Log_OC; +import com.actionbarsherlock.app.SherlockDialogFragment; +import com.owncloud.android.R; import com.owncloud.android.authentication.SsoWebViewClient; import com.owncloud.android.authentication.SsoWebViewClient.SsoWebViewClientListener; +import com.owncloud.android.lib.network.OwnCloudClient; +import com.owncloud.android.utils.Log_OC; -import eu.alefzero.webdav.WebdavClient; /** * Dialog to show the WebView for SAML Authentication * * @author Maria Asensio + * @author David A. Velasco */ -public class SamlWebViewDialog extends DialogFragment - { +public class SamlWebViewDialog extends SherlockDialogFragment { public final String SAML_DIALOG_TAG = "SamlWebViewDialog"; private final static String TAG = SamlWebViewDialog.class.getSimpleName(); + + private static final String ARG_INITIAL_URL = "INITIAL_URL"; + private static final String ARG_TARGET_URL = "TARGET_URL"; + private static final String KEY_WEBVIEW_STATE = "WEBVIEW_STATE"; private WebView mSsoWebView; private SsoWebViewClient mWebViewClient; - private static String mUrl; - private static String mTargetUrl; + private String mInitialUrl; + private String mTargetUrl; private Handler mHandler; private SsoWebViewClientListener mSsoWebViewClientListener; - + + //private View mSsoRootView; + /** * Public factory method to get dialog instances. @@ -49,105 +80,205 @@ public class SamlWebViewDialog extends DialogFragment * @return New dialog instance, ready to show. */ public static SamlWebViewDialog newInstance(String url, String targetUrl) { + Log_OC.d(TAG, "New instance"); SamlWebViewDialog fragment = new SamlWebViewDialog(); - - mUrl = url; - mTargetUrl = targetUrl; + Bundle args = new Bundle(); + args.putString(ARG_INITIAL_URL, url); + args.putString(ARG_TARGET_URL, targetUrl); + fragment.setArguments(args); return fragment; } + public SamlWebViewDialog() { + super(); + Log_OC.d(TAG, "constructor"); + } + + @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - - // Save the state of the WebView - mSsoWebView.saveState(outState); + public void onAttach(Activity activity) { + Log_OC.d(TAG, "onAttach"); + super.onAttach(activity); + try { + mSsoWebViewClientListener = (SsoWebViewClientListener) activity; + mHandler = new Handler(); + mWebViewClient = new SsoWebViewClient(mHandler, mSsoWebViewClientListener); + + } catch (ClassCastException e) { + throw new ClassCastException(activity.toString() + " must implement " + SsoWebViewClientListener.class.getSimpleName()); + } } + @SuppressLint("SetJavaScriptEnabled") - @Override + @Override + public void onCreate(Bundle savedInstanceState) { + Log_OC.d(TAG, "onCreate"); + super.onCreate(savedInstanceState); + + CookieSyncManager.createInstance(getActivity()); + + if (savedInstanceState == null) { + mInitialUrl = getArguments().getString(ARG_INITIAL_URL); + mTargetUrl = getArguments().getString(ARG_TARGET_URL); + } else { + mInitialUrl = savedInstanceState.getString(ARG_INITIAL_URL); + mTargetUrl = savedInstanceState.getString(ARG_TARGET_URL); + } + + setStyle(SherlockDialogFragment.STYLE_NO_TITLE, R.style.Theme_ownCloud_Dialog); + } + + @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - Log_OC.d(TAG, "On Create Dialog"); + Log_OC.d(TAG, "onCreateDialog"); - mHandler = new Handler(); + /* + // build the dialog + AlertDialog.Builder builder = new AlertDialog.Builder(getSherlockActivity()); + if (mSsoRootView.getParent() != null) { + ((ViewGroup)(mSsoRootView.getParent())).removeView(mSsoRootView); + } + builder.setView(mSsoRootView); + //builder.setView(mSsoWebView); + Dialog dialog = builder.create(); + */ - mSsoWebView = new WebView(getActivity()) { - @Override - public boolean onCheckIsTextEditor() { - return true; - } - }; + return super.onCreateDialog(savedInstanceState); + } + @SuppressLint("SetJavaScriptEnabled") + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + Log_OC.d(TAG, "onCreateView"); - mWebViewClient = new SsoWebViewClient(mHandler, mSsoWebViewClientListener); - mSsoWebView.setWebViewClient(mWebViewClient); + // Inflate layout of the dialog + View rootView = inflater.inflate(R.layout.sso_dialog, container, false); // null parent view because it will go in the dialog layout + mSsoWebView = (WebView) rootView.findViewById(R.id.sso_webview); + mWebViewClient.setTargetUrl(mTargetUrl); + mSsoWebView.setWebViewClient(mWebViewClient); - mSsoWebView.setFocusable(true); - mSsoWebView.setFocusableInTouchMode(true); - mSsoWebView.setClickable(true); - + if (savedInstanceState == null) { + Log_OC.d(TAG, " initWebView start"); + CookieManager cookieManager = CookieManager.getInstance(); + cookieManager.setAcceptCookie(true); + cookieManager.removeAllCookie(); + mSsoWebView.loadUrl(mInitialUrl); + + } else { + Log_OC.d(TAG, " restoreWebView start"); + WebBackForwardList history = mSsoWebView.restoreState(savedInstanceState.getBundle(KEY_WEBVIEW_STATE)); + if (history == null) { + Log_OC.e(TAG, "Error restoring WebView state ; back to starting URL"); + mSsoWebView.loadUrl(mInitialUrl); + } + } + WebSettings webSettings = mSsoWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setBuiltInZoomControls(true); webSettings.setLoadWithOverviewMode(false); webSettings.setSavePassword(false); - webSettings.setUserAgentString(WebdavClient.USER_AGENT); + webSettings.setUserAgentString(OwnCloudClient.USER_AGENT); + webSettings.setSaveFormData(false); - // load the dialog - if (savedInstanceState == null) { - initWebView(); - } - else { - restoreWebView(savedInstanceState); - } + return rootView; + } + + @Override + public void onSaveInstanceState(Bundle outState) { + Log_OC.d(SAML_DIALOG_TAG, "onSaveInstanceState being CALLED"); + super.onSaveInstanceState(outState); - // build the dialog - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - Dialog dialog = builder.setView(mSsoWebView).create(); + // save URLs + outState.putString(ARG_INITIAL_URL, mInitialUrl); + outState.putString(ARG_TARGET_URL, mTargetUrl); - return dialog; + // Save the state of the WebView + Bundle webviewState = new Bundle(); + mSsoWebView.saveState(webviewState); + outState.putBundle(KEY_WEBVIEW_STATE, webviewState); } - @SuppressLint("SetJavaScriptEnabled") - private void initWebView() { - CookieManager cookieManager = CookieManager.getInstance(); - cookieManager.setAcceptCookie(true); - cookieManager.removeAllCookie(); - - mSsoWebView.loadUrl(mUrl); + @Override + public void onDestroyView() { + Log_OC.d(TAG, "onDestroyView"); + + mSsoWebView.setWebViewClient(null); + + // Work around bug: http://code.google.com/p/android/issues/detail?id=17423 + Dialog dialog = getDialog(); + if ((dialog != null)) { + dialog.setOnDismissListener(null); + //dialog.dismiss(); + //dialog.setDismissMessage(null); + } + + super.onDestroyView(); + } + + @Override + public void onDestroy() { + Log_OC.d(TAG, "onDestroy"); + super.onDestroy(); } - @SuppressLint("SetJavaScriptEnabled") - private void restoreWebView(Bundle savedInstanceState) { - mSsoWebView.restoreState(savedInstanceState); - - CookieManager cookieManager = CookieManager.getInstance(); - Log_OC.e(TAG, "Accept Cookie: " + cookieManager.acceptCookie()); + @Override + public void onDetach() { + Log_OC.d(TAG, "onDetach"); + mSsoWebViewClientListener = null; + mWebViewClient = null; + super.onDetach(); } + @Override + public void onCancel (DialogInterface dialog) { + Log_OC.d(SAML_DIALOG_TAG, "onCancel"); + super.onCancel(dialog); + } @Override - public void onDestroyView() { - Dialog dialog = getDialog(); - Log_OC.d(TAG, "On Destroy"); - // Work around bug: http://code.google.com/p/android/issues/detail?id=17423 - if ((dialog != null) && getRetainInstance()) - getDialog().setOnDismissListener(null); + public void onDismiss (DialogInterface dialog) { + Log_OC.d(SAML_DIALOG_TAG, "onDismiss"); + super.onDismiss(dialog); + } + + @Override + public void onStart() { + Log_OC.d(SAML_DIALOG_TAG, "onStart"); + super.onStart(); + } - super.onDestroyView(); + @Override + public void onStop() { + Log_OC.d(SAML_DIALOG_TAG, "onStop"); + super.onStop(); } + @Override + public void onResume() { + Log_OC.d(SAML_DIALOG_TAG, "onResume"); + super.onResume(); + } @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - Log_OC.e(TAG, "onAttach"); - try { - mSsoWebViewClientListener = (SsoWebViewClientListener) activity; - } catch (ClassCastException e) { - throw new ClassCastException(activity.toString() + " must implement " + SsoWebViewClientListener.class.getSimpleName()); - } + public void onPause() { + Log_OC.d(SAML_DIALOG_TAG, "onPause"); + super.onPause(); } + + @Override + public int show (FragmentTransaction transaction, String tag) { + Log_OC.d(SAML_DIALOG_TAG, "show (transaction)"); + return super.show(transaction, tag); + } + + @Override + public void show (FragmentManager manager, String tag) { + Log_OC.d(SAML_DIALOG_TAG, "show (manager)"); + super.show(manager, tag); + } + } \ No newline at end of file