com.letsgood.sampleapp.SignInActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.letsgood.sampleapp.SignInActivity.java

Source

/*
 * Copyright [2015] [Letsgood.com s.r.o.]
 *
 * 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.Copyright [2015] [Letsgood.com s.r.o.]
 *
 * 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.
 *
 * Created by Bc. Pavel Stambrecht for Letsgood.com s.r.o.
 */

package com.letsgood.sampleapp;

import android.content.Intent;
import android.content.IntentSender;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.util.Base64;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.Profile;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;

import com.google.android.gms.plus.Plus;
import com.letsgood.sampleapp.model.DemoUser;
import com.letsgood.sampleapp.widgets.CustomProgressDialog;
import com.letsgood.synergykitsdkandroid.Synergykit;
import com.letsgood.synergykitsdkandroid.listeners.UserResponseListener;
import com.letsgood.synergykitsdkandroid.log.SynergykitLog;
import com.letsgood.synergykitsdkandroid.resources.SynergykitError;
import com.letsgood.synergykitsdkandroid.resources.SynergykitFacebookAuthData;
import com.letsgood.synergykitsdkandroid.resources.SynergykitGoogleAuthData;
import com.letsgood.synergykitsdkandroid.resources.SynergykitTwitterAuthData;
import com.letsgood.synergykitsdkandroid.resources.SynergykitUser;

import org.json.JSONException;
import org.json.JSONObject;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

import io.fabric.sdk.android.Fabric;
import com.twitter.sdk.android.Twitter;
import com.twitter.sdk.android.core.Callback;
import com.twitter.sdk.android.core.Result;
import com.twitter.sdk.android.core.TwitterAuthConfig;
import com.twitter.sdk.android.core.TwitterAuthToken;
import com.twitter.sdk.android.core.TwitterException;
import com.twitter.sdk.android.core.TwitterSession;
import com.twitter.sdk.android.core.identity.TwitterLoginButton;

/**
 * Created by Marek on 1/13/15.
 */
public class SignInActivity extends ActionBarActivity implements View.OnClickListener,
        GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

    /* Constants */
    private static final String USER_SHARED_PREF = "user-shared-pref"; //shared preferences tag
    private static final String USER_PASSWD_TAG = "user-password-tag"; //user passoword tag for shared preferences
    private static final String USER_EMAIL_TAG = "user-email-tag"; //user email tag for shared preferences
    private static final String TWITTER_KEY = "RKLonAjPNotCVJHznnw6Pfy5c"; //Twitter application key
    private static final String TWITTER_SECRET = "EdbqjTzNhxhlYaJ6QL3JDVXWBTHDQw9ayZMmgeOaG9UT1ve7ji"; //Twitter application secret key
    private static final int RC_SIGN_IN = 0; //google+ request code

    /* Attributes */
    private SharedPreferences sharedPreferences = null;
    private EditText emailEditText;
    private EditText passwordEditText;
    private Button signInButton;
    private LoginButton facebookButton;
    private SignInButton googleButton;
    private TwitterLoginButton twitterButton;
    private CallbackManager callbackManager;
    private GoogleApiClient googleApiClient;
    private boolean googleIntentInProgress = false;
    private boolean googleButtonClicked;

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

        //initialize Facebook SDK
        FacebookSdk.sdkInitialize(getApplicationContext()); //init facebook sdk
        //initialize Google SDK
        this.initGoogleApiClient();
        //initialize Twitter SDK
        TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
        Fabric.with(getApplicationContext(), new Twitter(authConfig));

        setContentView(R.layout.activity_signin);

        //set action bar
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setHomeButtonEnabled(true);

        sharedPreferences = getSharedPreferences(USER_SHARED_PREF, MODE_PRIVATE); //get shared preferences for storing signed user

        //find views
        emailEditText = (EditText) findViewById(R.id.emailEditText);
        passwordEditText = (EditText) findViewById(R.id.passwordEditText);
        signInButton = (Button) findViewById(R.id.signInButton);
        facebookButton = (LoginButton) findViewById(R.id.facebookLoginButton);
        googleButton = (SignInButton) findViewById(R.id.googleLoginButton);
        twitterButton = (TwitterLoginButton) findViewById(R.id.twitterLoginButton);

        //set last signed user details if exists
        emailEditText.setText(sharedPreferences.getString(USER_EMAIL_TAG, ""));
        passwordEditText.setText(sharedPreferences.getString(USER_PASSWD_TAG, ""));

        this.printFacebookKeyHash(); //print Facebook key hash
        this.registerFacebookCallback(); //register Facebook callback
        this.registerTwitterCallback(); //register Twitter callback

        //set listeners
        signInButton.setOnClickListener(this);
        facebookButton.setOnClickListener(this);
        googleButton.setOnClickListener(this);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        //facebook result
        callbackManager.onActivityResult(requestCode, resultCode, data); // facebook callback

        //google+ result
        if (requestCode == RC_SIGN_IN) {
            if (resultCode != RESULT_OK) {
                googleButtonClicked = false;
            }

            googleIntentInProgress = false;

            if (!googleApiClient.isConnected()) {
                googleApiClient.reconnect();
            }
        }

        //twitter
        twitterButton.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        // send action id to manager
        int id = item.getItemId();

        switch (id) {
        case android.R.id.home:
            finish();
            break;
        }

        return super.onOptionsItemSelected(item);
    }

    /* Sign up */
    private void signIn() {

        //check value
        if (emailEditText.getText().toString().isEmpty()) {
            Toast.makeText(getApplicationContext(), "Email is empty. Fill it first", Toast.LENGTH_SHORT).show();
            return;
        }

        if (passwordEditText.getText().toString().isEmpty()) {
            Toast.makeText(getApplicationContext(), "Password is empty. Fill it first", Toast.LENGTH_SHORT).show();
            return;
        }

        //show progress dialog
        final CustomProgressDialog progressDialog = new CustomProgressDialog(this, "Signing in ...");

        //create user object
        DemoUser user = new DemoUser();
        user.setEmail(emailEditText.getText().toString());
        user.setPassword(passwordEditText.getText().toString());

        // Sign up via SynergyKit
        Synergykit.loginUser(user, new UserResponseListener() {
            @Override
            public void doneCallback(int statusCode, SynergykitUser user) {
                DemoUser demoUser = (DemoUser) user;
                progressDialog.dismiss();

                //save values
                sharedPreferences.edit().putString(USER_EMAIL_TAG, user.getEmail())
                        .putString(USER_PASSWD_TAG, passwordEditText.getText().toString()).commit();

                Toast.makeText(getApplicationContext(), demoUser.getName() + " is signed in!", Toast.LENGTH_SHORT)
                        .show();

                finish();
            }

            @Override
            public void errorCallback(int statusCode, SynergykitError errorObject) {
                progressDialog.dismiss();
                Toast.makeText(getApplicationContext(), errorObject.toString(), Toast.LENGTH_SHORT).show();
            }
        });

    }

    /* On click */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.signInButton:
            signIn();
            break;

        case R.id.googleLoginButton:
            if (!googleApiClient.isConnecting()) {
                googleButtonClicked = true;
                googleApiClient.connect();
            }
            break;
        case R.id.facebookLoginButton:
            if (AccessToken.getCurrentAccessToken() != null) {
                signInViaFacebook(AccessToken.getCurrentAccessToken());
            } else {
                LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile"));
            }
            break;

        case R.id.twitterLoginButton:
            registerTwitterCallback();
            break;
        }
    }

    /* Print Facebook key hash */
    private void printFacebookKeyHash() {
        // Add code to print out the key hash
        try {
            PackageInfo info = getPackageManager().getPackageInfo("com.letsgood.sampleapp",
                    PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
        } catch (PackageManager.NameNotFoundException e) {

        } catch (NoSuchAlgorithmException e) {

        }
    }

    /* Sign in via Facebook */
    private void signInViaFacebook(final AccessToken accessToken) {
        // App code
        GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(JSONObject object, GraphResponse response) {

                DemoUser demoUser = null;

                //show loading progress bar
                final CustomProgressDialog progressDialog = new CustomProgressDialog(SignInActivity.this,
                        "Signing in ...");

                SynergykitFacebookAuthData synergykitFacebookAuthData = new SynergykitFacebookAuthData(
                        accessToken.getUserId(), accessToken.getToken());

                if (Synergykit.getLoggedUser() == null) {
                    demoUser = new DemoUser();
                    try {
                        demoUser.setEmail(object.getString("email"));
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                } else {
                    demoUser = (DemoUser) Synergykit.getLoggedUser();
                }

                //set user name if not exists
                if (demoUser.getName() == null || demoUser.getName().isEmpty()) {
                    if (Profile.getCurrentProfile() != null && Profile.getCurrentProfile().getFirstName() != null)
                        demoUser.setName(Profile.getCurrentProfile().getFirstName());

                    if (Profile.getCurrentProfile() != null && Profile.getCurrentProfile().getLastName() != null) {
                        if (demoUser.getName() != null && !demoUser.getName().isEmpty()) {
                            demoUser.setName(demoUser.getName() + " " + Profile.getCurrentProfile().getLastName());
                        } else {
                            demoUser.setName(Profile.getCurrentProfile().getLastName());
                        }
                    }
                }

                LoginManager.getInstance().logOut();
                // Sign up via SynergyKit
                Synergykit.linkFacebook(demoUser, synergykitFacebookAuthData, new UserResponseListener() {
                    @Override
                    public void doneCallback(int statusCode, SynergykitUser user) {
                        DemoUser demoUser = (DemoUser) user;
                        String toastText = new String();
                        progressDialog.dismiss();

                        Toast.makeText(getApplicationContext(), "You are signed in via Facebook!",
                                Toast.LENGTH_SHORT).show();
                        finish();

                    }

                    @Override
                    public void errorCallback(int statusCode, SynergykitError errorObject) {
                        LoginManager.getInstance().logOut();
                        progressDialog.dismiss();
                        Toast.makeText(getApplicationContext(), errorObject.toString(), Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
        Bundle parameters = new Bundle();
        parameters.putString("fields", "email");
        request.setParameters(parameters);
        request.executeAsync();
    }

    /* Register Facebook callback */
    private void registerFacebookCallback() {
        callbackManager = CallbackManager.Factory.create();
        // Callback registration
        facebookButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {

                signInViaFacebook(loginResult.getAccessToken());

            }

            @Override
            public void onCancel() {
                // App code
            }

            @Override
            public void onError(FacebookException exception) {
                // App code
            }
        });
    }

    /* Google API client initialization */
    private void initGoogleApiClient() {
        googleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this).addApi(Plus.API).addScope(Plus.SCOPE_PLUS_LOGIN).build();
    }

    /* On stop */
    protected void onStop() {
        super.onStop();

        if (googleApiClient.isConnected()) {
            googleApiClient.disconnect();
        }
    }

    /* Sign in via Facebook */
    private void signInViaGoogle() {

        DemoUser demoUser = null;

        //show loading progress bar
        final CustomProgressDialog progressDialog = new CustomProgressDialog(SignInActivity.this, "Signing in ...");

        SynergykitGoogleAuthData synergykitGoogleAuthData = new SynergykitGoogleAuthData();
        synergykitGoogleAuthData.setId(Plus.PeopleApi.getCurrentPerson(googleApiClient).getId());

        if (Synergykit.getLoggedUser() == null) {
            demoUser = new DemoUser();
        } else {
            demoUser = (DemoUser) Synergykit.getLoggedUser();
        }

        demoUser.setName(Plus.PeopleApi.getCurrentPerson(googleApiClient).getName().getFormatted());

        // Sign up via SynergyKit
        Synergykit.linkGoogle(demoUser, synergykitGoogleAuthData, new UserResponseListener() {
            @Override
            public void doneCallback(int statusCode, SynergykitUser user) {
                DemoUser demoUser = (DemoUser) user;
                String toastText = new String();
                progressDialog.dismiss();

                Toast.makeText(getApplicationContext(), "You are signed in via Google+!", Toast.LENGTH_SHORT)
                        .show();

                finish();
            }

            @Override
            public void errorCallback(int statusCode, SynergykitError errorObject) {
                LoginManager.getInstance().logOut();
                progressDialog.dismiss();
                Toast.makeText(getApplicationContext(), errorObject.toString(), Toast.LENGTH_SHORT).show();
            }
        });
    }

    /* Google onConnected state */
    @Override
    public void onConnected(Bundle bundle) {
        googleButtonClicked = false;
        signInViaGoogle();
    }

    /* Google onConnectionSuspended state */
    @Override
    public void onConnectionSuspended(int i) {
        googleApiClient.connect();
    }

    /* Google onConnection failed state */
    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        if (!googleIntentInProgress) {
            if (googleButtonClicked && connectionResult.hasResolution()) {
                // The user has already clicked 'sign-in' so we attempt to resolve all
                // errors until the user is signed in, or they cancel.
                try {
                    connectionResult.startResolutionForResult(this, RC_SIGN_IN);
                    googleIntentInProgress = true;
                } catch (IntentSender.SendIntentException e) {
                    // The intent was canceled before it was sent.  Return to the default
                    // state and attempt to connect to get an updated ConnectionResult.
                    googleIntentInProgress = false;
                    googleApiClient.connect();
                }
            }
        }
    }

    /* Sign in via Twitter */
    private void signInViaTwitter(final TwitterSession session) {

        TwitterAuthToken authToken = null;
        DemoUser demoUser = null;

        if (session == null)
            return;

        authToken = session.getAuthToken();

        //show loading progress bar
        final CustomProgressDialog progressDialog = new CustomProgressDialog(SignInActivity.this, "Signing in ...");

        SynergykitTwitterAuthData twitterAuthData = new SynergykitTwitterAuthData(
                Long.toString(session.getUserId()), session.getUserName(), TWITTER_KEY, TWITTER_SECRET,
                authToken.token, authToken.secret);

        if (Synergykit.getLoggedUser() == null) {
            demoUser = new DemoUser();
        } else {
            demoUser = (DemoUser) Synergykit.getLoggedUser();
        }

        // Sign up via SynergyKit
        Synergykit.linkTwitter(demoUser, twitterAuthData, new UserResponseListener() {
            @Override
            public void doneCallback(int statusCode, SynergykitUser user) {
                DemoUser demoUser = (DemoUser) user;
                String toastText = new String();

                if (Twitter.getSessionManager().getActiveSession() != null)
                    Twitter.getSessionManager().clearActiveSession();

                progressDialog.dismiss();

                Toast.makeText(getApplicationContext(), "You are signed in via Google+!", Toast.LENGTH_SHORT)
                        .show();

                finish();
            }

            @Override
            public void errorCallback(int statusCode, SynergykitError errorObject) {

                if (Twitter.getSessionManager().getActiveSession() != null)
                    Twitter.getSessionManager().clearActiveSession();

                progressDialog.dismiss();
                Toast.makeText(getApplicationContext(), errorObject.toString(), Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void registerTwitterCallback() {
        twitterButton.setCallback(new Callback<TwitterSession>() {
            @Override
            public void success(Result<TwitterSession> twitterSessionResult) {
                TwitterSession session = Twitter.getSessionManager().getActiveSession();
                signInViaTwitter(session);
            }

            @Override
            public void failure(TwitterException e) {
                SynergykitLog.print(e.toString());
                Toast.makeText(getApplicationContext(), "Sign in failed.", Toast.LENGTH_SHORT).show();
            }
        });
    }
}