/* * Copyright 2015 Google Inc. * * 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. */ package io.plaidapp.util.glide; import android.graphics.Bitmap; import android.support.v4.content.ContextCompat; import android.support.v7.graphics.Palette; import com.bumptech.glide.load.resource.bitmap.GlideBitmapDrawable; import com.bumptech.glide.load.resource.drawable.GlideDrawable; import com.bumptech.glide.load.resource.gif.GifDrawable; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.GlideDrawableImageViewTarget; import io.plaidapp.R; import io.plaidapp.ui.widget.BadgedFourThreeImageView; import io.plaidapp.util.ColorUtils; import io.plaidapp.util.ViewUtils; /** * A Glide {@see ViewTarget} for {@link BadgedFourThreeImageView}s. It applies a badge for animated * images, can prevent GIFs from auto-playing & applies a palette generated ripple. */ public class DribbbleTarget extends GlideDrawableImageViewTarget implements Palette.PaletteAsyncListener { private final boolean autoplayGifs; public DribbbleTarget(BadgedFourThreeImageView view, boolean autoplayGifs) { super(view); this.autoplayGifs = autoplayGifs; } @Override public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> animation) { super.onResourceReady(resource, animation); if (!autoplayGifs) { resource.stop(); } BadgedFourThreeImageView badgedImageView = (BadgedFourThreeImageView) getView(); if (resource instanceof GlideBitmapDrawable) { Palette.from(((GlideBitmapDrawable) resource).getBitmap()) .clearFilters() .generate(this); } else if (resource instanceof GifDrawable) { Bitmap image = ((GifDrawable) resource).getFirstFrame(); Palette.from(image).clearFilters().generate(this); // look at the corner to determine the gif badge color int cornerSize = (int) (56 * getView().getContext().getResources().getDisplayMetrics ().scaledDensity); Bitmap corner = Bitmap.createBitmap(image, image.getWidth() - cornerSize, image.getHeight() - cornerSize, cornerSize, cornerSize); boolean isDark = ColorUtils.isDark(corner); corner.recycle(); badgedImageView.setBadgeColor(ContextCompat.getColor(getView().getContext(), isDark ? R.color.gif_badge_dark_image : R.color.gif_badge_light_image)); } } @Override public void onStart() { if (autoplayGifs) { super.onStart(); } } @Override public void onStop() { if (autoplayGifs) { super.onStop(); } } @Override public void onGenerated(Palette palette) { ((BadgedFourThreeImageView) getView()).setForeground( ViewUtils.createRipple(palette, 0.25f, 0.5f, ContextCompat.getColor(getView().getContext(), R.color.mid_grey), true)); } }