com.google.cloud.backend.neednow.core.CloudBackendFragment.java Source code

Java tutorial

Introduction

Here is the source code for com.google.cloud.backend.neednow.core.CloudBackendFragment.java

Source

/*
 * Copyright (c) 2013 Google Inc.
 *
 * 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 com.google.cloud.backend.neednow.core;

import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential;
import com.google.cloud.backend.neednow.core.CloudBackendFragment.OnListener;
import com.google.cloud.backend.neednow.core.CloudEntity;
import com.google.cloud.backend.neednow.core.Consts;
import com.google.cloud.backend.neednow.GCMIntentService;

import android.accounts.AccountManager;
import android.app.Activity;
import android.app.Fragment;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;

import java.util.List;

/**
 * An {@link Fragment} class that allows hosting Activities to access the
 * features and functionalities of the CloudBackend classes, including CRUD of
 * {@link CloudEntity}, Google account authentication and Google Cloud
 * Messaging.
 */
public class CloudBackendFragment extends Fragment {

    /**
     * onActivityResult code
     */
    private static final int REQUEST_ACCOUNT_PICKER = 2;

    private GoogleAccountCredential mCredential;

    private CloudBackendAsync mCloudBackend;

    /**
     * The listener to use upon completion of certain functions.
     */
    private OnListener callback;

    /**
     * BroadcastReceiver for incoming messages.
     */

    /*
     * private BroadcastReceiver mMsgReceiver = new BroadcastReceiver() {
     * 
     * @Override public void onReceive(Context context, Intent intent) { String
     * token = intent.getStringExtra("token"); Log.i(Consts.TAG,
     * "A message has been recieved of token: " + token);
     * mCloudBackend.handleQueryMessage(token); } };
     */

    /**
     * Returns {@link CloudBackendMessaging} instance for this activity.
     * 
     * @return {@link CloudBackendMessaging}
     */

    public CloudBackendAsync getCloudBackend() {
        return mCloudBackend;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            callback = (OnListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnListener");
        }
    }

    /*
     * @Override public void onAttach(Activity activity) {
     * super.onAttach(activity); try { callback = (OnListener) activity; } catch
     * (ClassCastException e) { throw new ClassCastException(activity.toString()
     * + " must implement OnListener"); } }
     */

    /**
     * Subclasses may override this to execute initialization of the activity.
     * If it uses any CloudBackend features, it should be executed inside
     * {@link #onCreateFinished()} that will be called after CloudBackend
     * initializations such as user authentication.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mCloudBackend = new CloudBackendAsync(getActivity());

        // create credential
        mCredential = GoogleAccountCredential.usingAudience(getActivity(), Consts.AUTH_AUDIENCE);
        mCloudBackend.setCredential(mCredential);
        signInAndSubscribe(false);

    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    public void onDestroy() {

        super.onDestroy();
    }

    /**
     * A listener interface for GameActivity to use to process the actions this
     * player makes.
     * 
     */

    /**
     * Signs in to the application with an account. Subscribes to broadcast
     * messages once the account picking flow has completed, or immediately if
     * there is no authentication required.
     * 
     * @param overrideCurrent
     *            {@code true} if user can choose an account even if already
     *            signed in, {@code false} if the user can choose an account
     *            only if there is no currently signed in user
     */
    public void signInAndSubscribe(boolean overrideCurrent) {
        if (Consts.IS_AUTH_ENABLED) {
            String accountName = mCloudBackend.getSharedPreferences().getString(Consts.PREF_KEY_ACCOUNT_NAME, null);
            if (accountName == null || overrideCurrent) {
                super.startActivityForResult(mCredential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
                return;
            } else {
                mCredential.setSelectedAccountName(accountName);

            }

            callback.onCreateFinished();
        }
    }

    /**
     * Handles callback from Intents like authorization request or account
     * picking. If the hosting Activity also makes use of onActivityResult, make
     * sure the Activity calls super.onActivityResult to handle all
     * requestCodes, including the code here. Forgetting to call the super
     * method is a common mistake and is often cause for confusion.
     */
    @Override
    public final void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Log.i("result from activity", "resultcode: " + resultCode);
        switch (requestCode) {
        case REQUEST_ACCOUNT_PICKER:
            if (data != null && data.getExtras() != null) {

                // set the picked account name to the credential
                String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                mCredential.setSelectedAccountName(accountName);

                // save account name to shared pref
                SharedPreferences.Editor e = mCloudBackend.getSharedPreferences().edit();
                e.putString(Consts.PREF_KEY_ACCOUNT_NAME, accountName);
                e.commit();
            } else
                Log.i("result unavailable", "resultcode: " + resultCode);

            // post create initialization

            break;

        default:
            Log.i("case not matching", "resultcode: " + resultCode);
            break;
        }
    }

    /**
     * Returns account name selected by user, or null if any account is
     * selected.
     */
    protected String getAccountName() {
        return mCredential == null ? null : mCredential.getSelectedAccountName();
    }

    public interface OnListener {
        public void onCreateFinished();

    }

}