package it.fdev.unisaconnect; import it.fdev.unisaconnect.MainActivity.BootableFragmentsEnum; import it.fdev.unisaconnect.data.SharedPrefDataManager; import it.fdev.utils.MySimpleFragment; import it.fdev.utils.MyWebView; import it.fdev.utils.Utils; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.http.client.methods.HttpGet; import org.apache.http.cookie.Cookie; import org.apache.http.impl.client.DefaultHttpClient; import android.graphics.Bitmap; import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.CookieManager; import android.webkit.CookieSyncManager; import android.webkit.HttpAuthHandler; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ProgressBar; /** * Frammento che si occupa dell'accesso alla esse3 * * @author francesco * */ public class FragmentEsse3Web extends MySimpleFragment { public final static String esse3LoginUrl = "https://esse3web.unisa.it/unisa/auth/Logon.do"; private ProgressBar progressBar; private MyWebView mWebView; private SharedPrefDataManager mDataManager; private boolean didSendLoginData = false; private Fragment thisFragment; private boolean acceptedPrivacy = false; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View mainView = (View) inflater.inflate(R.layout.web_fragment, container, false); return mainView; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); progressBar = (ProgressBar) view.findViewById(R.id.progress__bar); mWebView = (MyWebView) view.findViewById(R.id.webview); thisFragment = this; // Se non sono stati salvati i dati utente rimando al fragment dei dati mDataManager = new SharedPrefDataManager(mActivity); if (!mDataManager.loginDataExists()) { // Non sono memorizzati i dati utente Utils.createAlert(mActivity, getString(R.string.dati_errati), BootableFragmentsEnum.ACCOUNT, false); return; } // Se non c'è internet rimando al fragment di errore if (!Utils.hasConnection(mActivity)) { Utils.goToInternetError(mActivity, this); return; } // Mostro il dialog di caricamento // Utils.createDialog(activity, getString(R.string.caricamento), false); mActivity.setLoadingVisible(true, false); // Cancella i cookie in modo da evitare problemi vari di login CookieSyncManager.createInstance(mActivity); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.removeAllCookie(); cookieManager.setAcceptCookie(true); // On Gingerbread there are problems with the cookies and HTTP-Auth. // I make a request, get the session cookie and save it in // CookieManager, // which is used by the webView if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) { Log.d(Utils.TAG, "Executing GB cookie compatibility code"); DefaultHttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(esse3LoginUrl); try { client.execute(request); List<Cookie> cookies = client.getCookieStore().getCookies(); for (Cookie c : cookies) { String cUrl = (c.isSecure() ? "https" : "http") + "://" + c.getDomain() + c.getPath(); cookieManager.setCookie(cUrl, c.getName() + "=" + c.getValue() + "; Domain=" + c.getDomain()); } } catch (Exception e) { Log.d(Utils.TAG, "Error in preliminar load", e); } } // Inizializzo la webview WebSettings webSettings = mWebView.getSettings(); webSettings.setSavePassword(false); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setLoadsImagesAutomatically(true); webSettings.setBuiltInZoomControls(true); webSettings.setSupportZoom(true); webSettings.setJavaScriptEnabled(true); mWebView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { // Activities and WebViews measure progress with different scales. // The progress meter will automatically disappear when we reach 100% // activity.setProgress(progress * 1000); progressBar.setProgress(progress); } }); mWebView.setWebViewClient(new WebViewClient() { // Quando la pagina richiede l'autenticazione HTTP @Override public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { if (!isAdded()) { return; } if (mDataManager.loginDataExists() && !didSendLoginData) { // Evita un loop di login se i dati sono sbagliati didSendLoginData = true; Log.d(Utils.TAG, "Inviando dati esse3"); handler.proceed(mDataManager.getUser(), mDataManager.getPass()); } else { Log.d(Utils.TAG, "MMM"); Utils.createAlert(mActivity, getString(R.string.dati_errati), BootableFragmentsEnum.ACCOUNT, false); } } // Si verifica un errore durante il caricamento della pagina @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Utils.goToInternetError(mActivity, thisFragment); } // Non chiedere quale browser usare. Carica sempre la pagina nella webview @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); progressBar.setVisibility(View.VISIBLE); mActivity.setLoadingVisible(true, false); } // Quando il caricamento si completa rimuovi il dialog @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); progressBar.setVisibility(View.GONE); mActivity.setLoadingVisible(false, false); didSendLoginData = false; if(!acceptedPrivacy) { view.loadUrl("javascript:cookies.set()"); acceptedPrivacy = true; } } }); mWebView.loadUrl(esse3LoginUrl); } @Override public boolean goBack() { // Quando premo il tasto indietro if (mWebView.canGoBack()) { // Se posso andare indietro nella cronologia della webview... mWebView.goBack(); mWebView.reload(); return false; } else { // Altrimenti vado al fragment precedente try { mWebView.stopLoading(); mWebView.destroy(); } catch (Exception e) { } return super.goBack(); } } @Override public Set<Integer> getActionsToShow() { Set<Integer> actionsToShow = new HashSet<Integer>(); actionsToShow.add(R.id.action_refresh_button); return actionsToShow; } @Override public void actionRefresh() { try { if (!isAdded() || mWebView == null) { return; } if (!Utils.hasConnection(mActivity)) { Utils.goToInternetError(mActivity, thisFragment); return; } didSendLoginData = false; mWebView.reload(); } catch (Exception e) { // ho avuto java.lang.NullPointerException su webView.reload(); nonostante il controllo nel primo if // viene deferenziata giusto tra l'if e il reload? Forse perchè hasConnection() prende un po' di tempo } } @Override public void onPause() { try { mWebView.setVisibility(View.GONE); // Workaround for nullpointerexception mWebView.stopLoading(); } catch (Exception e) { } super.onPause(); } @Override public void onResume() { try { mWebView.setVisibility(View.VISIBLE); // Workaround for nullpointerexception mWebView.reload(); } catch (Exception e) { } super.onResume(); } @Override public int getTitleResId() { return R.string.esse3_pagina_web; } }