fossasia.valentina.bodyapp.main.SettingsActivity.java Source code

Java tutorial

Introduction

Here is the source code for fossasia.valentina.bodyapp.main.SettingsActivity.java

Source

/*
 * Copyright (c) 2014, Fashiontec (http://fashiontec.org)
 * Licensed under LGPL, Version 3
 */

package fossasia.valentina.bodyapp.main;

import java.io.InputStream;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import com.google.android.gms.plus.Plus;
import com.google.android.gms.plus.model.people.Person;

import fossasia.valentina.bodyapp.managers.MeasurementManager;
import fossasia.valentina.bodyapp.managers.UserManager;
import fossasia.valentina.bodyapp.models.User;
import fossasia.valentina.bodyapp.sync.SyncUser;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentSender.SendIntentException;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.os.Build;

/**
 * Activity for settings. This activity handles user authentication via Google
 * play services and obtains user ID from web application. Then user gets added
 * to the DB
 */
public class SettingsActivity extends ActionBarActivity
        implements OnClickListener, ConnectionCallbacks, OnConnectionFailedListener {

    private static final int RC_SIGN_IN = 0;
    // Profile pic image size in pixels
    private static final int PROFILE_PIC_SIZE = 400;

    // Google client to interact with Google API
    private GoogleApiClient mGoogleApiClient;

    /**
     * A flag indicating that a PendingIntent is in progress and prevents us
     * from starting further intents.
     */
    private boolean mIntentInProgress;

    private boolean mSignInClicked;

    private ConnectionResult mConnectionResult;

    private SignInButton btnSignIn;
    private Button btnSignOut;
    private Button btnRevoke;
    private ImageView imgProfilePic;
    private TextView txtName;
    private TextView txtEmail;
    private TextView txtConnected;
    private LinearLayout llProfileLayout;
    private static ProgressDialog progress;
    private static AlertDialog alertDialog;
    private static AlertDialog alertDialog2;
    private String email;
    private String personName;
    private String userID = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);

        btnSignIn = (SignInButton) findViewById(R.id.settings_btn_signin);
        btnSignOut = (Button) findViewById(R.id.settings_btn_signout);
        btnRevoke = (Button) findViewById(R.id.settings_btn_reovke);
        imgProfilePic = (ImageView) findViewById(R.id.settings_img_profile);
        txtName = (TextView) findViewById(R.id.settings_txt_name);
        txtEmail = (TextView) findViewById(R.id.settings_txt_email);
        txtConnected = (TextView) findViewById(R.id.settings_txt_connected);
        llProfileLayout = (LinearLayout) findViewById(R.id.settings_layout);

        // Button click listeners
        btnSignIn.setOnClickListener(this);
        btnSignOut.setOnClickListener(this);
        btnRevoke.setOnClickListener(this);
        mGoogleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this).addApi(Plus.API).addScope(Plus.SCOPE_PLUS_PROFILE).build();

        progress = new ProgressDialog(this);
        progress.setTitle("Loading");
        progress.setMessage("Wait while loading...");
        progress.setCanceledOnTouchOutside(false);

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Error Connecting").setMessage("Error occured while connecting to Web application")
                .setIcon(R.drawable.warning).setCancelable(false)
                .setNegativeButton("Close", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });
        alertDialog = builder.create();

        AlertDialog.Builder builder2 = new AlertDialog.Builder(this);
        builder.setTitle("Error Getting personal info").setMessage("Could not get personal info from Google")
                .setIcon(R.drawable.warning).setCancelable(false)
                .setNegativeButton("Close", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });
        alertDialog2 = builder2.create();
    }

    @Override
    protected void onStart() {
        super.onStart();
        mGoogleApiClient.connect();
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (mGoogleApiClient.isConnected()) {
            mGoogleApiClient.disconnect();
        }
    }

    /**
     * Sign in the user to Google
     */
    private void signInWithGplus() {
        if (!mGoogleApiClient.isConnecting()) {
            mSignInClicked = true;
            resolveSignInError();
        }
    }

    private void resolveSignInError() {
        System.out.println(mConnectionResult);
        if (mConnectionResult == null) {
            return;
        }

        if (mConnectionResult.hasResolution()) {

            try {
                mIntentInProgress = true;
                System.out.println(this);
                mConnectionResult.startResolutionForResult(this, RC_SIGN_IN);
                System.out.println("RSE");
            } catch (SendIntentException e) {
                mIntentInProgress = false;
                mGoogleApiClient.connect();
                System.out.println("RSE45");
            }
        }
    }

    /**
     * Sign out user from Google
     */
    private void signOutFromGplus() {
        if (mGoogleApiClient.isConnected()) {
            Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
            mGoogleApiClient.disconnect();
            mGoogleApiClient.connect();
            UserManager.getInstance(getBaseContext().getApplicationContext()).unsetCurrent();
            updateUI(false);
        }
    }

    /**
     * Revoking access from google
     * */
    private void revokeGplusAccess() {
        if (mGoogleApiClient.isConnected()) {
            Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
            Plus.AccountApi.revokeAccessAndDisconnect(mGoogleApiClient)
                    .setResultCallback(new ResultCallback<Status>() {
                        @Override
                        public void onResult(Status arg0) {
                            Log.e("settings", "User access revoked!");
                            mGoogleApiClient.connect();
                            updateUI(false);
                        }

                    });
        }
        UserManager.getInstance(getBaseContext().getApplicationContext()).unsetCurrent();
        reload();
    }

    /**
     * Update the UI according to isSign in
     * 
     * @param isSignedIn
     */
    private void updateUI(boolean isSignedIn) {
        if (isSignedIn) {
            btnSignIn.setVisibility(View.GONE);
            btnSignOut.setVisibility(View.VISIBLE);
            btnRevoke.setVisibility(View.VISIBLE);
            llProfileLayout.setVisibility(View.VISIBLE);
        } else {
            btnSignIn.setVisibility(View.VISIBLE);
            btnSignOut.setVisibility(View.GONE);
            btnRevoke.setVisibility(View.GONE);
            llProfileLayout.setVisibility(View.GONE);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.seetings, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.settings_btn_signin:
            // Signin button clicked
            signInWithGplus();
            break;
        case R.id.settings_btn_signout:
            // Signout button clicked
            signOutFromGplus();
            break;
        case R.id.settings_btn_reovke:
            // Revoke access button clicked
            revokeGplusAccess();
            break;
        }

    }

    private void getProfileInformation() {
        try {
            if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) {

                Person currentPerson = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient);

                personName = currentPerson.getDisplayName();
                String personPhotoUrl = currentPerson.getImage().getUrl();
                String personGooglePlusProfile = currentPerson.getUrl();
                email = Plus.AccountApi.getAccountName(mGoogleApiClient);

                Log.e("settings", "Name: " + personName + ", plusProfile: " + personGooglePlusProfile + ", email: "
                        + email + ", Image: " + personPhotoUrl);

                txtName.setText(personName);
                txtEmail.setText(email);

                personPhotoUrl = personPhotoUrl.substring(0, personPhotoUrl.length() - 2) + PROFILE_PIC_SIZE;

                new LoadProfileImage(imgProfilePic).execute(personPhotoUrl);

            } else {
                Toast.makeText(getApplicationContext(), "Person information is null", Toast.LENGTH_LONG).show();
                email = null;
                personName = null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            email = null;
            personName = null;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int responseCode, Intent intent) {
        if (requestCode == RC_SIGN_IN) {
            if (responseCode != RESULT_OK) {
                mSignInClicked = false;
            }

            mIntentInProgress = false;

            if (!mGoogleApiClient.isConnecting()) {
                mGoogleApiClient.connect();
            }
        }
    }

    @Override
    public void onConnectionFailed(ConnectionResult result) {
        if (!result.hasResolution()) {
            GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this, 0).show();
            return;
        }

        if (!mIntentInProgress) {
            // Store the ConnectionResult for later usage
            mConnectionResult = result;

            if (mSignInClicked) {
                // The user has already clicked 'sign-in' so attempt to
                // resolve all
                // errors until the user is signed in, or they cancel.
                resolveSignInError();
            }
        }

    }

    @Override
    public void onConnected(Bundle arg0) {
        mSignInClicked = false;
        Toast.makeText(this, "User is connected!", Toast.LENGTH_LONG).show();

        // Get user's information
        getProfileInformation();
        Log.d("settings", "here");

        if (email != null && personName != null) {

            // creates a new user and check if he exists on db
            User user = new User(email, personName, userID);
            String isUser = UserManager.getInstance(getBaseContext().getApplicationContext()).isUser(user);

            if (isUser == null) {
                // if user is not in DB a post goes to web app and gets a ID for
                // user.
                // Then he will be added to the DB and set as current user.
                progress.show();
                new HttpAsyncTaskUser().execute("http://192.168.1.2:8020/user");
            } else {

                if (isUser.equals("NoID")) {
                    // if user exists in DB and doesn't have a ID, try to get ID
                    progress.show();
                    new HttpAsyncTaskUser().execute("http://192.168.1.2:8020/user");
                } else {
                    // if user exists in DB and has a ID just sets him current
                    // user
                    UserManager.getInstance(getBaseContext().getApplicationContext()).setCurrent(user);
                    txtConnected.setText("User connected");
                    userID = isUser;
                }
            }
            // Update the UI after signin
            updateUI(true);
        } else {
            alertDialog2.show();
        }

    }

    @Override
    public void onConnectionSuspended(int arg0) {
        mGoogleApiClient.connect();
        updateUI(false);
    }

    public void reload() {

        Intent intent = getIntent();
        overridePendingTransition(0, 0);
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        finish();

        overridePendingTransition(0, 0);
        startActivity(intent);
    }

    /**
     * Async task to get profile image from google.
     */
    private class LoadProfileImage extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;

        public LoadProfileImage(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {
            String urldisplay = urls[0];
            Bitmap mIcon11 = null;
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                mIcon11 = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return mIcon11;
        }

        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
        }
    }

    /**
     * Call to syncUser method
     * 
     * @param url
     */
    public void postUser(String url) {

        userID = SyncUser.getUserID(email, personName);
    }

    /**
     * Async task to send user data to web app and get user ID.
     */
    private class HttpAsyncTaskUser extends AsyncTask<String, Void, String> {

        @Override
        protected void onPostExecute(String result) {
            Log.d("settings", "dataSent");
            System.out.println(userID + "ID check");

            if (userID != "") {

                User user = new User(email, personName, userID);
                String isUser = UserManager.getInstance(getBaseContext().getApplicationContext()).isUser(user);
                if (isUser == null) {
                    // adds the user to the DB
                    UserManager.getInstance(getBaseContext().getApplicationContext()).addUser(user);

                } else {
                    UserManager.getInstance(getBaseContext().getApplicationContext()).setID(user);
                    UserManager.getInstance(getBaseContext().getApplicationContext()).setCurrent(user);
                }
                //if user added measurements before sign in, those measurements will be added to the signed in user
                MeasurementManager.getInstance(getBaseContext().getApplicationContext()).setUserID(userID);
                txtConnected.setText("User connected");
            } else {
                Log.d("settings", "cannot");
                // adds the user to the DB, but without the ID if the user
                // currently not on db
                User user = new User(email, personName, "NoID");
                String isUser = UserManager.getInstance(getBaseContext().getApplicationContext()).isUser(user);
                if (isUser == null) {
                    UserManager.getInstance(getBaseContext().getApplicationContext()).addUser(user);
                    MeasurementManager.getInstance(getBaseContext().getApplicationContext()).setUserID("NoID");
                }
                UserManager.getInstance(getBaseContext().getApplicationContext()).setCurrent(user);
                MeasurementManager.getInstance(getBaseContext().getApplicationContext()).setUserID("NoID");
                alertDialog.show();
                txtConnected.setText("User not connected");
            }
            progress.dismiss();
        }

        @Override
        protected String doInBackground(String... urls) {

            postUser(urls[0]);
            System.out.println(userID + "async");
            return userID;
        }
    }
}