Support for light colors. The appbar will now automatically change its text and icon color to be visible on light theme colors.

This commit is contained in:
Karim Abou Zeid 2015-08-27 16:43:31 +02:00
commit 1be0d305b1
14 changed files with 271 additions and 146 deletions

View file

@ -28,6 +28,7 @@
<h3>Version 0.9.44 beta4</h3> <h3>Version 0.9.44 beta4</h3>
<ol> <ol>
<li><b>NEW:</b> Support for light colors. The appbar will now automatically change its text and icon color to be visible on light theme colors.</li>
<li><b>FIX:</b> Play/pause button offset too far to the right in landscape mode.</li> <li><b>FIX:</b> Play/pause button offset too far to the right in landscape mode.</li>
</ol> </ol>

View file

@ -51,7 +51,6 @@ 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;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.kabouzeid.gramophone.views.SquareIfPlaceImageView; import com.kabouzeid.gramophone.views.SquareIfPlaceImageView;
import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;

View file

@ -14,7 +14,6 @@ import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.support.annotation.ColorInt;
import android.support.annotation.LayoutRes; import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
@ -65,6 +64,7 @@ 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.ui.fragments.mainactivityfragments.AbsMainActivityFragment; import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityRecyclerViewLayoutModeFragment; import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityRecyclerViewLayoutModeFragment;
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.PreferenceUtil; import com.kabouzeid.gramophone.util.PreferenceUtil;
@ -75,8 +75,6 @@ import com.nostra13.universalimageloader.core.ImageLoader;
import com.sothree.slidinguppanel.SlidingUpPanelLayout; import com.sothree.slidinguppanel.SlidingUpPanelLayout;
import java.io.File; import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -154,7 +152,8 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
navigationView.getMenu().getItem(startPosition).setChecked(true); navigationView.getMenu().getItem(startPosition).setChecked(true);
tabs.setupWithViewPager(pager); tabs.setupWithViewPager(pager);
setUpTabStripColor(getThemeColorAccent() == Color.WHITE ? Color.WHITE : ThemeSingleton.get().positiveColor.getDefaultColor()); tabs.setTabTextColors(ColorUtil.getSecondaryTextColorForBackground(this, getThemeColorPrimary()), ColorUtil.getPrimaryTextColorForBackground(this, getThemeColorPrimary()));
tabs.setSelectedTabIndicatorColor(getThemeColorAccent() == Color.WHITE && !ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary()) ? Color.WHITE : ThemeSingleton.get().positiveColor.getDefaultColor());
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override @Override
@ -176,21 +175,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
pager.setCurrentItem(startPosition); pager.setCurrentItem(startPosition);
} }
private void setUpTabStripColor(@ColorInt int color) {
// use reflection to set the selected indicator color
try {
Field tabStripField = tabs.getClass().getDeclaredField("mTabStrip");
tabStripField.setAccessible(true);
Object tabStrip = tabStripField.get(tabs);
Method setSelectedIndicatorColorMethod = tabStrip.getClass().getDeclaredMethod("setSelectedIndicatorColor", Integer.TYPE);
setSelectedIndicatorColorMethod.setAccessible(true);
setSelectedIndicatorColorMethod.invoke(tabStrip, color);
} catch (Exception e) {
e.printStackTrace();
}
}
private void setUpToolbar() { private void setUpToolbar() {
toolbar.setNavigationIcon(R.drawable.ic_menu_white_24dp); toolbar.setNavigationIcon(R.drawable.ic_menu_white_24dp);
setTitle(getResources().getString(R.string.app_name)); setTitle(getResources().getString(R.string.app_name));
@ -361,6 +345,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
} else { } else {
menu.removeItem(R.id.action_view_as); menu.removeItem(R.id.action_view_as);
} }
ViewUtil.setToolbarContentColorForBackground(this, toolbar, getThemeColorPrimary());
return true; return true;
} }

View file

@ -25,8 +25,10 @@ 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.PlaylistsUtil; import com.kabouzeid.gramophone.util.PlaylistsUtil;
import com.kabouzeid.gramophone.util.ViewUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -159,6 +161,7 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_playlist_detail, menu); getMenuInflater().inflate(R.menu.menu_playlist_detail, menu);
ViewUtil.setToolbarContentColorForBackground(this, toolbar, getThemeColorPrimary());
return true; return true;
} }

View file

@ -1,28 +1,30 @@
package com.kabouzeid.gramophone.ui.activities; package com.kabouzeid.gramophone.ui.activities;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.graphics.Color;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.Menu; import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.SearchAdapter; import com.kabouzeid.gramophone.adapter.SearchAdapter;
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.util.ViewUtil;
import butterknife.Bind; import butterknife.Bind;
import butterknife.ButterKnife; import butterknife.ButterKnife;
@ -34,15 +36,16 @@ public class SearchActivity extends AbsMusicServiceActivity {
RecyclerView recyclerView; RecyclerView recyclerView;
@Bind(R.id.toolbar) @Bind(R.id.toolbar)
Toolbar toolbar; Toolbar toolbar;
@Bind(R.id.search_src_text)
EditText searchSrcText;
@Bind(R.id.search_close_btn)
ImageView searchCloseBtn;
@SuppressWarnings("ButterKnifeNoViewWithId") @SuppressWarnings("ButterKnifeNoViewWithId")
@Bind(android.R.id.empty) @Bind(android.R.id.empty)
TextView empty; TextView empty;
private SearchView searchView;
private SearchAdapter searchAdapter; private SearchAdapter searchAdapter;
private String searchQuery = "";
@SuppressLint("NewApi") @SuppressLint("NewApi")
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -59,23 +62,75 @@ public class SearchActivity extends AbsMusicServiceActivity {
@Override @Override
public boolean onTouch(View v, MotionEvent event) { public boolean onTouch(View v, MotionEvent event) {
Util.hideSoftKeyboard(SearchActivity.this); Util.hideSoftKeyboard(SearchActivity.this);
if (searchView != null) { searchSrcText.clearFocus();
searchView.clearFocus();
}
return false; return false;
} }
}); });
toolbar.setBackgroundColor(getThemeColorPrimary()); setUpToolBar();
setSupportActionBar(toolbar); setUpSearchBar();
//noinspection ConstantConditions
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (shouldColorNavigationBar()) if (shouldColorNavigationBar())
setNavigationBarThemeColor(); setNavigationBarThemeColor();
setStatusBarThemeColor(); setStatusBarThemeColor();
} }
private void setUpToolBar() {
setSupportActionBar(toolbar);
//noinspection ConstantConditions
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setBackgroundColor(getThemeColorPrimary());
Drawable navigationIcon = toolbar.getNavigationIcon();
if (navigationIcon != null) {
navigationIcon = navigationIcon.mutate();
navigationIcon.setColorFilter(ViewUtil.getToolbarIconColor(this, ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary())), PorterDuff.Mode.SRC_IN);
toolbar.setNavigationIcon(navigationIcon);
}
}
private void setUpSearchBar() {
searchCloseBtn.setColorFilter(ViewUtil.getToolbarIconColor(this, ColorUtil.useDarkTextColorOnBackground(getThemeColorPrimary())), PorterDuff.Mode.SRC_IN);
searchCloseBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
searchSrcText.setText("");
}
});
searchSrcText.setTextColor(ColorUtil.getPrimaryTextColorForBackground(this, getThemeColorPrimary()));
searchSrcText.setHintTextColor(ColorUtil.getSecondaryTextColorForBackground(this, getThemeColorPrimary()));
searchSrcText.setHint(R.string.search_hint);
searchSrcText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
search(searchSrcText.getText().toString());
}
});
searchSrcText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
search(searchSrcText.getText().toString());
return true;
}
return false;
}
});
}
@Override @Override
public void enableViews() { public void enableViews() {
super.enableViews(); super.enableViews();
@ -89,58 +144,14 @@ public class SearchActivity extends AbsMusicServiceActivity {
} }
@Override @Override
public boolean onCreateOptionsMenu(@NonNull Menu menu) { public boolean onOptionsItemSelected(MenuItem item) {
getMenuInflater().inflate(R.menu.menu_search, menu); if (item.getItemId() == android.R.id.home) {
super.onBackPressed();
final MenuItem search = menu.findItem(R.id.action_search); }
searchView = (SearchView) MenuItemCompat.getActionView(search); return super.onOptionsItemSelected(item);
searchView.setIconified(false);
searchView.setIconifiedByDefault(false);
searchView.setQueryHint(getString(R.string.search_hint));
View searchViewPlate = searchView.findViewById(android.support.v7.appcompat.R.id.search_plate);
Drawable drawable = ContextCompat.getDrawable(this, R.drawable.abc_textfield_search_activated_mtrl_alpha);
drawable.setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.SRC_IN);
searchViewPlate.setBackground(drawable);
ActionBar.LayoutParams params = new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.MATCH_PARENT);
searchView.setLayoutParams(params);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(@NonNull String query) {
onQueryTextChange(query);
Util.hideSoftKeyboard(SearchActivity.this);
searchView.clearFocus();
return true;
}
@Override
public boolean onQueryTextChange(@NonNull String newText) {
search(newText);
return false;
}
});
MenuItemCompat.setOnActionExpandListener(search, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
finish();
return false;
}
});
MenuItemCompat.expandActionView(search);
return true;
} }
private void search(@NonNull String query) { private void search(@NonNull String query) {
searchQuery = query;
if (searchAdapter != null) { if (searchAdapter != null) {
searchAdapter.search(query); searchAdapter.search(query);
empty.setVisibility(searchAdapter.getItemCount() < 1 ? View.VISIBLE : View.GONE); empty.setVisibility(searchAdapter.getItemCount() < 1 ? View.VISIBLE : View.GONE);
@ -150,6 +161,6 @@ public class SearchActivity extends AbsMusicServiceActivity {
@Override @Override
public void onMediaStoreChanged() { public void onMediaStoreChanged() {
super.onMediaStoreChanged(); super.onMediaStoreChanged();
search(searchQuery); search(searchSrcText.getText().toString());
} }
} }

View file

@ -14,6 +14,7 @@ import android.support.annotation.ColorInt;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
@ -22,20 +23,28 @@ import com.kabouzeid.gramophone.dialogs.ColorChooserDialog;
import com.kabouzeid.gramophone.helper.ColorPalette; import com.kabouzeid.gramophone.helper.ColorPalette;
import com.kabouzeid.gramophone.prefs.ColorChooserPreference; import com.kabouzeid.gramophone.prefs.ColorChooserPreference;
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.NavigationUtil; import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.PreferenceUtil;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;
import butterknife.Bind;
import butterknife.ButterKnife;
public class SettingsActivity extends AbsBaseActivity implements ColorChooserDialog.ColorCallback { public class SettingsActivity extends AbsBaseActivity implements ColorChooserDialog.ColorCallback {
public static final String TAG = SettingsActivity.class.getSimpleName(); public static final String TAG = SettingsActivity.class.getSimpleName();
@Bind(R.id.toolbar)
Toolbar toolbar;
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_preferences); setContentView(R.layout.activity_preferences);
setStatusBarTransparent(); setStatusBarTransparent();
ButterKnife.bind(this);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setBackgroundColor(getThemeColorPrimary()); toolbar.setBackgroundColor(getThemeColorPrimary());
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
//noinspection ConstantConditions //noinspection ConstantConditions
@ -71,6 +80,12 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
ViewUtil.setToolbarContentColorForBackground(this, toolbar, getThemeColorPrimary());
return super.onCreateOptionsMenu(menu);
}
public static class SettingsFragment extends PreferenceFragment { public static class SettingsFragment extends PreferenceFragment {
private static void setSummary(@NonNull Preference preference) { private static void setSummary(@NonNull Preference preference) {

View file

@ -12,6 +12,7 @@ import android.content.res.ColorStateList;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
@ -846,8 +847,9 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
private void updatePlayerMenu() { private void updatePlayerMenu() {
boolean isFavorite = MusicUtil.isFavorite(this, song); boolean isFavorite = MusicUtil.isFavorite(this, song);
Drawable favoriteIcon = Util.getTintedDrawable(this, isFavorite ? R.drawable.ic_favorite_white_24dp : R.drawable.ic_favorite_outline_white_24dp, ViewUtil.getToolbarIconColor(this, opaqueToolBar && ColorUtil.useDarkTextColorOnBackground(lastFooterColor)));
playerToolbar.getMenu().findItem(R.id.action_toggle_favorite) playerToolbar.getMenu().findItem(R.id.action_toggle_favorite)
.setIcon(isFavorite ? R.drawable.ic_favorite_white_24dp : R.drawable.ic_favorite_outline_white_24dp) .setIcon(favoriteIcon)
.setTitle(isFavorite ? getString(R.string.action_remove_from_favorites) : getString(R.string.action_add_to_favorites)); .setTitle(isFavorite ? getString(R.string.action_remove_from_favorites) : getString(R.string.action_add_to_favorites));
} }
@ -954,8 +956,10 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
if (opaqueToolBar) { if (opaqueToolBar) {
animatorSetBuilder.with(ViewUtil.createBackgroundColorTransition(playerToolbar, lastFooterColor, newColor)); animatorSetBuilder.with(ViewUtil.createBackgroundColorTransition(playerToolbar, lastFooterColor, newColor));
ViewUtil.setToolbarContentColorForBackground(this, playerToolbar, newColor);
} else { } else {
playerToolbar.setBackgroundColor(Color.TRANSPARENT); playerToolbar.setBackgroundColor(Color.TRANSPARENT);
ViewUtil.setToolbarContentDark(this, playerToolbar, false);
} }
if (opaqueStatusBar) { if (opaqueStatusBar) {
@ -1159,7 +1163,7 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
@Override @Override
public void set(FloatingActionButton object, Integer value) { public void set(FloatingActionButton object, Integer value) {
object.setBackgroundTintList(ColorStateList.valueOf(value)); object.setBackgroundTintList(ColorStateList.valueOf(value));
object.getDrawable().setColorFilter(ColorUtil.getFabDrawableColorForBackground(object.getContext(), value), PorterDuff.Mode.SRC_IN); object.getDrawable().setColorFilter(ColorUtil.getPrimaryTextColorForBackground(object.getContext(), value), PorterDuff.Mode.SRC_IN);
} }
@Override @Override

View file

@ -17,6 +17,7 @@ import android.support.design.widget.FloatingActionButton;
import android.support.v7.graphics.Palette; import android.support.v7.graphics.Palette;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.util.Log; import android.util.Log;
import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.animation.OvershootInterpolator; import android.view.animation.OvershootInterpolator;
@ -32,6 +33,7 @@ import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
import com.kabouzeid.gramophone.util.ColorUtil; 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.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;
import org.jaudiotagger.audio.AudioFile; import org.jaudiotagger.audio.AudioFile;
@ -192,7 +194,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
}); });
int fabColor = getThemeColorAccent(); int fabColor = getThemeColorAccent();
int fabDrawableColor = ColorUtil.getFabDrawableColorForBackground(this, fabColor); int fabDrawableColor = ColorUtil.getPrimaryTextColorForBackground(this, fabColor);
fab.setBackgroundTintList(ColorStateList.valueOf(fabColor)); fab.setBackgroundTintList(ColorStateList.valueOf(fabColor));
fab.getDrawable().setColorFilter(fabDrawableColor, PorterDuff.Mode.SRC_IN); fab.getDrawable().setColorFilter(fabDrawableColor, PorterDuff.Mode.SRC_IN);
} }
@ -206,6 +208,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
if (shouldColorNavigationBar()) if (shouldColorNavigationBar())
setNavigationBarColor(paletteColorPrimary); setNavigationBarColor(paletteColorPrimary);
header.setBackgroundColor(paletteColorPrimary); header.setBackgroundColor(paletteColorPrimary);
ViewUtil.setToolbarContentColorForBackground(this, toolbar, paletteColorPrimary);
notifyTaskColorChange(paletteColorPrimary); notifyTaskColorChange(paletteColorPrimary);
} }
@ -245,6 +248,11 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
ViewUtil.setToolbarContentColorForBackground(this, toolbar, paletteColorPrimary);
return super.onCreateOptionsMenu(menu);
}
protected void setNoImageMode() { protected void setNoImageMode() {
isInNoImageMode = true; isInNoImageMode = true;
@ -305,6 +313,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
setNavigationBarColor(paletteColorPrimary); setNavigationBarColor(paletteColorPrimary);
setStatusBarColor(paletteColorPrimary); setStatusBarColor(paletteColorPrimary);
header.setBackgroundColor(paletteColorPrimary); header.setBackgroundColor(paletteColorPrimary);
ViewUtil.setToolbarContentColorForBackground(AbsTagEditorActivity.this, toolbar, paletteColorPrimary);
notifyTaskColorChange(paletteColorPrimary); notifyTaskColorChange(paletteColorPrimary);
} else { } else {
resetColors(); resetColors();

View file

@ -109,11 +109,7 @@ public class ColorUtil {
} }
public static boolean useDarkTextColorOnBackground(@ColorInt int backgroundColor) { public static boolean useDarkTextColorOnBackground(@ColorInt int backgroundColor) {
return getLuminance(backgroundColor) > (255f / 2f); return getLuminance(backgroundColor) > (255f / 1.5f);
}
public static boolean useDarkFabDrawableOnBackground(@ColorInt int backgroundColor) {
return getLuminance(backgroundColor) > (255f / 1.3f);
} }
@ColorInt @ColorInt
@ -125,9 +121,4 @@ public class ColorUtil {
public static int getSecondaryTextColorForBackground(final Context context, @ColorInt int backgroundColor) { public static int getSecondaryTextColorForBackground(final Context context, @ColorInt int backgroundColor) {
return getSecondaryTextColor(context, useDarkTextColorOnBackground(backgroundColor)); return getSecondaryTextColor(context, useDarkTextColorOnBackground(backgroundColor));
} }
@ColorInt
public static int getFabDrawableColorForBackground(final Context context, @ColorInt int backgroundColor) {
return getPrimaryTextColor(context, useDarkFabDrawableOnBackground(backgroundColor));
}
} }

View file

@ -3,7 +3,11 @@ package com.kabouzeid.gramophone.util;
import android.animation.Animator; import android.animation.Animator;
import android.animation.ArgbEvaluator; import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Build; import android.os.Build;
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v7.internal.view.menu.ListMenuItemView; import android.support.v7.internal.view.menu.ListMenuItemView;
@ -11,20 +15,25 @@ import android.support.v7.internal.view.menu.MenuPopupHelper;
import android.support.v7.widget.ActionMenuPresenter; import android.support.v7.widget.ActionMenuPresenter;
import android.support.v7.widget.ActionMenuView; import android.support.v7.widget.ActionMenuView;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewTreeObserver; import android.view.ViewTreeObserver;
import android.view.animation.PathInterpolator; import android.view.animation.PathInterpolator;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView; import android.widget.ListView;
import android.widget.RadioButton; import android.widget.RadioButton;
import android.widget.TextView; import android.widget.TextView;
import com.afollestad.materialdialogs.ThemeSingleton; import com.afollestad.materialdialogs.ThemeSingleton;
import com.afollestad.materialdialogs.internal.MDTintHelper; import com.afollestad.materialdialogs.internal.MDTintHelper;
import com.kabouzeid.gramophone.R;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.ArrayList;
/** /**
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
@ -62,7 +71,8 @@ public class ViewUtil {
* *
* @param toolbar the toolbar to apply the tint on * @param toolbar the toolbar to apply the tint on
*/ */
public static void invalidateToolbarPopupMenuTint(@NonNull final Toolbar toolbar) { public static void invalidateToolbarPopupMenuTint(@Nullable final Toolbar toolbar) {
if (toolbar == null) return;
toolbar.post(new Runnable() { toolbar.post(new Runnable() {
@Override @Override
public void run() { public void run() {
@ -92,49 +102,106 @@ public class ViewUtil {
} }
public static void setTintForMenuPopupHelper(@Nullable MenuPopupHelper menuPopupHelper) { public static void setTintForMenuPopupHelper(@Nullable MenuPopupHelper menuPopupHelper) {
if (menuPopupHelper != null) { if (menuPopupHelper == null) return;
final ListView listView = menuPopupHelper.getPopup().getListView(); final ListView listView = menuPopupHelper.getPopup().getListView();
listView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { listView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override @Override
public void onGlobalLayout() { public void onGlobalLayout() {
try { try {
Field checkboxField = ListMenuItemView.class.getDeclaredField("mCheckBox"); Field checkboxField = ListMenuItemView.class.getDeclaredField("mCheckBox");
checkboxField.setAccessible(true); checkboxField.setAccessible(true);
Field radioButtonField = ListMenuItemView.class.getDeclaredField("mRadioButton"); Field radioButtonField = ListMenuItemView.class.getDeclaredField("mRadioButton");
radioButtonField.setAccessible(true); radioButtonField.setAccessible(true);
for (int i = 0; i < listView.getChildCount(); i++) { for (int i = 0; i < listView.getChildCount(); i++) {
View v = listView.getChildAt(i); View v = listView.getChildAt(i);
if (!(v instanceof ListMenuItemView)) continue; if (!(v instanceof ListMenuItemView)) continue;
ListMenuItemView iv = (ListMenuItemView) v; ListMenuItemView iv = (ListMenuItemView) v;
CheckBox check = (CheckBox) checkboxField.get(iv); CheckBox check = (CheckBox) checkboxField.get(iv);
if (check != null) { if (check != null) {
MDTintHelper.setTint(check, ThemeSingleton.get().positiveColor.getDefaultColor()); MDTintHelper.setTint(check, ThemeSingleton.get().positiveColor.getDefaultColor());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
check.setBackground(null); check.setBackground(null);
}
} }
}
RadioButton radioButton = (RadioButton) radioButtonField.get(iv); RadioButton radioButton = (RadioButton) radioButtonField.get(iv);
if (radioButton != null) { if (radioButton != null) {
MDTintHelper.setTint(radioButton, ThemeSingleton.get().positiveColor.getDefaultColor()); MDTintHelper.setTint(radioButton, ThemeSingleton.get().positiveColor.getDefaultColor());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
radioButton.setBackground(null); radioButton.setBackground(null);
}
} }
} }
} catch (Throwable e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
listView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
//noinspection deprecation
listView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
} }
} catch (Throwable e) {
e.printStackTrace();
} }
}); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
listView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
//noinspection deprecation
listView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
}
public static void setToolbarContentColorForBackground(@NonNull Context context, @Nullable Toolbar toolbar, @ColorInt final int backgroundColor) {
ViewUtil.setToolbarContentDark(context, toolbar, ColorUtil.useDarkTextColorOnBackground(backgroundColor));
}
public static void setToolbarContentDark(@NonNull Context context, @Nullable Toolbar toolbar, boolean dark) {
if (toolbar == null) return;
toolbar.setTitleTextColor(ColorUtil.getPrimaryTextColor(context, dark));
toolbar.setSubtitleTextColor(ColorUtil.getSecondaryTextColor(context, dark));
setToolbarIconColor(context, toolbar, getToolbarIconColor(context, dark));
}
public static int getToolbarIconColor(Context context, boolean dark) {
if (dark) {
return ColorUtil.getSecondaryTextColor(context, true);
} else {
return ColorUtil.getPrimaryTextColor(context, false);
} }
} }
public static void setToolbarIconColor(@NonNull final Context context, @Nullable final Toolbar toolbar, @ColorInt final int color) {
if (toolbar == null) return;
toolbar.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
toolbar.getViewTreeObserver().removeOnGlobalLayoutListener(this);
final ArrayList<View> outViews = new ArrayList<>();
final String overflowDescription = context.getString(R.string.abc_action_menu_overflow_description);
toolbar.findViewsWithText(outViews, overflowDescription, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
if (!outViews.isEmpty()) {
try {
ImageView overflowButton = (ImageView) outViews.get(0);
overflowButton.setColorFilter(color, PorterDuff.Mode.SRC_IN);
} catch (ClassCastException e) {
Log.e("setToolbarIconColor", "overflow button is not an ImageView", e);
}
}
Menu menu = toolbar.getMenu();
for (int i = 0; i < menu.size(); i++) {
MenuItem item = menu.getItem(i);
if (item.getIcon() != null) {
item.getIcon().setColorFilter(color, PorterDuff.Mode.SRC_IN);
}
}
Drawable navigationIcon = toolbar.getNavigationIcon();
if (navigationIcon != null) {
navigationIcon = navigationIcon.mutate();
navigationIcon.setColorFilter(color, PorterDuff.Mode.SRC_IN);
toolbar.setNavigationIcon(navigationIcon);
}
}
});
}
} }

View file

@ -7,7 +7,10 @@
<android.support.v7.widget.Toolbar <android.support.v7.widget.Toolbar
android:id="@+id/toolbar" android:id="@+id/toolbar"
style="@style/Toolbar" /> style="@style/Toolbar">
<include layout="@layout/search_bar" />
</android.support.v7.widget.Toolbar>
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="horizontal">
<EditText
android:id="@+id/search_src_text"
android:layout_width="0dp"
android:layout_height="36dip"
android:layout_gravity="bottom"
android:layout_weight="1"
android:background="@null"
android:ellipsize="end"
android:imeOptions="actionSearch"
android:inputType="text|textAutoComplete|textNoSuggestions"
android:minWidth="@dimen/abc_search_view_text_min_width"
android:paddingLeft="@dimen/abc_dropdownitem_text_padding_left"
android:paddingRight="@dimen/abc_dropdownitem_text_padding_right"
android:singleLine="true"
android:textCursorDrawable="@null"
tools:ignore="RtlHardcoded" />
<android.support.v7.internal.widget.TintImageView
android:id="@+id/search_close_btn"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/abc_searchview_description_clear"
android:focusable="true"
android:paddingLeft="8dip"
android:paddingRight="8dip"
android:src="@drawable/ic_close_white_24dp" />
</LinearLayout>

View file

@ -1,11 +0,0 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.kabouzeid.gramophone.ui.activities.SearchActivity">
<item
android:id="@+id/action_search"
android:icon="@drawable/abc_ic_search_api_mtrl_alpha"
android:title="@string/action_search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="ifRoom|collapseActionView" />
</menu>

View file

@ -23,8 +23,11 @@
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat</item> <item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat</item>
<!-- FOR EVERYWHERE WE CANT OVERRIDE THE ACCENT COLOR--> <!-- just in case-->
<item name="colorAccent">@android:color/white</item> <item name="colorAccent">@android:color/white</item>
<!-- necessary to find the overflow button later in the layout-->
<item name="android:actionOverflowButtonStyle">@style/Widget.ActionButton.Overflow</item>
</style> </style>
<style name="Theme.MaterialMusic.Base.Light" parent="Theme.AppCompat.Light.NoActionBar"> <style name="Theme.MaterialMusic.Base.Light" parent="Theme.AppCompat.Light.NoActionBar">
@ -48,8 +51,11 @@
<item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item> <item name="toolbarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
<!-- FOR EVERYWHERE WE CANT OVERRIDE THE ACCENT COLOR--> <!-- just in case-->
<item name="colorAccent">@android:color/black</item> <item name="colorAccent">@android:color/black</item>
<!-- necessary to find the overflow button later in the layout-->
<item name="android:actionOverflowButtonStyle">@style/Widget.ActionButton.Overflow</item>
</style> </style>
<style name="PlayPauseFabParent"> <style name="PlayPauseFabParent">
@ -83,4 +89,9 @@
<item name="android:focusableInTouchMode">false</item> <item name="android:focusableInTouchMode">false</item>
<item name="android:focusable">false</item> <item name="android:focusable">false</item>
</style> </style>
<!-- content description is necessary to find the overflow button later in the layout-->
<style name="Widget.ActionButton.Overflow" parent="Widget.AppCompat.ActionButton.Overflow">
<item name="android:contentDescription">@string/abc_action_menu_overflow_description</item>
</style>
</resources> </resources>