diff --git a/app/src/main/assets/changelog.html b/app/src/main/assets/changelog.html index d8a41d15..a2048a69 100644 --- a/app/src/main/assets/changelog.html +++ b/app/src/main/assets/changelog.html @@ -28,6 +28,7 @@

Version 0.9.44 beta4

    +
  1. NEW: Support for light colors. The appbar will now automatically change its text and icon color to be visible on light theme colors.
  2. FIX: Play/pause button offset too far to the right in landscape mode.
diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index cc5b6ceb..6d77a661 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -51,7 +51,6 @@ import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.Util; -import com.kabouzeid.gramophone.util.ViewUtil; import com.kabouzeid.gramophone.views.SquareIfPlaceImageView; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index a23504d8..0b14aeac 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -14,7 +14,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.provider.MediaStore; -import android.support.annotation.ColorInt; import android.support.annotation.LayoutRes; import android.support.annotation.NonNull; 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.fragments.mainactivityfragments.AbsMainActivityFragment; 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.NavigationUtil; import com.kabouzeid.gramophone.util.PreferenceUtil; @@ -75,8 +75,6 @@ import com.nostra13.universalimageloader.core.ImageLoader; import com.sothree.slidinguppanel.SlidingUpPanelLayout; import java.io.File; -import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -154,7 +152,8 @@ public class MainActivity extends AbsSlidingMusicPanelActivity navigationView.getMenu().getItem(startPosition).setChecked(true); 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() { @Override @@ -176,21 +175,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity 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() { toolbar.setNavigationIcon(R.drawable.ic_menu_white_24dp); setTitle(getResources().getString(R.string.app_name)); @@ -361,6 +345,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity } else { menu.removeItem(R.id.action_view_as); } + ViewUtil.setToolbarContentColorForBackground(this, toolbar, getThemeColorPrimary()); return true; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java index b2dfc911..eb6ac6cc 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java @@ -25,8 +25,10 @@ import com.kabouzeid.gramophone.model.PlaylistSong; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist; 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.PlaylistsUtil; +import com.kabouzeid.gramophone.util.ViewUtil; import java.util.ArrayList; import java.util.List; @@ -159,6 +161,7 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_playlist_detail, menu); + ViewUtil.setToolbarContentColorForBackground(this, toolbar, getThemeColorPrimary()); return true; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java index 2c3ce8eb..e8092fde 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java @@ -1,28 +1,30 @@ package com.kabouzeid.gramophone.ui.activities; import android.annotation.SuppressLint; -import android.app.ActionBar; -import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.os.Bundle; 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.RecyclerView; -import android.support.v7.widget.SearchView; 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.MotionEvent; import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.EditText; +import android.widget.ImageView; import android.widget.TextView; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.SearchAdapter; 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.ViewUtil; import butterknife.Bind; import butterknife.ButterKnife; @@ -34,15 +36,16 @@ public class SearchActivity extends AbsMusicServiceActivity { RecyclerView recyclerView; @Bind(R.id.toolbar) Toolbar toolbar; + @Bind(R.id.search_src_text) + EditText searchSrcText; + @Bind(R.id.search_close_btn) + ImageView searchCloseBtn; @SuppressWarnings("ButterKnifeNoViewWithId") @Bind(android.R.id.empty) TextView empty; - private SearchView searchView; private SearchAdapter searchAdapter; - private String searchQuery = ""; - @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { @@ -59,23 +62,75 @@ public class SearchActivity extends AbsMusicServiceActivity { @Override public boolean onTouch(View v, MotionEvent event) { Util.hideSoftKeyboard(SearchActivity.this); - if (searchView != null) { - searchView.clearFocus(); - } + searchSrcText.clearFocus(); return false; } }); - toolbar.setBackgroundColor(getThemeColorPrimary()); - setSupportActionBar(toolbar); - //noinspection ConstantConditions - getSupportActionBar().setDisplayHomeAsUpEnabled(true); + setUpToolBar(); + setUpSearchBar(); if (shouldColorNavigationBar()) setNavigationBarThemeColor(); 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 public void enableViews() { super.enableViews(); @@ -89,58 +144,14 @@ public class SearchActivity extends AbsMusicServiceActivity { } @Override - public boolean onCreateOptionsMenu(@NonNull Menu menu) { - getMenuInflater().inflate(R.menu.menu_search, menu); - - final MenuItem search = menu.findItem(R.id.action_search); - searchView = (SearchView) MenuItemCompat.getActionView(search); - 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; + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + super.onBackPressed(); + } + return super.onOptionsItemSelected(item); } private void search(@NonNull String query) { - searchQuery = query; if (searchAdapter != null) { searchAdapter.search(query); empty.setVisibility(searchAdapter.getItemCount() < 1 ? View.VISIBLE : View.GONE); @@ -150,6 +161,6 @@ public class SearchActivity extends AbsMusicServiceActivity { @Override public void onMediaStoreChanged() { super.onMediaStoreChanged(); - search(searchQuery); + search(searchSrcText.getText().toString()); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java index 12615af3..a83388e4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java @@ -14,6 +14,7 @@ import android.support.annotation.ColorInt; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.Toolbar; +import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -22,20 +23,28 @@ import com.kabouzeid.gramophone.dialogs.ColorChooserDialog; import com.kabouzeid.gramophone.helper.ColorPalette; import com.kabouzeid.gramophone.prefs.ColorChooserPreference; 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.PreferenceUtil; +import com.kabouzeid.gramophone.util.ViewUtil; import com.nostra13.universalimageloader.core.ImageLoader; +import butterknife.Bind; +import butterknife.ButterKnife; + public class SettingsActivity extends AbsBaseActivity implements ColorChooserDialog.ColorCallback { public static final String TAG = SettingsActivity.class.getSimpleName(); + @Bind(R.id.toolbar) + Toolbar toolbar; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_preferences); setStatusBarTransparent(); + ButterKnife.bind(this); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setBackgroundColor(getThemeColorPrimary()); setSupportActionBar(toolbar); //noinspection ConstantConditions @@ -71,6 +80,12 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia 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 { private static void setSummary(@NonNull Preference preference) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java index 1f6ba258..a1c05725 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java @@ -12,6 +12,7 @@ import android.content.res.ColorStateList; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -846,8 +847,9 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi private void updatePlayerMenu() { 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) - .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)); } @@ -954,8 +956,10 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi if (opaqueToolBar) { animatorSetBuilder.with(ViewUtil.createBackgroundColorTransition(playerToolbar, lastFooterColor, newColor)); + ViewUtil.setToolbarContentColorForBackground(this, playerToolbar, newColor); } else { playerToolbar.setBackgroundColor(Color.TRANSPARENT); + ViewUtil.setToolbarContentDark(this, playerToolbar, false); } if (opaqueStatusBar) { @@ -1159,7 +1163,7 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi @Override public void set(FloatingActionButton object, Integer 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 diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java index 2c9a433a..6dd82839 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java @@ -17,6 +17,7 @@ import android.support.design.widget.FloatingActionButton; import android.support.v7.graphics.Palette; import android.support.v7.widget.Toolbar; import android.util.Log; +import android.view.Menu; import android.view.MenuItem; import android.view.View; 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.MusicUtil; import com.kabouzeid.gramophone.util.Util; +import com.kabouzeid.gramophone.util.ViewUtil; import com.nostra13.universalimageloader.core.ImageLoader; import org.jaudiotagger.audio.AudioFile; @@ -192,7 +194,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { }); int fabColor = getThemeColorAccent(); - int fabDrawableColor = ColorUtil.getFabDrawableColorForBackground(this, fabColor); + int fabDrawableColor = ColorUtil.getPrimaryTextColorForBackground(this, fabColor); fab.setBackgroundTintList(ColorStateList.valueOf(fabColor)); fab.getDrawable().setColorFilter(fabDrawableColor, PorterDuff.Mode.SRC_IN); } @@ -206,6 +208,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { if (shouldColorNavigationBar()) setNavigationBarColor(paletteColorPrimary); header.setBackgroundColor(paletteColorPrimary); + ViewUtil.setToolbarContentColorForBackground(this, toolbar, paletteColorPrimary); notifyTaskColorChange(paletteColorPrimary); } @@ -245,6 +248,11 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { return super.onOptionsItemSelected(item); } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + ViewUtil.setToolbarContentColorForBackground(this, toolbar, paletteColorPrimary); + return super.onCreateOptionsMenu(menu); + } protected void setNoImageMode() { isInNoImageMode = true; @@ -305,6 +313,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { setNavigationBarColor(paletteColorPrimary); setStatusBarColor(paletteColorPrimary); header.setBackgroundColor(paletteColorPrimary); + ViewUtil.setToolbarContentColorForBackground(AbsTagEditorActivity.this, toolbar, paletteColorPrimary); notifyTaskColorChange(paletteColorPrimary); } else { resetColors(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/ColorUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/ColorUtil.java index bb355b83..93f660d5 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/ColorUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/ColorUtil.java @@ -109,11 +109,7 @@ public class ColorUtil { } public static boolean useDarkTextColorOnBackground(@ColorInt int backgroundColor) { - return getLuminance(backgroundColor) > (255f / 2f); - } - - public static boolean useDarkFabDrawableOnBackground(@ColorInt int backgroundColor) { - return getLuminance(backgroundColor) > (255f / 1.3f); + return getLuminance(backgroundColor) > (255f / 1.5f); } @ColorInt @@ -125,9 +121,4 @@ public class ColorUtil { public static int getSecondaryTextColorForBackground(final Context context, @ColorInt int backgroundColor) { return getSecondaryTextColor(context, useDarkTextColorOnBackground(backgroundColor)); } - - @ColorInt - public static int getFabDrawableColorForBackground(final Context context, @ColorInt int backgroundColor) { - return getPrimaryTextColor(context, useDarkFabDrawableOnBackground(backgroundColor)); - } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java index c718f670..7254dcfc 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java @@ -3,7 +3,11 @@ package com.kabouzeid.gramophone.util; import android.animation.Animator; import android.animation.ArgbEvaluator; import android.animation.ObjectAnimator; +import android.content.Context; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; import android.os.Build; +import android.support.annotation.ColorInt; import android.support.annotation.NonNull; import android.support.annotation.Nullable; 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.ActionMenuView; import android.support.v7.widget.Toolbar; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewTreeObserver; import android.view.animation.PathInterpolator; import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.ImageView; import android.widget.ListView; import android.widget.RadioButton; import android.widget.TextView; import com.afollestad.materialdialogs.ThemeSingleton; import com.afollestad.materialdialogs.internal.MDTintHelper; +import com.kabouzeid.gramophone.R; import java.lang.reflect.Field; +import java.util.ArrayList; /** * @author Karim Abou Zeid (kabouzeid) @@ -62,7 +71,8 @@ public class ViewUtil { * * @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() { @Override public void run() { @@ -92,49 +102,106 @@ public class ViewUtil { } public static void setTintForMenuPopupHelper(@Nullable MenuPopupHelper menuPopupHelper) { - if (menuPopupHelper != null) { - final ListView listView = menuPopupHelper.getPopup().getListView(); - listView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - try { - Field checkboxField = ListMenuItemView.class.getDeclaredField("mCheckBox"); - checkboxField.setAccessible(true); - Field radioButtonField = ListMenuItemView.class.getDeclaredField("mRadioButton"); - radioButtonField.setAccessible(true); + if (menuPopupHelper == null) return; + final ListView listView = menuPopupHelper.getPopup().getListView(); + listView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + try { + Field checkboxField = ListMenuItemView.class.getDeclaredField("mCheckBox"); + checkboxField.setAccessible(true); + Field radioButtonField = ListMenuItemView.class.getDeclaredField("mRadioButton"); + radioButtonField.setAccessible(true); - for (int i = 0; i < listView.getChildCount(); i++) { - View v = listView.getChildAt(i); - if (!(v instanceof ListMenuItemView)) continue; - ListMenuItemView iv = (ListMenuItemView) v; + for (int i = 0; i < listView.getChildCount(); i++) { + View v = listView.getChildAt(i); + if (!(v instanceof ListMenuItemView)) continue; + ListMenuItemView iv = (ListMenuItemView) v; - CheckBox check = (CheckBox) checkboxField.get(iv); - if (check != null) { - MDTintHelper.setTint(check, ThemeSingleton.get().positiveColor.getDefaultColor()); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - check.setBackground(null); - } + CheckBox check = (CheckBox) checkboxField.get(iv); + if (check != null) { + MDTintHelper.setTint(check, ThemeSingleton.get().positiveColor.getDefaultColor()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + check.setBackground(null); } + } - RadioButton radioButton = (RadioButton) radioButtonField.get(iv); - if (radioButton != null) { - MDTintHelper.setTint(radioButton, ThemeSingleton.get().positiveColor.getDefaultColor()); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - radioButton.setBackground(null); - } + RadioButton radioButton = (RadioButton) radioButtonField.get(iv); + if (radioButton != null) { + MDTintHelper.setTint(radioButton, ThemeSingleton.get().positiveColor.getDefaultColor()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + 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 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); + } + } + }); + } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search.xml b/app/src/main/res/layout/activity_search.xml index 5bb2ee0a..10424356 100644 --- a/app/src/main/res/layout/activity_search.xml +++ b/app/src/main/res/layout/activity_search.xml @@ -7,7 +7,10 @@ + style="@style/Toolbar"> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_search.xml b/app/src/main/res/menu/menu_search.xml deleted file mode 100644 index c5cddfef..00000000 --- a/app/src/main/res/menu/menu_search.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/app/src/main/res/values/styles_parents.xml b/app/src/main/res/values/styles_parents.xml index 8fb6d07b..56f760fa 100644 --- a/app/src/main/res/values/styles_parents.xml +++ b/app/src/main/res/values/styles_parents.xml @@ -23,8 +23,11 @@ @style/ThemeOverlay.AppCompat - + @android:color/white + + + @style/Widget.ActionButton.Overflow + + + \ No newline at end of file