Added native image loader support for artist images. Automatically recreate activity onrResume when colors changed fixes issues #2 and #39. Also Butterknife should be used now everywhere #40

This commit is contained in:
Karim Abou Zeid 2015-07-14 04:08:43 +02:00
commit 8bdaf08a30
29 changed files with 485 additions and 521 deletions

View file

@ -9,7 +9,6 @@ import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.util.Pair;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.Toolbar;
import android.transition.Transition;
@ -49,13 +48,14 @@ import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import com.nostra13.universalimageloader.core.process.BitmapProcessor;
import butterknife.ButterKnife;
import butterknife.InjectView;
/**
* A lot of hackery is done in this activity. Changing things may will brake the whole activity.
* <p/>
* <p>
* Should be kinda stable ONLY AS IT IS!!!
*/
public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder {
@ -200,17 +200,24 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
.cacheInMemory(true)
.showImageOnFail(R.drawable.default_album_art)
.resetViewBeforeLoading(true)
.postProcessor(new BitmapProcessor() {
@Override
public Bitmap process(Bitmap bitmap) {
final int color = ColorUtil.generateColor(AlbumDetailActivity.this, bitmap);
runOnUiThread(new Runnable() {
@Override
public void run() {
setColors(color);
}
});
return bitmap;
}
})
.build(),
new SimpleImageLoadingListener() {
@Override
public void onLoadingFailed(String imageUri, View view, @Nullable FailReason failReason) {
applyPalette(null);
ImageLoader.getInstance().displayImage(
"drawable://" + R.drawable.default_album_art,
albumArtBackground,
new DisplayImageOptions.Builder().postProcessor(new BlurProcessor(10)).build()
);
setUpBackground("drawable://" + R.drawable.default_album_art);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
startPostponedEnterTransition();
@ -222,13 +229,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
onLoadingFailed(imageUri, view, null);
return;
}
applyPalette(loadedImage);
ImageLoader.getInstance().displayImage(
imageUri,
albumArtBackground,
new DisplayImageOptions.Builder().postProcessor(new BlurProcessor(10)).build()
);
setUpBackground(imageUri);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
startPostponedEnterTransition();
@ -237,23 +238,14 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
);
}
private void applyPalette(@Nullable Bitmap bitmap) {
final int defaultBarColor = ColorUtil.resolveColor(this, R.attr.default_bar_color);
if (bitmap != null) {
Palette.from(bitmap)
.resizeBitmapSize(100)
.generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(@NonNull Palette palette) {
setColors(palette.getVibrantColor(defaultBarColor));
}
});
} else {
setColors(defaultBarColor);
}
private void setUpBackground(String imageUri) {
ImageLoader.getInstance().displayImage(
imageUri,
albumArtBackground,
new DisplayImageOptions.Builder().postProcessor(new BlurProcessor(10)).build()
);
}
private void setColors(int vibrantColor) {
toolbarColor = vibrantColor;
albumTitleView.setBackgroundColor(vibrantColor);

View file

@ -4,12 +4,10 @@ import android.animation.Animator;
import android.annotation.TargetApi;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
@ -35,13 +33,11 @@ import com.kabouzeid.gramophone.adapter.album.HorizontalAlbumAdapter;
import com.kabouzeid.gramophone.adapter.song.ArtistSongAdapter;
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.bitmapblur.StackBlurManager;
import com.kabouzeid.gramophone.imageloader.BlurProcessor;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.interfaces.PaletteColorHolder;
import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient;
import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.ArtistInfo;
import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.Image;
import com.kabouzeid.gramophone.loader.ArtistAlbumLoader;
import com.kabouzeid.gramophone.loader.ArtistLoader;
import com.kabouzeid.gramophone.loader.ArtistSongLoader;
@ -60,19 +56,17 @@ import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import java.util.List;
import com.nostra13.universalimageloader.core.process.BitmapProcessor;
import butterknife.ButterKnife;
import butterknife.InjectView;
import hugo.weaving.DebugLog;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
/**
* A lot of hackery is done in this activity. Changing things may will brake the whole activity.
* <p/>
* <p>
* Should be kinda stable ONLY AS IT IS!!!
*/
public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder {
@ -113,8 +107,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
private LastFMRestClient lastFMRestClient;
private StackBlurManager defaultArtistImageBlurManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
setStatusBarTransparent();
@ -283,112 +275,54 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
}
private void setUpArtistImageAndApplyPalette(final boolean forceDownload) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
if (defaultArtistImageBlurManager == null) {
defaultArtistImageBlurManager = new StackBlurManager(BitmapFactory.decodeResource(getResources(), R.drawable.default_artist_image, options));
}
if (MusicUtil.isArtistNameUnknown(artist.name)) {
artistImage.setImageResource(R.drawable.default_artist_image);
resetPaletteAndArtistImageBackground();
return;
}
lastFMRestClient.getApiService().getArtistInfo(artist.name, forceDownload ? "no-cache" : null, new Callback<ArtistInfo>() {
@Override
public void success(@NonNull ArtistInfo artistInfo, Response response) {
if (artistInfo.getArtist() != null) {
List<Image> images = artistInfo.getArtist().getImage();
int lastElementIndex = images.size() - 1;
ImageLoader.getInstance().displayImage(images.get(lastElementIndex).getText(),
artistImage,
new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.showImageOnFail(R.drawable.default_artist_image)
.showImageForEmptyUri(R.drawable.default_artist_image)
.resetViewBeforeLoading(true)
.build(),
new SimpleImageLoadingListener() {
@DebugLog
@Override
public void onLoadingFailed(String imageUri, View view, @Nullable FailReason failReason) {
resetPaletteAndArtistImageBackground();
toastUpdatedArtistImageIfDownloadWasForced();
}
@DebugLog
@Override
public void onLoadingComplete(String imageUri, View view, @Nullable Bitmap loadedImage) {
if (loadedImage == null) {
onLoadingFailed(imageUri, view, null);
return;
ImageLoader.getInstance().displayImage(MusicUtil.getArtistImageLoaderString(artist, forceDownload),
artistImage,
new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.showImageOnFail(R.drawable.default_artist_image)
.resetViewBeforeLoading(true)
.postProcessor(new BitmapProcessor() {
@Override
public Bitmap process(Bitmap bitmap) {
final int color = ColorUtil.generateColor(ArtistDetailActivity.this, bitmap);
runOnUiThread(new Runnable() {
@Override
public void run() {
setColors(color);
}
applyPalette(loadedImage);
ImageLoader.getInstance().displayImage(
imageUri,
artistImageBackground,
new DisplayImageOptions.Builder().postProcessor(new BlurProcessor(10)).build()
);
toastUpdatedArtistImageIfDownloadWasForced();
}
private void toastUpdatedArtistImageIfDownloadWasForced() {
if (forceDownload) {
Toast.makeText(ArtistDetailActivity.this, getString(R.string.updated_artist_image), Toast.LENGTH_SHORT).show();
}
}
});
return bitmap;
}
);
}
}
})
.build(),
new SimpleImageLoadingListener() {
@Override
public void onLoadingFailed(String imageUri, View view, @Nullable FailReason failReason) {
setUpBackground("drawable://" + R.drawable.default_artist_image);
@Override
public void failure(RetrofitError error) {
if (forceDownload) {
Toast.makeText(ArtistDetailActivity.this, getString(R.string.could_not_update_artist_image), Toast.LENGTH_SHORT).show();
} else {
artistImage.setImageResource(R.drawable.default_artist_image);
resetPaletteAndArtistImageBackground();
}
}
});
}
toastUpdatedArtistImageIfDownloadWasForced();
}
private void resetPaletteAndArtistImageBackground() {
applyPalette(null);
ImageLoader.getInstance().displayImage(
"drawable://" + R.drawable.default_artist_image,
artistImageBackground,
new DisplayImageOptions.Builder().postProcessor(new BlurProcessor(10)).build()
);
}
private void applyPalette(@Nullable Bitmap bitmap) {
if (bitmap != null) {
Palette.from(bitmap)
.resizeBitmapSize(100)
.generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(@NonNull Palette palette) {
final Palette.Swatch vibrantSwatch = palette.getVibrantSwatch();
if (vibrantSwatch != null) {
toolbarColor = vibrantSwatch.getRgb();
artistName.setBackgroundColor(vibrantSwatch.getRgb());
artistName.setTextColor(ColorUtil.getOpaqueColor(vibrantSwatch.getTitleTextColor()));
if (PreferenceUtil.getInstance(ArtistDetailActivity.this).coloredNavigationBarArtist())
setNavigationBarColor(vibrantSwatch.getRgb());
notifyTaskColorChange(toolbarColor);
} else {
resetColors();
}
@Override
public void onLoadingComplete(String imageUri, View view, @Nullable Bitmap loadedImage) {
if (loadedImage == null) {
onLoadingFailed(imageUri, view, null);
return;
}
});
} else {
resetColors();
}
setUpBackground(imageUri);
toastUpdatedArtistImageIfDownloadWasForced();
}
private void toastUpdatedArtistImageIfDownloadWasForced() {
if (forceDownload) {
Toast.makeText(ArtistDetailActivity.this, getString(R.string.updated_artist_image), Toast.LENGTH_SHORT).show();
}
}
}
);
}
@Override
@ -408,19 +342,23 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
return toolbarColor;
}
private void setUpBackground(String imageUri) {
ImageLoader.getInstance().displayImage(
imageUri,
artistImageBackground,
new DisplayImageOptions.Builder().postProcessor(new BlurProcessor(10)).build()
);
}
private void resetColors() {
int titleTextColor = DialogUtils.resolveColor(this, R.attr.title_text_color);
int defaultBarColor = DialogUtils.resolveColor(this, R.attr.default_bar_color);
toolbarColor = defaultBarColor;
artistName.setBackgroundColor(defaultBarColor);
artistName.setTextColor(titleTextColor);
private void setColors(int vibrantColor) {
toolbarColor = vibrantColor;
artistName.setBackgroundColor(vibrantColor);
artistName.setTextColor(ColorUtil.getTextColorForBackground(vibrantColor));
if (PreferenceUtil.getInstance(this).coloredNavigationBarArtist())
setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color));
setNavigationBarColor(vibrantColor);
notifyTaskColorChange(toolbarColor);
notifyTaskColorChange(vibrantColor);
}
private void getArtistFromIntentExtras() {

View file

@ -329,20 +329,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
handlePlaybackIntent(getIntent());
}
@Override
public boolean onCreateOptionsMenu(@NonNull Menu menu) {
if (isAlbumPage()) {
getMenuInflater().inflate(R.menu.menu_albums, menu);
setUpGridMenu(menu);
} else if (isPlaylistPage()) {
getMenuInflater().inflate(R.menu.menu_playlists, menu);
} else {
getMenuInflater().inflate(R.menu.menu_main, menu);
}
restoreActionBar();
return true;
}
public void restoreActionBar() {
ActionBar actionBar = getSupportActionBar();
//noinspection ConstantConditions
@ -351,6 +337,18 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
actionBar.setHomeButtonEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(@NonNull Menu menu) {
if (isPlaylistPage()) {
getMenuInflater().inflate(R.menu.menu_playlists, menu);
} else {
getMenuInflater().inflate(R.menu.menu_main, menu);
setUpGridMenu(menu);
}
restoreActionBar();
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item)) {
@ -386,6 +384,63 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
return super.onOptionsItemSelected(item);
}
private void setUpGridMenu(@NonNull Menu menu) {
boolean isPortrait = Util.isInPortraitMode(this);
int columns = isPortrait ? PreferenceUtil.getInstance(this).getAlbumGridColumns() : PreferenceUtil.getInstance(this).getAlbumGridColumnsLand();
String title = isPortrait ? getResources().getString(R.string.action_view_as) : getResources().getString(R.string.action_view_as_land);
MenuItem gridSizeItem = menu.findItem(R.id.action_view_as);
gridSizeItem.setTitle(title);
SubMenu gridSizeMenu = gridSizeItem.getSubMenu();
gridSizeMenu.getItem(columns - 1).setChecked(true);
}
private boolean handleGridSize(@NonNull MenuItem item) {
int size = getGridSize(item);
if (size > 0) {
item.setChecked(true);
if (isAlbumPage()) {
getAlbumFragment().setColumns(size);
if (Util.isInPortraitMode(this)) {
PreferenceUtil.getInstance(this).setAlbumGridColumns(size);
} else {
PreferenceUtil.getInstance(this).setAlbumGridColumnsLand(size);
}
}
return true;
}
return false;
}
private int getGridSize(MenuItem item) {
int size = -1;
switch (item.getItemId()) {
case R.id.gridSizeOne:
size = 1;
break;
case R.id.gridSizeTwo:
size = 2;
break;
case R.id.gridSizeThree:
size = 3;
break;
case R.id.gridSizeFour:
size = 4;
break;
case R.id.gridSizeFive:
size = 5;
break;
case R.id.gridSizeSix:
size = 6;
break;
}
return size;
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
drawerToggle.onConfigurationChanged(newConfig);
@ -499,57 +554,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
// return (PlaylistViewFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.PLAYLIST.ordinal());
// }
private void setUpGridMenu(@NonNull Menu menu) {
boolean isPortrait = Util.isInPortraitMode(this);
int columns = isPortrait ? PreferenceUtil.getInstance(this).getAlbumGridColumns() : PreferenceUtil.getInstance(this).getAlbumGridColumnsLand();
String title = isPortrait ? getResources().getString(R.string.action_grid_columns) : getResources().getString(R.string.action_grid_columns_land);
MenuItem gridSizeItem = menu.findItem(R.id.action_grid_columns);
gridSizeItem.setTitle(title);
SubMenu gridSizeMenu = gridSizeItem.getSubMenu();
gridSizeMenu.getItem(columns - 1).setChecked(true);
}
private boolean handleGridSize(@NonNull MenuItem item) {
int size = -1;
switch (item.getItemId()) {
case R.id.gridSizeOne:
size = 1;
break;
case R.id.gridSizeTwo:
size = 2;
break;
case R.id.gridSizeThree:
size = 3;
break;
case R.id.gridSizeFour:
size = 4;
break;
case R.id.gridSizeFive:
size = 5;
break;
case R.id.gridSizeSix:
size = 6;
break;
}
if (size > 0) {
item.setChecked(true);
if (isAlbumPage()) {
getAlbumFragment().setColumns(size);
if (Util.isInPortraitMode(this)) {
PreferenceUtil.getInstance(this).setAlbumGridColumns(size);
} else {
PreferenceUtil.getInstance(this).setAlbumGridColumnsLand(size);
}
}
return true;
}
return false;
}
@Override
public boolean dispatchKeyEvent(@NonNull KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_MENU && event.getAction() == KeyEvent.ACTION_UP) {

View file

@ -14,8 +14,8 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import com.afollestad.materialdialogs.util.DialogUtils;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.ColorChooserDialog;
import com.kabouzeid.gramophone.prefs.ColorChooserPreference;
@ -53,15 +53,21 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
} else if (title == R.string.accent_color) {
PreferenceUtil.getInstance(this).setThemeColorAccent(color);
}
recreate();
recreateIfThemeChanged();
}
public static class SettingsFragment extends PreferenceFragment {
private Preference equalizer;
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(android.R.id.list).setPadding(0, 0, 0, 0);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_general);
addPreferencesFromResource(R.xml.pref_colors);
addPreferencesFromResource(R.xml.pref_now_playing_screen);
@ -85,29 +91,33 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
@Override
public boolean onPreferenceChange(Preference preference, @NonNull Object o) {
setSummary(generalTheme, o);
PreferenceUtil.getInstance(getActivity()).setGeneralTheme(getActivity(), (String) o);
((SettingsActivity) getActivity()).recreateIfThemeChanged();
return true;
}
});
ColorChooserPreference primaryColor = (ColorChooserPreference) findPreference("primary_color");
primaryColor.setColor(((SettingsActivity) getActivity()).getThemeColorPrimary(),
DialogUtils.resolveColor(getActivity(), android.R.attr.textColorPrimary));
primaryColor.setColor(PreferenceUtil.getInstance(getActivity()).getThemeColorPrimary(getActivity()));
primaryColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(@NonNull Preference preference) {
new ColorChooserDialog().show(getActivity(), preference.getTitleRes(),
new ColorChooserDialog().show(
getActivity(),
preference.getTitleRes(),
((SettingsActivity) getActivity()).getThemeColorPrimary());
return true;
}
});
ColorChooserPreference accentColor = (ColorChooserPreference) findPreference("accent_color");
accentColor.setColor(((SettingsActivity) getActivity()).getThemeColorAccent(),
DialogUtils.resolveColor(getActivity(), android.R.attr.textColorPrimary));
accentColor.setColor(PreferenceUtil.getInstance(getActivity()).getThemeColorAccent(getActivity()));
accentColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(@NonNull Preference preference) {
new ColorChooserDialog().show(getActivity(), preference.getTitleRes(),
new ColorChooserDialog().show(
getActivity(),
preference.getTitleRes(),
((SettingsActivity) getActivity()).getThemeColorAccent());
return true;
}
@ -128,8 +138,11 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
}
});
equalizer = findPreference("equalizer");
resolveEqualizer();
Preference equalizer = findPreference("equalizer");
if (!hasEqualizer()) {
equalizer.setEnabled(false);
equalizer.setSummary(getResources().getString(R.string.no_equalizer));
}
equalizer.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
@ -160,14 +173,11 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
}
}
private void resolveEqualizer() {
private boolean hasEqualizer() {
final Intent effects = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL);
PackageManager pm = getActivity().getPackageManager();
ResolveInfo ri = pm.resolveActivity(effects, 0);
if (ri == null) {
equalizer.setEnabled(false);
equalizer.setSummary(getResources().getString(R.string.no_equalizer));
}
return ri != null;
}
}

View file

@ -22,6 +22,7 @@ public abstract class AbsThemeActivity extends AppCompatActivity implements KabV
private int colorPrimary;
private int colorPrimaryDarker;
private int colorAccent;
private boolean darkTheme;
@Nullable
private ActivityManager.TaskDescription taskDescription;
@ -33,23 +34,41 @@ public abstract class AbsThemeActivity extends AppCompatActivity implements KabV
setupTheme();
}
@Override
protected void onResume() {
super.onResume();
recreateIfThemeChanged();
}
private void setupTheme() {
colorPrimary = PreferenceUtil.getInstance(this).getThemeColorPrimary(this);
colorPrimaryDarker = ColorUtil.shiftColorDown(colorPrimary);
colorAccent = PreferenceUtil.getInstance(this).getThemeColorAccent(this);
darkTheme = PreferenceUtil.getInstance(this).getGeneralTheme() == R.style.Theme_MaterialMusic;
ThemeSingleton.get().positiveColor = colorAccent;
ThemeSingleton.get().negativeColor = ThemeSingleton.get().positiveColor;
ThemeSingleton.get().neutralColor = ThemeSingleton.get().positiveColor;
ThemeSingleton.get().widgetColor = ThemeSingleton.get().positiveColor;
ThemeSingleton.get().darkTheme = PreferenceUtil.getInstance(this).getGeneralTheme() == R.style.Theme_MaterialMusic;
ThemeSingleton.get().negativeColor = colorAccent;
ThemeSingleton.get().neutralColor = colorAccent;
ThemeSingleton.get().widgetColor = colorAccent;
ThemeSingleton.get().darkTheme = darkTheme;
if (!overridesTaskColor()) {
notifyTaskColorChange(getThemeColorPrimary());
}
}
protected void recreateIfThemeChanged() {
if (didThemeChanged()) {
recreate();
}
}
private boolean didThemeChanged() {
return colorPrimary != PreferenceUtil.getInstance(this).getThemeColorPrimary(this) ||
colorAccent != PreferenceUtil.getInstance(this).getThemeColorAccent(this) ||
darkTheme != (PreferenceUtil.getInstance(this).getGeneralTheme() == R.style.Theme_MaterialMusic);
}
protected void notifyTaskColorChange(int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// Sets color of entry in the system recents page

View file

@ -24,7 +24,7 @@ import butterknife.Optional;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView.Adapter> extends AbsMainActivityFragment implements OnOffsetChangedListener, MusicStateListener {
public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView.Adapter, LM extends RecyclerView.LayoutManager> extends AbsMainActivityFragment implements OnOffsetChangedListener, MusicStateListener {
public static final String TAG = AbsMainActivityRecyclerViewFragment.class.getSimpleName();
@ -39,7 +39,8 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
@InjectView(R.id.fast_scroller)
FastScroller fastScroller;
private A mAdapter;
private A adapter;
private LM layoutManager;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@ -65,8 +66,8 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
}
private void setUpRecyclerView() {
mAdapter = createAdapter();
mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
adapter = createAdapter();
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
super.onChanged();
@ -74,12 +75,22 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
}
});
recyclerView.setLayoutManager(createLayoutManager());
recyclerView.setAdapter(mAdapter);
layoutManager = createLayoutManager();
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);
}
public A getAdapter() {
return mAdapter;
protected A getAdapter() {
return adapter;
}
protected LM getLayoutManager() {
return layoutManager;
}
protected RecyclerView getRecyclerView() {
return recyclerView;
}
@Override
@ -137,11 +148,7 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
return R.layout.fragment_main_activity_recycler_view;
}
protected RecyclerView getRecyclerView() {
return recyclerView;
}
protected abstract RecyclerView.LayoutManager createLayoutManager();
protected abstract LM createLayoutManager();
protected abstract A createAdapter();

View file

@ -2,7 +2,6 @@ package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.album.AlbumAdapter;
@ -13,16 +12,13 @@ import com.kabouzeid.gramophone.util.Util;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment<AlbumAdapter> {
public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment<AlbumAdapter, GridLayoutManager> {
public static final String TAG = AlbumViewFragment.class.getSimpleName();
private GridLayoutManager layoutManager;
@Override
protected RecyclerView.LayoutManager createLayoutManager() {
protected GridLayoutManager createLayoutManager() {
int columns = Util.isInPortraitMode(getActivity()) ? PreferenceUtil.getInstance(getActivity()).getAlbumGridColumns() : PreferenceUtil.getInstance(getActivity()).getAlbumGridColumnsLand();
layoutManager = new GridLayoutManager(getActivity(), columns);
return layoutManager;
return new GridLayoutManager(getActivity(), columns);
}
@NonNull
@ -41,8 +37,10 @@ public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment<Album
}
public void setColumns(int columns) {
layoutManager.setSpanCount(columns);
layoutManager.requestLayout();
getLayoutManager().setSpanCount(columns);
getLayoutManager().requestLayout();
// required to animate the column size change
getAdapter().notifyDataSetChanged();
}
@Override

View file

@ -2,7 +2,6 @@ package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.artist.ArtistAdapter;
@ -11,13 +10,13 @@ import com.kabouzeid.gramophone.loader.ArtistLoader;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment<ArtistAdapter> {
public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment<ArtistAdapter, GridLayoutManager> {
public static final String TAG = ArtistViewFragment.class.getSimpleName();
@NonNull
@Override
protected RecyclerView.LayoutManager createLayoutManager() {
protected GridLayoutManager createLayoutManager() {
return new GridLayoutManager(getActivity(), 2);
}

View file

@ -1,8 +1,7 @@
package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.LinearLayoutManager;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.PlaylistAdapter;
@ -17,14 +16,14 @@ import java.util.ArrayList;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment<PlaylistAdapter> {
public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment<PlaylistAdapter, LinearLayoutManager> {
public static final String TAG = PlaylistViewFragment.class.getSimpleName();
@NonNull
@Override
protected RecyclerView.LayoutManager createLayoutManager() {
return new GridLayoutManager(getActivity(), 1);
protected LinearLayoutManager createLayoutManager() {
return new LinearLayoutManager(getActivity());
}
@NonNull

View file

@ -2,7 +2,6 @@ package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.song.SongAdapter;
@ -11,13 +10,13 @@ import com.kabouzeid.gramophone.loader.SongLoader;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class SongViewFragment extends AbsMainActivityRecyclerViewFragment<SongAdapter> {
public class SongViewFragment extends AbsMainActivityRecyclerViewFragment<SongAdapter, GridLayoutManager> {
public static final String TAG = SongViewFragment.class.getSimpleName();
@NonNull
@Override
protected RecyclerView.LayoutManager createLayoutManager() {
protected GridLayoutManager createLayoutManager() {
return new GridLayoutManager(getActivity(), 1);
}