summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlinus_lee <llee@cyngn.com>2014-12-19 11:10:06 -0800
committerDanny Baumann <dannybaumann@web.de>2014-12-20 14:38:46 +0100
commit0107486cd17d8372355d5ad6b28f569bc6b2cb94 (patch)
tree0df61a6fdf983cc75470b0729a143a34860b6c8b
parent657192dce57da265cf12100886e55a0a4cebe181 (diff)
downloadandroid_packages_apps_Eleven-0107486cd17d8372355d5ad6b28f569bc6b2cb94.tar.gz
android_packages_apps_Eleven-0107486cd17d8372355d5ad6b28f569bc6b2cb94.tar.bz2
android_packages_apps_Eleven-0107486cd17d8372355d5ad6b28f569bc6b2cb94.zip
Eleven: Make sure we have vibrant colors for all default colors
Change-Id: I4be163e75fc35d3b139439c504d769d17d980ace
-rw-r--r--res/values/colors.xml13
-rw-r--r--src/com/cyanogenmod/eleven/MusicPlaybackService.java47
-rw-r--r--src/com/cyanogenmod/eleven/appwidgets/AppWidgetLarge.java2
-rw-r--r--src/com/cyanogenmod/eleven/appwidgets/AppWidgetLargeAlternate.java2
-rw-r--r--src/com/cyanogenmod/eleven/appwidgets/AppWidgetSmall.java2
-rw-r--r--src/com/cyanogenmod/eleven/cache/ImageFetcher.java7
-rw-r--r--src/com/cyanogenmod/eleven/utils/BitmapWithColors.java91
-rw-r--r--src/com/cyanogenmod/eleven/widgets/LetterTileDrawable.java47
8 files changed, 161 insertions, 50 deletions
diff --git a/res/values/colors.xml b/res/values/colors.xml
index ce70bd4..43683fa 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -121,7 +121,7 @@
<color name="letter_tile_default_color">#cccccc</color>
<color name="letter_tile_font_color">#ffffff</color>
<array name="letter_tile_colors">
- <item>#9237A2</item>
+ <item>#883397</item>
<item>#4B498C</item>
<item>#4E5BA7</item>
<item>#41A4F4</item>
@@ -130,4 +130,15 @@
<item>#B9BF45</item>
<item>#757578</item>
</array>
+
+ <array name="letter_tile_vibrant_dark_colors">
+ <item>#b74bc9</item>
+ <item>#6967bf</item>
+ <item>#2a315a</item>
+ <item>#07497d</item>
+ <item>#0c6c64</item>
+ <item>#415a2a</item>
+ <item>#5f6322</item>
+ <item>#505052</item>
+ </array>
</resources>
diff --git a/src/com/cyanogenmod/eleven/MusicPlaybackService.java b/src/com/cyanogenmod/eleven/MusicPlaybackService.java
index 2624537..5b71d86 100644
--- a/src/com/cyanogenmod/eleven/MusicPlaybackService.java
+++ b/src/com/cyanogenmod/eleven/MusicPlaybackService.java
@@ -33,7 +33,6 @@ import android.database.MatrixCursor;
import android.graphics.Bitmap;
import android.media.AudioManager;
import android.media.AudioManager.OnAudioFocusChangeListener;
-import android.media.MediaMetadataRetriever;
import android.media.MediaMetadata;
import android.media.MediaPlayer;
import android.media.audiofx.AudioEffect;
@@ -52,7 +51,6 @@ import android.os.SystemClock;
import android.provider.MediaStore;
import android.provider.MediaStore.Audio.AlbumColumns;
import android.provider.MediaStore.Audio.AudioColumns;
-import android.support.v7.graphics.Palette;
import android.text.TextUtils;
import android.util.Log;
@@ -66,7 +64,7 @@ import com.cyanogenmod.eleven.provider.MusicPlaybackState;
import com.cyanogenmod.eleven.provider.RecentStore;
import com.cyanogenmod.eleven.provider.SongPlayCount;
import com.cyanogenmod.eleven.service.MusicPlaybackTrack;
-import com.cyanogenmod.eleven.utils.ApolloUtils;
+import com.cyanogenmod.eleven.utils.BitmapWithColors;
import com.cyanogenmod.eleven.utils.Lists;
import com.cyanogenmod.eleven.utils.SrtManager;
@@ -496,8 +494,7 @@ public class MusicPlaybackService extends Service {
// to improve perf, instead of hitting the disk cache or file cache, store the bitmaps in memory
private String mCachedKey;
- private Bitmap[] mCachedBitmap = new Bitmap[2];
- private int mCachedBitmapAccentColor = 0;
+ private BitmapWithColors[] mCachedBitmapWithColors = new BitmapWithColors[2];
/**
* Image cache
@@ -1475,7 +1472,7 @@ public class MusicPlaybackService extends Service {
mSession.setPlaybackState(new PlaybackState.Builder()
.setState(playState, position(), 1.0f).build());
} else if (what.equals(META_CHANGED) || what.equals(QUEUE_CHANGED)) {
- Bitmap albumArt = getAlbumArt(false);
+ Bitmap albumArt = getAlbumArt(false).getBitmap();
if (albumArt != null) {
// RemoteControlClient wants to recycle the bitmaps thrown at it, so we need
// to make sure not to hand out our cache copy
@@ -1522,7 +1519,7 @@ public class MusicPlaybackService extends Service {
Intent nowPlayingIntent = new Intent("com.cyanogenmod.eleven.AUDIO_PLAYER")
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent clickIntent = PendingIntent.getActivity(this, 0, nowPlayingIntent, 0);
- Bitmap artwork = getAlbumArt(false);
+ BitmapWithColors artwork = getAlbumArt(false);
if (mNotificationPostTime == 0) {
mNotificationPostTime = System.currentTimeMillis();
@@ -1530,7 +1527,7 @@ public class MusicPlaybackService extends Service {
Notification.Builder builder = new Notification.Builder(this)
.setSmallIcon(R.drawable.ic_notification)
- .setLargeIcon(artwork)
+ .setLargeIcon(artwork.getBitmap())
.setContentIntent(clickIntent)
.setContentTitle(getTrackName())
.setContentText(text)
@@ -1547,23 +1544,7 @@ public class MusicPlaybackService extends Service {
getString(R.string.accessibility_next),
retrievePlaybackAction(NEXT_ACTION));
- if (mCachedBitmapAccentColor == 0 && artwork != null) {
- // Generate a new Palette from the current artwork
- final Palette p = Palette.generate(artwork);
- if (p != null) {
- // Check for dark vibrant colors, then vibrant
- Palette.Swatch swatch = p.getDarkVibrantSwatch();
- if (swatch == null) {
- swatch = p.getVibrantSwatch();
- }
- if (swatch != null) {
- mCachedBitmapAccentColor = swatch.getRgb();
- }
- }
- }
- if (mCachedBitmapAccentColor != 0) {
- builder.setColor(mCachedBitmapAccentColor);
- }
+ builder.setColor(artwork.getVibrantDarkColor());
return builder.build();
}
@@ -2680,7 +2661,7 @@ public class MusicPlaybackService extends Service {
* Currently Has no impact on the artwork size if one exists
* @return The album art for the current album.
*/
- public Bitmap getAlbumArt(boolean smallBitmap) {
+ public BitmapWithColors getAlbumArt(boolean smallBitmap) {
final String albumName = getAlbumName();
final String artistName = getArtistName();
final long albumId = getAlbumId();
@@ -2688,23 +2669,23 @@ public class MusicPlaybackService extends Service {
final int targetIndex = smallBitmap ? 0 : 1;
// if the cached key matches and we have the bitmap, return it
- if (key.equals(mCachedKey) && mCachedBitmap[targetIndex] != null) {
- return mCachedBitmap[targetIndex];
+ if (key.equals(mCachedKey) && mCachedBitmapWithColors[targetIndex] != null) {
+ return mCachedBitmapWithColors[targetIndex];
}
// otherwise get the artwork (or defaultartwork if none found)
- final Bitmap bitmap = mImageFetcher.getArtwork(albumName, albumId, artistName, smallBitmap);
+ final BitmapWithColors bitmap = mImageFetcher.getArtwork(albumName,
+ albumId, artistName, smallBitmap);
// if the key is different, clear the bitmaps first
if (!key.equals(mCachedKey)) {
- mCachedBitmap[0] = null;
- mCachedBitmap[1] = null;
- mCachedBitmapAccentColor = 0;
+ mCachedBitmapWithColors[0] = null;
+ mCachedBitmapWithColors[1] = null;
}
// store the new key and bitmap
mCachedKey = key;
- mCachedBitmap[targetIndex] = bitmap;
+ mCachedBitmapWithColors[targetIndex] = bitmap;
return bitmap;
}
diff --git a/src/com/cyanogenmod/eleven/appwidgets/AppWidgetLarge.java b/src/com/cyanogenmod/eleven/appwidgets/AppWidgetLarge.java
index 9f726f8..1ede430 100644
--- a/src/com/cyanogenmod/eleven/appwidgets/AppWidgetLarge.java
+++ b/src/com/cyanogenmod/eleven/appwidgets/AppWidgetLarge.java
@@ -114,7 +114,7 @@ public class AppWidgetLarge extends AppWidgetBase {
final CharSequence trackName = service.getTrackName();
final CharSequence artistName = service.getArtistName();
final CharSequence albumName = service.getAlbumName();
- final Bitmap bitmap = service.getAlbumArt(true);
+ final Bitmap bitmap = service.getAlbumArt(true).getBitmap();
// Set the titles and artwork
appWidgetView.setTextViewText(R.id.app_widget_large_line_one, trackName);
diff --git a/src/com/cyanogenmod/eleven/appwidgets/AppWidgetLargeAlternate.java b/src/com/cyanogenmod/eleven/appwidgets/AppWidgetLargeAlternate.java
index f4ba43d..d40e536 100644
--- a/src/com/cyanogenmod/eleven/appwidgets/AppWidgetLargeAlternate.java
+++ b/src/com/cyanogenmod/eleven/appwidgets/AppWidgetLargeAlternate.java
@@ -119,7 +119,7 @@ public class AppWidgetLargeAlternate extends AppWidgetBase {
final CharSequence trackName = service.getTrackName();
final CharSequence artistName = service.getArtistName();
final CharSequence albumName = service.getAlbumName();
- final Bitmap bitmap = service.getAlbumArt(true);
+ final Bitmap bitmap = service.getAlbumArt(true).getBitmap();
// Set the titles and artwork
appWidgetView.setTextViewText(R.id.app_widget_large_alternate_line_one, trackName);
diff --git a/src/com/cyanogenmod/eleven/appwidgets/AppWidgetSmall.java b/src/com/cyanogenmod/eleven/appwidgets/AppWidgetSmall.java
index 7973f63..107cc7a 100644
--- a/src/com/cyanogenmod/eleven/appwidgets/AppWidgetSmall.java
+++ b/src/com/cyanogenmod/eleven/appwidgets/AppWidgetSmall.java
@@ -116,7 +116,7 @@ public class AppWidgetSmall extends AppWidgetBase {
final CharSequence trackName = service.getTrackName();
final CharSequence artistName = service.getArtistName();
- final Bitmap bitmap = service.getAlbumArt(true);
+ final Bitmap bitmap = service.getAlbumArt(true).getBitmap();
// Set the titles and artwork
if (TextUtils.isEmpty(trackName) && TextUtils.isEmpty(artistName)) {
diff --git a/src/com/cyanogenmod/eleven/cache/ImageFetcher.java b/src/com/cyanogenmod/eleven/cache/ImageFetcher.java
index afa06c1..fe50c6f 100644
--- a/src/com/cyanogenmod/eleven/cache/ImageFetcher.java
+++ b/src/com/cyanogenmod/eleven/cache/ImageFetcher.java
@@ -22,6 +22,7 @@ import android.widget.ImageView;
import com.cyanogenmod.eleven.Config;
import com.cyanogenmod.eleven.MusicPlaybackService;
import com.cyanogenmod.eleven.cache.PlaylistWorkerTask.PlaylistWorkerType;
+import com.cyanogenmod.eleven.utils.BitmapWithColors;
import com.cyanogenmod.eleven.utils.MusicUtils;
import com.cyanogenmod.eleven.widgets.BlurScrimImage;
import com.cyanogenmod.eleven.widgets.LetterTileDrawable;
@@ -187,8 +188,8 @@ public class ImageFetcher extends ImageWorker {
* @param smallArtwork Get the small version of the default artwork if no artwork exists
* @return The album art as an {@link Bitmap}
*/
- public Bitmap getArtwork(final String albumName, final long albumId, final String artistName,
- boolean smallArtwork) {
+ public BitmapWithColors getArtwork(final String albumName, final long albumId,
+ final String artistName, boolean smallArtwork) {
// Check the disk cache
Bitmap artwork = null;
String key = String.valueOf(albumId);
@@ -201,7 +202,7 @@ public class ImageFetcher extends ImageWorker {
artwork = mImageCache.getArtworkFromFile(mContext, albumId);
}
if (artwork != null) {
- return artwork;
+ return new BitmapWithColors(artwork);
}
return LetterTileDrawable.createDefaultBitmap(mContext, key, ImageType.ALBUM, false,
diff --git a/src/com/cyanogenmod/eleven/utils/BitmapWithColors.java b/src/com/cyanogenmod/eleven/utils/BitmapWithColors.java
new file mode 100644
index 0000000..7c76d0a
--- /dev/null
+++ b/src/com/cyanogenmod/eleven/utils/BitmapWithColors.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2014 The CyanogenMod Project
+ *
+ * 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 com.cyanogenmod.eleven.utils;
+
+import android.graphics.Bitmap;
+import android.graphics.Color;
+import android.support.v7.graphics.Palette;
+
+public class BitmapWithColors {
+ private Bitmap mBitmap;
+ private int mVibrantColor;
+ private int mVibrantDarkColor;
+ private boolean mColorsLoaded = false;
+
+ public BitmapWithColors(Bitmap bitmap) {
+ mBitmap = bitmap;
+ mVibrantColor = Color.TRANSPARENT;
+ mVibrantDarkColor = Color.TRANSPARENT;
+ mColorsLoaded = false;
+ }
+
+ public BitmapWithColors(Bitmap bitmap, int vibrantColor, int vibrantDarkColor) {
+ mBitmap = bitmap;
+ mVibrantColor = vibrantColor;
+ mVibrantDarkColor = vibrantDarkColor;
+ mColorsLoaded = true;
+ }
+
+ public Bitmap getBitmap() {
+ return mBitmap;
+ }
+
+ public int getVibrantColor() {
+ loadColorsIfNeeded();
+ return mVibrantColor;
+ }
+
+ public int getVibrantDarkColor() {
+ loadColorsIfNeeded();
+ return mVibrantDarkColor;
+ }
+
+ private void loadColorsIfNeeded() {
+ synchronized (this) {
+ if (mColorsLoaded) {
+ return;
+ }
+ }
+
+ final Palette p = Palette.generate(mBitmap);
+ int vibrantColor = Color.TRANSPARENT;
+ int vibrantDarkColor = Color.TRANSPARENT;
+
+ if (p != null) {
+ Palette.Swatch swatch = p.getDarkVibrantSwatch();
+ if (swatch != null) {
+ vibrantDarkColor = swatch.getRgb();
+ }
+ swatch = p.getVibrantSwatch();
+ if (swatch != null) {
+ vibrantColor = swatch.getRgb();
+ }
+ }
+
+ if (vibrantColor == Color.TRANSPARENT && vibrantDarkColor != Color.TRANSPARENT) {
+ vibrantColor = vibrantDarkColor;
+ }
+ if (vibrantColor != Color.TRANSPARENT && vibrantDarkColor == Color.TRANSPARENT) {
+ vibrantDarkColor = vibrantColor;
+ }
+
+ synchronized (this) {
+ mColorsLoaded = true;
+ mVibrantColor = vibrantColor;
+ mVibrantDarkColor = vibrantDarkColor;
+ }
+ }
+}
diff --git a/src/com/cyanogenmod/eleven/widgets/LetterTileDrawable.java b/src/com/cyanogenmod/eleven/widgets/LetterTileDrawable.java
index 176c216..306e998 100644
--- a/src/com/cyanogenmod/eleven/widgets/LetterTileDrawable.java
+++ b/src/com/cyanogenmod/eleven/widgets/LetterTileDrawable.java
@@ -34,6 +34,7 @@ import junit.framework.Assert;
import com.cyanogenmod.eleven.R;
import com.cyanogenmod.eleven.cache.ImageWorker.ImageType;
+import com.cyanogenmod.eleven.utils.BitmapWithColors;
import com.cyanogenmod.eleven.utils.MusicUtils;
/**
@@ -48,6 +49,7 @@ public class LetterTileDrawable extends Drawable {
/** Letter tile */
private static TypedArray sColors;
+ private static TypedArray sVibrantDarkColors;
private static int sDefaultColor;
private static int sTileFontColor;
private static float sLetterToTileRatio;
@@ -75,6 +77,7 @@ public class LetterTileDrawable extends Drawable {
private static synchronized void initializeStaticVariables(final Resources res) {
if (sColors == null) {
sColors = res.obtainTypedArray(R.array.letter_tile_colors);
+ sVibrantDarkColors = res.obtainTypedArray(R.array.letter_tile_vibrant_dark_colors);
sDefaultColor = res.getColor(R.color.letter_tile_default_color);
sTileFontColor = res.getColor(R.color.letter_tile_font_color);
sLetterToTileRatio = res.getFraction(R.dimen.letter_to_tile_ratio, 1, 1);
@@ -173,17 +176,38 @@ public class LetterTileDrawable extends Drawable {
}
/**
+ * @return the corresponding index in the color palette based on the identifier
+ */
+ private static int getColorIndex(final String identifier) {
+ if (TextUtils.isEmpty(identifier)) {
+ return -1;
+ }
+
+ return Math.abs(identifier.hashCode()) % sColors.length();
+ }
+
+ /**
* Returns a deterministic color based on the provided contact identifier string.
*/
private static int pickColor(final String identifier) {
- if (TextUtils.isEmpty(identifier)) {
+ final int idx = getColorIndex(identifier);
+ if (idx == -1) {
return sDefaultColor;
}
- // String.hashCode() implementation is not supposed to change across java versions, so
- // this should guarantee the same email address always maps to the same color.
- // The email should already have been normalized by the ContactRequest.
- final int color = Math.abs(identifier.hashCode()) % sColors.length();
- return sColors.getColor(color, sDefaultColor);
+
+ return sColors.getColor(idx, sDefaultColor);
+ }
+
+ /**
+ * Returns the vibrant matching color based on the provided contact identifier string.
+ */
+ private static int pickVibrantDarkColor(final String identifier) {
+ final int idx = getColorIndex(identifier);
+ if (idx == -1) {
+ return sDefaultColor;
+ }
+
+ return sVibrantDarkColors.getColor(idx, sDefaultColor);
}
/**
@@ -309,8 +333,8 @@ public class LetterTileDrawable extends Drawable {
* @param smallArtwork true if you want to draw a smaller version of the default bitmap for
* perf/memory reasons
*/
- public static Bitmap createDefaultBitmap(Context context, String identifier, ImageType type,
- boolean isCircle, boolean smallArtwork) {
+ public static BitmapWithColors createDefaultBitmap(Context context, String identifier,
+ ImageType type, boolean isCircle, boolean smallArtwork) {
initializeStaticVariables(context.getResources());
identifier = MusicUtils.getTrimmedName(identifier);
@@ -324,8 +348,11 @@ public class LetterTileDrawable extends Drawable {
defaultBitmap.getHeight(), defaultBitmap.getConfig());
Canvas canvas = new Canvas(createdBitmap);
+ int color = pickColor(identifier);
+ int vibrantDarkColor = pickVibrantDarkColor(identifier);
+
Paint paint = new Paint();
- paint.setColor(pickColor(identifier));
+ paint.setColor(color);
final int minDimension = Math.min(bounds.width(), bounds.height());
@@ -339,6 +366,6 @@ public class LetterTileDrawable extends Drawable {
drawBitmap(defaultBitmap, defaultBitmap.getWidth(), defaultBitmap.getHeight(), canvas,
bounds, 1, 0, paint);
- return createdBitmap;
+ return new BitmapWithColors(createdBitmap, color, vibrantDarkColor);
}
}