package com.fourtails.usuariolecturista; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.annotation.TargetApi; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.PorterDuff; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; import com.activeandroid.query.Select; import com.facebook.AccessToken; import com.facebook.GraphRequest; import com.facebook.GraphResponse; import com.fourtails.usuariolecturista.jobs.RegisterUserJob; import com.fourtails.usuariolecturista.model.RegisteredUser; import com.fourtails.usuariolecturista.ottoEvents.AndroidBus; import com.fourtails.usuariolecturista.ottoEvents.RefreshMainActivityFromPrepayEvent; import com.fourtails.usuariolecturista.ottoEvents.RegisterUserEvent; import com.melnykov.fab.FloatingActionButton; import com.orhanobut.logger.Logger; import com.parse.ParseFacebookUtils; import com.parse.ParseInstallation; import com.parse.ParseUser; import com.path.android.jobqueue.JobManager; import com.squareup.otto.Bus; import com.squareup.otto.Subscribe; import org.json.JSONException; import org.json.JSONObject; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; /** * This class will show the available services and also will be in charge of registering * the user into the backend */ public class ServiceChooserActivity extends Activity { private static final String TAG = "ServiceChooserActivity"; public static final String PREF_METER_JMAS_REGISTERED = "meterJMASNotAddedPref"; public static final String EXTRA_USER_EMAIL = "userEmailSetAsExtra"; public static final String EXTRA_SERVICE_TYPE = "extraServiceTypeForApp"; public static final String EXTRA_JMAS = "jmasAccountSelected"; volatile boolean running; private String accountType; private long age; private String email; private String name; private String installationId; JobManager jobManager; public static Bus bus; public boolean isFabButtonShowing = false; @Bind(R.id.imageViewJmasIcon) FloatingActionButton fabJmasIcon; @Bind(R.id.imageViewGasIcon) FloatingActionButton fabGasIcon; @Bind(R.id.imageViewCfeIcon) FloatingActionButton fabCfeIcon; @Bind(R.id.progressBar) ProgressBar progressBar; @Bind(R.id.textViewIntroTitle) TextView introTitle; @OnClick(R.id.imageViewJmasIcon) public void jmasIconClicked() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); boolean isMeterRegistered = prefs.getBoolean(PREF_METER_JMAS_REGISTERED, false); if (isMeterRegistered) { // if the meter is already registered then we go straight to MainActivity startActivityWithSharedElementTransition(); //finish(); } else { // otherwise we have to register the meter Intent intent = new Intent(this, MeterRegistrationActivity.class); intent.putExtra(EXTRA_USER_EMAIL, email); intent.putExtra(EXTRA_SERVICE_TYPE, EXTRA_JMAS); startActivity(intent); } } /** * will start an activity transition with a shared element animation */ private void startActivityWithSharedElementTransition() { Intent intent = new Intent(this, MainActivity.class); ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation( this, fabJmasIcon, getResources().getString(R.string.transitionJmas) ); ActivityCompat.startActivity(this, intent, options.toBundle()); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_service_chooser); ButterKnife.bind(this); bus = new AndroidBus(); bus.register(this); jobManager = FirstApplication.getInstance().getJobManager(); // ParseFacebookUtils.initialize(String.valueOf(R.string.facebook_app_id)); running = true; fillUserInfoThenRegister(); progressBar.setVisibility(View.VISIBLE); progressBar.getIndeterminateDrawable().setColorFilter(getResources().getColor(R.color.colorPrimaryOCR), PorterDuff.Mode.SRC_IN); introTitle.setVisibility(View.GONE); fabJmasIcon.hide(); fabJmasIcon.setVisibility(View.INVISIBLE); fabGasIcon.hide(); fabGasIcon.setVisibility(View.INVISIBLE); fabCfeIcon.hide(); fabCfeIcon.setVisibility(View.INVISIBLE); } /** * fill user info into the global variables */ private void fillUserInfoThenRegister() { ParseUser parseUser = ParseUser.getCurrentUser(); installationId = ParseInstallation.getCurrentInstallation().getInstallationId(); Logger.d("InstallationId ::" + installationId); if (ParseFacebookUtils.isLinked(parseUser)) { GraphRequest request = GraphRequest.newMeRequest( AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() { @Override public void onCompleted(JSONObject user, GraphResponse response) { try { if (user != null) { accountType = "Facebook"; age = 30L; //user.getBirthday() test this name = user.get("name").toString(); email = user.get("email").toString(); registerUserBackend(); } } catch (JSONException e) { if (e.getMessage().equalsIgnoreCase("No value for email")) { email = name + "@test.com"; registerUserBackend(); } e.printStackTrace(); } } }); Bundle parameters = new Bundle(); parameters.putString("fields", "id,name,email,age_range,gender"); request.setParameters(parameters); request.executeAsync(); } else { // todo: some of this is dummy data, must change it accountType = "G+"; age = 30L; email = parseUser.getEmail(); name = parseUser.getUsername(); registerUserBackend(); } } /** * BackendCall * Registers the user on the backend */ private void registerUserBackend() { jobManager.addJobInBackground(new RegisterUserJob(accountType, age, email, name, installationId)); } @Subscribe public void registerUserBackendResponse(RegisterUserEvent event) { if (running) { progressBar.setVisibility(View.GONE); showFab(); } if (event.getResultCode() == 1) { registerUser(); } else if (event.getResultCode() == 99) { Logger.i("BACKEND, Bad-registerUserBackend"); } } /** * DatabaseSave * checks where is the user registering from and saves is to the database */ private void registerUser() { // we need to check if the user is already in the database RegisteredUser previouslyRegisteredUser = checkForExistingUser(email); if (previouslyRegisteredUser == null) { RegisteredUser registeredUser = new RegisteredUser( accountType, age, email, name, installationId ); registeredUser.save(); } } /** * DatabaseQuery * We check in our database if the user is already registered * * @param emailAsUsername use the email as username * @return a registered user if exists */ private RegisteredUser checkForExistingUser(String emailAsUsername) { return new Select() .from(RegisteredUser.class) .where("Email = ?", emailAsUsername) .executeSingle(); } @Subscribe public void refreshMainActivityFromPrepay(RefreshMainActivityFromPrepayEvent event) { if (event.getResultCode() == 1) { startActivityWithSharedElementTransition(); } } /** * Show the calculate button */ private void showFab() { if (!isFabButtonShowing) { isFabButtonShowing = true; // Set the content view to 0% opacity but visible, so that it is visible // (but fully transparent) during the animation. fabJmasIcon.setAlpha(0f); fabJmasIcon.setVisibility(View.VISIBLE); fabGasIcon.setAlpha(0f); fabGasIcon.setVisibility(View.VISIBLE); fabCfeIcon.setAlpha(0f); fabCfeIcon.setVisibility(View.VISIBLE); introTitle.setAlpha(0f); introTitle.setVisibility(View.VISIBLE); // Animate the content view to 100% opacity, and clear any animation // listener set on the view. fabJmasIcon.animate() .alpha(1f) .setDuration(300) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { fabJmasIcon.show(); fabGasIcon.animate() .alpha(1f) .setDuration(300) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { fabGasIcon.show(); fabCfeIcon.animate() .alpha(1f) .setDuration(300) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { fabCfeIcon.show(); } }); } }); } }); introTitle.animate() .alpha(1f) .setDuration(1000) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { } }); } } }