package com.odc.beachodc;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.util.Base64;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import com.facebook.Request;
import com.facebook.Response;
import com.facebook.Session;
import com.facebook.SessionState;
import com.facebook.UiLifecycleHelper;
import com.facebook.model.GraphUser;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.location.LocationClient;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.odc.beachodc.activities.LocationActivity;
import com.odc.beachodc.db.BBDD;
import com.odc.beachodc.utilities.Geo;
import com.odc.beachodc.utilities.Utilities;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import de.keyboardsurfer.android.widget.crouton.Crouton;
import de.keyboardsurfer.android.widget.crouton.Style;
public class Inicio extends LocationActivity {
Context context;
Activity activity;
// Variables usadas para representar los fragments de Login y futuras otras pantallas de inicio.
private static final int LOGIN = 0;
private static final int FRAGMENT_COUNT = LOGIN+1;
// Item del menu que permitira cerrar sesion en Facebook
private MenuItem logout;
// Variables para controlar los fragments, cual esta activo, etc.
private Fragment[] fragments = new Fragment[FRAGMENT_COUNT];
private boolean isResumed = false;
// Variables para controlar el ciclo de vida de la sesion de Facebook
private UiLifecycleHelper uiHelper;
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
onSessionStateChange(session, state, exception);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
//opening transition animations
overridePendingTransition(R.anim.activity_open_translate,R.anim.activity_close_scale);
super.onCreate(savedInstanceState);
Utilities.checkGooglePlayServiceAvailability(this);
Utilities.setImageLoader(this);
activity = this;
// Ciclo de vida de la sesion de autenticacion de Facebook
uiHelper = new UiLifecycleHelper(this, callback);
uiHelper.onCreate(savedInstanceState);
context = getApplicationContext();
setContentView(R.layout.activity_inicio);
FragmentManager fm = getSupportFragmentManager();
fragments[LOGIN] = fm.findFragmentById(R.id.splashFragment);
List<Fragment> fd= fm.getFragments();
// Ocultamos todos los fragments que maneja nuestra activity para despues mostrarlo si procede o saltar a la siguiente activity.
FragmentTransaction transaction = fm.beginTransaction();
transaction.hide(fragments[LOGIN]);
transaction.commit();
//código para mostrar tu clave de desarrollador
/*try {
PackageInfo info = getPackageManager().getPackageInfo("com.odc.beachodc", 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) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}*/
}
@Override
public void onResume() {
super.onResume();
uiHelper.onResume();
isResumed = true;
}
@Override
public void onPause() {
super.onPause();
uiHelper.onPause();
isResumed = false;
overridePendingTransition(R.anim.activity_open_scale,R.anim.activity_close_translate);
System.gc();
Runtime.getRuntime().gc();
}
@Override
public void onStop(){
super.onStop();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
uiHelper.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onDestroy() {
super.onDestroy();
uiHelper.onDestroy();
System.gc();
Runtime.getRuntime().gc();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
uiHelper.onSaveInstanceState(outState);
}
@Override
protected void onResumeFragments() {
super.onResumeFragments();
if (Utilities.haveInternet(this)) {
Session session = Session.getActiveSession();
// Cada vez que la app se ponga en primer plano, comprobaremos si nuestra sesión de FB aun sigue vigente, para entrar directamente. Si ha caducado o hemos hecho logout, mostramos el fragment de Login.
if (session != null && session.isOpened()) {
if (Utilities.checkGooglePlayServiceAvailability(this)) {
goToHome(session);
}
} else {
// otherwise present the splash screen and ask the user to login, unless the user explicitly skipped.
showFragment(LOGIN, false);
}
} else {
if (!Utilities.checkGooglePlayServiceAvailability(this)) {
return;
}
if ((Utilities.getUserIdFacebook(this) != null) && (!Utilities.getUserIdFacebook(this).equals(""))) {
Intent intent = new Intent(activity, Home.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();
} else {
Crouton.makeText(activity, getString(R.string.no_internet), Style.ALERT).show();
}
}
}
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
// Si hacemos login o logout, el estado de la sesion cambiará, por lo que en esta función se controla y se muestra el fragment correspondiente en funcion de si la sesión esta abierta o cerrada.
if (isResumed) {
FragmentManager manager = getSupportFragmentManager();
int backStackSize = manager.getBackStackEntryCount();
for (int i = 0; i < backStackSize; i++) {
manager.popBackStack();
}
// check for the OPENED state instead of session.isOpened() since for the
// OPENED_TOKEN_UPDATED state, the selection fragment should already be showing.
if (state.equals(SessionState.OPENED)) {
if (Utilities.checkGooglePlayServiceAvailability(this)) {
goToHome(session);
}
} else if (state.isClosed()) {
showFragment(LOGIN, false);
}
}
}
// Función que a partir del ID (0: Login), muestra el fragment correspondiente, ocultando el resto.
private void showFragment(int fragmentIndex, boolean addToBackStack) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.show(fragments[LOGIN]);
if (addToBackStack) {
transaction.addToBackStack(null);
}
transaction.commit();
}
// Funcion encargada de redireccionar a la pantalla principal de usuario una vez logueado correctamente en Facebook
public void goToHome(final Session session){
// Obtenemos nuestros datos para crear el usuario que nos represente
Request request = Request.newMeRequest(session,
new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
// If the response is successfulHome
if (session == Session.getActiveSession()) {
// Empezar aqui a trabajar con la UI
if (user != null) {
Utilities.storeRegistrationId(context, user.getId(), user.getName());
Intent intent = new Intent(activity, Home.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();
} else {
Crouton.makeText(activity, getString(R.string.error_unknown), Style.ALERT).show();
}
}
if (response.getError() != null) {
// Handle errors, will do so later.
Crouton.makeText(activity, getString(R.string.error_unknown), Style.ALERT).show();
}
}
});
request.executeAsync();
}
}