org.alfresco.mobile.android.application.accounts.oauth.OAuthRefreshTokenCallback.java Source code

Java tutorial

Introduction

Here is the source code for org.alfresco.mobile.android.application.accounts.oauth.OAuthRefreshTokenCallback.java

Source

/*******************************************************************************
 * Copyright (C) 2005-2013 Alfresco Software Limited.
 * 
 * This file is part of Alfresco Mobile for Android.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/
package org.alfresco.mobile.android.application.accounts.oauth;

import java.util.Date;

import org.alfresco.mobile.android.api.asynchronous.LoaderResult;
import org.alfresco.mobile.android.api.session.AlfrescoSession;
import org.alfresco.mobile.android.api.session.CloudSession;
import org.alfresco.mobile.android.api.session.authentication.OAuthData;
import org.alfresco.mobile.android.application.R;
import org.alfresco.mobile.android.application.accounts.Account;
import org.alfresco.mobile.android.application.accounts.AccountManager;
import org.alfresco.mobile.android.application.exception.CloudExceptionUtils;
import org.alfresco.mobile.android.application.fragments.WaitingDialogFragment;
import org.alfresco.mobile.android.application.intent.IntentIntegrator;
import org.alfresco.mobile.android.application.manager.ActionManager;
import org.alfresco.mobile.android.application.utils.SessionUtils;

import android.app.Activity;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.Context;
import android.content.Intent;
import android.content.Loader;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;

public class OAuthRefreshTokenCallback implements LoaderCallbacks<LoaderResult<OAuthData>> {

    private static final String TAG = OAuthRefreshTokenCallback.class.getName();

    private static final String KEY_CLOUD_LOADING_TIME = "cloudLoadingTime";

    /**
     * flag to indicate it's not necessary to keep cloud session creation
     * datetime.
     */
    private static final long DEFAULT_LOADING_TIME = -1;

    /**
     * We want to refresh token after 50 minutes even if the official timeout is
     * 60 min.
     */
    private static final long DEFAULT_LOADING_TIMEOUT = 3000000;

    private Account acc;

    private Activity activity;

    private Context appContext;

    private CloudSession session;

    public OAuthRefreshTokenCallback(Activity activity, Account acc, CloudSession session) {
        this.activity = activity;
        this.appContext = activity.getApplicationContext();
        this.acc = acc;
        this.session = session;
    }

    @Override
    public Loader<LoaderResult<OAuthData>> onCreateLoader(final int id, Bundle args) {
        if (activity != null) {
            activity.setProgressBarIndeterminateVisibility(true);
            WaitingDialogFragment.newInstance(R.string.app_name, R.string.error_session_refresh, true)
                    .show(activity.getFragmentManager(), WaitingDialogFragment.TAG);
        }
        return new OAuthRefreshTokenLoader(activity, session);
    }

    @Override
    public void onLoadFinished(Loader<LoaderResult<OAuthData>> loader, LoaderResult<OAuthData> results) {
        if (activity != null) {
            OAuthRefreshTokenCallback.saveLastCloudLoadingTime(activity);
            activity.setProgressBarIndeterminateVisibility(false);
        }
        if (!results.hasException()) {
            saveNewOauthData(results);
        } else {
            switch ((int) acc.getTypeId()) {
            case Account.TYPE_ALFRESCO_TEST_OAUTH:
            case Account.TYPE_ALFRESCO_CLOUD:
                CloudExceptionUtils.handleCloudException(activity, results.getException(), true);
                break;
            default:
                break;
            }
            Log.e(TAG, Log.getStackTraceString(results.getException()));
        }
    }

    @Override
    public void onLoaderReset(Loader<LoaderResult<OAuthData>> loader) {

    }

    private void saveNewOauthData(LoaderResult<OAuthData> loader) {
        switch ((int) acc.getTypeId()) {
        case Account.TYPE_ALFRESCO_TEST_OAUTH:
        case Account.TYPE_ALFRESCO_CLOUD:
            acc = AccountManager.update(appContext, acc.getId(), acc.getDescription(), acc.getUrl(),
                    acc.getUsername(), acc.getPassword(), acc.getRepositoryId(),
                    Integer.valueOf((int) acc.getTypeId()), null, loader.getData().getAccessToken(),
                    loader.getData().getRefreshToken(), acc.getIsPaidAccount() ? 1 : 0);
            break;
        default:
            break;
        }

        Intent broadcastIntent = new Intent();
        broadcastIntent.setAction(IntentIntegrator.ACTION_LOAD_ACCOUNT_COMPLETED);
        broadcastIntent.putExtra(IntentIntegrator.EXTRA_ACCOUNT_ID, acc.getId());
        LocalBroadcastManager.getInstance(appContext)
                .sendBroadcast(new Intent(IntentIntegrator.ACTION_LOAD_ACCOUNT_COMPLETED)
                        .putExtra(IntentIntegrator.EXTRA_ACCOUNT_ID, acc.getId()));
    }

    /**
     * Utility method to flag when the cloud session has been created for the
     * last time. This time is used to check Oauth timeout.
     * 
     * @param context
     */
    public static void saveLastCloudLoadingTime(Context context) {
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
        Editor editor = sharedPref.edit();
        editor.putLong(KEY_CLOUD_LOADING_TIME, new Date().getTime());
        editor.commit();
    }

    /**
     * Utility method to remove the flag when the cloud session has been
     * created.
     * 
     * @param context
     */
    public static void removeLastCloudLoadingTime(Context context) {
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
        Editor editor = sharedPref.edit();
        editor.remove(KEY_CLOUD_LOADING_TIME);
        editor.commit();
    }

    /**
     * Indicates if the application must requires a new refresh token.
     * 
     * @param context
     */
    public static boolean doesRequireRefreshToken(Context context) {
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
        long activationTime = sharedPref.getLong(KEY_CLOUD_LOADING_TIME, DEFAULT_LOADING_TIME);
        if (activationTime == DEFAULT_LOADING_TIME) {
            return false;
        }

        long now = new Date().getTime();
        return (now - activationTime) > DEFAULT_LOADING_TIMEOUT;
    }

    /**
     * Request if necessary a new refresh token for cloudSession.
     * 
     * @param alfrescoSession
     * @param activity
     */
    public static void requestRefreshToken(AlfrescoSession alfrescoSession, Activity activity) {
        if (alfrescoSession instanceof CloudSession && doesRequireRefreshToken(activity)) {
            ActionManager.actionRequestAuthentication(activity, SessionUtils.getAccount(activity));
        }
    }

}