package com.jasonchen.microlang.gallery;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Browser;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.jasonchen.microlang.R;
import com.jasonchen.microlang.beans.MessageBean;
import com.jasonchen.microlang.debug.AppLogger;
import com.jasonchen.microlang.tasks.MyAsyncTask;
import com.jasonchen.microlang.utils.AnimationRect;
import com.jasonchen.microlang.utils.AnimationUtility;
import com.jasonchen.microlang.utils.GlobalContext;
import com.jasonchen.microlang.utils.Utility;
import com.jasonchen.microlang.utils.ViewUtility;
import com.jasonchen.microlang.utils.file.FileLocationMethod;
import com.jasonchen.microlang.utils.file.FileManager;
import java.io.File;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
/**
* jasonchen
* 2015/04/10
*/
@SuppressLint("NewApi")
public class GalleryAnimationActivity extends ActionBarActivity {
private ArrayList<AnimationRect> rectList;
private ArrayList<String> urls = new ArrayList<String>();
private ArrayList<String> oriUrls = new ArrayList<String>();
private Toolbar toolbar;
private ViewPager pager;
private FragmentPagerAdapter adapter;
private View background;
private PicSaveTask saveTask;
private int initPosition;
private ColorDrawable backgroundColor;
public static Intent newIntent(MessageBean msg,
ArrayList<AnimationRect> rectList, int initPosition) {
Intent intent = new Intent(GlobalContext.getInstance(),
GalleryAnimationActivity.class);
intent.putExtra("msg", msg);
intent.putExtra("rect", rectList);
intent.putExtra("position", initPosition);
return intent;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.galleryactivity_animation_layout);
rectList = getIntent().getParcelableArrayListExtra("rect");
MessageBean msg = getIntent().getParcelableExtra("msg");
ArrayList<String> tmp = msg.getThumbnailPicUrls();
for (int i = 0; i < tmp.size(); i++) {
oriUrls.add(tmp.get(i));
urls.add(tmp.get(i).replace("thumbnail", "large"));
}
boolean disableHardwareLayerType = false;
for (String url : urls) {
if (url.contains(".gif")) {
disableHardwareLayerType = true;
break;
}
}
toolbar = ViewUtility.findViewById(this, R.id.toolbar);
initPosition = getIntent().getIntExtra("position", 0);
pager = (ViewPager) findViewById(R.id.pager);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setBackgroundDrawable(getResources().getDrawable(R.drawable.action_gradient));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
getSupportActionBar().setTitle("[1/" + urls.size() + "]");
adapter = new ImagePagerAdapter(getSupportFragmentManager());
pager.setAdapter(adapter);
final boolean finalDisableHardwareLayerType = disableHardwareLayerType;
pager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
getSupportActionBar().setTitle("[" + String.valueOf(position + 1) + "/" + urls.size() + "]");
}
@Override
public void onPageScrollStateChanged(int scrollState) {
if (scrollState != ViewPager.SCROLL_STATE_IDLE
&& finalDisableHardwareLayerType) {
final int childCount = pager.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = pager.getChildAt(i);
if (child.getLayerType() != View.LAYER_TYPE_NONE) {
child.setLayerType(View.LAYER_TYPE_NONE, null);
}
}
}
}
});
pager.setCurrentItem(getIntent().getIntExtra("position", 0));
pager.setOffscreenPageLimit(1);
pager.setPageTransformer(true, new ZoomOutPageTransformer());
background = AnimationUtility.getAppContentView(this);
if (savedInstanceState != null) {
showBackgroundImmediately();
}
}
private void saveBitmapToPictureDir(String filePath) {
if (Utility.isTaskStopped(saveTask)) {
saveTask = new PicSaveTask(GalleryAnimationActivity.this, filePath);
saveTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR);
}
}
private HashMap<Integer, ContainerFragment> fragmentMap = new HashMap<Integer, ContainerFragment>();
private boolean alreadyAnimateIn = false;
private class ImagePagerAdapter extends FragmentPagerAdapter {
public ImagePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
ContainerFragment fragment = fragmentMap.get(position);
if (fragment == null) {
boolean animateIn = (initPosition == position)
&& !alreadyAnimateIn;
fragment = ContainerFragment.newInstance(oriUrls.get(position), urls.get(position),
rectList.get(position), animateIn,
initPosition == position);
alreadyAnimateIn = true;
fragmentMap.put(position, fragment);
}
return fragment;
}
// when activity is recycled, ViewPager will reuse fragment by theirs
// name, so
// getItem wont be called, but we need fragmentMap to animate close
// operation
@Override
public void setPrimaryItem(ViewGroup container, int position,
Object object) {
super.setPrimaryItem(container, position, object);
if (object instanceof Fragment) {
fragmentMap.put(position, (ContainerFragment) object);
}
}
@Override
public int getCount() {
return urls.size();
}
}
public void showBackgroundImmediately() {
if (background.getBackground() == null) {
backgroundColor = new ColorDrawable(getResources().getColor(R.color.black));
background.setBackground(backgroundColor);
}
}
public ObjectAnimator showBackgroundAnimate() {
backgroundColor = new ColorDrawable(getResources().getColor(R.color.black));
background.setBackground(backgroundColor);
ObjectAnimator bgAnim = ObjectAnimator.ofInt(backgroundColor, "alpha",
0, 255);
bgAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
background.setBackground(backgroundColor);
}
});
return bgAnim;
}
@Override
public void onBackPressed() {
ContainerFragment fragment = fragmentMap.get(pager.getCurrentItem());
if (fragment != null && fragment.canAnimateCloseActivity()) {
backgroundColor = new ColorDrawable(getResources().getColor(R.color.black));
ObjectAnimator bgAnim = ObjectAnimator.ofInt(backgroundColor,
"alpha", 0);
bgAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
background.setBackground(backgroundColor);
}
});
bgAnim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
GalleryAnimationActivity.super.finish();
overridePendingTransition(-1, -1);
}
});
fragment.animationExit(bgAnim);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_activity_gallery, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
final String url = urls.get(pager.getCurrentItem());
final String path = FileManager.getFilePathFromUrl(url, FileLocationMethod.picture_large);
int itemId = item.getItemId();
if (itemId == R.id.save) {
saveBitmapToPictureDir(path);
} else if (itemId == R.id.share){
Intent sharingIntent = new Intent(Intent.ACTION_SEND);
sharingIntent.setType("image/jpeg");
if (!TextUtils.isEmpty(path)) {
Uri uri = Uri.fromFile(new File(path));
sharingIntent.putExtra(Intent.EXTRA_STREAM, uri);
if (Utility.isIntentSafe(GalleryAnimationActivity.this,
sharingIntent)) {
startActivity(Intent.createChooser(sharingIntent,
getString(R.string.share)));
}
}
} else if (itemId == R.id.copy){
ClipboardManager cm = (ClipboardManager) getSystemService(
Context.CLIPBOARD_SERVICE);
cm.setPrimaryClip(ClipData.newPlainText("sinaweibo", url));
Toast.makeText(GalleryAnimationActivity.this,
getString(R.string.copy_successfully),
Toast.LENGTH_SHORT).show();
}
return false;
}
}