package edu.vanderbilt.vm.guide.ui; import android.content.Context; import android.os.Handler; import android.util.AttributeSet; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import edu.vanderbilt.vm.guide.R; import edu.vanderbilt.vm.guide.container.Agenda; import edu.vanderbilt.vm.guide.container.Place; import edu.vanderbilt.vm.guide.ui.adapter.CardTourAdapter; import edu.vanderbilt.vm.guide.util.ImageDownloader; import java.util.Date; import java.util.Random; /** * Date: 6/25/13 * Time: 5:32 PM */ public class CyclingTourGridItem extends RelativeLayout { private ImageView mImage1; private TextView mTourName; private int mPosition; private boolean mIsRunning; private Random mGenerator; private Handler mHandler; private CardTourAdapter.TourRecord mRecord; public CyclingTourGridItem(Context ctx) { super(ctx); init(); } public CyclingTourGridItem(Context ctx, AttributeSet attrs) { super(ctx, attrs); init(); } private void init() { mGenerator = new Random((new Date()).getTime()); mIsRunning = false; mHandler = new Handler(); } @Override protected void onFinishInflate() { super.onFinishInflate(); mImage1 = (ImageView) findViewById(R.id.ctgi_iv1); mTourName = (TextView) findViewById(R.id.ctgi_name); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth()); } public void setView(String tourName) { mTourName.setText(tourName); } public void setView(CardTourAdapter.TourRecord record) { mRecord = record; mPosition = 0; mTourName.setText(record.mTour.getName()); if (!mIsRunning && record.mImageList.length != 0) { mIsRunning = true; mHandler.post(mImageCycler); } } private Runnable mImageCycler = new Runnable() { @Override public void run() { if (mRecord.mImageList[mPosition] == null) { final int position = mPosition; ImageDownloader.BitmapDownloaderTask download = new ImageDownloader.BitmapDownloaderTask(mImage1); download.setRunOnFinishDownload(new Runnable() { @Override public void run() { mRecord.mImageList[position] = mImage1.getDrawable(); postImageAdvance(); }}); download.execute(getImageLoc(mPosition)); } else { mImage1.setImageDrawable(mRecord.mImageList[mPosition]); postImageAdvance(); } } }; private void postImageAdvance() { mPosition++; if (mPosition == mRecord.mImageList.length) { mPosition = 0; } // post with a slight randomization, for giggles mHandler.postDelayed(mImageCycler, 4000 + mGenerator.nextInt(500)); } private String getImageLoc(int position) { Agenda a = mRecord.mTour.getAgenda(); Place p = a.get(position); if (p == null) { throw new IllegalStateException( "There is a null object in Tour#" + mRecord.mTour.getUniqueId() + " at position: " + position + ". Agenda: " + mRecord.mTour.getAgenda().toString()); } return p.getPictureLoc(); } }