package com.ptrprograms.daydream.views; import android.content.Context; import android.graphics.Typeface; import android.os.Handler; import android.text.TextUtils; import android.util.AttributeSet; import android.view.Gravity; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.widget.TextView; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.Volley; import com.ptrprograms.daydream.R; import com.ptrprograms.daydream.models.Quote; import com.ptrprograms.daydream.utils.GsonRequest; /** * Created by PaulTR on 1/29/14. */ public class QuoteView extends TextView { private Quote mQuote; private Handler mHandler; private int mNewQuoteDelay = 5000; private int mFadeInTime = 1200; private int mFadeOutTime = 2000; private AlphaAnimation mFadeIn; private AlphaAnimation mFadeOut; public QuoteView( Context context ) { this( context, null ); } public QuoteView( Context context, AttributeSet attrs ) { this( context, attrs, 0 ); } public QuoteView( Context context, AttributeSet attrs, int defStyle ) { super( context, attrs, defStyle ); applyViewStyles(); initAnimation(); mHandler = new Handler(); } private void applyViewStyles( ) { setTextColor( getResources().getColor( android.R.color.white ) ); setTextAlignment( TEXT_ALIGNMENT_CENTER ); setGravity( Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL ); setTypeface( Typeface.SANS_SERIF ); } private void initAnimation() { mFadeIn = new AlphaAnimation( 0.0f, 1.0f ); mFadeIn.setDuration( mFadeInTime ); mFadeIn.setFillAfter( true ); mFadeOut = new AlphaAnimation( 1.0f, 0.0f ); mFadeOut.setDuration( mFadeOutTime ); mFadeOut.setFillAfter( true ); mFadeOut.setAnimationListener( new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { //Do nothing. } @Override public void onAnimationEnd(Animation animation) { displayQuote(); } @Override public void onAnimationRepeat(Animation animation) { //Do nothing. } }); } Runnable mQuoteGenerator = new Runnable() { @Override public void run() { generateQuote(); mHandler.postDelayed( mQuoteGenerator, mNewQuoteDelay ); } }; private void generateQuote() { GsonRequest<Quote> request = new GsonRequest<Quote>( Request.Method.GET, getResources().getString( R.string.random_quote_url_json ), Quote.class, onSuccessListener(), onErrorListener() ); Volley.newRequestQueue( getContext() ).add(request); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); mQuoteGenerator.run(); } @Override protected void onDetachedFromWindow() { mHandler.removeCallbacks( mQuoteGenerator ); super.onDetachedFromWindow(); } public Response.Listener onSuccessListener() { return new Response.Listener<Quote>() { @Override public void onResponse(Quote quote) { if( quote == null ) return; if( mQuote == null ) mQuote = new Quote(); mQuote.setJson_class( quote.getJson_class() ); mQuote.setLink( quote.getLink() ); mQuote.setSource( quote.getSource() ); mQuote.setQuote( quote.getQuote() ); startAnimation(mFadeOut); } }; } protected Response.ErrorListener onErrorListener() { return new Response.ErrorListener() { @Override public void onErrorResponse( VolleyError volleyError ) { mQuote.setQuote( getResources().getString( R.string.volley_error ) ); startAnimation(mFadeOut); } }; } private void displayQuote() { if( mQuote == null || TextUtils.isEmpty( mQuote.getQuote() ) ) return; this.setText( mQuote.getQuote() ); startAnimation( mFadeIn ); } }