package com.dm.wallpaper.board.adapters;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.animation.LinearOutSlowInInterpolator;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.danimahardhika.android.helpers.animation.AnimationHelper;
import com.danimahardhika.android.helpers.core.ColorHelper;
import com.danimahardhika.android.helpers.core.DrawableHelper;
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.activities.WallpaperBoardPreviewActivity;
import com.dm.wallpaper.board.databases.Database;
import com.dm.wallpaper.board.fragments.FavoritesFragment;
import com.dm.wallpaper.board.fragments.WallpaperSearchFragment;
import com.dm.wallpaper.board.fragments.WallpapersFragment;
import com.dm.wallpaper.board.fragments.dialogs.WallpaperOptionsFragment;
import com.dm.wallpaper.board.helpers.WallpaperHelper;
import com.dm.wallpaper.board.items.Wallpaper;
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.listeners.WallpaperListener;
import com.dm.wallpaper.board.utils.views.HeaderView;
import com.kogitune.activitytransition.ActivityTransitionLauncher;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.imageaware.ImageViewAware;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import butterknife.BindView;
import butterknife.ButterKnife;
import static com.dm.wallpaper.board.helpers.DrawableHelper.getDefaultImage;
/*
* 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 WallpapersAdapter extends RecyclerView.Adapter<WallpapersAdapter.ViewHolder> {
private final Context mContext;
private final DisplayImageOptions.Builder mOptions;
private List<Wallpaper> mWallpapers;
private List<Wallpaper> mWallpapersAll;
private int mLastSelectedPosition = -1;
private final boolean mIsFavoriteMode;
public static boolean sIsClickable = true;
public WallpapersAdapter(@NonNull Context context, @NonNull List<Wallpaper> wallpapers,
boolean isFavoriteMode, boolean isSearchMode) {
mContext = context;
mWallpapers = wallpapers;
mIsFavoriteMode = isFavoriteMode;
if (isSearchMode) {
mWallpapersAll = new ArrayList<>();
mWallpapersAll.addAll(mWallpapers);
}
int color = ColorHelper.getAttributeColor(mContext, android.R.attr.textColorSecondary);
Drawable loading = getDefaultImage(mContext, R.drawable.ic_default_image_loading, color,
mContext.getResources().getDimensionPixelSize(R.dimen.default_image_padding));
Drawable failed = getDefaultImage(mContext, R.drawable.ic_default_image_failed, color,
mContext.getResources().getDimensionPixelSize(R.dimen.default_image_padding));
mOptions = ImageConfig.getRawDefaultImageOptions();
mOptions.resetViewBeforeLoading(true);
mOptions.cacheInMemory(true);
mOptions.cacheOnDisk(true);
mOptions.showImageForEmptyUri(failed);
mOptions.showImageOnFail(failed);
mOptions.showImageOnLoading(loading);
mOptions.displayer(new FadeInBitmapDisplayer(700));
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(
R.layout.fragment_wallpapers_item_grid, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.name.setText(mWallpapers.get(position).getName());
holder.author.setText(mWallpapers.get(position).getAuthor());
setFavorite(holder.favorite, ColorHelper.getAttributeColor(
mContext, android.R.attr.textColorPrimary), position, false);
String url = WallpaperHelper.getThumbnailUrl(mContext,
mWallpapers.get(position).getUrl(),
mWallpapers.get(position).getThumbUrl());
ImageLoader.getInstance().displayImage(url, new ImageViewAware(holder.image),
mOptions.build(), ImageConfig.getThumbnailSize(mContext), new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
super.onLoadingStarted(imageUri, view);
if (Preferences.get(mContext).isColoredWallpapersCard()) {
int vibrant = ColorHelper.getAttributeColor(
mContext, R.attr.card_background);
holder.card.setCardBackgroundColor(vibrant);
int primary = ColorHelper.getAttributeColor(
mContext, android.R.attr.textColorPrimary);
holder.name.setTextColor(primary);
holder.author.setTextColor(primary);
}
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
super.onLoadingComplete(imageUri, view, loadedImage);
if (Preferences.get(mContext).isColoredWallpapersCard()) {
if (loadedImage != null) {
Palette.from(loadedImage).generate(palette -> {
int vibrant = ColorHelper.getAttributeColor(
mContext, R.attr.card_background);
int color = palette.getVibrantColor(vibrant);
if (color == vibrant)
color = palette.getMutedColor(vibrant);
holder.card.setCardBackgroundColor(color);
int text = ColorHelper.getTitleTextColor(color);
holder.name.setTextColor(text);
holder.author.setTextColor(text);
setFavorite(holder.favorite, text, holder.getAdapterPosition(), false);
});
}
}
}
}, null);
}
@Override
public int getItemCount() {
return mWallpapers.size();
}
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
@BindView(R2.id.card)
CardView card;
@BindView(R2.id.container)
LinearLayout container;
@BindView(R2.id.image)
HeaderView image;
@BindView(R2.id.name)
TextView name;
@BindView(R2.id.author)
TextView author;
@BindView(R2.id.favorite)
ImageView favorite;
ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
if (!Preferences.get(mContext).isShadowEnabled()) {
card.setCardElevation(0f);
}
if (mContext.getResources().getBoolean(R.bool.enable_wallpaper_card_rounded_corner)) {
card.setRadius(mContext.getResources().getDimensionPixelSize(R.dimen.card_corner_radius));
}
container.setOnClickListener(this);
container.setOnLongClickListener(this);
favorite.setOnClickListener(this);
}
@Override
public void onClick(View view) {
int id = view.getId();
int position = getAdapterPosition();
if (id == R.id.container) {
if (sIsClickable) {
sIsClickable = false;
try {
final Intent intent = new Intent(mContext, WallpaperBoardPreviewActivity.class);
intent.putExtra(Extras.EXTRA_URL, mWallpapers.get(position).getUrl());
intent.putExtra(Extras.EXTRA_AUTHOR, mWallpapers.get(position).getAuthor());
intent.putExtra(Extras.EXTRA_NAME, mWallpapers.get(position).getName());
ActivityTransitionLauncher.with((AppCompatActivity) mContext)
.from(image, Extras.EXTRA_IMAGE)
.image(((BitmapDrawable) image.getDrawable()).getBitmap())
.launch(intent);
} catch (Exception e) {
sIsClickable = true;
}
FragmentManager fm = ((AppCompatActivity) mContext).getSupportFragmentManager();
if (fm != null) {
Fragment fragment = fm.findFragmentById(R.id.container);
if (fragment != null) {
if (fragment instanceof WallpapersFragment ||
fragment instanceof FavoritesFragment ||
fragment instanceof WallpaperSearchFragment) {
WallpaperListener listener = (WallpaperListener) fragment;
listener.onWallpaperSelected(position);
}
}
}
}
} else if (id == R.id.favorite) {
if (position < 0 || position > mWallpapers.size()) return;
boolean isFavorite = mWallpapers.get(position).isFavorite();
Database database = new Database(mContext);
database.favoriteWallpaper(mWallpapers.get(position).getId(), !isFavorite);
if (mIsFavoriteMode) {
mWallpapers.remove(position);
notifyItemRemoved(position);
return;
}
mWallpapers.get(position).setFavorite(!isFavorite);
setFavorite(favorite, name.getCurrentTextColor(), position, true);
CafeBar.builder(mContext)
.theme(new CafeBarTheme.Custom(ColorHelper.getAttributeColor(
mContext, R.attr.card_background)))
.fitSystemWindow()
.typeface("Font-Regular.ttf", "Font-Bold.ttf")
.content(String.format(
mContext.getResources().getString(mWallpapers.get(position).isFavorite() ?
R.string.wallpaper_favorite_added : R.string.wallpaper_favorite_removed),
mWallpapers.get(position).getName()))
.icon(mWallpapers.get(position).isFavorite() ?
R.drawable.ic_toolbar_love : R.drawable.ic_toolbar_unlove)
.show();
}
}
@Override
public boolean onLongClick(View view) {
int id = view.getId();
int position = getAdapterPosition();
if (id == R.id.container) {
if (position < 0 || position > mWallpapers.size()) {
mLastSelectedPosition = -1;
return false;
}
mLastSelectedPosition = position;
WallpaperOptionsFragment.showWallpaperOptionsDialog(
((AppCompatActivity) mContext).getSupportFragmentManager(),
mWallpapers.get(position).getUrl(),
mWallpapers.get(position).getName());
return true;
}
return false;
}
}
private void setFavorite(@NonNull ImageView imageView, @ColorInt int color, int position, boolean animate) {
if (position < 0 || position > mWallpapers.size()) return;
if (mIsFavoriteMode) {
if (!Preferences.get(mContext).isColoredWallpapersCard())
color = ContextCompat.getColor(mContext, R.color.favoriteColor);
imageView.setImageDrawable(DrawableHelper.getTintedDrawable(mContext, R.drawable.ic_toolbar_love, color));
return;
}
final int favoriteColor;
boolean isFavorite = mWallpapers.get(position).isFavorite();
if (!Preferences.get(mContext).isColoredWallpapersCard() && isFavorite)
favoriteColor = ContextCompat.getColor(mContext, R.color.favoriteColor);
else favoriteColor = color;
if (animate) {
AnimationHelper.show(imageView)
.interpolator(new LinearOutSlowInInterpolator())
.callback(new AnimationHelper.Callback() {
@Override
public void onAnimationStart() {
imageView.setImageDrawable(DrawableHelper.getTintedDrawable(mContext,
isFavorite ? R.drawable.ic_toolbar_love : R.drawable.ic_toolbar_unlove, favoriteColor));
}
@Override
public void onAnimationEnd() {
}
})
.start();
return;
}
imageView.setImageDrawable(DrawableHelper.getTintedDrawable(mContext,
isFavorite ? R.drawable.ic_toolbar_love : R.drawable.ic_toolbar_unlove, favoriteColor));
}
public void filter() {
Database database = new Database(mContext);
mWallpapers = database.getFilteredWallpapers();
notifyDataSetChanged();
}
public void downloadLastSelectedWallpaper() {
if (mLastSelectedPosition < 0 || mLastSelectedPosition > mWallpapers.size()) return;
WallpaperHelper.downloadWallpaper(mContext,
ColorHelper.getAttributeColor(mContext, R.attr.colorAccent),
mWallpapers.get(mLastSelectedPosition).getUrl(),
mWallpapers.get(mLastSelectedPosition).getName());
}
public void search(String string) {
String query = string.toLowerCase(Locale.getDefault()).trim();
mWallpapers.clear();
if (query.length() == 0) mWallpapers.addAll(mWallpapersAll);
else {
for (int i = 0; i < mWallpapersAll.size(); i++) {
Wallpaper wallpaper = mWallpapersAll.get(i);
String name = wallpaper.getName().toLowerCase(Locale.getDefault());
String author = wallpaper.getAuthor().toLowerCase(Locale.getDefault());
if (name.contains(query) || author.contains(query)) {
mWallpapers.add(wallpaper);
}
}
}
notifyDataSetChanged();
}
}