package com.charlesmadere.android.classygames;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextSwitcher;
import android.widget.ViewSwitcher;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Window;
import com.charlesmadere.android.classygames.models.Person;
import com.charlesmadere.android.classygames.server.Server;
import com.charlesmadere.android.classygames.server.ServerApi;
import com.charlesmadere.android.classygames.server.ServerApiRegister;
import com.charlesmadere.android.classygames.utilities.FacebookUtilities;
import com.charlesmadere.android.classygames.utilities.Utilities;
import com.facebook.*;
import com.facebook.Request.GraphUserCallback;
import com.facebook.model.GraphUser;
/**
* This class is the app's entry point.
*/
public final class MainActivity extends BaseActivity implements
Session.StatusCallback
{
private final static String LOG_TAG = Utilities.LOG_TAG + " - MainActivity";
private LinearLayout facebook;
private LinearLayout loading;
private ProgressBar loadingSpinner;
private TextSwitcher loadingText;
private boolean hasFinished = false;
private boolean isResumed = false;
private ServerApiRegister serverApiTask;
private UiLifecycleHelper uiHelper;
/**
* Used to obtain the current user's Facebook identity.
*/
private AsyncGetFacebookIdentity asyncGetFacebookIdentity;
@Override
protected void onCreate(final Bundle savedInstanceState)
{
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState, R.string.classy_games, false);
setContentView(R.layout.main_activity);
facebook = (LinearLayout) findViewById(R.id.main_activity_facebook);
loading = (LinearLayout) findViewById(R.id.main_activity_loading);
loadingSpinner = (ProgressBar) findViewById(R.id.main_activity_loading_spinner);
loadingText = (TextSwitcher) findViewById(R.id.main_activity_loading_text);
loadingText.setFactory(new ViewSwitcher.ViewFactory()
{
@Override
public View makeView()
{
return getLayoutInflater().inflate(R.layout.main_activity_loading_text, null);
}
});
uiHelper = new UiLifecycleHelper(this, this);
uiHelper.onCreate(savedInstanceState);
}
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
uiHelper.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_FIRST_USER)
{
hasFinished = true;
finish();
}
}
@Override
public void onBackPressed()
{
cancelRunningAnyAsyncTask();
super.onBackPressed();
}
@Override
protected void onDestroy()
{
cancelRunningAnyAsyncTask();
isResumed = false;
uiHelper.onDestroy();
super.onDestroy();
}
@Override
protected void onPause()
{
isResumed = false;
uiHelper.onPause();
super.onPause();
}
@Override
protected void onResume()
{
super.onResume();
uiHelper.onResume();
isResumed = true;
if (!hasFinished)
{
final Person whoAmI = Utilities.getWhoAmI(this);
if (whoAmI != null && whoAmI.isValid())
{
startGameFragmentActivity();
}
}
}
@Override
protected void onSaveInstanceState(final Bundle outState)
{
uiHelper.onSaveInstanceState(outState);
super.onSaveInstanceState(outState);
}
@Override
public void call(final Session session, final SessionState state, final Exception exception)
{
if (isResumed)
// only make changes if this activity is visible
{
if (state.equals(SessionState.OPENED))
// if the session state is open, show the authenticated activity
{
// store the user's Facebook Access Token for retrieval later
FacebookUtilities.setAccessToken(this, session.getAccessToken());
asyncGetFacebookIdentity = new AsyncGetFacebookIdentity(session);
asyncGetFacebookIdentity.execute();
}
}
}
/**
* Cancels the AsyncRefreshGamesList AsyncTask if it is currently
* running.
*/
private void cancelRunningAnyAsyncTask()
{
if (isAnAsyncTaskRunning())
{
if (serverApiTask != null)
{
serverApiTask.cancel();
}
asyncGetFacebookIdentity.cancel(true);
}
}
/**
* @return
* Returns true if an AsyncTask is running.
*/
private boolean isAnAsyncTaskRunning()
{
return asyncGetFacebookIdentity != null;
}
private void startGameFragmentActivity()
{
final Intent intent = new Intent(this, GameFragmentActivity.class);
startActivityForResult(intent, RESULT_FIRST_USER);
}
private final class AsyncGetFacebookIdentity extends AsyncTask<Void, Void, Person>
{
private Session session;
private SherlockActivity activity;
private AsyncGetFacebookIdentity(final Session session)
{
activity = MainActivity.this;
this.session = session;
}
@Override
protected Person doInBackground(final Void... params)
{
final Person facebookIdentity = new Person();
if (!isCancelled())
{
try
{
Thread.sleep(Server.WAIT_FOR_SERVER_DELAY);
}
catch (final InterruptedException e)
{
Log.w(LOG_TAG, "AsyncGetFacebookIdentity thread sleep interrupted!", e);
}
Request.newMeRequest(session, new GraphUserCallback()
{
@Override
public void onCompleted(final GraphUser user, final Response response)
{
facebookIdentity.setId(user.getId());
facebookIdentity.setName(user.getName());
}
}).executeAndWait();
}
return facebookIdentity;
}
@Override
protected void onPostExecute(final Person facebookIdentity)
{
if (facebookIdentity.isValid())
{
Log.i(LOG_TAG, "received valid Facebook identity: \"" + facebookIdentity.toString() + "\"");
Utilities.setWhoAmI(activity, facebookIdentity);
final Handler handler = new Handler();
serverApiTask = new ServerApiRegister(activity, false, new ServerApi.Listeners()
{
@Override
public void onCancel()
{}
@Override
public void onComplete(final String serverResponse)
{
loadingSpinner.setVisibility(View.INVISIBLE);
final String name = facebookIdentity.getFirstName();
loadingText.setText(getString(R.string.hello_x, name));
handler.postDelayed(new Runnable()
{
@Override
public void run()
{
asyncGetFacebookIdentity = null;
startGameFragmentActivity();
}
}, Server.WAIT_FOR_SERVER_DELAY);
}
@Override
public void onDismiss()
{}
});
loadingText.setText(getString(R.string.registering_you_with_our_servers));
handler.postDelayed(new Runnable()
{
@Override
public void run()
{
serverApiTask.execute(false);
}
}, Server.WAIT_FOR_SERVER_DELAY);
}
else
{
loadingText.setText(getString(R.string.we_had_a_problem_gathering_your_facebook_information));
}
}
@Override
protected void onPreExecute()
{
facebook.setVisibility(View.GONE);
loading.setVisibility(View.VISIBLE);
loadingText.setText(getString(R.string.authenticating_you_with_facebook));
}
}
}