package com.gojira.ui; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Intent; import android.os.Bundle; import android.support.design.widget.Snackbar; import android.view.View; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.widget.ImageView; import android.widget.TextView; import com.gojira.R; import com.gojira.app.GojiraApp; import com.gojira.data.api.JiraService; import com.gojira.data.io.SessionResponse; import com.gojira.util.ViewUtils; import javax.inject.Inject; import butterknife.ButterKnife; import butterknife.InjectView; import retrofit.Callback; import retrofit.RetrofitError; import retrofit.client.Response; import timber.log.Timber; /** * @author Stratos Theodorou * @version 1.0 * @since 14/05/2015 */ public class SplashActivity extends BaseActivity implements Callback<SessionResponse> { private static final long START_DELAY = 2500; private static final long STOP_DELAY = 2000; @Inject JiraService mService; @InjectView(R.id.logo) ImageView mLogo; @InjectView(R.id.description) TextView mDescription; @InjectView(R.id.root) View mRoot; AnimatorSet mStartAnimations; AnimatorSet mStopAnimations; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GojiraApp.get(this).getGraph().inject(this); setContentView(R.layout.activity_splash); ButterKnife.inject(this); // Start animations, after views are laid out ViewUtils.addOnGlobalLayoutListener(mRoot, new Runnable() { @Override public void run() { mStartAnimations = new AnimatorSet(); mStartAnimations.playTogether( ObjectAnimator .ofFloat(mDescription, "alpha", 0.0f, 1.0f) .setDuration(START_DELAY), ObjectAnimator .ofFloat(mLogo, "alpha", 0.0f, 1.0f) .setDuration(START_DELAY), ObjectAnimator .ofFloat(mLogo, "translationY", -(mLogo.getTop() + mLogo.getBottom()), 0) .setDuration(START_DELAY / 3) ); mStartAnimations.setInterpolator(new AccelerateDecelerateInterpolator()); mStartAnimations.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mService.session(SplashActivity.this); } }); mStartAnimations.start(); } }); } @Override protected void onDestroy() { if (mStartAnimations != null) { mStartAnimations.cancel(); } if (mStopAnimations != null) { mStopAnimations.cancel(); } super.onDestroy(); } @Override public void success(SessionResponse sessionResponse, Response response) { // We already have a session, start main app flow mStopAnimations = new AnimatorSet(); mStopAnimations.setDuration(STOP_DELAY); mStopAnimations.setInterpolator(new DecelerateInterpolator()); mStopAnimations.playTogether( ObjectAnimator.ofFloat(mDescription, "alpha", 1.0f, 0.0f), ObjectAnimator.ofFloat(mLogo, "alpha", 1.0f, 0.0f) ); mStopAnimations.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { startActivity(new Intent(SplashActivity.this, MainActivity.class)); finish(); } }); mStopAnimations.start(); } @Override public void failure(RetrofitError error) { Timber.d(error, "Error trying to get session."); // Unexpected error typically means invalid endpoint, so we need to login if (error.getKind() == RetrofitError.Kind.UNEXPECTED) { mStopAnimations = new AnimatorSet(); mStopAnimations.setDuration(STOP_DELAY); mStopAnimations.setInterpolator(new DecelerateInterpolator()); mStopAnimations.playTogether( ObjectAnimator.ofFloat(mDescription, "alpha", 1.0f, 0.0f), ObjectAnimator.ofFloat(mLogo, "alpha", 1.0f, 0.0f) ); mStopAnimations.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { startActivity(new Intent(SplashActivity.this, LoginActivity.class)); finish(); } }); mStopAnimations.start(); } // Login required in case of 401 error else if (error.getKind() == RetrofitError.Kind.HTTP) { mStopAnimations = new AnimatorSet(); mStopAnimations.setDuration(STOP_DELAY); mStopAnimations.setInterpolator(new DecelerateInterpolator()); mStopAnimations.playTogether( ObjectAnimator.ofFloat(mDescription, "alpha", 1.0f, 0.0f), ObjectAnimator.ofFloat(mLogo, "alpha", 1.0f, 0.0f) ); mStopAnimations.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { startActivity(new Intent(SplashActivity.this, LoginActivity.class)); finish(); } }); mStopAnimations.start(); } // Show retry prompt in case of network error else if (error.getKind() == RetrofitError.Kind.NETWORK) { Snackbar.make(mRoot, R.string.error_network, Snackbar.LENGTH_LONG) .setAction(R.string.action_retry, new View.OnClickListener() { @Override public void onClick(View v) { mService.session(SplashActivity.this); } }) .show(); } // Non-recoverable error? else { Snackbar.make(mRoot, R.string.error_unknown, Snackbar.LENGTH_LONG).show(); } } }