Clean ups

This commit is contained in:
Karim Abou Zeid 2016-01-27 22:11:38 +01:00
commit 44ba560d77
28 changed files with 243 additions and 422 deletions

View file

@ -139,4 +139,6 @@ dependencies {
compile 'com.github.bumptech.glide:glide:3.6.1' compile 'com.github.bumptech.glide:glide:3.6.1'
compile 'com.github.kabouzeid:RecyclerView-FastScroll:v1.2-kmod' compile 'com.github.kabouzeid:RecyclerView-FastScroll:v1.2-kmod'
compile 'com.github.kabouzeid:app-theme-helper:0.7.8kmod' compile 'com.github.kabouzeid:app-theme-helper:0.7.8kmod'
compile 'com.github.kabouzeid:GlidePalette:e34717bced@aar'
} }

View file

@ -11,6 +11,8 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.PopupMenu; import android.widget.PopupMenu;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter; import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter;
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
@ -24,7 +26,6 @@ import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist; import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.Util; import com.kabouzeid.gramophone.util.Util;
@ -98,7 +99,7 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
holder.image.setImageDrawable(Util.getTintedDrawable( holder.image.setImageDrawable(Util.getTintedDrawable(
activity, activity,
getIconRes(playlist), getIconRes(playlist),
ColorUtil.resolveColor(activity, android.R.attr.textColorSecondary) ATHUtil.resolveColor(activity, R.attr.icon_color, ThemeStore.textColorSecondary(activity))
)); ));
} }
} }
@ -178,7 +179,7 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
if (shortSeparator != null) { if (shortSeparator != null) {
shortSeparator.setVisibility(View.GONE); shortSeparator.setVisibility(View.GONE);
} }
itemView.setBackgroundColor(ColorUtil.resolveColor(activity, R.attr.cardBackgroundColor)); itemView.setBackgroundColor(ATHUtil.resolveColor(activity, R.attr.cardBackgroundColor));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
itemView.setElevation(activity.getResources().getDimensionPixelSize(R.dimen.card_elevation)); itemView.setElevation(activity.getResources().getDimensionPixelSize(R.dimen.card_elevation));
} }

View file

@ -13,6 +13,7 @@ import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority; import com.bumptech.glide.Priority;
import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.target.Target;
import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.glide.SongGlideRequest;
@ -26,7 +27,6 @@ import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Artist; import com.kabouzeid.gramophone.model.Artist;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.ArtistSignatureUtil; import com.kabouzeid.gramophone.util.ArtistSignatureUtil;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.NavigationUtil;
@ -139,7 +139,7 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
itemView.setOnLongClickListener(null); itemView.setOnLongClickListener(null);
if (itemViewType != HEADER) { if (itemViewType != HEADER) {
itemView.setBackgroundColor(ColorUtil.resolveColor(activity, R.attr.cardBackgroundColor)); itemView.setBackgroundColor(ATHUtil.resolveColor(activity, R.attr.cardBackgroundColor));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
itemView.setElevation(activity.getResources().getDimensionPixelSize(R.dimen.card_elevation)); itemView.setElevation(activity.getResources().getDimensionPixelSize(R.dimen.card_elevation));
} }

View file

@ -23,7 +23,6 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.model.Album; import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.NavigationUtil;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
@ -105,15 +104,16 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
} }
private void setColors(int color, ViewHolder holder) { private void setColors(int color, ViewHolder holder) {
if (holder.paletteColorContainer != null) { // TODO
holder.paletteColorContainer.setBackgroundColor(color); // if (holder.paletteColorContainer != null) {
if (holder.title != null) { // holder.paletteColorContainer.setBackgroundColor(color);
holder.title.setTextColor(ColorUtil.getPrimaryTextColorForBackground(activity, color)); // if (holder.title != null) {
} // holder.title.setTextColor(PhonographColorUtil.getPrimaryTextColorForBackground(activity, color));
if (holder.text != null) { // }
holder.text.setTextColor(ColorUtil.getSecondaryTextColorForBackground(activity, color)); // if (holder.text != null) {
} // holder.text.setTextColor(PhonographColorUtil.getSecondaryTextColorForBackground(activity, color));
} // }
// }
} }
protected void loadAlbumCover(Album album, final ViewHolder holder) { protected void loadAlbumCover(Album album, final ViewHolder holder) {

View file

@ -30,7 +30,6 @@ import com.kabouzeid.gramophone.loader.ArtistSongLoader;
import com.kabouzeid.gramophone.model.Artist; import com.kabouzeid.gramophone.model.Artist;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.ArtistSignatureUtil; import com.kabouzeid.gramophone.util.ArtistSignatureUtil;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.NavigationUtil;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
@ -88,7 +87,7 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
final Artist artist = dataSet.get(position); final Artist artist = dataSet.get(position);
// final int defaultBarColor = ColorUtil.resolveColor(activity, R.attr.default_bar_color); // final int defaultBarColor = PhonographColorUtil.resolveColor(activity, R.attr.default_bar_color);
// setColors(defaultBarColor, holder); // setColors(defaultBarColor, holder);
boolean isChecked = isChecked(artist); boolean isChecked = isChecked(artist);
@ -110,13 +109,14 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
private void setColors(int color, ViewHolder holder) { private void setColors(int color, ViewHolder holder) {
if (holder.paletteColorContainer != null) { if (holder.paletteColorContainer != null) {
holder.paletteColorContainer.setBackgroundColor(color); // TODO
if (holder.title != null) { // holder.paletteColorContainer.setBackgroundColor(color);
holder.title.setTextColor(ColorUtil.getPrimaryTextColorForBackground(activity, color)); // if (holder.title != null) {
} // holder.title.setTextColor(PhonographColorUtil.getPrimaryTextColorForBackground(activity, color));
if (holder.text != null) { // }
holder.text.setTextColor(ColorUtil.getSecondaryTextColorForBackground(activity, color)); // if (holder.text != null) {
} // holder.text.setTextColor(PhonographColorUtil.getSecondaryTextColorForBackground(activity, color));
// }
} }
} }

View file

@ -10,7 +10,6 @@ import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.SectionIndexer;
import com.afollestad.materialcab.MaterialCab; import com.afollestad.materialcab.MaterialCab;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
@ -25,12 +24,10 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper; import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.NavigationUtil;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
import java.io.CharArrayReader;
import java.util.ArrayList; import java.util.ArrayList;
/** /**
@ -109,13 +106,14 @@ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, S
private void setColors(int color, ViewHolder holder) { private void setColors(int color, ViewHolder holder) {
if (holder.paletteColorContainer != null) { if (holder.paletteColorContainer != null) {
holder.paletteColorContainer.setBackgroundColor(color); // TODO
if (holder.title != null) { // holder.paletteColorContainer.setBackgroundColor(color);
holder.title.setTextColor(ColorUtil.getPrimaryTextColorForBackground(activity, color)); // if (holder.title != null) {
} // holder.title.setTextColor(PhonographColorUtil.getPrimaryTextColorForBackground(activity, color));
if (holder.text != null) { // }
holder.text.setTextColor(ColorUtil.getSecondaryTextColorForBackground(activity, color)); // if (holder.text != null) {
} // holder.text.setTextColor(PhonographColorUtil.getSecondaryTextColorForBackground(activity, color));
// }
} }
} }

View file

@ -15,8 +15,8 @@ import android.webkit.WebView;
import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.internal.ThemeSingleton; import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.appthemehelper.util.ColorUtil;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.PreferenceUtil;
import java.io.BufferedReader; import java.io.BufferedReader;
@ -83,7 +83,7 @@ public class ChangelogDialog extends DialogFragment {
.replace("{style-placeholder}", .replace("{style-placeholder}",
String.format("body { background-color: #%s; color: #%s; }", backgroundColor, contentColor)) String.format("body { background-color: #%s; color: #%s; }", backgroundColor, contentColor))
.replace("{link-color}", colorToHex(ThemeSingleton.get().positiveColor.getDefaultColor())) .replace("{link-color}", colorToHex(ThemeSingleton.get().positiveColor.getDefaultColor()))
.replace("{link-color-active}", colorToHex(ColorUtil.shiftColorUp(ThemeSingleton.get().positiveColor.getDefaultColor()))) .replace("{link-color-active}", colorToHex(ColorUtil.lightenColor(ThemeSingleton.get().positiveColor.getDefaultColor())))
, "text/html", "UTF-8"); , "text/html", "UTF-8");
} catch (Throwable e) { } catch (Throwable e) {
webView.loadData("<h1>Unable to load</h1><p>" + e.getLocalizedMessage() + "</p>", "text/html", "UTF-8"); webView.loadData("<h1>Unable to load</h1><p>" + e.getLocalizedMessage() + "</p>", "text/html", "UTF-8");

View file

@ -25,9 +25,10 @@ import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.anjlab.android.iab.v3.BillingProcessor; import com.anjlab.android.iab.v3.BillingProcessor;
import com.anjlab.android.iab.v3.SkuDetails; import com.anjlab.android.iab.v3.SkuDetails;
import com.anjlab.android.iab.v3.TransactionDetails; import com.anjlab.android.iab.v3.TransactionDetails;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.ColorUtil;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.ArrayList; import java.util.ArrayList;
@ -168,12 +169,14 @@ public class DonationDialog extends DialogFragment implements BillingProcessor.I
viewHolder.price.setText(skuDetails.priceText); viewHolder.price.setText(skuDetails.priceText);
final boolean purchased = donationDialog.billingProcessor.isPurchased(skuDetails.productId); final boolean purchased = donationDialog.billingProcessor.isPurchased(skuDetails.productId);
int titleTextColor = purchased ? ATHUtil.resolveColor(getContext(), android.R.attr.textColorHint) : ThemeStore.textColorPrimary(getContext());
int contentTextColor = purchased ? titleTextColor : ThemeStore.textColorSecondary(getContext());
int titleTextColor = purchased ? ColorUtil.resolveColor(getContext(), android.R.attr.textColorHint) : ColorUtil.resolveColor(getContext(), android.R.attr.textColorPrimary); //noinspection ResourceAsColor
int contentTextColor = purchased ? titleTextColor : ColorUtil.resolveColor(getContext(), android.R.attr.textColorSecondary);
viewHolder.title.setTextColor(titleTextColor); viewHolder.title.setTextColor(titleTextColor);
//noinspection ResourceAsColor
viewHolder.text.setTextColor(contentTextColor); viewHolder.text.setTextColor(contentTextColor);
//noinspection ResourceAsColor
viewHolder.price.setTextColor(titleTextColor); viewHolder.price.setTextColor(titleTextColor);
strikeThrough(viewHolder.title, purchased); strikeThrough(viewHolder.title, purchased);

View file

@ -4,10 +4,11 @@ import android.graphics.drawable.Drawable;
import android.widget.ImageView; import android.widget.ImageView;
import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.animation.GlideAnimation;
import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTarget; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTarget;
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.PhonographColorUtil;
public abstract class PhonographColoredTarget extends BitmapPaletteTarget { public abstract class PhonographColoredTarget extends BitmapPaletteTarget {
public PhonographColoredTarget(ImageView view) { public PhonographColoredTarget(ImageView view) {
@ -23,11 +24,11 @@ public abstract class PhonographColoredTarget extends BitmapPaletteTarget {
@Override @Override
public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation<? super BitmapPaletteWrapper> glideAnimation) { public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation<? super BitmapPaletteWrapper> glideAnimation) {
super.onResourceReady(resource, glideAnimation); super.onResourceReady(resource, glideAnimation);
onColorReady(ColorUtil.getColor(resource.getPalette(), getDefaultBarColor())); onColorReady(PhonographColorUtil.getColor(resource.getPalette(), getDefaultBarColor()));
} }
protected int getDefaultBarColor() { protected int getDefaultBarColor() {
return ColorUtil.resolveColor(getView().getContext(), R.attr.default_bar_color); return ATHUtil.resolveColor(getView().getContext(), R.attr.default_bar_color);
} }
public abstract void onColorReady(int color); public abstract void onColorReady(int color);

View file

@ -7,7 +7,7 @@ import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.Resource; import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; import com.bumptech.glide.load.resource.transcode.ResourceTranscoder;
import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.PhonographColorUtil;
public class BitmapPaletteTranscoder implements ResourceTranscoder<Bitmap, BitmapPaletteWrapper> { public class BitmapPaletteTranscoder implements ResourceTranscoder<Bitmap, BitmapPaletteWrapper> {
private final BitmapPool bitmapPool; private final BitmapPool bitmapPool;
@ -23,7 +23,7 @@ public class BitmapPaletteTranscoder implements ResourceTranscoder<Bitmap, Bitma
@Override @Override
public Resource<BitmapPaletteWrapper> transcode(Resource<Bitmap> bitmapResource) { public Resource<BitmapPaletteWrapper> transcode(Resource<Bitmap> bitmapResource) {
Bitmap bitmap = bitmapResource.get(); Bitmap bitmap = bitmapResource.get();
BitmapPaletteWrapper bitmapPaletteWrapper = new BitmapPaletteWrapper(bitmap, ColorUtil.generatePalette(bitmap)); BitmapPaletteWrapper bitmapPaletteWrapper = new BitmapPaletteWrapper(bitmap, PhonographColorUtil.generatePalette(bitmap));
return new BitmapPaletteResource(bitmapPaletteWrapper, bitmapPool); return new BitmapPaletteResource(bitmapPaletteWrapper, bitmapPool);
} }

View file

@ -0,0 +1,33 @@
package com.kabouzeid.gramophone.glide.palette;
import android.support.annotation.ColorInt;
import android.support.v7.graphics.Palette;
import com.github.florent37.glidepalette.common.BaseColorGenerator;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class CustomTextColorGenerator extends BaseColorGenerator {
private final int titleDark;
private final int titleLight;
private final int bodyDark;
private final int bodyLight;
public CustomTextColorGenerator(@ColorInt int titleDark, @ColorInt int titleLight, @ColorInt int bodyDark, @ColorInt int bodyLight) {
this.titleDark = titleDark;
this.titleLight = titleLight;
this.bodyDark = bodyDark;
this.bodyLight = bodyLight;
}
@Override
public int getTitleTextColor(Palette.Swatch swatch) {
return super.getTitleTextColor(swatch);
}
@Override
public int getBodyTextColor(Palette.Swatch swatch) {
return super.getBodyTextColor(swatch);
}
}

View file

@ -24,13 +24,14 @@ import com.bumptech.glide.Glide;
import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.target.Target;
import com.kabouzeid.appthemehelper.util.ColorUtil;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.glide.SongGlideRequest;
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.service.MusicService; import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.ui.activities.MainActivity; import com.kabouzeid.gramophone.ui.activities.MainActivity;
import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.PhonographColorUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.PreferenceUtil;
public class PlayingNotificationHelper { public class PlayingNotificationHelper {
@ -69,7 +70,7 @@ public class PlayingNotificationHelper {
@Override @Override
public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation<? super BitmapPaletteWrapper> glideAnimation) { public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation<? super BitmapPaletteWrapper> glideAnimation) {
setAlbumCover(resource.getBitmap(), ColorUtil.getColor(resource.getPalette(), Color.TRANSPARENT)); setAlbumCover(resource.getBitmap(), PhonographColorUtil.getColor(resource.getPalette(), Color.TRANSPARENT));
} }
}; };
} }
@ -214,7 +215,7 @@ public class PlayingNotificationHelper {
bgColor = Color.TRANSPARENT; bgColor = Color.TRANSPARENT;
} }
setBackgroundColor(bgColor); setBackgroundColor(bgColor);
setDarkNotificationContent(bgColor == Color.TRANSPARENT ? Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP : ColorUtil.useDarkTextColorOnBackground(bgColor)); setDarkNotificationContent(bgColor == Color.TRANSPARENT ? Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP : ColorUtil.isColorLight(bgColor));
if (notification != null) { if (notification != null) {
notificationManager.notify(notificationId, notification); notificationManager.notify(notificationId, notification);

View file

@ -1,26 +0,0 @@
package com.kabouzeid.gramophone.misc;
import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
import android.support.design.widget.FloatingActionButton;
import android.util.Property;
import com.kabouzeid.gramophone.util.ColorUtil;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class FloatingActionButtonProperties {
public static final Property<FloatingActionButton, Integer> COLOR = new Property<FloatingActionButton, Integer>(Integer.class, "color") {
@Override
public void set(FloatingActionButton object, Integer value) {
object.setBackgroundTintList(ColorStateList.valueOf(value));
object.getDrawable().mutate().setColorFilter(ColorUtil.getPrimaryTextColorForBackground(object.getContext(), value), PorterDuff.Mode.SRC_IN);
}
@Override
public Integer get(FloatingActionButton object) {
return object.getBackgroundTintList() != null ? object.getBackgroundTintList().getDefaultColor() : 0;
}
};
}

View file

@ -16,11 +16,11 @@ import android.widget.TextView;
import com.afollestad.materialdialogs.internal.ThemeSingleton; import com.afollestad.materialdialogs.internal.ThemeSingleton;
import com.kabouzeid.appthemehelper.ThemeStore; import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.ChangelogDialog; import com.kabouzeid.gramophone.dialogs.ChangelogDialog;
import com.kabouzeid.gramophone.dialogs.DonationDialog; import com.kabouzeid.gramophone.dialogs.DonationDialog;
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import butterknife.Bind; import butterknife.Bind;
import butterknife.ButterKnife; import butterknife.ButterKnife;
@ -176,7 +176,7 @@ public class AboutActivity extends AbsBaseActivity implements View.OnClickListen
} }
private void setUpIconTint() { private void setUpIconTint() {
int iconColor = ColorUtil.resolveColor(this, R.attr.icon_color); int iconColor = ATHUtil.resolveColor(this, R.attr.icon_color, ThemeStore.textColorSecondary(this));
iconInfo.setColorFilter(iconColor); iconInfo.setColorFilter(iconColor);
iconChangelog.setColorFilter(iconColor); iconChangelog.setColorFilter(iconColor);
iconIntro.setColorFilter(iconColor); iconIntro.setColorFilter(iconColor);

View file

@ -19,6 +19,8 @@ import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.target.Target;
import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView; import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView;
import com.kabouzeid.appthemehelper.util.ColorUtil;
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.song.AlbumSongAdapter; import com.kabouzeid.gramophone.adapter.song.AlbumSongAdapter;
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog; import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
@ -34,8 +36,8 @@ import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.AlbumTagEditorActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.AlbumTagEditorActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PhonographColorUtil;
import com.kabouzeid.gramophone.util.Util; import com.kabouzeid.gramophone.util.Util;
import butterknife.Bind; import butterknife.Bind;
@ -106,8 +108,8 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
// Change alpha of overlay // Change alpha of overlay
toolbarAlpha = Math.max(0, Math.min(1, (float) scrollY / flexibleRange)); toolbarAlpha = Math.max(0, Math.min(1, (float) scrollY / flexibleRange));
toolbar.setBackgroundColor(ColorUtil.getColorWithAlpha(toolbarAlpha, toolbarColor)); toolbar.setBackgroundColor(ColorUtil.withAlpha(toolbarColor, toolbarAlpha));
setStatusbarColor(ColorUtil.getColorWithAlpha(cab != null && cab.isActive() ? 1 : toolbarAlpha, toolbarColor)); setStatusbarColor(ColorUtil.withAlpha(toolbarColor, cab != null && cab.isActive() ? 1 : toolbarAlpha));
// Translate name text // Translate name text
int maxTitleTranslationY = albumArtViewHeight; int maxTitleTranslationY = albumArtViewHeight;
@ -174,7 +176,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
private void setColors(int color) { private void setColors(int color) {
toolbarColor = color; toolbarColor = color;
albumTitleView.setBackgroundColor(color); albumTitleView.setBackgroundColor(color);
albumTitleView.setTextColor(ColorUtil.getPrimaryTextColorForBackground(this, color)); albumTitleView.setTextColor(MaterialValueHelper.getPrimaryTextColor(this, ColorUtil.isColorLight(color)));
setNavigationbarColor(color); setNavigationbarColor(color);
setTaskDescriptionColor(color); setTaskDescriptionColor(color);
@ -295,11 +297,11 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
cab = new MaterialCab(this, R.id.cab_stub) cab = new MaterialCab(this, R.id.cab_stub)
.setMenu(menuRes) .setMenu(menuRes)
.setCloseDrawableRes(R.drawable.ic_close_white_24dp) .setCloseDrawableRes(R.drawable.ic_close_white_24dp)
.setBackgroundColor(ColorUtil.shiftBackgroundColorForLightText(getPaletteColor())) .setBackgroundColor(PhonographColorUtil.shiftBackgroundColorForLightText(getPaletteColor()))
.start(new MaterialCab.Callback() { .start(new MaterialCab.Callback() {
@Override @Override
public boolean onCabCreated(MaterialCab materialCab, Menu menu) { public boolean onCabCreated(MaterialCab materialCab, Menu menu) {
setStatusbarColor(ColorUtil.getOpaqueColor(toolbarColor)); setStatusbarColor(ColorUtil.stripAlpha(toolbarColor));
return callback.onCabCreated(materialCab, menu); return callback.onCabCreated(materialCab, menu);
} }
@ -310,7 +312,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
@Override @Override
public boolean onCabFinished(MaterialCab materialCab) { public boolean onCabFinished(MaterialCab materialCab) {
setStatusbarColor(ColorUtil.getColorWithAlpha(toolbarAlpha, toolbarColor)); setStatusbarColor(ColorUtil.withAlpha(toolbarColor, toolbarAlpha));
return callback.onCabFinished(materialCab); return callback.onCabFinished(materialCab);
} }
}); });

View file

@ -26,6 +26,8 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.target.Target;
import com.github.ksoichiro.android.observablescrollview.ObservableListView; import com.github.ksoichiro.android.observablescrollview.ObservableListView;
import com.kabouzeid.appthemehelper.util.ColorUtil;
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.album.HorizontalAlbumAdapter; import com.kabouzeid.gramophone.adapter.album.HorizontalAlbumAdapter;
import com.kabouzeid.gramophone.adapter.song.ArtistSongAdapter; import com.kabouzeid.gramophone.adapter.song.ArtistSongAdapter;
@ -48,8 +50,8 @@ import com.kabouzeid.gramophone.model.Artist;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.util.ArtistSignatureUtil; import com.kabouzeid.gramophone.util.ArtistSignatureUtil;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PhonographColorUtil;
import com.kabouzeid.gramophone.util.Util; import com.kabouzeid.gramophone.util.Util;
import java.util.ArrayList; import java.util.ArrayList;
@ -131,8 +133,8 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
// Change alpha of overlay // Change alpha of overlay
toolbarAlpha = Math.max(0, Math.min(1, (float) scrollY / flexibleRange)); toolbarAlpha = Math.max(0, Math.min(1, (float) scrollY / flexibleRange));
toolbar.setBackgroundColor(ColorUtil.getColorWithAlpha(toolbarAlpha, toolbarColor)); toolbar.setBackgroundColor(ColorUtil.withAlpha(toolbarColor, toolbarAlpha));
setStatusbarColor(ColorUtil.getColorWithAlpha(cab != null && cab.isActive() ? 1 : toolbarAlpha, toolbarColor)); setStatusbarColor(ColorUtil.withAlpha(toolbarColor, cab != null && cab.isActive() ? 1 : toolbarAlpha));
// Translate name text // Translate name text
int maxTitleTranslationY = artistImageViewHeight; int maxTitleTranslationY = artistImageViewHeight;
@ -297,12 +299,12 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
return toolbarColor; return toolbarColor;
} }
private void setColors(int vibrantColor) { private void setColors(int color) {
toolbarColor = vibrantColor; toolbarColor = color;
artistName.setBackgroundColor(vibrantColor); artistName.setBackgroundColor(color);
artistName.setTextColor(ColorUtil.getPrimaryTextColorForBackground(this, vibrantColor)); artistName.setTextColor(MaterialValueHelper.getPrimaryTextColor(this, ColorUtil.isColorLight(color)));
setNavigationbarColor(vibrantColor); setNavigationbarColor(color);
setTaskDescriptionColor(vibrantColor); setTaskDescriptionColor(color);
} }
private void getArtistFromIntentExtras() { private void getArtistFromIntentExtras() {
@ -380,11 +382,11 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
cab = new MaterialCab(this, R.id.cab_stub) cab = new MaterialCab(this, R.id.cab_stub)
.setMenu(menuRes) .setMenu(menuRes)
.setCloseDrawableRes(R.drawable.ic_close_white_24dp) .setCloseDrawableRes(R.drawable.ic_close_white_24dp)
.setBackgroundColor(ColorUtil.shiftBackgroundColorForLightText(getPaletteColor())) .setBackgroundColor(PhonographColorUtil.shiftBackgroundColorForLightText(getPaletteColor()))
.start(new MaterialCab.Callback() { .start(new MaterialCab.Callback() {
@Override @Override
public boolean onCabCreated(MaterialCab materialCab, Menu menu) { public boolean onCabCreated(MaterialCab materialCab, Menu menu) {
setStatusbarColor(ColorUtil.getOpaqueColor(toolbarColor)); setStatusbarColor(ColorUtil.stripAlpha(toolbarColor));
return callback.onCabCreated(materialCab, menu); return callback.onCabCreated(materialCab, menu);
} }
@ -395,7 +397,7 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
@Override @Override
public boolean onCabFinished(MaterialCab materialCab) { public boolean onCabFinished(MaterialCab materialCab) {
setStatusbarColor(ColorUtil.getColorWithAlpha(toolbarAlpha, toolbarColor)); setStatusbarColor(ColorUtil.withAlpha(toolbarColor, toolbarAlpha));
return callback.onCabFinished(materialCab); return callback.onCabFinished(materialCab);
} }
}); });

View file

@ -1,19 +1,18 @@
package com.kabouzeid.gramophone.ui.activities; package com.kabouzeid.gramophone.ui.activities;
import android.Manifest; import android.Manifest;
import android.app.ActivityManager;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.support.annotation.ColorInt;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
import android.widget.Toast; import android.widget.Toast;
import com.github.paolorotolo.appintro.AppIntro; import com.github.paolorotolo.appintro.AppIntro;
import com.github.paolorotolo.appintro.AppIntroFragment; import com.github.paolorotolo.appintro.AppIntroFragment;
import com.kabouzeid.appthemehelper.ATH;
import com.kabouzeid.appthemehelper.util.ColorUtil;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.PreferenceUtil;
/** /**
@ -23,8 +22,9 @@ public class IntroActivity extends AppIntro {
@Override @Override
public void init(Bundle savedInstanceState) { public void init(Bundle savedInstanceState) {
int color = ContextCompat.getColor(this, R.color.blue_grey_700); int color = ContextCompat.getColor(this, R.color.blue_grey_700);
setStatusBarColor(ColorUtil.shiftColorDown(color));
setTaskColor(color); ATH.setStatusbarColor(this, ColorUtil.darkenColor(color));
ATH.setTaskDescriptionColor(this, color);
showSkipButton(false); showSkipButton(false);
@ -40,15 +40,6 @@ public class IntroActivity extends AppIntro {
addSlide(AppIntroFragment.newInstance(getString(R.string.label_playing_queue), getString(R.string.rearrange_playing_queue_instruction), R.drawable.tutorial_rearrange_queue, color)); addSlide(AppIntroFragment.newInstance(getString(R.string.label_playing_queue), getString(R.string.rearrange_playing_queue_instruction), R.drawable.tutorial_rearrange_queue, color));
} }
private void setTaskColor(@ColorInt int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
setTaskDescription(new ActivityManager.TaskDescription(
null,
null,
ColorUtil.getOpaqueColor(color)));
}
}
private boolean hasExternalStoragePermission() { private boolean hasExternalStoragePermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; return checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;

View file

@ -57,8 +57,8 @@ import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityFragment; import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityRecyclerViewCustomGridSizeFragment; import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityRecyclerViewCustomGridSizeFragment;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PhonographColorUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.PreferenceUtil;
import com.kabouzeid.gramophone.util.Util; import com.kabouzeid.gramophone.util.Util;
import com.sothree.slidinguppanel.SlidingUpPanelLayout; import com.sothree.slidinguppanel.SlidingUpPanelLayout;
@ -538,7 +538,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
cab = new MaterialCab(this, R.id.cab_stub) cab = new MaterialCab(this, R.id.cab_stub)
.setMenu(menu) .setMenu(menu)
.setCloseDrawableRes(R.drawable.ic_close_white_24dp) .setCloseDrawableRes(R.drawable.ic_close_white_24dp)
.setBackgroundColor(ColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor(this))) .setBackgroundColor(PhonographColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor(this)))
.start(callback); .start(callback);
return cab; return cab;
} }

View file

@ -29,8 +29,8 @@ import com.kabouzeid.gramophone.model.PlaylistSong;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist; import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PhonographColorUtil;
import com.kabouzeid.gramophone.util.PlaylistsUtil; import com.kabouzeid.gramophone.util.PlaylistsUtil;
import java.util.ArrayList; import java.util.ArrayList;
@ -188,7 +188,7 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
cab = new MaterialCab(this, R.id.cab_stub) cab = new MaterialCab(this, R.id.cab_stub)
.setMenu(menu) .setMenu(menu)
.setCloseDrawableRes(R.drawable.ic_close_white_24dp) .setCloseDrawableRes(R.drawable.ic_close_white_24dp)
.setBackgroundColor(ColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor(this))) .setBackgroundColor(PhonographColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor(this)))
.start(callback); .start(callback);
return cab; return cab;
} }

View file

@ -3,10 +3,8 @@ package com.kabouzeid.gramophone.ui.activities.tageditor;
import android.app.SearchManager; import android.app.SearchManager;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.content.res.ColorStateList;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.PorterDuff;
import android.media.MediaScannerConnection; import android.media.MediaScannerConnection;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
@ -25,10 +23,11 @@ import android.widget.LinearLayout;
import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.MaterialDialog;
import com.github.ksoichiro.android.observablescrollview.ObservableScrollView; import com.github.ksoichiro.android.observablescrollview.ObservableScrollView;
import com.kabouzeid.appthemehelper.ThemeStore; import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.util.ColorUtil;
import com.kabouzeid.appthemehelper.util.TintHelper;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.misc.SimpleObservableScrollViewCallbacks; import com.kabouzeid.gramophone.misc.SimpleObservableScrollViewCallbacks;
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.Util; import com.kabouzeid.gramophone.util.Util;
@ -85,7 +84,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
header.setTranslationY(scrollY); header.setTranslationY(scrollY);
alpha = 1; alpha = 1;
} }
toolbar.setBackgroundColor(ColorUtil.getColorWithAlpha(alpha, paletteColorPrimary)); toolbar.setBackgroundColor(ColorUtil.withAlpha(paletteColorPrimary, alpha));
image.setTranslationY(scrollY / 2); image.setTranslationY(scrollY / 2);
} }
}; };
@ -188,10 +187,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
} }
}); });
int accentColor = ThemeStore.accentColor(this); TintHelper.setTintAuto(fab, ThemeStore.accentColor(this), true);
int fabDrawableColor = ColorUtil.getPrimaryTextColorForBackground(this, accentColor);
fab.setBackgroundTintList(ColorStateList.valueOf(accentColor));
fab.getDrawable().setColorFilter(fabDrawableColor, PorterDuff.Mode.SRC_IN);
} }
protected abstract void save(); protected abstract void save();

View file

@ -18,6 +18,7 @@ import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.SimpleTarget;
import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTranscoder; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTranscoder;
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
@ -25,9 +26,9 @@ import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient;
import com.kabouzeid.gramophone.lastfm.rest.model.LastFmAlbum; import com.kabouzeid.gramophone.lastfm.rest.model.LastFmAlbum;
import com.kabouzeid.gramophone.loader.AlbumLoader; import com.kabouzeid.gramophone.loader.AlbumLoader;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.LastFMUtil; import com.kabouzeid.gramophone.util.LastFMUtil;
import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.PhonographColorUtil;
import org.jaudiotagger.tag.FieldKey; import org.jaudiotagger.tag.FieldKey;
import org.jaudiotagger.tag.images.Artwork; import org.jaudiotagger.tag.images.Artwork;
@ -92,7 +93,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
@Override @Override
protected void loadCurrentImage() { protected void loadCurrentImage() {
Bitmap bitmap = getAlbumArt(); Bitmap bitmap = getAlbumArt();
setImageBitmap(bitmap, ColorUtil.getColor(ColorUtil.generatePalette(bitmap), ColorUtil.resolveColor(this, R.attr.default_bar_color))); setImageBitmap(bitmap, PhonographColorUtil.getColor(PhonographColorUtil.generatePalette(bitmap), ATHUtil.resolveColor(this, R.attr.default_bar_color)));
deleteAlbumArt = false; deleteAlbumArt = false;
} }
@ -128,7 +129,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
@Override @Override
public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation<? super BitmapPaletteWrapper> glideAnimation) { public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation<? super BitmapPaletteWrapper> glideAnimation) {
albumArtBitmap = getResizedAlbumCover(resource.getBitmap(), 2048); albumArtBitmap = getResizedAlbumCover(resource.getBitmap(), 2048);
setImageBitmap(albumArtBitmap, ColorUtil.getColor(resource.getPalette(), ColorUtil.resolveColor(AlbumTagEditorActivity.this, R.attr.default_bar_color))); setImageBitmap(albumArtBitmap, PhonographColorUtil.getColor(resource.getPalette(), ATHUtil.resolveColor(AlbumTagEditorActivity.this, R.attr.default_bar_color)));
deleteAlbumArt = false; deleteAlbumArt = false;
dataChanged(); dataChanged();
setResult(RESULT_OK); setResult(RESULT_OK);
@ -159,7 +160,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
@Override @Override
protected void deleteImage() { protected void deleteImage() {
setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.default_album_art), ColorUtil.resolveColor(this, R.attr.default_bar_color)); setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.default_album_art), ATHUtil.resolveColor(this, R.attr.default_bar_color));
deleteAlbumArt = true; deleteAlbumArt = true;
dataChanged(); dataChanged();
} }
@ -223,9 +224,9 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
@Override @Override
public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation<? super BitmapPaletteWrapper> glideAnimation) { public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation<? super BitmapPaletteWrapper> glideAnimation) {
ColorUtil.getColor(resource.getPalette(), Color.TRANSPARENT); PhonographColorUtil.getColor(resource.getPalette(), Color.TRANSPARENT);
albumArtBitmap = getResizedAlbumCover(resource.getBitmap(), 2048); albumArtBitmap = getResizedAlbumCover(resource.getBitmap(), 2048);
setImageBitmap(albumArtBitmap, ColorUtil.getColor(resource.getPalette(), ColorUtil.resolveColor(AlbumTagEditorActivity.this, R.attr.default_bar_color))); setImageBitmap(albumArtBitmap, PhonographColorUtil.getColor(resource.getPalette(), ATHUtil.resolveColor(AlbumTagEditorActivity.this, R.attr.default_bar_color)));
deleteAlbumArt = false; deleteAlbumArt = false;
dataChanged(); dataChanged();
setResult(RESULT_OK); setResult(RESULT_OK);

View file

@ -14,9 +14,11 @@ import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import com.kabouzeid.appthemehelper.ThemeStore; import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.appthemehelper.util.ColorUtil;
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener; import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
import butterknife.Bind; import butterknife.Bind;
@ -63,9 +65,9 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
if (recyclerView instanceof FastScrollRecyclerView) { if (recyclerView instanceof FastScrollRecyclerView) {
int accentColor = ThemeStore.accentColor(getActivity()); int accentColor = ThemeStore.accentColor(getActivity());
((FastScrollRecyclerView) recyclerView).setPopupBgColor(accentColor); ((FastScrollRecyclerView) recyclerView).setPopupBgColor(accentColor);
((FastScrollRecyclerView) recyclerView).setPopupTextColor(ColorUtil.getPrimaryTextColorForBackground(getActivity(), accentColor)); ((FastScrollRecyclerView) recyclerView).setPopupTextColor(MaterialValueHelper.getPrimaryTextColor(getActivity(), ColorUtil.isColorLight(accentColor)));
((FastScrollRecyclerView) recyclerView).setThumbColor(accentColor); ((FastScrollRecyclerView) recyclerView).setThumbColor(accentColor);
((FastScrollRecyclerView) recyclerView).setTrackColor(ColorUtil.getColorWithAlpha(0.12f, ColorUtil.resolveColor(getContext(), R.attr.colorControlNormal))); ((FastScrollRecyclerView) recyclerView).setTrackColor(ColorUtil.withAlpha(ATHUtil.resolveColor(getContext(), R.attr.colorControlNormal), 0.12f));
} }
invalidateLayoutManager(); invalidateLayoutManager();
invalidateAdapter(); invalidateAdapter();

View file

@ -15,13 +15,15 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.kabouzeid.appthemehelper.ThemeStore; import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.appthemehelper.util.ColorUtil;
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.MusicProgressViewUpdateHelper; import com.kabouzeid.gramophone.helper.MusicProgressViewUpdateHelper;
import com.kabouzeid.gramophone.helper.PlayPauseButtonOnClickHandler; import com.kabouzeid.gramophone.helper.PlayPauseButtonOnClickHandler;
import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener; import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener;
import com.kabouzeid.gramophone.ui.activities.base.AbsMusicServiceActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsMusicServiceActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.Util; import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.views.PlayPauseDrawable; import com.kabouzeid.gramophone.views.PlayPauseDrawable;
@ -95,9 +97,9 @@ public class MiniPlayerFragment extends Fragment implements MusicServiceEventLis
} }
private void setUpMiniPlayer() { private void setUpMiniPlayer() {
setMiniPlayerColor(ColorUtil.resolveColor(activity, R.attr.cardBackgroundColor)); setMiniPlayerColor(ATHUtil.resolveColor(activity, R.attr.cardBackgroundColor));
miniPlayerImage.setImageDrawable(Util.getTintedDrawable(activity, R.drawable.ic_keyboard_arrow_up_white_24dp, miniPlayerImage.setImageDrawable(Util.getTintedDrawable(activity, R.drawable.ic_keyboard_arrow_up_white_24dp,
ColorUtil.resolveColor(activity, android.R.attr.textColorSecondary))); ATHUtil.resolveColor(activity, R.attr.icon_color, ThemeStore.textColorSecondary(getActivity()))));
setUpPlayPauseButton(); setUpPlayPauseButton();
progressBar.setProgressTintList(ColorStateList.valueOf(ThemeStore.accentColor(activity))); progressBar.setProgressTintList(ColorStateList.valueOf(ThemeStore.accentColor(activity)));
@ -106,13 +108,13 @@ public class MiniPlayerFragment extends Fragment implements MusicServiceEventLis
public void setMiniPlayerColor(int color) { public void setMiniPlayerColor(int color) {
if (getView() == null) return; if (getView() == null) return;
getView().setBackgroundColor(color); getView().setBackgroundColor(color);
miniPlayerTitle.setTextColor(ColorUtil.getPrimaryTextColorForBackground(activity, color)); miniPlayerTitle.setTextColor(MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color)));
} }
private void setUpPlayPauseButton() { private void setUpPlayPauseButton() {
updatePlayPauseDrawableState(false); updatePlayPauseDrawableState(false);
miniPlayerPlayPauseButton.setImageDrawable(miniPlayerPlayPauseDrawable); miniPlayerPlayPauseButton.setImageDrawable(miniPlayerPlayPauseDrawable);
miniPlayerPlayPauseButton.setColorFilter(ColorUtil.resolveColor(activity, android.R.attr.textColorSecondary), PorterDuff.Mode.SRC_IN); miniPlayerPlayPauseButton.setColorFilter(ATHUtil.resolveColor(activity, R.attr.icon_color, ThemeStore.textColorSecondary(getActivity())), PorterDuff.Mode.SRC_IN);
miniPlayerPlayPauseButton.setOnClickListener(new PlayPauseButtonOnClickHandler()); miniPlayerPlayPauseButton.setOnClickListener(new PlayPauseButtonOnClickHandler());
} }

View file

@ -14,16 +14,17 @@ import android.widget.ImageButton;
import android.widget.SeekBar; import android.widget.SeekBar;
import android.widget.TextView; import android.widget.TextView;
import com.kabouzeid.appthemehelper.util.ColorUtil;
import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
import com.kabouzeid.appthemehelper.util.TintHelper;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.MusicProgressViewUpdateHelper; import com.kabouzeid.gramophone.helper.MusicProgressViewUpdateHelper;
import com.kabouzeid.gramophone.helper.PlayPauseButtonOnClickHandler; import com.kabouzeid.gramophone.helper.PlayPauseButtonOnClickHandler;
import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener; import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener;
import com.kabouzeid.gramophone.misc.FloatingActionButtonProperties;
import com.kabouzeid.gramophone.misc.SimpleOnSeekbarChangeListener; import com.kabouzeid.gramophone.misc.SimpleOnSeekbarChangeListener;
import com.kabouzeid.gramophone.service.MusicService; import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.ui.activities.base.AbsMusicServiceActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsMusicServiceActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.Util; import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.views.PlayPauseDrawable; import com.kabouzeid.gramophone.views.PlayPauseDrawable;
@ -148,12 +149,12 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
} }
public void setColor(int color) { public void setColor(int color) {
if (ColorUtil.useDarkTextColorOnBackground(color)) { if (ColorUtil.isColorLight(color)) {
lastPlaybackControlsColor = ColorUtil.getSecondaryTextColor(getActivity(), true); lastPlaybackControlsColor = MaterialValueHelper.getSecondaryTextColor(getActivity(), true);
lastDisabledPlaybackControlsColor = ColorUtil.getSecondaryDisabledTextColor(getActivity(), true); lastDisabledPlaybackControlsColor = MaterialValueHelper.getSecondaryDisabledTextColor(getActivity(), true);
} else { } else {
lastPlaybackControlsColor = ColorUtil.getPrimaryTextColor(getActivity(), false); lastPlaybackControlsColor = MaterialValueHelper.getPrimaryTextColor(getActivity(), false);
lastDisabledPlaybackControlsColor = ColorUtil.getPrimaryDisabledTextColor(getActivity(), false); lastDisabledPlaybackControlsColor = MaterialValueHelper.getPrimaryDisabledTextColor(getActivity(), false);
} }
updateRepeatState(); updateRepeatState();
@ -166,7 +167,10 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
private void setUpPlayPauseFab() { private void setUpPlayPauseFab() {
updatePlayPauseDrawableState(false); updatePlayPauseDrawableState(false);
playPauseFab.setImageDrawable(playerFabPlayPauseDrawable); playPauseFab.setImageDrawable(playerFabPlayPauseDrawable);
FloatingActionButtonProperties.COLOR.set(playPauseFab, Color.WHITE); final int fabColor = Color.WHITE;
TintHelper.setTintAuto(playPauseFab, fabColor, true);
// because of our custom drawable we have to set the tint manually
playPauseFab.getDrawable().mutate().setColorFilter(MaterialValueHelper.getPrimaryTextColor(getContext(), ColorUtil.isColorLight(fabColor)), PorterDuff.Mode.SRC_IN);
playPauseFab.setOnClickListener(new PlayPauseButtonOnClickHandler()); playPauseFab.setOnClickListener(new PlayPauseButtonOnClickHandler());
playPauseFab.post(new Runnable() { playPauseFab.post(new Runnable() {
@Override @Override
@ -215,7 +219,7 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
} }
private void updateProgressTextColor() { private void updateProgressTextColor() {
int color = ColorUtil.getPrimaryTextColor(getContext(), false); int color = MaterialValueHelper.getPrimaryTextColor(getContext(), false);
songTotalTime.setTextColor(color); songTotalTime.setTextColor(color);
songCurrentProgress.setTextColor(color); songCurrentProgress.setTextColor(color);
} }
@ -295,7 +299,7 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
} }
private void updateProgressSliderTint() { private void updateProgressSliderTint() {
int color = ColorUtil.getPrimaryTextColor(getContext(), false); int color = MaterialValueHelper.getPrimaryTextColor(getContext(), false);
progressSlider.getThumb().mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN); progressSlider.getThumb().mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN);
progressSlider.getProgressDrawable().mutate().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.SRC_IN); progressSlider.getProgressDrawable().mutate().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.SRC_IN);
} }

View file

@ -25,6 +25,7 @@ import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator;
import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator; import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator;
import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager; import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager;
import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils; import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.util.ATHUtil; import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.appthemehelper.util.TintHelper; import com.kabouzeid.appthemehelper.util.TintHelper;
import com.kabouzeid.appthemehelper.util.ToolbarContentTintHelper; import com.kabouzeid.appthemehelper.util.ToolbarContentTintHelper;
@ -36,7 +37,6 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper; import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.Util; import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil; import com.kabouzeid.gramophone.util.ViewUtil;
@ -115,7 +115,7 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
}); });
// for some reason the xml attribute doesn't get applied here. // for some reason the xml attribute doesn't get applied here.
playingQueueCard.setCardBackgroundColor(ColorUtil.resolveColor(getActivity(), R.attr.cardBackgroundColor)); playingQueueCard.setCardBackgroundColor(ATHUtil.resolveColor(getActivity(), R.attr.cardBackgroundColor));
} }
@Override @Override
@ -365,7 +365,7 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
@Override @Override
public void animateColorChange(PlayerFragment fragment, int newColor) { public void animateColorChange(PlayerFragment fragment, int newColor) {
if (ATHUtil.isWindowBackgroundDark(fragment.getActivity())) { if (ATHUtil.isWindowBackgroundDark(fragment.getActivity())) {
fragment.playerQueueSubHeader.setTextColor(ColorUtil.getSecondaryTextColor(fragment.getActivity(), false)); fragment.playerQueueSubHeader.setTextColor(ThemeStore.textColorSecondary(fragment.getActivity()));
} }
} }
} }
@ -382,7 +382,7 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
currentSongViewHolder.separator.setVisibility(View.VISIBLE); currentSongViewHolder.separator.setVisibility(View.VISIBLE);
currentSongViewHolder.shortSeparator.setVisibility(View.GONE); currentSongViewHolder.shortSeparator.setVisibility(View.GONE);
currentSongViewHolder.image.setScaleType(ImageView.ScaleType.CENTER); currentSongViewHolder.image.setScaleType(ImageView.ScaleType.CENTER);
currentSongViewHolder.image.setImageDrawable(Util.getTintedDrawable(fragment.getActivity(), R.drawable.ic_volume_up_white_24dp, ColorUtil.resolveColor(fragment.getActivity(), R.attr.icon_color))); currentSongViewHolder.image.setImageDrawable(Util.getTintedDrawable(fragment.getActivity(), R.drawable.ic_volume_up_white_24dp, ATHUtil.resolveColor(fragment.getActivity(), R.attr.icon_color, ThemeStore.textColorSecondary(fragment.getActivity()))));
currentSongViewHolder.itemView.setOnClickListener(new View.OnClickListener() { currentSongViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@ -481,8 +481,7 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
fragment.slidingUpPanelLayout.setBackgroundColor(fragment.lastColor); fragment.slidingUpPanelLayout.setBackgroundColor(fragment.lastColor);
AnimatorSet animatorSet = createDefaultColorChangeAnimatorSet(fragment, newColor); AnimatorSet animatorSet = createDefaultColorChangeAnimatorSet(fragment, newColor);
animatorSet.play(ViewUtil.createBackgroundColorTransition(fragment.toolbar, fragment.lastColor, newColor)) animatorSet.play(ViewUtil.createBackgroundColorTransition(fragment.toolbar, fragment.lastColor, newColor));
.with(ViewUtil.createBackgroundColorTransition(fragment.getView().findViewById(R.id.status_bar), ColorUtil.shiftColorDown(fragment.lastColor), ColorUtil.shiftColorDown(newColor)));
animatorSet.start(); animatorSet.start();
} }
} }

View file

@ -1,266 +0,0 @@
package com.kabouzeid.gramophone.util;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.support.annotation.AttrRes;
import android.support.annotation.ColorInt;
import android.support.annotation.FloatRange;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v7.graphics.Palette;
import com.kabouzeid.gramophone.R;
import java.util.Collections;
import java.util.Comparator;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class ColorUtil {
public static final int PALETTE_BITMAP_SIZE = 100;
@Nullable
public static Palette generatePalette(Bitmap bitmap) {
if (bitmap == null) return null;
return Palette.from(bitmap)
.resizeBitmapSize(PALETTE_BITMAP_SIZE)
.generate();
}
@ColorInt
public static int getColor(@Nullable Palette palette, int fallback) {
if (palette != null) {
if (palette.getVibrantSwatch() != null) {
return palette.getVibrantSwatch().getRgb();
} else if (palette.getMutedSwatch() != null) {
return palette.getMutedSwatch().getRgb();
} else if (palette.getDarkVibrantSwatch() != null) {
return palette.getDarkVibrantSwatch().getRgb();
} else if (palette.getDarkMutedSwatch() != null) {
return palette.getDarkMutedSwatch().getRgb();
} else if (palette.getLightVibrantSwatch() != null) {
return palette.getLightVibrantSwatch().getRgb();
} else if (palette.getLightMutedSwatch() != null) {
return palette.getLightMutedSwatch().getRgb();
} else if (palette.getSwatches() != null && !palette.getSwatches().isEmpty()) {
return Collections.max(palette.getSwatches(), SwatchComparator.getInstance()).getRgb();
}
}
return fallback;
}
private static class SwatchComparator implements Comparator<Palette.Swatch> {
private static SwatchComparator sInstance;
static SwatchComparator getInstance() {
if (sInstance == null) {
sInstance = new SwatchComparator();
}
return sInstance;
}
@Override
public int compare(Palette.Swatch lhs, Palette.Swatch rhs) {
return lhs.getPopulation() - rhs.getPopulation();
}
}
@ColorInt
public static int resolveColor(@NonNull Context context, @AttrRes int colorAttr) {
TypedArray a = context.obtainStyledAttributes(new int[]{colorAttr});
int resId = a.getColor(0, 0);
a.recycle();
return resId;
}
@ColorInt
public static int getOpaqueColor(@ColorInt int color) {
return color | 0xFF000000;
}
@ColorInt
public static int getColorWithAlpha(float alpha, @ColorInt int baseColor) {
int a = Math.min(255, Math.max(0, (int) (alpha * 255))) << 24;
int rgb = 0x00ffffff & baseColor;
return a + rgb;
}
@ColorInt
public static int shiftColor(@ColorInt int color, @FloatRange(from = 0.0f, to = 2.0f) float by) {
if (by == 1f) return color;
int alpha = Color.alpha(color);
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
hsv[2] *= by; // value component
// don't use getColorWithAlpha(float alpha, int baseColor) here
return (alpha << 24) + (0x00ffffff & Color.HSVToColor(hsv));
}
@SuppressWarnings("ResourceType")
@ColorInt
public static int shiftColorDown(@ColorInt int color) {
return shiftColor(color, 0.9f);
}
@SuppressWarnings("ResourceType")
@ColorInt
public static int shiftColorUp(@ColorInt int color) {
return shiftColor(color, 1.1f);
}
@ColorInt
public static int getPrimaryTextColor(final Context context, boolean dark) {
return dark ? ContextCompat.getColor(context, R.color.primary_text_default_material_light) : ContextCompat.getColor(context, R.color.primary_text_default_material_dark);
}
@ColorInt
public static int getSecondaryTextColor(final Context context, boolean dark) {
return dark ? ContextCompat.getColor(context, R.color.secondary_text_default_material_light) : ContextCompat.getColor(context, R.color.secondary_text_default_material_dark);
}
@ColorInt
public static int getPrimaryDisabledTextColor(final Context context, boolean dark) {
return dark ? ContextCompat.getColor(context, R.color.primary_text_disabled_material_light) : ContextCompat.getColor(context, R.color.primary_text_disabled_material_dark);
}
@ColorInt
public static int getSecondaryDisabledTextColor(final Context context, boolean dark) {
return dark ? ContextCompat.getColor(context, R.color.secondary_text_disabled_material_light) : ContextCompat.getColor(context, R.color.secondary_text_disabled_material_dark);
}
public static float getLuminance(@ColorInt int color) {
return (Color.red(color) * 0.299f + Color.green(color) * 0.587f + Color.blue(color) * 0.114f);
}
public static boolean useDarkTextColorOnBackground(@ColorInt int backgroundColor) {
return getLuminance(backgroundColor) > (255f / 1.5f);
}
@ColorInt
public static int getPrimaryTextColorForBackground(final Context context, @ColorInt int backgroundColor) {
return getPrimaryTextColor(context, useDarkTextColorOnBackground(backgroundColor));
}
@ColorInt
public static int getSecondaryTextColorForBackground(final Context context, @ColorInt int backgroundColor) {
return getSecondaryTextColor(context, useDarkTextColorOnBackground(backgroundColor));
}
@ColorInt
public static int getPrimaryDisabledTextColorForBackground(final Context context, @ColorInt int backgroundColor) {
return getPrimaryDisabledTextColor(context, useDarkTextColorOnBackground(backgroundColor));
}
@ColorInt
public static int getSecondaryDisabledTextColorForBackground(final Context context, @ColorInt int backgroundColor) {
return getSecondaryDisabledTextColor(context, useDarkTextColorOnBackground(backgroundColor));
}
@ColorInt
public static int shiftBackgroundColorForLightText(@ColorInt int backgroundColor) {
while (ColorUtil.useDarkTextColorOnBackground(backgroundColor)) {
backgroundColor = ColorUtil.shiftColorDown(backgroundColor);
}
return backgroundColor;
}
@ColorInt
public static int shiftBackgroundColorForDarkText(@ColorInt int backgroundColor) {
while (!ColorUtil.useDarkTextColorOnBackground(backgroundColor)) {
backgroundColor = ColorUtil.shiftColorUp(backgroundColor);
}
return backgroundColor;
}
public static int[] rgb2lab(int R, int G, int B) {
//http://www.brucelindbloom.com
float r, g, b, X, Y, Z, fx, fy, fz, xr, yr, zr;
float Ls, as, bs;
float eps = 216.f / 24389.f;
float k = 24389.f / 27.f;
float Xr = 0.964221f; // reference white D50
float Yr = 1.0f;
float Zr = 0.825211f;
// RGB to XYZ
r = R / 255.f; //R 0..1
g = G / 255.f; //G 0..1
b = B / 255.f; //B 0..1
// assuming sRGB (D65)
if (r <= 0.04045)
r = r / 12;
else
r = (float) Math.pow((r + 0.055) / 1.055, 2.4);
if (g <= 0.04045)
g = g / 12;
else
g = (float) Math.pow((g + 0.055) / 1.055, 2.4);
if (b <= 0.04045)
b = b / 12;
else
b = (float) Math.pow((b + 0.055) / 1.055, 2.4);
X = 0.436052025f * r + 0.385081593f * g + 0.143087414f * b;
Y = 0.222491598f * r + 0.71688606f * g + 0.060621486f * b;
Z = 0.013929122f * r + 0.097097002f * g + 0.71418547f * b;
// XYZ to Lab
xr = X / Xr;
yr = Y / Yr;
zr = Z / Zr;
if (xr > eps)
fx = (float) Math.pow(xr, 1 / 3.);
else
fx = (float) ((k * xr + 16.) / 116.);
if (yr > eps)
fy = (float) Math.pow(yr, 1 / 3.);
else
fy = (float) ((k * yr + 16.) / 116.);
if (zr > eps)
fz = (float) Math.pow(zr, 1 / 3.);
else
fz = (float) ((k * zr + 16.) / 116);
Ls = (116 * fy) - 16;
as = 500 * (fx - fy);
bs = 200 * (fy - fz);
int[] lab = new int[3];
lab[0] = (int) (2.55 * Ls + .5);
lab[1] = (int) (as + .5);
lab[2] = (int) (bs + .5);
return lab;
}
/**
* Computes the difference between two RGB colors by converting them to the L*a*b scale and
* comparing them using the CIE76 algorithm { http://en.wikipedia.org/wiki/Color_difference#CIE76}
*
* @return > 23 corresponds to a JND (just noticeable difference)
*/
public static double getColorDifference(int a, int b) {
int r1, g1, b1, r2, g2, b2;
r1 = Color.red(a);
g1 = Color.green(a);
b1 = Color.blue(a);
r2 = Color.red(b);
g2 = Color.green(b);
b2 = Color.blue(b);
int[] lab1 = rgb2lab(r1, g1, b1);
int[] lab2 = rgb2lab(r2, g2, b2);
return Math.sqrt(Math.pow(lab2[0] - lab1[0], 2) + Math.pow(lab2[1] - lab1[1], 2) + Math.pow(lab2[2] - lab1[2], 2));
}
}

View file

@ -0,0 +1,80 @@
package com.kabouzeid.gramophone.util;
import android.graphics.Bitmap;
import android.support.annotation.ColorInt;
import android.support.annotation.Nullable;
import android.support.v7.graphics.Palette;
import com.kabouzeid.appthemehelper.util.ColorUtil;
import java.util.Collections;
import java.util.Comparator;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class PhonographColorUtil {
public static final int PALETTE_BITMAP_SIZE = 100;
@Nullable
public static Palette generatePalette(Bitmap bitmap) {
if (bitmap == null) return null;
return Palette.from(bitmap)
.resizeBitmapSize(PALETTE_BITMAP_SIZE)
.generate();
}
@ColorInt
public static int getColor(@Nullable Palette palette, int fallback) {
if (palette != null) {
if (palette.getVibrantSwatch() != null) {
return palette.getVibrantSwatch().getRgb();
} else if (palette.getMutedSwatch() != null) {
return palette.getMutedSwatch().getRgb();
} else if (palette.getDarkVibrantSwatch() != null) {
return palette.getDarkVibrantSwatch().getRgb();
} else if (palette.getDarkMutedSwatch() != null) {
return palette.getDarkMutedSwatch().getRgb();
} else if (palette.getLightVibrantSwatch() != null) {
return palette.getLightVibrantSwatch().getRgb();
} else if (palette.getLightMutedSwatch() != null) {
return palette.getLightMutedSwatch().getRgb();
} else if (palette.getSwatches() != null && !palette.getSwatches().isEmpty()) {
return Collections.max(palette.getSwatches(), SwatchComparator.getInstance()).getRgb();
}
}
return fallback;
}
private static class SwatchComparator implements Comparator<Palette.Swatch> {
private static SwatchComparator sInstance;
static SwatchComparator getInstance() {
if (sInstance == null) {
sInstance = new SwatchComparator();
}
return sInstance;
}
@Override
public int compare(Palette.Swatch lhs, Palette.Swatch rhs) {
return lhs.getPopulation() - rhs.getPopulation();
}
}
@ColorInt
public static int shiftBackgroundColorForLightText(@ColorInt int backgroundColor) {
while (ColorUtil.isColorLight(backgroundColor)) {
backgroundColor = ColorUtil.darkenColor(backgroundColor);
}
return backgroundColor;
}
@ColorInt
public static int shiftBackgroundColorForDarkText(@ColorInt int backgroundColor) {
while (!ColorUtil.isColorLight(backgroundColor)) {
backgroundColor = ColorUtil.lightenColor(backgroundColor);
}
return backgroundColor;
}
}

View file

@ -48,11 +48,6 @@ public class Util {
return size; return size;
} }
public static int getSmallerScreenSize(@NonNull Context c) {
Point size = Util.getScreenSize(c);
return Math.min(size.x, size.y);
}
@TargetApi(19) @TargetApi(19)
public static void setStatusBarTranslucent(@NonNull Window window) { public static void setStatusBarTranslucent(@NonNull Window window) {
window.setFlags( window.setFlags(