/** * */ package com.gmail.charleszq.picorner.ui; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.MenuItem; import android.widget.ImageView; import android.widget.Toast; import com.gmail.charleszq.picorner.R; import com.gmail.charleszq.picorner.SPUtil; import com.gmail.charleszq.picorner.dp.IPhotosProvider; import com.gmail.charleszq.picorner.model.Author; import com.gmail.charleszq.picorner.model.GeoLocation; import com.gmail.charleszq.picorner.model.MediaObject; import com.gmail.charleszq.picorner.model.MediaSourceType; import com.gmail.charleszq.picorner.msg.Message; import com.gmail.charleszq.picorner.msg.MessageBus; import com.gmail.charleszq.picorner.task.IGeneralTaskDoneListener; import com.gmail.charleszq.picorner.task.flickr.FetchGeoLocationTask; import com.gmail.charleszq.picorner.ui.helper.PhotoDetailViewPagerAdapter; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.viewpagerindicator.TitlePageIndicator; /** * Represents the activity to show all detail information of a photo. * * @author charles(charleszq@gmail.com) * */ public class PhotoDetailActivity extends FragmentActivity { private static final String TAG = PhotoDetailActivity.class.getSimpleName(); /** * */ public static final String DETAIL_PAGE_KEY = "detail.page.key"; //$NON-NLS-1$ public static final String MY_F_ORG_PHOTO_SET_PAGE = "m.f.ps.page"; //$NON-NLS-1$ public static final String MY_F_ORG_GROUP_PAGE = "m.f.group.page"; //$NON-NLS-1$ public static final String COMMENT_PAGE = "comment.page"; //$NON-NLS-1$ public static final String EXIF_PAGE = "exif.page"; //$NON-NLS-1$ public static final String MAP_PAGE = "map.page"; //$NON-NLS-1$ private ViewPager mViewPager; private TitlePageIndicator mIndicator; private PhotoDetailViewPagerAdapter mAdapter; private ImageView mImageView; private int mCurrentPos; private MediaObject mCurrentPhoto; private DisplayImageOptions mImageDisplayOption; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.photo_detail_activity); mCurrentPos = getIntent().getIntExtra( ImageDetailActivity.LARGE_IMAGE_POSITION, -1); IPhotosProvider dp = (IPhotosProvider) getIntent() .getSerializableExtra(ImageDetailActivity.DP_KEY); mCurrentPhoto = dp.getMediaObject(mCurrentPos); mImageView = (ImageView) findViewById(R.id.imageThumb); mViewPager = (ViewPager) findViewById(R.id.pager_photo_detail); mAdapter = new PhotoDetailViewPagerAdapter(getSupportFragmentManager(), mCurrentPhoto, this); mViewPager.setAdapter(mAdapter); mIndicator = (TitlePageIndicator) findViewById(R.id.indicator_photo_detail); mIndicator.setViewPager(mViewPager); String pagekey = getIntent().getStringExtra(DETAIL_PAGE_KEY); if( pagekey != null ) { int pageIndex = mAdapter.getPageIndex(pagekey); if( pageIndex != -1 ) mViewPager.setCurrentItem(pageIndex, true); } loadImage(); getActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); } private void loadImage() { ImageLoader loader = ImageLoader.getInstance(); if (mImageDisplayOption == null) mImageDisplayOption = new DisplayImageOptions.Builder() .cacheInMemory().cacheOnDisc() .bitmapConfig(Bitmap.Config.RGB_565) .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) .build(); String url = mCurrentPhoto.getLargeUrl(); loader.displayImage(url, mImageView, mImageDisplayOption); } /** * Called by inside page to check, for example, if the photo has location * information, then we will show the map page. */ public void notifyDataChanged() { if (mAdapter != null) { mAdapter.notifyDataSetChanged(); } } /** * Called by inside fragments to show photos of the given * <code>author</code>. * * @param author */ void showUserPhotos(Author author) { boolean canClick = canClickUserAvator(author); if (!canClick) { return; } Intent i = new Intent(this, UserPhotoListActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); i.putExtra(UserPhotoListActivity.MD_TYPE_KEY, mCurrentPhoto .getMediaSource().ordinal()); i.putExtra(UserPhotoListActivity.USER_KEY, author); startActivity(i); } /** * Before trying to show photos of a given user, check this. * * @return */ private boolean canClickUserAvator(Author author) { boolean result = true; switch (mCurrentPhoto.getMediaSource()) { case INSTAGRAM: String instagramUserId = SPUtil.getInstagramUserId(this); if (instagramUserId == null) { Toast.makeText(this, getString(R.string.pls_sing_in_first), Toast.LENGTH_SHORT).show(); result = false; } else { if (instagramUserId.equals(author.getUserId())) { Toast.makeText(this, getString(R.string.msg_your_own_photo), Toast.LENGTH_SHORT).show(); result = false; } } break; case FLICKR: if (!SPUtil.isFlickrAuthed(this)) { Toast.makeText(this, getString(R.string.pls_sing_in_first), Toast.LENGTH_SHORT).show(); result = false; } else { if (SPUtil.getFlickrUserId(this).equals( author.getUserId())) { Toast.makeText(this, getString(R.string.msg_your_own_photo), Toast.LENGTH_SHORT).show(); result = false; } } break; case PX500: break; } return result; } /* * (non-Javadoc) * * @see android.support.v4.app.FragmentActivity#onStart() */ @Override protected void onStart() { super.onStart(); // for flickr photos, some api calls just cannot return the geo // information, // then check if there is geo information if (mCurrentPhoto == null || !MediaSourceType.FLICKR.equals(mCurrentPhoto .getMediaSource())) { return; } GeoLocation loc = mCurrentPhoto.getLocation(); if (loc != null) { return; } FetchGeoLocationTask task = new FetchGeoLocationTask(); task.addTaskDoneListener(new IGeneralTaskDoneListener<GeoLocation>() { @Override public void onTaskDone(GeoLocation result) { onFlickrGeoInformationFetch(result); } }); Log.d(TAG, "call server to fetch geo information for flickr photo."); //$NON-NLS-1$ task.execute(mCurrentPhoto.getId()); } /** * After geo location fetched for flikcr photos. * * @param result */ private void onFlickrGeoInformationFetch(GeoLocation result) { if (result == null) { return; } mCurrentPhoto.setLocation(result); notifyDataChanged(); // broadcast the message. Message msg = new Message(Message.GEO_INFO_FETCHED, mCurrentPhoto.getMediaSource(), mCurrentPhoto.getId(), result); MessageBus.broadcastMessage(msg); } }