Makes full use of the Android Support Design Library. A lot of small things fixed or improved. Added dozens of new colors.

This commit is contained in:
Karim Abou Zeid 2015-05-30 22:51:17 +02:00
commit 31926d7983
45 changed files with 447 additions and 599 deletions

View file

@ -203,8 +203,8 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
public void onGenerated(Palette palette) {
final Palette.Swatch vibrantSwatch = palette.getVibrantSwatch();
if (vibrantSwatch != null) {
title.setTextColor(Util.getColorWithoutAlpha(vibrantSwatch.getTitleTextColor()));
artist.setTextColor(Util.getColorWithoutAlpha(vibrantSwatch.getTitleTextColor()));
title.setTextColor(Util.getOpaqueColor(vibrantSwatch.getTitleTextColor()));
artist.setTextColor(Util.getOpaqueColor(vibrantSwatch.getTitleTextColor()));
ViewUtil.animateViewColor(footer, footer.getDrawingCacheBackgroundColor(), vibrantSwatch.getRgb());
} else {
paletteBlackAndWhite(title, artist, footer);
@ -217,8 +217,8 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
}
private void paletteBlackAndWhite(final TextView title, final TextView artist, final View footer) {
title.setTextColor(Util.getColorWithoutAlpha(DialogUtils.resolveColor(activity, R.attr.title_text_color)));
artist.setTextColor(Util.getColorWithoutAlpha(DialogUtils.resolveColor(activity, R.attr.caption_text_color)));
title.setTextColor(Util.getOpaqueColor(DialogUtils.resolveColor(activity, R.attr.title_text_color)));
artist.setTextColor(Util.getOpaqueColor(DialogUtils.resolveColor(activity, R.attr.caption_text_color)));
int defaultBarColor = DialogUtils.resolveColor(activity, R.attr.default_bar_color);
ViewUtil.animateViewColor(footer, defaultBarColor, defaultBarColor);
}

View file

@ -1,119 +0,0 @@
package com.kabouzeid.gramophone.adapter;
import android.content.Context;
import android.graphics.PorterDuff;
import android.os.Build;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.afollestad.materialdialogs.ThemeSingleton;
import com.afollestad.materialdialogs.util.DialogUtils;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.ColorChooserDialog;
import com.kabouzeid.gramophone.model.NavigationDrawerItem;
import com.kabouzeid.gramophone.ui.fragments.NavigationDrawerFragment;
import java.util.ArrayList;
/**
* @author Aidan Follestad (afollestad)
*/
public class NavigationDrawerItemAdapter extends RecyclerView.Adapter<NavigationDrawerItemAdapter.ShortcutViewHolder> implements View.OnClickListener {
// per the Material design guidelines
@SuppressWarnings("FieldCanBeLocal")
private final int ALPHA_ACTIVATED = 255;
@SuppressWarnings("FieldCanBeLocal")
private final int ALPHA_ICON = 138;
@SuppressWarnings("FieldCanBeLocal")
private final int ALPHA_TEXT = 222;
@Override
public void onClick(View v) {
int index = (Integer) v.getTag();
if (mCallback != null)
mCallback.onItemSelected(index);
}
public static class ShortcutViewHolder extends RecyclerView.ViewHolder {
public ShortcutViewHolder(View itemView) {
super(itemView);
divider = itemView.findViewById(R.id.divider);
container = itemView.findViewById(R.id.container);
title = (TextView) itemView.findViewById(R.id.title);
icon = (ImageView) itemView.findViewById(R.id.icon);
}
final TextView title;
final ImageView icon;
final View divider;
final View container;
}
private int currentChecked = -1;
private int navIconColor;
private final ArrayList<NavigationDrawerItem> mItems;
private final Callback mCallback;
public interface Callback {
void onItemSelected(int index);
}
public NavigationDrawerItemAdapter(Context context, ArrayList<NavigationDrawerItem> objects, Callback callback) {
navIconColor = DialogUtils.resolveColor(context, R.attr.nav_drawer_icon_color);
if (DialogUtils.isColorDark(navIconColor))
navIconColor = ColorChooserDialog.shiftColorUp(navIconColor);
mItems = objects;
mCallback = callback;
}
public void setChecked(int position) {
// int oldPosition = currentChecked;
currentChecked = position;
notifyDataSetChanged();
}
@Override
public ShortcutViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_navigation_drawer, parent, false);
return new ShortcutViewHolder(view);
}
@Override
public void onBindViewHolder(ShortcutViewHolder holder, int position) {
NavigationDrawerItem item = mItems.get(position);
holder.title.setText(item.title);
holder.icon.setImageResource(item.imageRes);
holder.divider.setVisibility(position == NavigationDrawerFragment.SETTINGS_INDEX ?
View.VISIBLE : View.GONE);
final boolean selected = position == currentChecked;
final int iconColor = selected ? ThemeSingleton.get().positiveColor : navIconColor;
final int textColor = selected ? ThemeSingleton.get().positiveColor : navIconColor;
holder.title.setTextColor(textColor);
holder.title.setAlpha(selected ? ALPHA_ACTIVATED : ALPHA_TEXT);
holder.icon.setColorFilter(iconColor, PorterDuff.Mode.SRC_ATOP);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
holder.icon.setImageAlpha(selected ? ALPHA_ACTIVATED : ALPHA_ICON);
} else {
// noinspection deprecation
holder.icon.setAlpha(selected ? ALPHA_ACTIVATED : ALPHA_ICON);
}
holder.container.setActivated(selected);
holder.container.setTag(position);
holder.container.setOnClickListener(this);
}
@Override
public int getItemCount() {
return mItems.size();
}
}

View file

@ -21,9 +21,8 @@ import android.widget.BaseAdapter;
import android.widget.GridView;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.ThemeSingleton;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.views.CircleView;
import com.kabouzeid.gramophone.views.ColorView;
/**
* @author Aidan Follestad (afollestad)
@ -95,7 +94,10 @@ public class ColorChooserDialog extends DialogFragment implements View.OnClickLi
mColors[i] = ta.getColor(i, 0);
ta.recycle();
mGrid = (GridView) dialog.getCustomView();
invalidateGrid();
if (mGrid != null) {
mGrid.setNumColumns(primary ? 7 : 4);
invalidateGrid();
}
return dialog;
}
@ -130,13 +132,12 @@ public class ColorChooserDialog extends DialogFragment implements View.OnClickLi
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
convertView = LayoutInflater.from(getActivity()).inflate(R.layout.griditem_color_chooser, parent, false);
final boolean dark = ThemeSingleton.get().darkTheme;
CircleView child = (CircleView) convertView;
child.setActivated(getArguments().getInt("preselect") == mColors[position]);
child.setBackgroundColor(mColors[position]);
child.setBorderColor(dark ? Color.WHITE : Color.BLACK);
child.setTag(position);
child.setOnClickListener(this);
final ColorView colorView = (ColorView) convertView;
colorView.setActivated(getArguments().getInt("preselect") == mColors[position]);
colorView.setBackgroundColor(mColors[position]);
colorView.setTag(position);
colorView.setOnClickListener(this);
Drawable selector = createSelector(mColors[position]);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
@ -147,9 +148,9 @@ public class ColorChooserDialog extends DialogFragment implements View.OnClickLi
shiftColorDown(mColors[position])
};
ColorStateList rippleColors = new ColorStateList(states, colors);
child.setForeground(new RippleDrawable(rippleColors, selector, null));
colorView.setForeground(new RippleDrawable(rippleColors, selector, null));
} else {
child.setForeground(selector);
colorView.setForeground(selector);
}
return convertView;
}
@ -162,20 +163,14 @@ public class ColorChooserDialog extends DialogFragment implements View.OnClickLi
}
}
public static int shiftColorDown(int color) {
@SuppressWarnings("ResourceType")
private static int shiftColorDown(int color) {
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
hsv[2] *= 0.9f; // value component
return Color.HSVToColor(hsv);
}
public static int shiftColorUp(int color) {
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
hsv[2] *= 1.1f; // value component
return Color.HSVToColor(hsv);
}
private static int translucentColor(int color) {
final float factor = 0.7f;
int alpha = Math.round(Color.alpha(color) * factor);

View file

@ -13,7 +13,6 @@ public class UIPreferenceChangedEvent {
public static final int COLORED_NAVIGATION_BAR_CURRENT_PLAYING_CHANGED = 6;
public static final int COLORED_NAVIGATION_BAR_CHANGED = 10;
public static final int COLORED_NAVIGATION_BAR_OTHER_SCREENS_CHANGED = 7;
public static final int TOOLBAR_TRANSPARENT_CHANGED = 8;
private final int action;
private final Object value;

View file

@ -7,7 +7,7 @@ import android.util.AttributeSet;
import android.view.View;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.views.CircleView;
import com.kabouzeid.gramophone.views.ColorView;
public class ColorChooserPreference extends Preference {
@ -43,11 +43,10 @@ public class ColorChooserPreference extends Preference {
private void invalidateColor() {
if (mView != null) {
CircleView circle = (CircleView) mView.findViewById(R.id.circle);
ColorView circle = (ColorView) mView.findViewById(R.id.circle);
if (this.color != 0) {
circle.setVisibility(View.VISIBLE);
circle.setBackgroundColor(color);
circle.setBorderColor(border);
} else {
circle.setVisibility(View.GONE);
}

View file

@ -69,7 +69,6 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
private ObservableRecyclerView recyclerView;
private AlbumSongAdapter adapter;
private ArrayList<Song> songs;
private View statusBar;
private ImageView albumArtImageView;
private ImageView albumArtBackground;
private View songsBackgroundView;
@ -99,7 +98,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
// Change alpha of overlay
toolbarAlpha = Math.max(0, Math.min(1, (float) scrollY / flexibleRange));
ViewUtil.setBackgroundAlpha(toolbar, toolbarAlpha, toolbarColor);
ViewUtil.setBackgroundAlpha(statusBar, cab != null && cab.isActive() ? 1 : toolbarAlpha, toolbarColor);
setStatusBarColor(Util.getColorWithAlpha(cab != null && cab.isActive() ? 1 : toolbarAlpha, toolbarColor));
// Translate name text
int maxTitleTranslationY = albumArtViewHeight;
@ -112,6 +111,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
@Override
protected void onCreate(Bundle savedInstanceState) {
setStatusBarTransparent();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_album_detail);
@ -174,7 +174,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
recyclerView = (ObservableRecyclerView) findViewById(R.id.list);
albumTitleView = (TextView) findViewById(R.id.album_title);
songsBackgroundView = findViewById(R.id.list_background);
statusBar = findViewById(R.id.status_bar);
// statusBar = findViewById(R.id.status_bar);
}
private void setUpObservableListViewParams() {
@ -237,7 +237,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
if (vibrantSwatch != null) {
toolbarColor = vibrantSwatch.getRgb();
albumTitleView.setBackgroundColor(toolbarColor);
albumTitleView.setTextColor(vibrantSwatch.getTitleTextColor());
albumTitleView.setTextColor(Util.getOpaqueColor(vibrantSwatch.getTitleTextColor()));
if (Util.isAtLeastLollipop() && PreferenceUtils.getInstance(AlbumDetailActivity.this).coloredNavigationBarAlbumEnabled())
setNavigationBarColor(toolbarColor);
notifyTaskColorChange(toolbarColor);
@ -411,7 +411,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
.start(new MaterialCab.Callback() {
@Override
public boolean onCabCreated(MaterialCab materialCab, Menu menu) {
ViewUtil.setBackgroundAlpha(statusBar, 1, toolbarColor);
setStatusBarColor(Util.getOpaqueColor(toolbarColor));
return callback.onCabCreated(materialCab, menu);
}
@ -422,7 +422,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
@Override
public boolean onCabFinished(MaterialCab materialCab) {
ViewUtil.setBackgroundAlpha(statusBar, toolbarAlpha, toolbarColor);
setStatusBarColor(Util.getColorWithAlpha(toolbarAlpha, toolbarColor));
return callback.onCabFinished(materialCab);
}
});

View file

@ -74,7 +74,6 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor
private Artist artist;
private ObservableListView songListView;
private View statusBar;
private ImageView artistImage;
private ImageView artistImageBackground;
private View songsBackgroundView;
@ -112,7 +111,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor
// Change alpha of overlay
toolbarAlpha = Math.max(0, Math.min(1, (float) scrollY / flexibleRange));
ViewUtil.setBackgroundAlpha(toolbar, toolbarAlpha, toolbarColor);
ViewUtil.setBackgroundAlpha(statusBar, cab != null && cab.isActive() ? 1 : toolbarAlpha, toolbarColor);
setStatusBarColor(Util.getColorWithAlpha(cab != null && cab.isActive() ? 1 : toolbarAlpha, toolbarColor));
// Translate name text
int maxTitleTranslationY = artistImageViewHeight;
@ -127,6 +126,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor
@Override
protected void onCreate(Bundle savedInstanceState) {
setStatusBarTransparent();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_artist_detail);
@ -183,7 +183,6 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor
songListView = (ObservableListView) findViewById(R.id.list);
artistNameTv = (TextView) findViewById(R.id.artist_name);
songsBackgroundView = findViewById(R.id.list_background);
statusBar = findViewById(R.id.status_bar);
songListHeader = LayoutInflater.from(this).inflate(R.layout.artist_detail_header, songListView, false);
albumRecyclerView = (RecyclerView) songListHeader.findViewById(R.id.recycler_view);
@ -318,7 +317,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor
if (vibrantSwatch != null) {
toolbarColor = vibrantSwatch.getRgb();
artistNameTv.setBackgroundColor(vibrantSwatch.getRgb());
artistNameTv.setTextColor(vibrantSwatch.getTitleTextColor());
artistNameTv.setTextColor(Util.getOpaqueColor(vibrantSwatch.getTitleTextColor()));
if (Util.isAtLeastLollipop() && PreferenceUtils.getInstance(ArtistDetailActivity.this).coloredNavigationBarArtistEnabled())
setNavigationBarColor(vibrantSwatch.getRgb());
notifyTaskColorChange(toolbarColor);
@ -497,7 +496,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor
.start(new MaterialCab.Callback() {
@Override
public boolean onCabCreated(MaterialCab materialCab, Menu menu) {
ViewUtil.setBackgroundAlpha(statusBar, 1, toolbarColor);
setStatusBarColor(Util.getOpaqueColor(toolbarColor));
return callback.onCabCreated(materialCab, menu);
}
@ -508,7 +507,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor
@Override
public boolean onCabFinished(MaterialCab materialCab) {
ViewUtil.setBackgroundAlpha(statusBar, toolbarAlpha, toolbarColor);
setStatusBarColor(Util.getColorWithAlpha(toolbarAlpha, toolbarColor));
return callback.onCabFinished(materialCab);
}
});

View file

@ -10,6 +10,7 @@ import android.os.Handler;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView;
import android.support.design.widget.TabLayout;
import android.support.v4.util.Pair;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
@ -30,7 +31,6 @@ import android.widget.TextView;
import com.afollestad.materialcab.MaterialCab;
import com.afollestad.materialdialogs.ThemeSingleton;
import com.astuetz.PagerSlidingTabStrip;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.PagerAdapter;
import com.kabouzeid.gramophone.dialogs.AboutDialog;
@ -70,7 +70,7 @@ public class MainActivity extends AbsFabActivity
private Toolbar toolbar;
private PagerAdapter pagerAdapter;
private ViewPager viewPager;
private PagerSlidingTabStrip slidingTabLayout;
private TabLayout tabLayout;
private int currentPage = -1;
private MaterialCab cab;
private NavigationView navigationView;
@ -105,34 +105,34 @@ public class MainActivity extends AbsFabActivity
int startPosition = PreferenceUtils.getInstance(this).getDefaultStartPage();
startPosition = startPosition == -1 ? PreferenceUtils.getInstance(this).getLastStartPage() : startPosition;
currentPage = startPosition;
viewPager.setCurrentItem(startPosition);
navigationView.getMenu().getItem(startPosition).setChecked(true);
slidingTabLayout.setIndicatorColor(ThemeSingleton.get().positiveColor);
slidingTabLayout.setViewPager(viewPager);
slidingTabLayout.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
tabLayout.setupWithViewPager(viewPager);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(final int position) {
public void onPageSelected(int position) {
navigationView.getMenu().getItem(position).setChecked(true);
currentPage = position;
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
viewPager.setCurrentItem(startPosition);
}
private void initViews() {
viewPager = (ViewPager) findViewById(R.id.pager);
slidingTabLayout = (PagerSlidingTabStrip) findViewById(R.id.tabs);
tabLayout = (TabLayout) findViewById(R.id.tabs);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
navigationView = (NavigationView) findViewById(R.id.nav_view);
}
@ -140,16 +140,15 @@ public class MainActivity extends AbsFabActivity
private void setUpToolBar() {
setTitle(getResources().getString(R.string.app_name));
toolbar = (Toolbar) findViewById(R.id.toolbar);
setToolBarTransparent(PreferenceUtils.getInstance(this).transparentToolbar());
setToolBarColor();
setSupportActionBar(toolbar);
setUpDrawerToggle();
}
private void setToolBarTransparent(boolean transparent) {
float alpha = transparent ? 0.9f : 1f;
final int colorPrimary = PreferenceUtils.getInstance(this).getThemeColorPrimary();
ViewUtil.setBackgroundAlpha(toolbar, alpha, colorPrimary);
ViewUtil.setBackgroundAlpha(slidingTabLayout, alpha, colorPrimary);
private void setToolBarColor() {
final int colorPrimary = getThemeColorPrimary();
toolbar.setBackgroundColor(colorPrimary);
tabLayout.setBackgroundColor(colorPrimary);
}
private void setUpNavigationView() {
@ -163,7 +162,7 @@ public class MainActivity extends AbsFabActivity
new int[]{
// 0,
colorAccent,
Color.argb(222, 0, 0, 0)
ThemeSingleton.get().darkTheme ? Color.argb(222, 255, 255, 255) : Color.argb(222, 0, 0, 0)
}
));
navigationView.setItemIconTintList(new ColorStateList(
@ -175,7 +174,7 @@ public class MainActivity extends AbsFabActivity
new int[]{
// 0,
colorAccent,
Color.argb(138, 0, 0, 0)
ThemeSingleton.get().darkTheme ? Color.argb(138, 255, 255, 255) : Color.argb(138, 0, 0, 0)
}
));
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@ -369,9 +368,6 @@ public class MainActivity extends AbsFabActivity
public void onUIPreferenceChangedEvent(UIPreferenceChangedEvent event) {
super.onUIPreferenceChangedEvent(event);
switch (event.getAction()) {
case UIPreferenceChangedEvent.TOOLBAR_TRANSPARENT_CHANGED:
setToolBarTransparent((boolean) event.getValue());
break;
case UIPreferenceChangedEvent.COLORED_NAVIGATION_BAR_OTHER_SCREENS_CHANGED:
if ((boolean) event.getValue()) setNavigationBarThemeColor();
else resetNavigationBarColor();

View file

@ -81,6 +81,7 @@ public class MusicControllerActivity extends AbsFabActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
setStatusBarTransparent();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_music_controller);
@ -218,7 +219,7 @@ public class MusicControllerActivity extends AbsFabActivity {
switch (MusicPlayerRemote.getShuffleMode()) {
case MusicService.SHUFFLE_MODE_SHUFFLE:
shuffleButton.setImageDrawable(Util.getTintedDrawable(this, R.drawable.ic_shuffle_white_48dp,
ThemeSingleton.get().positiveColor));
getThemeColorAccent() == Color.WHITE ? Color.BLACK : getThemeColorAccent()));
break;
default:
shuffleButton.setImageDrawable(Util.getTintedDrawable(this, R.drawable.ic_shuffle_white_48dp,
@ -245,11 +246,11 @@ public class MusicControllerActivity extends AbsFabActivity {
break;
case MusicService.REPEAT_MODE_ALL:
repeatButton.setImageDrawable(Util.getTintedDrawable(this, R.drawable.ic_repeat_white_48dp,
ThemeSingleton.get().positiveColor));
getThemeColorAccent() == Color.WHITE ? Color.BLACK : getThemeColorAccent()));
break;
default:
repeatButton.setImageDrawable(Util.getTintedDrawable(this, R.drawable.ic_repeat_one_white_48dp,
ThemeSingleton.get().positiveColor));
getThemeColorAccent() == Color.WHITE ? Color.BLACK : getThemeColorAccent()));
break;
}
}
@ -320,7 +321,7 @@ public class MusicControllerActivity extends AbsFabActivity {
if (vibrantSwatch != null) {
final int swatchRgb = vibrantSwatch.getRgb();
animateColorChange(swatchRgb);
animateTextColorChange(Util.getColorWithoutAlpha(vibrantSwatch.getTitleTextColor()));
animateTextColorChange(Util.getOpaqueColor(vibrantSwatch.getTitleTextColor()));
notifyTaskColorChange(swatchRgb);
} else {
resetColors();
@ -333,7 +334,7 @@ public class MusicControllerActivity extends AbsFabActivity {
}
private void resetColors() {
final int textColor = Util.getColorWithoutAlpha(DialogUtils.resolveColor(this, R.attr.title_text_color));
final int textColor = Util.getOpaqueColor(DialogUtils.resolveColor(this, R.attr.title_text_color));
final int defaultBarColor = DialogUtils.resolveColor(this, R.attr.default_bar_color);
animateColorChange(defaultBarColor);
@ -360,7 +361,7 @@ public class MusicControllerActivity extends AbsFabActivity {
else toolbar.setBackgroundColor(Color.TRANSPARENT);
}
setTint(progressSlider, PreferenceUtils.getInstance(this).getThemeColorAccent());
setTint(progressSlider, !ThemeSingleton.get().darkTheme && getThemeColorAccent() == Color.WHITE ? Color.BLACK : getThemeColorAccent());
if (opaqueToolBar) setStatusBarColor(newColor);
else setStatusBarColor(Color.TRANSPARENT);

View file

@ -79,6 +79,7 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder
if (PreferenceUtils.getInstance(this).coloredNavigationBarPlaylistEnabled())
setNavigationBarThemeColor();
setStatusBarThemeColor();
App.bus.register(this);
}

View file

@ -113,14 +113,6 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
}
});
findPreference("transparent_toolbar").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
App.bus.post(new UIPreferenceChangedEvent(UIPreferenceChangedEvent.TOOLBAR_TRANSPARENT_CHANGED, o));
return true;
}
});
findPreference("colored_album_footers").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {

View file

@ -19,6 +19,7 @@ import com.kabouzeid.gramophone.misc.SmallOnGestureListener;
import com.kabouzeid.gramophone.model.MusicRemoteEvent;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.views.PlayPauseDrawable;
import com.squareup.otto.Subscribe;
@ -54,7 +55,7 @@ public abstract class AbsFabActivity extends AbsBaseActivity {
getFab().setImageDrawable(playPauseDrawable);
final int accentColor = ThemeSingleton.get().positiveColor;
getFab().setRippleColor(accentColor);
getFab().setBackgroundTintList(Util.getEmptyColorStateList(accentColor));
if (accentColor == Color.WHITE) {
getFab().getDrawable().setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN);
} else {

View file

@ -5,6 +5,7 @@ import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import com.afollestad.materialdialogs.ThemeSingleton;
import com.kabouzeid.gramophone.R;
@ -17,6 +18,9 @@ import com.kabouzeid.gramophone.util.Util;
*/
public abstract class ThemeBaseActivity extends AppCompatActivity implements KabViewsDisableAble {
private int colorPrimary;
private int colorPrimaryDarker;
private int colorAccent;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -27,7 +31,11 @@ public abstract class ThemeBaseActivity extends AppCompatActivity implements Kab
private void setupTheme() {
ThemeSingleton.get().positiveColor = PreferenceUtils.getInstance(this).getThemeColorAccent();
colorPrimary = PreferenceUtils.getInstance(this).getThemeColorPrimary();
colorPrimaryDarker = Util.shiftColorDown(colorPrimary);
colorAccent = PreferenceUtils.getInstance(this).getThemeColorAccent();
ThemeSingleton.get().positiveColor = colorAccent;
ThemeSingleton.get().negativeColor = ThemeSingleton.get().positiveColor;
ThemeSingleton.get().neutralColor = ThemeSingleton.get().positiveColor;
ThemeSingleton.get().widgetColor = ThemeSingleton.get().positiveColor;
@ -49,27 +57,45 @@ public abstract class ThemeBaseActivity extends AppCompatActivity implements Kab
}
}
protected void setStatusBarTranslucent(boolean statusBarTranslucent) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
Util.setStatusBarTranslucent(getWindow(), statusBarTranslucent);
public int getThemeColorPrimary() {
return colorPrimary;
}
public int getThemeColorPrimaryDarker() {
return colorPrimaryDarker;
}
public int getThemeColorAccent() {
return colorAccent;
}
protected void setStatusBarTransparent() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
Util.setAllowDrawUnderStatusBar(getWindow());
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
Util.setStatusBarTranslucent(getWindow(), true);
}
protected final void setNavigationBarColor(int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
getWindow().setNavigationBarColor(color);
getWindow().setNavigationBarColor(Util.shiftColorDown(color));
}
protected final void setStatusBarColor(int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
getWindow().setStatusBarColor(color);
getWindow().setStatusBarColor(Util.shiftColorDown(color));
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
final View statusBar = getWindow().getDecorView().getRootView().findViewById(R.id.status_bar);
if (statusBar != null) statusBar.setBackgroundColor(color);
}
}
protected final void setNavigationBarThemeColor() {
setNavigationBarColor(PreferenceUtils.getInstance(this).getThemeColorPrimaryDarker());
setNavigationBarColor(colorPrimary);
}
protected final void setStatusBarThemeColor() {
setStatusBarColor(PreferenceUtils.getInstance(this).getThemeColorPrimaryDarker());
setStatusBarColor(colorPrimary);
}
protected final void resetNavigationBarColor() {

View file

@ -24,7 +24,6 @@ import com.afollestad.materialdialogs.util.DialogUtils;
import com.github.ksoichiro.android.observablescrollview.ObservableScrollView;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.ColorChooserDialog;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks;
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
@ -255,8 +254,8 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
header.setBackgroundColor(paletteColorPrimary);
setStatusBarColor(paletteColorPrimary);
if (Util.isAtLeastLollipop() && PreferenceUtils.getInstance(this).coloredNavigationBarTagEditorEnabled())
setNavigationBarColor(ColorChooserDialog.shiftColorDown(paletteColorPrimary));
if (PreferenceUtils.getInstance(this).coloredNavigationBarTagEditorEnabled())
setNavigationBarColor(paletteColorPrimary);
}
protected void dataChanged() {

View file

@ -1,182 +0,0 @@
package com.kabouzeid.gramophone.ui.fragments;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.NavigationDrawerItemAdapter;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.NavigationDrawerItem;
import java.util.ArrayList;
public class NavigationDrawerFragment extends Fragment {
public static final int NAVIGATION_DRAWER_HEADER = -1;
public static final int ABOUT_INDEX = 5;
public static final int SETTINGS_INDEX = 4;
private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";
public View fragmentRootView;
private NavigationDrawerCallbacks callbacks;
private NavigationDrawerItemAdapter drawerAdapter;
private DrawerLayout drawerLayout;
private RecyclerView drawerRecyclerView;
private View headerButton;
private ImageView albumArt;
private TextView songTitle;
private TextView songArtist;
private boolean fromSavedInstanceState;
private boolean userLearnedDrawer;
private int checkedPosition = 0;
public NavigationDrawerFragment() {
}
public boolean isDrawerOpen() {
return drawerLayout != null && drawerLayout.isDrawerOpen(Gravity.START);
}
public void setUp(final DrawerLayout drawerLayout) {
this.drawerLayout = drawerLayout;
this.drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
if (!userLearnedDrawer && !fromSavedInstanceState) {
this.drawerLayout.openDrawer(Gravity.START);
userLearnedDrawer = true;
PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().putBoolean(AppKeys.SP_USER_LEARNED_DRAWER, true).apply();
}
}
public TextView getSongArtist() {
return songArtist;
}
public ImageView getAlbumArtImageView() {
return albumArt;
}
public TextView getSongTitle() {
return songTitle;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
callbacks = (NavigationDrawerCallbacks) activity;
} catch (ClassCastException e) {
throw new ClassCastException("Activity must implement NavigationDrawerCallbacks.");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
userLearnedDrawer = PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean(AppKeys.SP_USER_LEARNED_DRAWER, false);
if (savedInstanceState != null) {
setItemChecked(savedInstanceState.getInt(STATE_SELECTED_POSITION));
fromSavedInstanceState = true;
}
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.navigation_drawer_header, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
fragmentRootView = view;
super.onViewCreated(view, savedInstanceState);
initViews();
setUpViews();
}
private void initViews() {
// drawerRecyclerView = (RecyclerView) fragmentRootView.findViewById(R.id.navigation_drawer_list);
// final View drawerHeader = fragmentRootView.findViewById(R.id.header);
// headerButton = (View) drawerHeader.findViewById(R.id.header_clickable);
// albumArt = (ImageView) drawerHeader.findViewById(R.id.album_art);
// songTitle = (TextView) drawerHeader.findViewById(R.id.song_title);
// songArtist = (TextView) drawerHeader.findViewById(R.id.song_artist);
}
private void setUpViews() {
headerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectItem(NAVIGATION_DRAWER_HEADER);
}
});
setUpListView();
}
private void setUpListView() {
final ArrayList<NavigationDrawerItem> navigationDrawerItems = new ArrayList<>();
navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.songs), R.drawable.ic_audiotrack_white_24dp));
navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.albums), R.drawable.ic_album_white_24dp));
navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.artists), R.drawable.ic_person_white_24dp));
navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.playlists), R.drawable.ic_queue_music_white_24dp));
navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.action_settings), R.drawable.ic_settings_white_24dp));
navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.action_about), R.drawable.ic_help_white_24dp));
drawerAdapter = new NavigationDrawerItemAdapter(getActivity(), navigationDrawerItems, new NavigationDrawerItemAdapter.Callback() {
@Override
public void onItemSelected(int index) {
selectItem(index);
}
});
drawerRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
drawerRecyclerView.setAdapter(drawerAdapter);
}
private void selectItem(final int position) {
if (position != NAVIGATION_DRAWER_HEADER &&
position != ABOUT_INDEX && position != SETTINGS_INDEX) {
setItemChecked(position);
if (drawerLayout != null)
drawerLayout.closeDrawers();
}
if (callbacks != null)
callbacks.onNavigationDrawerItemSelected(position);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(STATE_SELECTED_POSITION, checkedPosition);
}
@Override
public void onDetach() {
super.onDetach();
callbacks = null;
}
public void setItemChecked(final int position) {
if (drawerAdapter != null) {
drawerAdapter.setChecked(position);
checkedPosition = position;
}
}
public interface NavigationDrawerCallbacks {
void onNavigationDrawerItemSelected(int position);
}
}

View file

@ -6,7 +6,6 @@ import android.support.v4.app.Fragment;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
import com.kabouzeid.gramophone.ui.activities.MainActivity;
import com.kabouzeid.gramophone.util.Util;
/**
* @author Karim Abou Zeid (kabouzeid)
@ -15,9 +14,7 @@ public abstract class AbsMainActivityFragment extends Fragment implements KabVie
private boolean areViewsEnabled;
protected int getTopPadding() {
return Util.getActionBarSize(getActivity()) +
getResources().getDimensionPixelSize(R.dimen.tab_height) +
getResources().getDimensionPixelSize(R.dimen.list_padding_vertical);
return getResources().getDimensionPixelSize(R.dimen.list_padding_vertical);
}
protected int getBottomPadding() {

View file

@ -6,7 +6,6 @@ import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.ColorChooserDialog;
import java.util.HashSet;
import java.util.Set;
@ -33,7 +32,6 @@ public final class PreferenceUtils {
public static final String COLORED_NAVIGATION_BAR_PLAYIST = "colored_navigation_bar_playlist";
public static final String COLORED_NAVIGATION_BAR_TAG_EDITOR = "colored_navigation_bar_tag_editor";
public static final String COLORED_NAVIGATION_BAR_OTHER_SCREENS = "colored_navigation_bar_other_screens";
public static final String TRANSPARENT_TOOLBAR = "transparent_toolbar";
public static final String ALBUM_GRID_COLUMNS = "album_grid_columns";
public static final String ALBUM_GRID_COLUMNS_LAND = "album_grid_columns_land";
public static final String OPAQUE_TOOLBAR_NOW_PLAYING = "opaque_toolbar_now_playing";
@ -72,7 +70,7 @@ public final class PreferenceUtils {
}
public int getThemeColorPrimaryDarker() {
return ColorChooserDialog.shiftColorDown(getThemeColorPrimary());
return Util.shiftColorDown(getThemeColorPrimary());
}
@SuppressLint("CommitPrefEdits")
@ -161,10 +159,6 @@ public final class PreferenceUtils {
// mPreferences.edit().putBoolean(COLORED_NAVIGATION_BAR_OTHER_SCREENS, coloredNavbar).commit();
// }
public final boolean transparentToolbar() {
return mPreferences.getBoolean(TRANSPARENT_TOOLBAR, false);
}
public final boolean opaqueToolbarNowPlaying() {
return mPreferences.getBoolean(OPAQUE_TOOLBAR_NOW_PLAYING, false);
}

View file

@ -3,8 +3,10 @@ package com.kabouzeid.gramophone.util;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Build;
@ -107,6 +109,12 @@ public class Util {
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
public static void setAllowDrawUnderStatusBar(Window window) {
window.getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
// public static boolean isOnline(final Context context) {
// if (context == null)
// return false;
@ -203,7 +211,31 @@ public class Util {
return drawable;
}
public static int getColorWithoutAlpha(@ColorInt int color) {
public static int getOpaqueColor(@ColorInt int color) {
return color | 0xFF000000;
}
public static int getColorWithAlpha(float alpha, int baseColor) {
int a = Math.min(255, Math.max(0, (int) (alpha * 255))) << 24;
int rgb = 0x00ffffff & baseColor;
return a + rgb;
}
@SuppressWarnings("ResourceType")
public static int shiftColorDown(int color) {
int alpha = Color.alpha(color);
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
hsv[2] *= 0.9f; // value component
return (alpha << 24) + (0x00ffffff & Color.HSVToColor(hsv));
}
public static ColorStateList getEmptyColorStateList(int color) {
return new ColorStateList(
new int[][]{
new int[]{}
},
new int[]{color}
);
}
}

View file

@ -13,8 +13,9 @@ import android.util.AttributeSet;
import android.widget.FrameLayout;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.Util;
public class CircleView extends FrameLayout {
public class ColorView extends FrameLayout {
private final Bitmap mCheck;
private final Paint paint;
@ -22,19 +23,19 @@ public class CircleView extends FrameLayout {
private Paint paintCheck;
private final int borderWidth;
public CircleView(Context context) {
public ColorView(Context context) {
this(context, null, 0);
}
public CircleView(Context context, AttributeSet attrs) {
public ColorView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
public ColorView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
final int checkSize = (int) context.getResources().getDimension(R.dimen.circle_view_check);
mCheck = getResizedBitmap(BitmapFactory.decodeResource(context.getResources(),
R.drawable.ic_check_white_24dp), checkSize, checkSize);
R.drawable.ic_checkbox_marked_circle_outline_white_24dp), checkSize, checkSize);
borderWidth = (int) getResources().getDimension(R.dimen.circle_view_border);
paint = new Paint();
@ -42,7 +43,6 @@ public class CircleView extends FrameLayout {
paintBorder = new Paint();
paintBorder.setAntiAlias(true);
paintBorder.setColor(Color.BLACK);
setWillNotDraw(false);
}
@ -64,12 +64,7 @@ public class CircleView extends FrameLayout {
@Override
public void setBackgroundColor(int color) {
paint.setColor(color);
requestLayout();
invalidate();
}
public void setBorderColor(int color) {
paintBorder.setColor(color);
paintBorder.setColor(Util.shiftColorDown(color));
requestLayout();
invalidate();
}