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>
<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>
</ol>

View file

@ -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;

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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());
}
}

View file

@ -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) {

View file

@ -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

View file

@ -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();

View file

@ -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));
}
}

View file

@ -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<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:id="@+id/toolbar"
style="@style/Toolbar" />
style="@style/Toolbar">
<include layout="@layout/search_bar" />
</android.support.v7.widget.Toolbar>
<FrameLayout
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>
<!-- FOR EVERYWHERE WE CANT OVERRIDE THE ACCENT COLOR-->
<!-- just in case-->
<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 name="Theme.MaterialMusic.Base.Light" parent="Theme.AppCompat.Light.NoActionBar">
@ -48,8 +51,11 @@
<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>
<!-- necessary to find the overflow button later in the layout-->
<item name="android:actionOverflowButtonStyle">@style/Widget.ActionButton.Overflow</item>
</style>
<style name="PlayPauseFabParent">
@ -83,4 +89,9 @@
<item name="android:focusableInTouchMode">false</item>
<item name="android:focusable">false</item>
</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>