com.owncloud.android.utils.OwnCloudClientUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.owncloud.android.utils.OwnCloudClientUtils.java

Source

/* ownCloud Android client application
 *   Copyright (C) 2011  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 <http://www.gnu.org/licenses/>.
 *
 */
package com.owncloud.android.utils;

import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.protocol.Protocol;

import com.owncloud.android.AccountUtils;
import com.owncloud.android.authenticator.AccountAuthenticator;
import com.owncloud.android.authenticator.EasySSLSocketFactory;
import com.owncloud.android.utils.OwnCloudVersion;

import eu.alefzero.webdav.WebdavClient;

import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.Context;
import android.net.Uri;
import android.util.Log;

public class OwnCloudClientUtils {

    final private static String TAG = "OwnCloudClientFactory";

    /** Default timeout for waiting data from the server */
    public static final int DEFAULT_DATA_TIMEOUT = 60000;

    /** Default timeout for establishing a connection */
    public static final int DEFAULT_CONNECTION_TIMEOUT = 60000;

    /** Connection manager for all the WebdavClients */
    static private MultiThreadedHttpConnectionManager mConnManager = null;

    /**
     * Creates a WebdavClient setup for an ownCloud account
     * 
     * @param account   The ownCloud account
     * @param context   The application context
     * @return          A WebdavClient object ready to be used
     */
    public static WebdavClient createOwnCloudClient(Account account, Context context) {
        Log.d(TAG, "Creating WebdavClient associated to " + account.name);

        String baseUrl = AccountManager.get(context).getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL);
        OwnCloudVersion ownCloudVersion = new OwnCloudVersion(
                AccountManager.get(context).getUserData(account, AccountAuthenticator.KEY_OC_VERSION));
        String webDavPath = AccountUtils.getWebdavPath(ownCloudVersion);

        WebdavClient client = createOwnCloudClient(Uri.parse(baseUrl + webDavPath));

        String username = account.name.substring(0, account.name.lastIndexOf('@'));
        String password = AccountManager.get(context).getPassword(account);
        //String password = am.blockingGetAuthToken(mAccount, AccountAuthenticator.AUTH_TOKEN_TYPE, true);

        client.setCredentials(username, password);

        return client;
    }

    /**
     * Creates a WebdavClient to try a new account before saving it
     * 
     * @param uri       URL to the ownCloud server
     * @param username  User name
     * @param password  User password
     * @return          A WebdavClient object ready to be used
     */
    public static WebdavClient createOwnCloudClient(Uri uri, String username, String password) {
        Log.d(TAG, "Creating WebdavClient for " + username + "@" + uri);

        WebdavClient client = createOwnCloudClient(uri);

        client.setCredentials(username, password);

        return client;
    }

    /**
     * Creates a WebdavClient to access a URL and sets the desired parameters for ownCloud client connections.
     * 
     * @param uri       URL to the ownCloud server
     * @return          A WebdavClient object ready to be used
     */
    public static WebdavClient createOwnCloudClient(Uri uri) {
        Log.d(TAG, "Creating WebdavClient for " + uri);

        allowSelfsignedCertificates(true);

        WebdavClient client = new WebdavClient(getMultiThreadedConnManager());

        allowSelfsignedCertificates(true);
        client.setDefaultTimeouts(DEFAULT_DATA_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT);
        client.setBaseUri(uri);

        return client;
    }

    /**
     * Allows or disallows self-signed certificates in ownCloud servers to reach
     * 
     * @param allow     'True' to allow, 'false' to disallow
     */
    public static void allowSelfsignedCertificates(boolean allow) {
        Protocol pr = null;
        try {
            pr = Protocol.getProtocol("https");
        } catch (IllegalStateException e) {
            // nothing to do here; really
        }
        boolean isAllowed = (pr != null && pr.getSocketFactory() instanceof EasySSLSocketFactory);
        if (allow && !isAllowed) {
            Protocol.registerProtocol("https", new Protocol("https", new EasySSLSocketFactory(), 443));
        } else if (!allow && isAllowed) {
            // TODO - a more strict SocketFactory object should be provided here
        }
    }

    static private MultiThreadedHttpConnectionManager getMultiThreadedConnManager() {
        if (mConnManager == null) {
            mConnManager = new MultiThreadedHttpConnectionManager();
            mConnManager.getParams().setDefaultMaxConnectionsPerHost(5);
            mConnManager.getParams().setMaxTotalConnections(5);
        }
        return mConnManager;
    }

}