package com.github.miao1007.animewallpaper.ui.activity;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.IntRange;
import android.support.annotation.Nullable;
import android.support.annotation.Size;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import com.github.miao1007.animewallpaper.R;
import com.github.miao1007.animewallpaper.support.api.ImageVO;
import com.github.miao1007.animewallpaper.ui.widget.ActionSheet;
import com.github.miao1007.animewallpaper.ui.widget.NavigationBar;
import com.github.miao1007.animewallpaper.ui.widget.PieImageView;
import com.github.miao1007.animewallpaper.ui.widget.Position;
import com.github.miao1007.animewallpaper.ui.widget.TagsActionSheet;
import com.github.miao1007.animewallpaper.ui.widget.blur.BlurDrawable;
import com.github.miao1007.animewallpaper.utils.FileUtils;
import com.github.miao1007.animewallpaper.utils.LogUtils;
import com.github.miao1007.animewallpaper.utils.SquareUtils;
import com.github.miao1007.animewallpaper.utils.StatusBarUtils;
import com.github.miao1007.animewallpaper.utils.WallpaperUtils;
import com.github.miao1007.animewallpaper.utils.picasso.Blur;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import java.io.File;
import okhttp3.CacheControl;
import okhttp3.Request;
import okhttp3.Response;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
/**
* 用户默认的交互区主要在左下角
*/
public class DetailedActivity extends AppCompatActivity {
public static final String TAG = LogUtils.makeLogTag(DetailedActivity.class);
private static final String EXTRA_IMAGE = "URL";
private static final String EXTRA_POSITION = "EXTRA_POSITION";
@BindView(R.id.iv_detailed_card) PieImageView ivDetailedCard;
@BindView(R.id.blur_bg) ImageView ivDetailedCardBlur;
@BindView(R.id.navigation_bar) NavigationBar mNavigationBar;
@BindView(R.id.ll_detailed_downloads) LinearLayout mLlDetailedDownloads;
@BindView(R.id.image_share) ImageView mImageShare;
BlurDrawable drawable;
private ImageVO imageResult;
private boolean isPlaying = false;
private SquareUtils.ProgressListener listener = new SquareUtils.ProgressListener() {
@Override public void update(@IntRange(from = 0, to = 100) final int percent) {
runOnUiThread(new Runnable() {
@Override public void run() {
ivDetailedCard.setProgress(percent);
}
});
}
};
private Picasso largeImagepicasso;
private static Position getPosition(Intent intent) {
return intent.getParcelableExtra(EXTRA_POSITION);
}
public static void startActivity(Context context, Position position, ImageVO parcelable) {
Intent intent = new Intent(context, DetailedActivity.class);
intent.putExtra(EXTRA_IMAGE, parcelable);
intent.putExtra(EXTRA_POSITION, position);
context.startActivity(intent);
}
@OnClick(R.id.detailed_back) void back() {
onBackPressed();
}
@OnClick(R.id.detailed_tags) void tags() {
final ActionSheet a = new TagsActionSheet(getWindow(), new AdapterView.OnItemClickListener() {
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MainActivity.startRefreshActivity(DetailedActivity.this,
imageResult.getTags().get(position));
}
}, imageResult.getTags());
drawable = new BlurDrawable(getWindow());
a.setDrawable(drawable);
a.show();
}
@OnClick(R.id.image_download) void image_download() {
downloadViaPicasso(new Subscriber<File>() {
@Override public void onCompleted() {
}
@Override public void onError(Throwable e) {
}
@Override public void onNext(File file) {
final Intent shareIntent = new Intent(Intent.ACTION_VIEW);
shareIntent.setDataAndType(Uri.fromFile(file), "image/*");
startActivity(Intent.createChooser(shareIntent, getString(R.string.view_image_by)));
}
});
}
@OnClick(R.id.image_setwallpaper) void image_setWallpaper(ImageView v) {
Toast.makeText(DetailedActivity.this, R.string.start_download_image, Toast.LENGTH_SHORT).show();
downloadViaPicasso(new Subscriber<File>() {
@Override public void onCompleted() {
}
@Override public void onError(Throwable e) {
}
@Override public void onNext(File file) {
WallpaperUtils.setWallpaper(DetailedActivity.this, file);
}
});
}
@OnClick(R.id.iv_detailed_card) void download(final ImageView v) {
image_setWallpaper(v);
}
@OnClick(R.id.image_share) void image_share(ImageView v) {
downloadViaPicasso(new Subscriber<File>() {
@Override public void onCompleted() {
}
@Override public void onError(Throwable e) {
}
@Override public void onNext(File file) {
WallpaperUtils.previewImage(DetailedActivity.this, file);
}
});
}
private void downloadViaPicasso(final Subscriber<File> subscriber) {
if (mNavigationBar.getProgress()) {
//debounce
return;
}
mNavigationBar.setProgressBar(true);
largeImagepicasso.load(imageResult.getDownload_url()).placeholder(ivDetailedCard.getDrawable())
//fix oom
.config(Bitmap.Config.ARGB_4444).into(ivDetailedCard, new Callback() {
@Override public void onSuccess() {
mNavigationBar.setProgressBar(false);
final Request request = new Request.Builder().url(imageResult.getDownload_url())
.cacheControl(CacheControl.FORCE_CACHE)
.get()
.build();
Observable.create(new Observable.OnSubscribe<Response>() {
@Override public void call(final Subscriber<? super Response> subscriber) {
try {
subscriber.onNext(SquareUtils.getClient().newCall(request).execute());
} catch (Exception e) {
subscriber.onError(e);
}
}
})
.map(new Func1<Response, File>() {
@Override public File call(Response response) {
return FileUtils.saveBodytoExtStorage(response.body(),
Uri.parse(imageResult.getDownload_url()).getLastPathSegment());
}
})
.subscribeOn(SquareUtils.getRxWorkerScheduler())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
@Override public void onError() {
mNavigationBar.setProgressBar(false);
}
});
}
@Override protected void onDestroy() {
super.onDestroy();
if (drawable != null) {
drawable.onDestroy();
}
listener = null;
largeImagepicasso.cancelRequest(ivDetailedCard);
}
@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_image_detailed_card);
ButterKnife.bind(this);
StatusBarUtils.from(this)
.setTransparentStatusbar(true)
.setTransparentNavigationbar(true)
.setActionbarView(mNavigationBar)
.setLightStatusBar(false)
.process();
largeImagepicasso = SquareUtils.getPicasso(this, listener);
mNavigationBar.setTextColor(Color.WHITE);
imageResult = getIntent().getParcelableExtra(EXTRA_IMAGE);
SquareUtils.getPicasso(this)
.load(imageResult.getPrevurl())
.into(ivDetailedCard, new Callback.EmptyCallback() {
@Override public void onSuccess() {
Observable.just(ivDetailedCard)
.map(new Func1<ImageView, Bitmap>() {
@Override public Bitmap call(ImageView imageView) {
return ((BitmapDrawable) imageView.getDrawable()).getBitmap();
}
})
.map(new Func1<Bitmap, Bitmap>() {
@Override public Bitmap call(Bitmap bitmap) {
return Blur.apply(DetailedActivity.this, bitmap, 20);
}
})
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Bitmap>() {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN) @Override
public void call(final Bitmap bitmap) {
anim(getPosition(getIntent()), new BitmapDrawable(bitmap), true,
new Runnable() {
@Override public void run() {
}
}, ivDetailedCard, mLlDetailedDownloads, ivDetailedCardBlur);
}
});
}
});
}
/**
* 动画封装,千万不要剁手改正负
*/
private void anim(final Position position, @Nullable Drawable drawable, final boolean in,
final Runnable runnable, @Size(value = 3) View... views) {
if (isPlaying) {
return;
}
//记住括号哦,我这里调试了一小时
float delta = ((float) (position.width)) / ((float) (position.height));
//243 - 168(navi) = 75 = status_bar
float[] y_img = {
position.top - (views[0].getY() + (in ? (StatusBarUtils.getStatusBarOffsetPx(this)) : 0)), 0
};
float[] s_img = { 1f, delta };
float[] y_icn = { views[1].getHeight() * 4, 0 };
views[0].setPivotX(views[0].getWidth() / 2);
views[0].setPivotY(0);
views[1].setPivotX(views[1].getWidth() / 2);
views[1].setPivotY(0);
ImageView bg = ((ImageView) views[2]);
if (drawable != null) {
bg.setImageDrawable(drawable);
}
Animator trans_Y =
ObjectAnimator.ofFloat(views[0], View.TRANSLATION_Y, in ? y_img[0] : y_img[1],
in ? y_img[1] : y_img[0]);
Animator scale_X = ObjectAnimator.ofFloat(views[0], View.SCALE_X, in ? s_img[0] : s_img[1],
in ? s_img[1] : s_img[0]);
Animator scale_Y = ObjectAnimator.ofFloat(views[0], View.SCALE_Y, in ? s_img[0] : s_img[1],
in ? s_img[1] : s_img[0]);
Animator alpha_icn = ObjectAnimator.ofFloat(views[1], View.ALPHA, in ? 0f : 1f, in ? 1f : 0f);
Animator alpha_bg = ObjectAnimator.ofFloat(views[2], View.ALPHA, in ? 0f : 1f, in ? 1f : 0f);
Animator trans_icn_Y =
ObjectAnimator.ofFloat(views[1], View.TRANSLATION_Y, in ? y_icn[0] : y_icn[1],
in ? y_icn[1] : y_icn[0]);
AnimatorSet set = new AnimatorSet();
set.playTogether(trans_Y, scale_X, scale_Y);
set.playTogether(trans_icn_Y, alpha_icn, alpha_bg);
set.setDuration(300);
set.addListener(new Animator.AnimatorListener() {
@Override public void onAnimationStart(Animator animation) {
isPlaying = true;
}
@Override public void onAnimationEnd(Animator animation) {
isPlaying = false;
runnable.run();
}
@Override public void onAnimationCancel(Animator animation) {
isPlaying = false;
}
@Override public void onAnimationRepeat(Animator animation) {
}
});
set.setInterpolator(new AccelerateInterpolator());
set.start();
}
@Override public void onBackPressed() {
anim(getPosition(getIntent()), null, false, new Runnable() {
@Override public void run() {
DetailedActivity.super.onBackPressed();
overridePendingTransition(0, 0);
}
}, ivDetailedCard, mLlDetailedDownloads, ivDetailedCardBlur);
}
}