/** * */ package com.gmail.charleszq.picorner.ui; import java.io.File; import java.util.ArrayList; import java.util.List; import android.animation.Animator; import android.animation.Animator.AnimatorListener; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.annotation.TargetApi; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.net.Uri; import android.service.dreams.DreamService; import android.util.Log; import android.widget.ImageView; import com.gmail.charleszq.picorner.BuildConfig; import com.gmail.charleszq.picorner.R; import com.gmail.charleszq.picorner.model.MediaObject; import com.gmail.charleszq.picorner.model.MediaObjectCollection; import com.gmail.charleszq.picorner.service.IPhotoService; import com.gmail.charleszq.picorner.service.flickr.FlickrInterestingPhotosService; import com.gmail.charleszq.picorner.service.ig.InstagramPopularsService; import com.gmail.charleszq.picorner.service.px500.Px500EditorsPhotosService; import com.gmail.charleszq.picorner.service.px500.Px500FreshTodayPhotosService; import com.gmail.charleszq.picorner.service.px500.Px500PopularPhotosService; import com.gmail.charleszq.picorner.service.px500.Px500UpcomingPhotosService; import com.gmail.charleszq.picorner.task.AbstractGeneralTask; import com.gmail.charleszq.picorner.task.IGeneralTaskDoneListener; import com.gmail.charleszq.picorner.utils.IConstants; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.ImageScaleType; /** * @author charleszq@gmail.com * */ @TargetApi(17) public class PicornerDaydream extends DreamService { private List<String> mPhotoUrls; private DisplayImageOptions mImageDisplayOption = null; private ImageLoader mImageLoader; private ImageView mImageView1, mImageView2; private int mCurrentShowingPhotoIndex = 0; private AnimatorSet mAnimatorSet; private ImageView mFadeView, mInView; /* * (non-Javadoc) * * @see android.service.dreams.DreamService#onDreamingStarted() */ @Override public void onDreamingStarted() { super.onDreamingStarted(); preparePhotos(); mImageDisplayOption = new DisplayImageOptions.Builder() .showStubImage(R.drawable.ic_launcher).cacheInMemory() .cacheOnDisc().bitmapConfig(Bitmap.Config.RGB_565) .imageScaleType(ImageScaleType.IN_SAMPLE_INT).build(); mImageLoader = ImageLoader.getInstance(); } private void start() { if (mPhotoUrls.isEmpty()) return; int secondaryIndex = mCurrentShowingPhotoIndex + 1; if (secondaryIndex >= mPhotoUrls.size()) { secondaryIndex = 0; } mImageLoader.displayImage(mPhotoUrls.get(mCurrentShowingPhotoIndex), mImageView1, mImageDisplayOption); mImageLoader.displayImage(mPhotoUrls.get(secondaryIndex), mImageView2, mImageDisplayOption); startAnimation(); } @Override public void onAttachedToWindow() { super.onAttachedToWindow(); this.setContentView(R.layout.day_dream); mImageView1 = (ImageView) findViewById(R.id.img_dream_1); mImageView2 = (ImageView) findViewById(R.id.img_dream_2); mFadeView = mImageView1; mInView = mImageView2; } @Override public void onDreamingStopped() { mImageDisplayOption = null; mPhotoUrls = null; if (mAnimatorSet != null) mAnimatorSet.cancel(); super.onDreamingStopped(); } private void preparePhotos() { PhotoTask task = new PhotoTask(this); task.addTaskDoneListener(new IGeneralTaskDoneListener<List<String>>() { @Override public void onTaskDone(List<String> result) { if (result != null) { mPhotoUrls = new ArrayList<String>(); mPhotoUrls.addAll(result); start(); } } }); task.execute(); } private void startAnimation() { ObjectAnimator o1 = ObjectAnimator .ofFloat(mFadeView, "alpha", 1.0f, 0f).setDuration(10000); //$NON-NLS-1$ ObjectAnimator o2 = ObjectAnimator .ofFloat(mInView, "alpha", 0f, 1f).setDuration(10000); //$NON-NLS-1$ if (mAnimatorSet == null) { mAnimatorSet = new AnimatorSet(); mAnimatorSet.addListener(new AnimatorListener() { @Override public void onAnimationStart(Animator animation) { int secondaryIndex = mCurrentShowingPhotoIndex + 1; if (secondaryIndex >= mPhotoUrls.size()) { secondaryIndex = 0; } mImageLoader.displayImage(mPhotoUrls.get(secondaryIndex), mInView, mImageDisplayOption); } @Override public void onAnimationEnd(Animator animation) { mCurrentShowingPhotoIndex++; if (mCurrentShowingPhotoIndex >= mPhotoUrls.size()) { mCurrentShowingPhotoIndex = 0; } mImageLoader.displayImage( mPhotoUrls.get(mCurrentShowingPhotoIndex), mFadeView, mImageDisplayOption); mFadeView = mFadeView == mImageView1 ? mImageView2 : mImageView1; mInView = mInView == mImageView1 ? mImageView2 : mImageView1; startAnimation(); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); } mAnimatorSet.playTogether(o1, o2); mAnimatorSet.start(); } private static class PhotoTask extends AbstractGeneralTask<Void, Integer, List<String>> { private Context mContext; PhotoTask(Context ctx) { this.mContext = ctx; } private int getSecondaryPhotoSource() { SharedPreferences sp = mContext.getSharedPreferences( IConstants.DEF_PREF_NAME, Context.MODE_APPEND); String src = sp.getString(IConstants.PREF_DEFAULT_PHOTO_LIST, "1"); //$NON-NLS-1$ return Integer.parseInt(src); } private IPhotoService getNetworkPhotoSourceService(int which) { switch (which) { case 1: return new Px500PopularPhotosService(); case 2: return new Px500EditorsPhotosService(); case 3: return new Px500UpcomingPhotosService(); case 4: return new Px500FreshTodayPhotosService(); case 5: return new FlickrInterestingPhotosService(); default: return new InstagramPopularsService(); } } private int getPageSize(int which) { switch (which) { case 5: return IConstants.DEF_SERVICE_PAGE_SIZE; case 6: return IConstants.DEF_IG_PAGE_SIZE; default: return IConstants.DEF_500PX_PAGE_SIZE; } } @Override protected List<String> doInBackground(Void... params) { List<String> urls = new ArrayList<String>(); File[] files = mContext.getFilesDir().listFiles(); for (File f : files) { String name = f.getName(); if (name.contains(".png")) { //$NON-NLS-1$ String url = Uri.fromFile(f).toString(); urls.add(url); if (BuildConfig.DEBUG) { Log.d(TAG, "foudn offline photo: " + url); //$NON-NLS-1$ } } } if (urls.isEmpty()) { return getNetworkPhotos(getSecondaryPhotoSource()); } else return urls; } private List<String> getNetworkPhotos(int which) { List<String> urls = new ArrayList<String>(); MediaObjectCollection col = null; IPhotoService ps = getNetworkPhotoSourceService(which); try { col = ps.getPhotos(getPageSize(which), 0); for (MediaObject photo : col.getPhotos()) { urls.add(photo.getLargeUrl()); } } catch (Exception e) { if (BuildConfig.DEBUG) { Log.e(TAG, "Unable to get the photos for daydream: " + e.getMessage()); //$NON-NLS-1$ } } return urls; } } }