X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/fae44486b9545bfb2a49ded9a0c3fd550fd18549..0aeb425885ceccb28b31c9822d52b90656bf9257:/src/eu/alefzero/owncloud/authenticator/ConnectionCheckerRunnable.java diff --git a/src/eu/alefzero/owncloud/authenticator/ConnectionCheckerRunnable.java b/src/eu/alefzero/owncloud/authenticator/ConnectionCheckerRunnable.java new file mode 100644 index 00000000..a9866b47 --- /dev/null +++ b/src/eu/alefzero/owncloud/authenticator/ConnectionCheckerRunnable.java @@ -0,0 +1,162 @@ +/* ownCloud Android client application + * Copyright (C) 2012 Bartek Przybylski + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * 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 eu.alefzero.owncloud.authenticator; + +import java.net.ConnectException; +import java.net.UnknownHostException; + +import javax.net.ssl.SSLHandshakeException; + +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.methods.GetMethod; +import org.json.JSONException; +import org.json.JSONObject; + +import eu.alefzero.owncloud.AccountUtils; +import eu.alefzero.owncloud.authenticator.OnConnectCheckListener.ResultType; +import eu.alefzero.owncloud.utils.OwnCloudVersion; +import eu.alefzero.webdav.WebdavClient; +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.Uri; +import android.os.Handler; +import android.util.Log; + +public class ConnectionCheckerRunnable implements Runnable { + private static final String TAG = "ConnectionCheckerRunnable"; + private OnConnectCheckListener mListener; + private String mUrl; + private Handler mHandler; + private ResultType mLatestResult; + private Context mContext; + private OwnCloudVersion mOCVersion; + + public void setListener(OnConnectCheckListener listener, Handler handler) { + mListener = listener; + mHandler = handler; + } + + public ConnectionCheckerRunnable(String url, Context context) { + mListener = null; + mHandler = null; + mUrl = url; + mContext = context; + mOCVersion = null; + } + + @Override + public void run() { + + if (!isOnline()) { + postResult(ResultType.NO_NETWORK_CONNECTION); + return; + } + if (mUrl.startsWith("http://") || mUrl.startsWith("https://")) { + mLatestResult = ResultType.OK; + tryConnection(Uri.parse(mUrl + AccountUtils.STATUS_PATH)); + postResult(mLatestResult); + } else { + Uri uri = Uri.parse("https://" + mUrl + AccountUtils.STATUS_PATH); + if (tryConnection(uri)) { + postResult(ResultType.OK); + return; + } + Log.d(TAG, "establishing secure connection failed, trying non secure connection"); + uri = Uri.parse("http://" + mUrl + AccountUtils.STATUS_PATH); + + if (tryConnection(uri)) { + postResult(ResultType.OK_NO_SSL); + return; + } + postResult(mLatestResult); + } + } + + public OwnCloudVersion getDiscoveredVersion() { + return mOCVersion; + } + + private boolean tryConnection(Uri uri) { + WebdavClient wc = new WebdavClient(uri); + wc.allowUnsignedCertificates(); + GetMethod get = new GetMethod(uri.toString()); + boolean retval = false; + try { + int status = wc.executeMethod(get); + switch (status) { + case HttpStatus.SC_OK: { + String response = get.getResponseBodyAsString(); + JSONObject json = new JSONObject(response); + if (!json.getBoolean("installed")) { + mLatestResult = ResultType.INSTANCE_NOT_CONFIGURED; + break; + } + mOCVersion = new OwnCloudVersion(json.getString("version")); + if (!mOCVersion.isVersionValid()) + break; + retval = true; + break; + } + case HttpStatus.SC_NOT_FOUND: + mLatestResult = ResultType.FILE_NOT_FOUND; + break; + case HttpStatus.SC_INTERNAL_SERVER_ERROR: + mLatestResult = ResultType.INSTANCE_NOT_CONFIGURED; + break; + default: + mLatestResult = ResultType.UNKNOWN_ERROR; + Log.e(TAG,"Not handled status received from server: " + status); + } + + } catch (Exception e) { + if (e instanceof UnknownHostException || e instanceof ConnectException) { + mLatestResult = ResultType.HOST_NOT_AVAILABLE; + } else if (e instanceof JSONException) { + mLatestResult = ResultType.INSTANCE_NOT_CONFIGURED; + } else if (e instanceof SSLHandshakeException) { + mLatestResult = ResultType.SSL_INIT_ERROR; + } else { + mLatestResult = ResultType.UNKNOWN_ERROR; + } + e.printStackTrace(); + } + + return retval; + } + + private boolean isOnline() { + ConnectivityManager cm = + (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); + return cm != null + && cm.getActiveNetworkInfo() != null + && cm.getActiveNetworkInfo().isConnectedOrConnecting(); + } + + private void postResult(final ResultType result) { + if (mHandler != null && mListener != null) { + mHandler.post(new Runnable() { + @Override + public void run() { + mListener.onConnectionCheckResult(result); + } + }); + } + } + +}