/*
* 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 net.nurik.roman.formwatchface.common;
import android.content.AsyncTaskLoader;
import android.content.Context;
import android.database.ContentObserver;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.support.v7.graphics.Palette;
import android.util.Log;
import android.util.Pair;
import com.google.android.apps.muzei.api.Artwork;
import com.google.android.apps.muzei.api.MuzeiContract;
import java.io.FileNotFoundException;
/**
* AsyncTaskLoader which provides access to the current Muzei artwork image. It also
* registers a ContentObserver to ensure the image stays up to date
*/
public class MuzeiArtworkImageLoader extends AsyncTaskLoader<MuzeiArtworkImageLoader.LoadedArtwork> {
private ContentObserver mContentObserver;
public MuzeiArtworkImageLoader(Context context) {
super(context);
}
public static boolean hasMuzeiArtwork(Context context) {
Artwork currentArtwork = MuzeiContract.Artwork.getCurrentArtwork(context);
return currentArtwork != null;
}
@Override
protected void onStartLoading() {
if (mContentObserver == null) {
mContentObserver = new ContentObserver(null) {
@Override
public void onChange(boolean selfChange) {
onContentChanged();
}
};
getContext().getContentResolver().registerContentObserver(
MuzeiContract.Artwork.CONTENT_URI, true, mContentObserver);
}
forceLoad();
}
@Override
public MuzeiArtworkImageLoader.LoadedArtwork loadInBackground() {
try {
Bitmap bitmap = MuzeiContract.Artwork.getCurrentArtworkBitmap(getContext());
if (bitmap == null) {
return null;
}
Pair<Integer, Integer> p = extractColors(bitmap);
return new LoadedArtwork(bitmap, p.first, p.second);
} catch (FileNotFoundException e) {
Log.e(MuzeiArtworkImageLoader.class.getSimpleName(), "Error getting artwork image", e);
}
return null;
}
private Pair<Integer, Integer> extractColors(Bitmap bitmap) {
Palette palette = Palette.generate(bitmap, 16);
int midColor = palette.getVibrantColor(
palette.getDarkVibrantColor(
palette.getMutedColor(
palette.getDarkMutedColor(Color.GRAY))));
int lightColor = palette.getLightMutedColor(
palette.getLightVibrantColor(
palette.getMutedColor(Color.BLACK)));
if (lightColor == Color.BLACK) {
lightColor = lighten(midColor, 0.2f);
}
return new Pair<>(lightColor, midColor);
}
private static int lighten(int color, float amount) {
float hsv[] = new float[3];
Color.colorToHSV(color, hsv);
hsv[2] = Math.max(0f, Math.min(1f, hsv[2] + amount));
return Color.HSVToColor(hsv);
}
@Override
protected void onReset() {
if (mContentObserver != null) {
getContext().getContentResolver().unregisterContentObserver(mContentObserver);
}
}
public static class LoadedArtwork {
public Bitmap bitmap;
public int color1;
public int color2;
public LoadedArtwork(Bitmap bitmap, int color1, int color2) {
this.bitmap = bitmap;
this.color1 = color1;
this.color2 = color2;
}
}
}