package com.dm.wallpaper.board.activities;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.ActivityCompat;
import android.support.v4.view.animation.LinearOutSlowInInterpolator;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.Toolbar;
import android.transition.Transition;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.danimahardhika.android.helpers.animation.AnimationHelper;
import com.danimahardhika.android.helpers.core.ColorHelper;
import com.danimahardhika.android.helpers.core.DrawableHelper;
import com.danimahardhika.android.helpers.permission.PermissionCode;
import com.danimahardhika.android.helpers.permission.PermissionHelper;
import com.danimahardhika.cafebar.CafeBar;
import com.danimahardhika.cafebar.CafeBarTheme;
import com.dm.wallpaper.board.R;
import com.dm.wallpaper.board.R2;
import com.dm.wallpaper.board.adapters.WallpapersAdapter;
import com.dm.wallpaper.board.fragments.dialogs.WallpaperSettingsFragment;
import com.dm.wallpaper.board.helpers.LocaleHelper;
import com.dm.wallpaper.board.helpers.TapIntroHelper;
import com.dm.wallpaper.board.helpers.ViewHelper;
import com.dm.wallpaper.board.helpers.WallpaperHelper;
import com.dm.wallpaper.board.preferences.Preferences;
import com.dm.wallpaper.board.utils.Extras;
import com.dm.wallpaper.board.utils.ImageConfig;
import com.dm.wallpaper.board.utils.LogUtil;
import com.kogitune.activitytransition.ActivityTransition;
import com.kogitune.activitytransition.ExitActivityTransition;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import java.io.File;
import butterknife.BindView;
import butterknife.ButterKnife;
import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper;
import uk.co.senab.photoview.PhotoViewAttacher;
/*
* Wallpaper Board
*
* Copyright (c) 2017 Dani Mahardhika
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
public class WallpaperBoardPreviewActivity extends AppCompatActivity implements View.OnClickListener,
ActivityCompat.OnRequestPermissionsResultCallback {
@BindView(R2.id.wallpaper)
ImageView mWallpaper;
@BindView(R2.id.fab)
FloatingActionButton mFab;
@BindView(R2.id.progress)
ProgressBar mProgress;
@BindView(R2.id.bottom_progress)
ProgressBar mBottomProgress;
private Runnable mRunnable;
private Handler mHandler;
private PhotoViewAttacher mAttacher;
private ExitActivityTransition mExitTransition;
private String mUrl;
private String mName;
private String mAuthor;
private int mColor;
private boolean mIsEnter;
private boolean mIsResumed = false;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.setTheme(Preferences.get(this).isDarkTheme() ?
R.style.WallpaperThemeDark : R.style.WallpaperTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wallpaper_preview);
ButterKnife.bind(this);
ViewHelper.resetViewBottomMargin(mFab);
ColorHelper.setStatusBarColor(this, ColorHelper.get(this, R.color.wallpaperStatusBar), true);
mIsEnter = true;
Toolbar toolbar = ButterKnife.findById(this, R.id.toolbar);
TextView toolbarTitle = ButterKnife.findById(this, R.id.toolbar_title);
TextView toolbarSubTitle = ButterKnife.findById(this, R.id.toolbar_subtitle);
mColor = ColorHelper.getAttributeColor(this, R.attr.colorAccent);
mProgress.getIndeterminateDrawable().setColorFilter(
Color.parseColor("#CCFFFFFF"), PorterDuff.Mode.SRC_IN);
mBottomProgress.getProgressDrawable().setColorFilter(
Color.parseColor("#EEFFFFFF"), PorterDuff.Mode.SRC_IN);
if (savedInstanceState != null) {
mUrl = savedInstanceState.getString(Extras.EXTRA_URL);
mName = savedInstanceState.getString(Extras.EXTRA_NAME);
mAuthor = savedInstanceState.getString(Extras.EXTRA_AUTHOR);
mIsResumed = savedInstanceState.getBoolean(Extras.EXTRA_RESUMED);
}
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
mUrl = bundle.getString(Extras.EXTRA_URL);
mName = bundle.getString(Extras.EXTRA_NAME);
mAuthor = bundle.getString(Extras.EXTRA_AUTHOR);
}
toolbarTitle.setText(mName);
toolbarSubTitle.setText(mAuthor);
toolbar.setTitle("");
toolbar.setNavigationIcon(R.drawable.ic_toolbar_back);
setSupportActionBar(toolbar);
mFab.setOnClickListener(this);
if (!mIsResumed) {
mExitTransition = ActivityTransition
.with(getIntent())
.to(this, mWallpaper, Extras.EXTRA_IMAGE)
.duration(300)
.start(savedInstanceState);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && savedInstanceState == null) {
Transition transition = getWindow().getSharedElementEnterTransition();
if (transition != null) {
transition.addListener(new Transition.TransitionListener() {
@Override
public void onTransitionStart(Transition transition) {
}
@Override
public void onTransitionEnd(Transition transition) {
if (mIsEnter) {
mIsEnter = false;
AnimationHelper.slideDownIn(toolbar)
.duration(300)
.interpolator(new LinearOutSlowInInterpolator())
.start();
loadWallpaper(mUrl);
}
}
@Override
public void onTransitionCancel(Transition transition) {
}
@Override
public void onTransitionPause(Transition transition) {
}
@Override
public void onTransitionResume(Transition transition) {
}
});
return;
}
}
mRunnable = () -> {
toolbar.setVisibility(View.VISIBLE);
loadWallpaper(mUrl);
mRunnable = null;
mHandler = null;
};
mHandler = new Handler();
mHandler.postDelayed(mRunnable, 700);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
ViewHelper.resetViewBottomMargin(mFab);
LocaleHelper.setLocale(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_wallpaper_preview, menu);
MenuItem save = menu.findItem(R.id.menu_save);
save.setVisible(getResources().getBoolean(R.bool.enable_wallpaper_download));
return super.onCreateOptionsMenu(menu);
}
@Override
protected void attachBaseContext(Context newBase) {
LocaleHelper.setLocale(newBase);
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString(Extras.EXTRA_NAME, mName);
outState.putString(Extras.EXTRA_AUTHOR, mAuthor);
outState.putString(Extras.EXTRA_URL, mUrl);
outState.putBoolean(Extras.EXTRA_RESUMED, true);
super.onSaveInstanceState(outState);
}
@Override
protected void onDestroy() {
if (mAttacher != null) mAttacher.cleanup();
super.onDestroy();
}
@Override
public void onBackPressed() {
WallpapersAdapter.sIsClickable = true;
if (mHandler != null && mRunnable != null)
mHandler.removeCallbacks(mRunnable);
if (mExitTransition != null) {
mExitTransition.exit(this);
return;
}
super.onBackPressed();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
onBackPressed();
return true;
} else if (id == R.id.menu_save) {
if (PermissionHelper.isStorageGranted(this)) {
File target = new File(WallpaperHelper.getDefaultWallpapersDirectory(this).toString()
+ File.separator + mName + WallpaperHelper.IMAGE_EXTENSION);
if (target.exists()) {
CafeBar.builder(this)
.theme(new CafeBarTheme.Custom(ColorHelper.getAttributeColor(this, R.attr.card_background)))
.autoDismiss(false)
.maxLines(4)
.fitSystemWindow()
.typeface("Font-Regular.ttf", "Font-Bold.ttf")
.content(String.format(getResources().getString(R.string.wallpaper_download_exist),
("\"" +mName + WallpaperHelper.IMAGE_EXTENSION+ "\"")))
.icon(R.drawable.ic_toolbar_download)
.positiveText(R.string.wallpaper_download_exist_replace)
.positiveColor(mColor)
.onPositive(cafeBar -> {
WallpaperHelper.downloadWallpaper(this, mColor, mUrl, mName);
cafeBar.dismiss();
})
.negativeText(R.string.wallpaper_download_exist_new)
.onNegative(cafeBar -> {
WallpaperHelper.downloadWallpaper(this, mColor, mUrl, mName +"_"+ System.currentTimeMillis());
cafeBar.dismiss();
})
.show();
return true;
}
WallpaperHelper.downloadWallpaper(this, mColor, mUrl, mName);
return true;
}
PermissionHelper.requestStorage(this);
return true;
} else if (id == R.id.menu_wallpaper_settings) {
WallpaperSettingsFragment.showWallpaperSettings(getSupportFragmentManager());
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View view) {
int id = view.getId();
if (id == R.id.fab) {
WallpaperHelper.applyWallpaper(this, mAttacher.getDisplayRect(), mColor, mUrl, mName);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PermissionCode.STORAGE) {
if (grantResults.length > 0 &&
grantResults[0] == PackageManager.PERMISSION_GRANTED) {
WallpaperHelper.downloadWallpaper(this, mColor, mUrl, mName);
} else {
Toast.makeText(this, R.string.permission_storage_denied, Toast.LENGTH_LONG).show();
}
}
}
private void loadWallpaper(String url) {
DisplayImageOptions.Builder options = ImageConfig.getRawDefaultImageOptions();
options.cacheInMemory(false);
options.cacheOnDisk(true);
ImageLoader.getInstance().handleSlowNetwork(true);
ImageLoader.getInstance().displayImage(url, mWallpaper, options.build(), new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
super.onLoadingStarted(imageUri, view);
if (Preferences.get(WallpaperBoardPreviewActivity.this).isWallpaperCrop()) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
AnimationHelper.fade(mProgress).start();
AnimationHelper.fade(mBottomProgress).start();
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
super.onLoadingFailed(imageUri, view, failReason);
int text = ColorHelper.getTitleTextColor(mColor);
onWallpaperLoaded(text);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
super.onLoadingComplete(imageUri, view, loadedImage);
if (loadedImage != null) {
Palette.from(loadedImage).generate(palette -> {
int accent = ColorHelper.getAttributeColor(
WallpaperBoardPreviewActivity.this, R.attr.colorAccent);
int color = palette.getVibrantColor(accent);
mColor = color;
int text = ColorHelper.getTitleTextColor(color);
mFab.setBackgroundTintList(ColorHelper.getColorStateList(color));
onWallpaperLoaded(text);
});
}
}
}, (imageUri, view, current, total) -> {
mBottomProgress.setMax(total);
mBottomProgress.setProgress(current);
});
}
private void onWallpaperLoaded(@ColorInt int textColor) {
mAttacher = new PhotoViewAttacher(mWallpaper);
mAttacher.setScaleType(ImageView.ScaleType.CENTER_CROP);
AnimationHelper.fade(mProgress).start();
AnimationHelper.fade(mBottomProgress).start();
mRunnable = null;
mHandler = null;
mIsResumed = false;
mFab.setImageDrawable(DrawableHelper.getTintedDrawable(this,
R.drawable.ic_fab_apply, textColor));
AnimationHelper.show(mFab)
.interpolator(new LinearOutSlowInInterpolator())
.start();
try {
TapIntroHelper.showWallpaperPreviewIntro(this, mColor);
} catch (Exception e) {
LogUtil.e(Log.getStackTraceString(e));
}
}
}