Android Open Source - trip-chain-android Login Activity






From Project

Back to project page trip-chain-android.

License

The source code is released under:

MIT License

If you think the Android project trip-chain-android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package fi.aalto.tripchain;
/*from ww w .j  a  v  a  2 s .  co  m*/
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Locale;
import java.util.Scanner;

import net.frakbot.accounts.chooser.AccountChooser;

import org.json.JSONObject;

import android.accounts.AccountManager;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.auth.GoogleAuthUtil;
import com.google.android.gms.auth.UserRecoverableAuthException;
import com.google.android.gms.common.Scopes;

/**
 * Activity handling logging in using Google+ account.
 * Redirects to MainActivity on success.
 *
 */
public class LoginActivity extends Activity {

  private static final String TAG = LoginActivity.class.getSimpleName();

  /**
   * Authorization scope.
   */
  private static final String SCOPE = Scopes.PROFILE;

  private SharedPreferences preferences;

  /**
   * Codes for distinguishing startActivityForResult callbacks.
   */
  private static final int AUTHORIZATION_CODE = 1993;
  private static final int ACCOUNT_CODE = 1601;

  private volatile String accountName = null;


  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    preferences = getSharedPreferences(Configuration.SHARED_PREFERENCES, MODE_MULTI_PROCESS);
    String loginId = preferences.getString(Configuration.KEY_LOGIN_ID, null);
    if (loginId != null) {
      startMain();
      return;
    }

    setContentView(R.layout.activity_login);
    findViewById(R.id.sign_in_button).setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View v) {
        chooseAccount(v);
      }
    });
  }

  public void chooseAccount(View _) {
    Intent intent = AccountChooser.newChooseAccountIntent(null, null, new String[] { "com.google" },
        false, null, null, null, null, this);
    startActivityForResult(intent, ACCOUNT_CODE);
  }

  /**
   * Non blocking call for getting Google User ID using AsyncTask.
   */
  private void getUserId() {
    final ProgressDialog dialog = ProgressDialog.show(this, "", "Loading. Please wait...", true);

    new AsyncTask<Void, Void, Boolean>() {
      protected Boolean doInBackground(Void... _) {
        try {
          String token = GoogleAuthUtil
              .getToken(LoginActivity.this, accountName, "oauth2:" + SCOPE);

          URL url = new URL("https://www.googleapis.com/plus/v1/people/me?access_token=" + token);
          HttpURLConnection con = (HttpURLConnection) url.openConnection();
          int serverCode = con.getResponseCode();
          // successful query
          if (serverCode == 200) {
            InputStream is = con.getInputStream();

            String message = new Scanner(is, "UTF-8").useDelimiter("\\A").next();
            JSONObject j = new JSONObject(message);
            is.close();

            Editor editor = preferences.edit();
            editor.putString(Configuration.KEY_LOGIN_ID, j.getString("id"));
            editor.commit();

            GoogleAuthUtil.invalidateToken(LoginActivity.this, token);

            return true;
            // bad token, invalidate and get a new one
          } else if (serverCode == 401) {
            GoogleAuthUtil.invalidateToken(LoginActivity.this, token);
            Log.e(TAG, "Server auth error: "
                + new Scanner(con.getErrorStream(), "UTF-8").useDelimiter("\\A").next());
            // unknown error, do something else
          } else {
            Log.e(TAG, "Server returned the following error code: " + serverCode, null);
          }
        } catch (UserRecoverableAuthException e) {
          startActivityForResult(e.getIntent(), AUTHORIZATION_CODE);
        } catch (Exception e) {
          Log.d(TAG, "failed to get user id", e);
        }

        return false;
      }

      protected void onPostExecute(Boolean success) {
        Log.d(TAG, "Cancelling dialog.");
        dialog.cancel();

        if (success) {
          Toast.makeText(LoginActivity.this,
              "USER: " + preferences.getString(Configuration.KEY_LOGIN_ID, null),
              Toast.LENGTH_SHORT).show();
          startMain();
        }
      }
    }.execute();
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult");

    if (resultCode != RESULT_OK) {
      return;
    }

    if (requestCode == AUTHORIZATION_CODE) {
      Log.d(TAG, "AUTHORIZATION_CODE");
    } else if (requestCode == ACCOUNT_CODE) {
      accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);

      Log.d(TAG, "ACCOUNT_CODE " + accountName);
    }

    getUserId();
  }

  /**
   * Pushes MainActivity on top and finishes LoginActivity.
   */
  private void startMain() {
    Intent i = new Intent(getApplicationContext(), MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(i);
    finish();
  }
}




Java Source Code List

fi.aalto.tripchain.BackgroundService.java
fi.aalto.tripchain.Configuration.java
fi.aalto.tripchain.LoginActivity.java
fi.aalto.tripchain.MainActivity.java
fi.aalto.tripchain.StartFragment.java
fi.aalto.tripchain.TripFragment.java
fi.aalto.tripchain.receivers.ActivityReceiver.java
fi.aalto.tripchain.receivers.EventDispatcher.java
fi.aalto.tripchain.receivers.EventListener.java
fi.aalto.tripchain.receivers.LocationReceiver.java
fi.aalto.tripchain.receivers.Receiver.java
fi.aalto.tripchain.route.ActivityListener.java
fi.aalto.tripchain.route.Activity.java
fi.aalto.tripchain.route.LocationListener.java
fi.aalto.tripchain.route.RoadSegment.java
fi.aalto.tripchain.route.Roads.java
fi.aalto.tripchain.route.RouteSegment.java
fi.aalto.tripchain.route.Route.java
fi.aalto.tripchain.route.TripRecorder.java
fi.aalto.tripchain.route.Trip.java