Option to hide the new bottom bar

This commit is contained in:
Karim Abou Zeid 2015-08-13 00:37:49 +02:00
commit ec2e943a5d
13 changed files with 122 additions and 57 deletions

View file

@ -3,6 +3,7 @@ package com.kabouzeid.gramophone.ui.activities;
import android.animation.Animator;
import android.annotation.TargetApi;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
@ -43,6 +44,7 @@ import com.kabouzeid.gramophone.ui.activities.tageditor.AlbumTagEditorActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
@ -89,7 +91,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
private int albumArtViewHeight;
private int toolbarColor;
private float toolbarAlpha;
private int bottomOffset;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -179,7 +180,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
}
private void setUpObservableListViewParams() {
bottomOffset = getResources().getDimensionPixelSize(R.dimen.bottom_offset_fab_activity);
albumArtViewHeight = getResources().getDimensionPixelSize(R.dimen.header_image_height);
toolbarColor = DialogUtils.resolveColor(this, R.attr.default_bar_color);
int toolbarHeight = Util.getActionBarSize(this);
@ -274,8 +274,8 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
}
private void setUpRecyclerViewView() {
setUpRecyclerViewPadding();
recyclerView.setScrollViewCallbacks(observableScrollViewCallbacks);
recyclerView.setPadding(0, albumArtViewHeight + titleViewHeight, 0, bottomOffset);
final View contentView = getWindow().getDecorView().findViewById(android.R.id.content);
contentView.post(new Runnable() {
@Override
@ -289,6 +289,10 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
});
}
private void setUpRecyclerViewPadding() {
recyclerView.setPadding(0, albumArtViewHeight + titleViewHeight, 0, getBottomOffset());
}
private void setUpToolBar() {
setSupportActionBar(toolbar);
//noinspection ConstantConditions
@ -417,4 +421,12 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
super.onMediaStoreChanged();
reloadDataSet();
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
super.onSharedPreferenceChanged(sharedPreferences, key);
if (key.equals(PreferenceUtil.HIDE_BOTTOM_BAR)) {
setUpRecyclerViewPadding();
}
}
}

View file

@ -3,6 +3,7 @@ package com.kabouzeid.gramophone.ui.activities;
import android.animation.Animator;
import android.annotation.TargetApi;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
@ -50,6 +51,7 @@ import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.kabouzeid.gramophone.views.SquareIfPlaceImageView;
@ -98,7 +100,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
private int artistImageViewHeight;
private int toolbarColor;
private float toolbarAlpha;
private int bottomOffset;
private Artist artist;
@Nullable
@ -187,7 +188,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
};
private void setUpObservableListViewParams() {
bottomOffset = getResources().getDimensionPixelSize(R.dimen.bottom_offset_fab_activity);
artistImageViewHeight = getResources().getDimensionPixelSize(R.dimen.header_image_height);
toolbarColor = DialogUtils.resolveColor(this, R.attr.default_bar_color);
int toolbarHeight = Util.getActionBarSize(this);
@ -213,8 +213,8 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
}
private void setUpSongListView() {
setUpSongListPadding();
songListView.setScrollViewCallbacks(observableScrollViewCallbacks);
songListView.setPadding(0, artistImageViewHeight + titleViewHeight, 0, bottomOffset);
songListView.addHeaderView(songListHeader);
songAdapter = new ArtistSongAdapter(this, loadSongDataSet(), this);
@ -230,6 +230,10 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
});
}
private void setUpSongListPadding() {
songListView.setPadding(0, artistImageViewHeight + titleViewHeight, 0, getBottomOffset());
}
private void setUpAlbumRecyclerView() {
albumRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
albumAdapter = new HorizontalAlbumAdapter(this, loadAlbumDataSet(), this);
@ -477,4 +481,12 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
super.onMediaStoreChanged();
reloadDataSets();
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
super.onSharedPreferenceChanged(sharedPreferences, key);
if (key.equals(PreferenceUtil.HIDE_BOTTOM_BAR)) {
setUpSongListPadding();
}
}
}

View file

@ -90,6 +90,12 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
@Nullable
private View navigationDrawerHeader;
private ArrayList<HideBottomBarListener> hideBottomBarListeners = new ArrayList<>();
public interface HideBottomBarListener {
void onBottomBarHiddenStateChanged(boolean hidden);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -127,7 +133,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
for (final PagerAdapter.MusicFragments fragment : fragments) {
pagerAdapter.add(fragment.getFragmentClass(), null);
}
pager.setAdapter(pagerAdapter);
pager.setOffscreenPageLimit(pagerAdapter.getCount() - 1);
@ -576,4 +581,26 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
super.onPanelCollapsed(view);
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
}
@Override
public void hideBottomBar(boolean hide) {
super.hideBottomBar(hide);
for (HideBottomBarListener hideBottomBarListener : hideBottomBarListeners) {
if (hideBottomBarListener != null) {
hideBottomBarListener.onBottomBarHiddenStateChanged(hide);
}
}
}
public void addHideBottomBarListener(HideBottomBarListener listener) {
if (listener != null) {
hideBottomBarListeners.add(listener);
}
}
public void removeHideBottomBarListener(HideBottomBarListener listener) {
if (listener != null) {
hideBottomBarListeners.remove(listener);
}
}
}

View file

@ -1,5 +1,6 @@
package com.kabouzeid.gramophone.ui.activities;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
@ -27,6 +28,7 @@ import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PlaylistsUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import java.util.ArrayList;
import java.util.List;
@ -77,6 +79,7 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
}
private void setUpRecyclerView() {
setUpRecyclerViewPadding();
recyclerView.setLayoutManager(new GridLayoutManager(this, 1));
if (playlist instanceof AbsSmartPlaylist) {
adapter = new SmartPlaylistSongAdapter(this, loadSmartPlaylistDataSet(), R.layout.item_list, false, this);
@ -114,6 +117,10 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
});
}
private void setUpRecyclerViewPadding() {
recyclerView.setPadding(0, 0, 0, getBottomOffset());
}
private void reloadDataSet() {
if (playlist instanceof AbsSmartPlaylist) {
adapter.swapDataSet(loadSmartPlaylistDataSet());
@ -203,6 +210,14 @@ public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity impleme
reloadDataSet();
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
super.onSharedPreferenceChanged(sharedPreferences, key);
if (key.equals(PreferenceUtil.HIDE_BOTTOM_BAR)) {
setUpRecyclerViewPadding();
}
}
private void checkIsEmpty() {
empty.setVisibility(
adapter.getItemCount() == 0 ? View.VISIBLE : View.GONE

View file

@ -62,7 +62,7 @@ import butterknife.ButterKnife;
/**
* @author Karim Abou Zeid (kabouzeid)
* <p>
* <p/>
* Do not use {@link #setContentView(int)} but wrap your layout with
* {@link #wrapSlidingMusicPanelAndFab(int)} first and then return it in {@link #createContentView()}
*/
@ -252,6 +252,9 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
showPlaybackControllerCard = PreferenceUtil.getInstance(this).playbackControllerCardNowPlaying();
setUpPlaybackControllerCard();
break;
case PreferenceUtil.HIDE_BOTTOM_BAR:
hideBottomBar(PreferenceUtil.getInstance(this).hideBottomBar());
break;
}
}
@ -296,6 +299,7 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
}
private void setUpMiniPlayer() {
hideBottomBar(PreferenceUtil.getInstance(this).hideBottomBar());
final GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
@ -403,6 +407,18 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
return slidingUpPanelLayout;
}
public void hideBottomBar(boolean hide) {
if (hide) {
slidingUpPanelLayout.setPanelHeight(0);
} else {
slidingUpPanelLayout.setPanelHeight(getResources().getDimensionPixelSize(R.dimen.mini_player_height));
}
}
public int getBottomOffset() {
return getResources().getDimensionPixelSize(R.dimen.bottom_offset_fab_activity) - slidingUpPanelLayout.getPanelHeight();
}
protected void updateFabState(boolean animate) {
if (playPauseDrawable == null) {
playPauseDrawable = new PlayPauseDrawable(this);

View file

@ -15,6 +15,7 @@ import android.widget.TextView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener;
import com.kabouzeid.gramophone.ui.activities.MainActivity;
import com.kabouzeid.gramophone.views.FastScroller;
import butterknife.Bind;
@ -23,7 +24,7 @@ import butterknife.ButterKnife;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView.Adapter, LM extends RecyclerView.LayoutManager> extends AbsMainActivityFragment implements OnOffsetChangedListener, MusicServiceEventListener {
public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView.Adapter, LM extends RecyclerView.LayoutManager> extends AbsMainActivityFragment implements OnOffsetChangedListener, MusicServiceEventListener, MainActivity.HideBottomBarListener {
public static final String TAG = AbsMainActivityRecyclerViewFragment.class.getSimpleName();
@ -56,6 +57,7 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
getMainActivity().addOnAppBarOffsetChangedListener(this);
getMainActivity().addMusicStateListenerListener(this);
getMainActivity().addHideBottomBarListener(this);
setUpRecyclerView();
@ -63,10 +65,15 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
}
private void setUpRecyclerView() {
setUpRecyclerViewPadding();
invalidateLayoutManager();
invalidateAdapter();
}
private void setUpRecyclerViewPadding() {
recyclerView.setPadding(0, 0, 0, getMainActivity().getBottomOffset());
}
protected void invalidateAdapter() {
adapter = createAdapter();
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@ -129,6 +136,11 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
}
@Override
public void onBottomBarHiddenStateChanged(boolean hidden) {
setUpRecyclerViewPadding();
}
@Override
public void enableViews() {
super.enableViews();
@ -170,6 +182,7 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
super.onDestroyView();
getMainActivity().removeOnAppBarOffsetChangedListener(this);
getMainActivity().removeMusicStateListenerListener(this);
getMainActivity().removeHideBottomBarListener(this);
ButterKnife.unbind(this);
}

View file

@ -5,7 +5,6 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.SortOrder;
@ -52,6 +51,8 @@ public final class PreferenceUtil {
public static final String IGNORE_MEDIA_STORE_ARTWORK = "ignore_media_store_artwork";
public static final String HIDE_BOTTOM_BAR = "hide_bottom_bar";
private static PreferenceUtil sInstance;
private final SharedPreferences mPreferences;
@ -186,35 +187,33 @@ public final class PreferenceUtil {
return mPreferences.getBoolean(IGNORE_MEDIA_STORE_ARTWORK, false);
}
@Nullable
public final boolean hideBottomBar() {
return mPreferences.getBoolean(HIDE_BOTTOM_BAR, false);
}
public final String getArtistSortOrder() {
return mPreferences.getString(ARTIST_SORT_ORDER, SortOrder.ArtistSortOrder.ARTIST_A_Z);
}
@Nullable
public final String getArtistSongSortOrder() {
return mPreferences.getString(ARTIST_SONG_SORT_ORDER,
SortOrder.ArtistSongSortOrder.SONG_A_Z);
}
@Nullable
public final String getArtistAlbumSortOrder() {
return mPreferences.getString(ARTIST_ALBUM_SORT_ORDER,
SortOrder.ArtistAlbumSortOrder.ALBUM_YEAR_ASC);
}
@Nullable
public final String getAlbumSortOrder() {
return mPreferences.getString(ALBUM_SORT_ORDER, SortOrder.AlbumSortOrder.ALBUM_A_Z);
}
@Nullable
public final String getAlbumSongSortOrder() {
return mPreferences.getString(ALBUM_SONG_SORT_ORDER,
SortOrder.AlbumSongSortOrder.SONG_TRACK_LIST);
}
@Nullable
public final String getSongSortOrder() {
return mPreferences.getString(SONG_SORT_ORDER, SortOrder.SongSortOrder.SONG_A_Z);
}

View file

@ -35,7 +35,6 @@
android:clipToPadding="false"
android:divider="@null"
android:dividerHeight="0px"
android:paddingBottom="@dimen/bottom_offset_fab_activity"
android:scrollbars="vertical" />
</LinearLayout>

View file

@ -4,7 +4,6 @@
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:paddingBottom="@dimen/bottom_offset_fab_activity"
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"

View file

@ -1,36 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/smart_playlist_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingBottom="@dimen/bottom_offset_fab_activity"
android:scrollbars="none" />
<TextView
android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:fontFamily="sans-serif-light"
android:text="@string/empty"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/empty_text_size" />
<com.kabouzeid.gramophone.views.FastScroller
android:id="@+id/fast_scroller"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="end" />
</FrameLayout>

View file

@ -44,8 +44,6 @@ http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout
<dimen name="widget_medium_image_size">96dp</dimen>
<dimen name="notification_big_image_size">128dp</dimen>
<dimen name="bottom_offset_fab_activity">44dp</dimen>
<dimen name="scrollbar_width">8dp</dimen>
<dimen name="scrollbar_inset">8dp</dimen>
<!-- MUST BE THE RESULT OF WIDTH PLUS INSET-->
@ -69,5 +67,6 @@ http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout
<dimen name="list_item_image_icon_padding">8dp</dimen>
<dimen name="mini_player_height">48dp</dimen>
<dimen name="bottom_offset_fab_activity">92dp</dimen>
</resources>

View file

@ -125,6 +125,7 @@
<string name="pref_title_larger_title_box_now_playing">Larger Title Box</string>
<string name="pref_title_alternative_progress_slider_now_playing">Alternative Progress Slider</string>
<string name="pref_title_playback_controller_card_now_playing">Show Card below Playback Controllers</string>
<string name="pref_title_hide_bottom_bar">Hide bottom bar</string>
<string name="no_equalizer">No equalizer found.</string>
<string name="no_audio_ID">"No audio ID, play something and try again."</string>
<string name="navigation_drawer_open">Open Navigation Drawer</string>
@ -161,6 +162,7 @@
<string name="pref_summary_alternative_progress_slider_now_playing">Uses a progressbar which does not cover the album art instead of the default progress slider.</string>
<string name="pref_summary_playback_controller_card_now_playing">Displays a card below the playback controller buttons (play/pause etc.).</string>
<string name="pref_summary_ignore_media_store_artwork">Bypass the Media Store, which can increase the album artwork quality but causes slower image loading times. Only enable this if you have problems with low resolution artworks.</string>
<string name="pref_summary_hide_bottom_bar">Hides the bar with the current playing information at the bottom. You can still fling the play/pause button in any direction to open the now playing view.</string>
<string name="could_not_download_album_cover">"Could not download a matching album cover."</string>
<string name="search_hint">Search your library…</string>
<string name="rescanning_media">Rescanning media…</string>

View file

@ -3,15 +3,23 @@
<com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory android:title="@string/pref_header_general">
<com.afollestad.materialdialogs.prefs.MaterialListPreference
android:layout="@layout/preference_custom"
android:defaultValue="-1"
android:entries="@array/pref_start_page_list_titles"
android:entryValues="@array/pref_start_page_list_values"
android:key="default_start_page"
android:layout="@layout/preference_custom"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_set_default_start_page" />
<CheckBoxPreference
android:defaultValue="false"
android:key="hide_bottom_bar"
android:layout="@layout/preference_custom"
android:summary="@string/pref_summary_hide_bottom_bar"
android:title="@string/pref_title_hide_bottom_bar"
android:widgetLayout="@layout/preference_dynamic_checkbox" />
</com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory>
</PreferenceScreen>