First steps for folder support.

This commit is contained in:
Karim Abou Zeid 2016-03-14 00:47:16 +01:00
commit 56d3a2dbce
27 changed files with 652 additions and 553 deletions

View file

@ -120,6 +120,7 @@ dependencies {
transitive = true
}
//noinspection GradleDynamicVersion
compile 'com.android.support:support-v4:23.2.1'
compile 'com.android.support:support-v13:23.2.1'
compile 'com.android.support:appcompat-v7:23.2.1'
@ -137,7 +138,6 @@ dependencies {
compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.jakewharton:butterknife:7.0.1'
//noinspection GradleDynamicVersion
compile 'com.anjlab.android.iab.v3:library:1.0.+'
compile 'de.psdev.licensesdialog:licensesdialog:1.8.0'
compile 'com.github.bumptech.glide:glide:3.7.0'

View file

@ -10,10 +10,10 @@ import android.util.SparseArray;
import android.view.ViewGroup;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AlbumsFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.ArtistsFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.PlaylistsFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.SongsFragment;
import com.kabouzeid.gramophone.ui.fragments.libraryfragments.AlbumsPagerFragment;
import com.kabouzeid.gramophone.ui.fragments.libraryfragments.ArtistsPagerFragment;
import com.kabouzeid.gramophone.ui.fragments.libraryfragments.PlaylistsPagerFragment;
import com.kabouzeid.gramophone.ui.fragments.libraryfragments.SongsPagerFragment;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
@ -107,10 +107,10 @@ public class MusicLibraryPagerAdapter extends FragmentPagerAdapter {
}
public enum MusicFragments {
SONG(SongsFragment.class),
ALBUM(AlbumsFragment.class),
ARTIST(ArtistsFragment.class),
PLAYLIST(PlaylistsFragment.class);
SONG(SongsPagerFragment.class),
ALBUM(AlbumsPagerFragment.class),
ARTIST(ArtistsPagerFragment.class),
PLAYLIST(PlaylistsPagerFragment.class);
private final Class<? extends Fragment> mFragmentClass;

View file

@ -1,13 +0,0 @@
package com.kabouzeid.gramophone.interfaces;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public interface KabViewsDisableAble {
void enableViews();
void disableViews();
boolean areViewsEnabled();
}

View file

@ -234,20 +234,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
adapter.swapDataSet(album.songs);
}
@Override
public void enableViews() {
super.enableViews();
recyclerView.setEnabled(true);
toolbar.setEnabled(true);
}
@Override
public void disableViews() {
super.disableViews();
recyclerView.setEnabled(false);
toolbar.setEnabled(false);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_album_detail, menu);

View file

@ -361,22 +361,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
return super.onOptionsItemSelected(item);
}
@Override
public void enableViews() {
super.enableViews();
songListView.setEnabled(true);
toolbar.setEnabled(true);
albumRecyclerView.setEnabled(true);
}
@Override
public void disableViews() {
super.disableViews();
songListView.setEnabled(false);
toolbar.setEnabled(false);
albumRecyclerView.setEnabled(false);
}
@Override
public MaterialCab openCab(int menuRes, @NonNull final MaterialCab.Callback callback) {
if (cab != null && cab.isActive()) cab.finish();

View file

@ -13,53 +13,35 @@ import android.os.IBinder;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.AppBarLayout.OnOffsetChangedListener;
import android.support.design.widget.NavigationView;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.afollestad.materialcab.MaterialCab;
import com.bumptech.glide.Glide;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.appthemehelper.util.NavigationViewUtil;
import com.kabouzeid.appthemehelper.util.TabLayoutUtil;
import com.kabouzeid.appthemehelper.util.ToolbarContentTintHelper;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.MusicLibraryPagerAdapter;
import com.kabouzeid.gramophone.dialogs.ChangelogDialog;
import com.kabouzeid.gramophone.dialogs.CreatePlaylistDialog;
import com.kabouzeid.gramophone.dialogs.DonationDialog;
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
import com.kabouzeid.gramophone.glide.SongGlideRequest;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.SearchQueryHelper;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
import com.kabouzeid.gramophone.loader.AlbumLoader;
import com.kabouzeid.gramophone.loader.ArtistSongLoader;
import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.ui.activities.intro.AppIntroActivity;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityRecyclerViewCustomGridSizeFragment;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PhonographColorUtil;
import com.kabouzeid.gramophone.ui.fragments.FolderFragment;
import com.kabouzeid.gramophone.ui.fragments.LibraryFragment;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import com.kabouzeid.gramophone.util.Util;
import com.sothree.slidinguppanel.SlidingUpPanelLayout;
@ -71,28 +53,23 @@ import butterknife.Bind;
import butterknife.ButterKnife;
public class MainActivity extends AbsSlidingMusicPanelActivity
implements KabViewsDisableAble, CabHolder, DrawerLayout.DrawerListener {
implements DrawerLayout.DrawerListener {
public static final String TAG = MainActivity.class.getSimpleName();
public static final int APP_INTRO_REQUEST = 100;
@Bind(R.id.toolbar)
Toolbar toolbar;
@Bind(R.id.tabs)
TabLayout tabs;
@Bind(R.id.appbar)
AppBarLayout appbar;
@Bind(R.id.pager)
ViewPager pager;
private static final int LIBRARY = 0;
private static final int FOLDERS = 1;
@Bind(R.id.navigation_view)
NavigationView navigationView;
@Bind(R.id.drawer_layout)
DrawerLayout drawerLayout;
MainActivityFragmentCallbacks currentFragment;
@Nullable
private View navigationDrawerHeader;
private MusicLibraryPagerAdapter pagerAdapter;
private MaterialCab cab;
private boolean blockRequestPermissions;
@ -105,32 +82,38 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
Util.setStatusBarTranslucent(getWindow());
drawerLayout.setFitsSystemWindows(false);
navigationView.setFitsSystemWindows(false);
//noinspection ConstantConditions
findViewById(R.id.drawer_content_container).setFitsSystemWindows(false);
}
setStatusbarColorAuto();
setNavigationbarColorAuto();
setTaskDescriptionColorAuto();
setUpDrawerLayout();
setUpToolbar();
setUpViewPager();
if (!PreferenceUtil.getInstance(this).introShown()) {
PreferenceUtil.getInstance(this).setIntroShown();
ChangelogDialog.setChangelogRead(this);
blockRequestPermissions = true;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startActivityForResult(new Intent(MainActivity.this, AppIntroActivity.class), APP_INTRO_REQUEST);
}
}, 200);
} else {
setMusicChooser(PreferenceUtil.getInstance(this).getLastMusicChooser());
if (!checkShowIntro()) {
checkShowChangelog();
}
}
private void setMusicChooser(int key) {
PreferenceUtil.getInstance(this).setLastMusicChooser(key);
switch (key) {
case LIBRARY:
navigationView.setCheckedItem(R.id.nav_library);
setCurrentFragment(new LibraryFragment());
break;
case FOLDERS:
navigationView.setCheckedItem(R.id.nav_folders);
setCurrentFragment(new FolderFragment());
break;
}
}
private void setCurrentFragment(Fragment fragment) {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment, LibraryFragment.TAG).commit();
currentFragment = (MainActivityFragmentCallbacks) fragment;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
@ -156,37 +139,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
return contentView;
}
private void setUpViewPager() {
pagerAdapter = new MusicLibraryPagerAdapter(this, getSupportFragmentManager());
pager.setAdapter(pagerAdapter);
pager.setOffscreenPageLimit(pagerAdapter.getCount() - 1); // => all
tabs.setupWithViewPager(pager);
int primaryColor = ThemeStore.primaryColor(this);
int normalColor = ToolbarContentTintHelper.toolbarSubtitleColor(this, primaryColor);
int selectedColor = ToolbarContentTintHelper.toolbarTitleColor(this, primaryColor);
TabLayoutUtil.setTabIconColors(tabs, normalColor, selectedColor);
tabs.setTabTextColors(normalColor, selectedColor);
tabs.setSelectedTabIndicatorColor(ThemeStore.accentColor(this));
int startPosition = PreferenceUtil.getInstance(this).getDefaultStartPage();
startPosition = startPosition == -1 ? PreferenceUtil.getInstance(this).getLastStartPage() : startPosition;
pager.setCurrentItem(startPosition);
}
private void setUpToolbar() {
int primaryColor = ThemeStore.primaryColor(this);
appbar.setBackgroundColor(primaryColor);
toolbar.setBackgroundColor(primaryColor);
toolbar.setNavigationIcon(R.drawable.ic_menu_white_24dp);
setTitle(getResources().getString(R.string.app_name));
setSupportActionBar(toolbar);
}
private void setUpNavigationView() {
navigationView.setCheckedItem(R.id.nav_library);
int accentColor = ThemeStore.accentColor(this);
NavigationViewUtil.setItemIconColors(navigationView, ATHUtil.resolveColor(this, R.attr.iconColor, ThemeStore.textColorSecondary(this)), accentColor);
NavigationViewUtil.setItemTextColors(navigationView, ThemeStore.textColorPrimary(this), accentColor);
@ -197,10 +150,20 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
drawerLayout.closeDrawers();
switch (menuItem.getItemId()) {
case R.id.nav_library:
// TODO
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
setMusicChooser(LIBRARY);
}
}, 300);
break;
case R.id.nav_folders:
// TODO
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
setMusicChooser(FOLDERS);
}
}, 300);
break;
case R.id.support_development:
new Handler().postDelayed(new Runnable() {
@ -234,7 +197,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
private void setUpDrawerLayout() {
setUpNavigationView();
drawerLayout.setDrawerListener(this);
drawerLayout.addDrawerListener(this);
}
private void updateNavigationDrawerHeader() {
@ -266,25 +229,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
}
}
@Override
public void enableViews() {
try {
super.enableViews();
toolbar.setEnabled(true);
((AbsMainActivityFragment) getCurrentFragment()).enableViews();
} catch (NullPointerException ignored) {
}
}
@Override
public void disableViews() {
try {
super.disableViews();
((AbsMainActivityFragment) getCurrentFragment()).disableViews();
} catch (NullPointerException ignored) {
}
}
@Override
public void onPlayingMetaChanged() {
super.onPlayingMetaChanged();
@ -297,31 +241,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
handlePlaybackIntent(getIntent());
}
@Override
public boolean onCreateOptionsMenu(@NonNull Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
if (isPlaylistPage()) {
menu.add(0, R.id.action_new_playlist, 0, R.string.new_playlist_title);
}
Fragment currentFragment = getCurrentFragment();
if (currentFragment instanceof AbsMainActivityRecyclerViewCustomGridSizeFragment && currentFragment.isAdded()) {
AbsMainActivityRecyclerViewCustomGridSizeFragment absMainActivityRecyclerViewCustomGridSizeFragment = (AbsMainActivityRecyclerViewCustomGridSizeFragment) currentFragment;
MenuItem gridSizeItem = menu.findItem(R.id.action_grid_size);
if (Util.isLandscape(getResources())) {
gridSizeItem.setTitle(R.string.action_grid_size_land);
}
setUpGridSizeMenu(absMainActivityRecyclerViewCustomGridSizeFragment, gridSizeItem.getSubMenu());
menu.findItem(R.id.action_colored_footers).setChecked(absMainActivityRecyclerViewCustomGridSizeFragment.usePalette());
menu.findItem(R.id.action_colored_footers).setEnabled(absMainActivityRecyclerViewCustomGridSizeFragment.canUsePalette());
} else {
menu.removeItem(R.id.action_grid_size);
menu.removeItem(R.id.action_colored_footers);
}
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == android.R.id.home) {
@ -332,137 +251,15 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
}
return true;
}
Fragment currentFragment = getCurrentFragment();
if (currentFragment instanceof AbsMainActivityRecyclerViewCustomGridSizeFragment) {
AbsMainActivityRecyclerViewCustomGridSizeFragment absMainActivityRecyclerViewCustomGridSizeFragment = (AbsMainActivityRecyclerViewCustomGridSizeFragment) currentFragment;
if (item.getItemId() == R.id.action_colored_footers) {
item.setChecked(!item.isChecked());
absMainActivityRecyclerViewCustomGridSizeFragment.setAndSaveUsePalette(item.isChecked());
return true;
}
if (handleGridSizeMenuItem(absMainActivityRecyclerViewCustomGridSizeFragment, item)) {
return true;
}
}
int id = item.getItemId();
switch (id) {
case R.id.action_sleep_timer:
new SleepTimerDialog().show(getSupportFragmentManager(), "SET_SLEEP_TIMER");
return true;
case R.id.action_equalizer:
NavigationUtil.openEqualizer(this);
return true;
case R.id.action_shuffle_all:
MusicPlayerRemote.openAndShuffleQueue(SongLoader.getAllSongs(this), true);
return true;
case R.id.action_new_playlist:
CreatePlaylistDialog.create().show(getSupportFragmentManager(), "CREATE_PLAYLIST");
return true;
case R.id.action_search:
startActivity(new Intent(MainActivity.this, SearchActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}
private void setUpGridSizeMenu(@NonNull AbsMainActivityRecyclerViewCustomGridSizeFragment fragment, @NonNull SubMenu gridSizeMenu) {
switch (fragment.getGridSize()) {
case 1:
gridSizeMenu.findItem(R.id.action_grid_size_1).setChecked(true);
break;
case 2:
gridSizeMenu.findItem(R.id.action_grid_size_2).setChecked(true);
break;
case 3:
gridSizeMenu.findItem(R.id.action_grid_size_3).setChecked(true);
break;
case 4:
gridSizeMenu.findItem(R.id.action_grid_size_4).setChecked(true);
break;
case 5:
gridSizeMenu.findItem(R.id.action_grid_size_5).setChecked(true);
break;
case 6:
gridSizeMenu.findItem(R.id.action_grid_size_6).setChecked(true);
break;
case 7:
gridSizeMenu.findItem(R.id.action_grid_size_7).setChecked(true);
break;
case 8:
gridSizeMenu.findItem(R.id.action_grid_size_8).setChecked(true);
break;
}
int maxGridSize = fragment.getMaxGridSize();
if (maxGridSize < 8) {
gridSizeMenu.findItem(R.id.action_grid_size_8).setVisible(false);
}
if (maxGridSize < 7) {
gridSizeMenu.findItem(R.id.action_grid_size_7).setVisible(false);
}
if (maxGridSize < 6) {
gridSizeMenu.findItem(R.id.action_grid_size_6).setVisible(false);
}
if (maxGridSize < 5) {
gridSizeMenu.findItem(R.id.action_grid_size_5).setVisible(false);
}
if (maxGridSize < 4) {
gridSizeMenu.findItem(R.id.action_grid_size_4).setVisible(false);
}
if (maxGridSize < 3) {
gridSizeMenu.findItem(R.id.action_grid_size_3).setVisible(false);
}
}
private boolean handleGridSizeMenuItem(@NonNull AbsMainActivityRecyclerViewCustomGridSizeFragment fragment, @NonNull MenuItem item) {
int gridSize = 0;
switch (item.getItemId()) {
case R.id.action_grid_size_1:
gridSize = 1;
break;
case R.id.action_grid_size_2:
gridSize = 2;
break;
case R.id.action_grid_size_3:
gridSize = 3;
break;
case R.id.action_grid_size_4:
gridSize = 4;
break;
case R.id.action_grid_size_5:
gridSize = 5;
break;
case R.id.action_grid_size_6:
gridSize = 6;
break;
case R.id.action_grid_size_7:
gridSize = 7;
break;
case R.id.action_grid_size_8:
gridSize = 8;
break;
}
if (gridSize > 0) {
item.setChecked(true);
fragment.setAndSaveGridSize(gridSize);
toolbar.getMenu().findItem(R.id.action_colored_footers).setEnabled(fragment.canUsePalette());
return true;
}
return false;
}
@Override
public void onBackPressed() {
if (drawerLayout.isDrawerOpen(navigationView)) drawerLayout.closeDrawers();
else if (cab != null && cab.isActive()) cab.finish();
else super.onBackPressed();
}
@Override
protected void onPause() {
super.onPause();
PreferenceUtil.getInstance(MainActivity.this).setLastStartPage(pager.getCurrentItem());
else if (currentFragment == null || !currentFragment.onBackPressed())
super.onBackPressed();
}
private void handlePlaybackIntent(@Nullable Intent intent) {
@ -531,37 +328,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
return id;
}
public Fragment getCurrentFragment() {
return pagerAdapter.getFragment(pager.getCurrentItem());
}
private boolean isPlaylistPage() {
return pager.getCurrentItem() == MusicLibraryPagerAdapter.MusicFragments.PLAYLIST.ordinal();
}
@Override
public MaterialCab openCab(final int menu, final MaterialCab.Callback callback) {
if (cab != null && cab.isActive()) cab.finish();
cab = new MaterialCab(this, R.id.cab_stub)
.setMenu(menu)
.setCloseDrawableRes(R.drawable.ic_close_white_24dp)
.setBackgroundColor(PhonographColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor(this)))
.start(callback);
return cab;
}
public void addOnAppBarOffsetChangedListener(OnOffsetChangedListener onOffsetChangedListener) {
appbar.addOnOffsetChangedListener(onOffsetChangedListener);
}
public void removeOnAppBarOffsetChangedListener(OnOffsetChangedListener onOffsetChangedListener) {
appbar.removeOnOffsetChangedListener(onOffsetChangedListener);
}
public int getTotalAppBarScrollingRange() {
return appbar.getTotalScrollRange();
}
@Override
public void onPanelExpanded(View view) {
super.onPanelExpanded(view);
@ -574,16 +340,34 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
}
private void checkShowChangelog() {
private boolean checkShowIntro() {
if (!PreferenceUtil.getInstance(this).introShown()) {
PreferenceUtil.getInstance(this).setIntroShown();
ChangelogDialog.setChangelogRead(this);
blockRequestPermissions = true;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startActivityForResult(new Intent(MainActivity.this, AppIntroActivity.class), APP_INTRO_REQUEST);
}
}, 50);
return true;
}
return false;
}
private boolean checkShowChangelog() {
try {
PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
int currentVersion = pInfo.versionCode;
if (currentVersion != PreferenceUtil.getInstance(this).getLastChangelogVersion()) {
ChangelogDialog.create().show(getSupportFragmentManager(), "CHANGE_LOG_DIALOG");
return true;
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return false;
}
@Override
@ -605,4 +389,8 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
public void onDrawerStateChanged(int newState) {
}
public interface MainActivityFragmentCallbacks {
boolean onBackPressed();
}
}

View file

@ -71,18 +71,6 @@ public class SearchActivity extends AbsMusicServiceActivity implements SearchVie
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public void enableViews() {
super.enableViews();
recyclerView.setEnabled(true);
}
@Override
public void disableViews() {
super.disableViews();
recyclerView.setEnabled(false);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_search, menu);

View file

@ -17,12 +17,11 @@ import android.view.View;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsBaseActivity extends AbsThemeActivity implements KabViewsDisableAble {
public abstract class AbsBaseActivity extends AbsThemeActivity {
public static final int PERMISSION_REQUEST = 100;
private boolean areViewsEnabled;
@ -54,7 +53,6 @@ public abstract class AbsBaseActivity extends AbsThemeActivity implements KabVie
@Override
protected void onResume() {
super.onResume();
enableViews();
if (hasPermissions() != createdWithPermissionsGranted) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
@ -88,31 +86,6 @@ public abstract class AbsBaseActivity extends AbsThemeActivity implements KabVie
}
/**
* Should be overwritten and re enable all {@link android.view.View} to ensure they are accessible again
* <p/>
* This is necessary because of a bug with the shared element transition
*/
@Override
public void enableViews() {
areViewsEnabled = true;
}
/**
* Should be overwritten and disable all views that start a new activity on click to prevent opening an activity multiple times
* <p/>
* This is necessary because of a bug with the shared element transition
*/
@Override
public void disableViews() {
areViewsEnabled = false;
}
@Override
public boolean areViewsEnabled() {
return areViewsEnabled;
}
@Nullable
protected String[] getPermissionsToRequest() {
return null;

View file

@ -0,0 +1,22 @@
package com.kabouzeid.gramophone.ui.fragments;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import com.kabouzeid.gramophone.ui.activities.MainActivity;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsMainActivityFragment extends Fragment {
public MainActivity getMainActivity() {
return (MainActivity) getActivity();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
}
}

View file

@ -0,0 +1,45 @@
package com.kabouzeid.gramophone.ui.fragments;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.ui.activities.MainActivity;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import butterknife.ButterKnife;
public class FolderFragment extends AbsMainActivityFragment implements MainActivity.MainActivityFragmentCallbacks {
public static final String TAG = FolderFragment.class.getSimpleName();
public FolderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_folder, container, false);
ButterKnife.bind(this, view);
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
PreferenceUtil.getInstance(getActivity()).setLastPage(-2);
}
@Override
public void onDestroyView() {
ButterKnife.unbind(this);
super.onDestroyView();
}
@Override
public boolean onBackPressed() {
return false;
}
}

View file

@ -0,0 +1,313 @@
package com.kabouzeid.gramophone.ui.fragments;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup;
import com.afollestad.materialcab.MaterialCab;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.util.TabLayoutUtil;
import com.kabouzeid.appthemehelper.util.ToolbarContentTintHelper;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.MusicLibraryPagerAdapter;
import com.kabouzeid.gramophone.dialogs.CreatePlaylistDialog;
import com.kabouzeid.gramophone.dialogs.SleepTimerDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.ui.activities.MainActivity;
import com.kabouzeid.gramophone.ui.activities.SearchActivity;
import com.kabouzeid.gramophone.ui.fragments.libraryfragments.AbsLibraryRecyclerViewCustomGridSizePagerFragment;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PhonographColorUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import com.kabouzeid.gramophone.util.Util;
import butterknife.Bind;
import butterknife.ButterKnife;
public class LibraryFragment extends AbsMainActivityFragment implements CabHolder, MainActivity.MainActivityFragmentCallbacks, ViewPager.OnPageChangeListener {
public static final String TAG = LibraryFragment.class.getSimpleName();
@Bind(R.id.toolbar)
Toolbar toolbar;
@Bind(R.id.tabs)
TabLayout tabs;
@Bind(R.id.appbar)
AppBarLayout appbar;
@Bind(R.id.pager)
ViewPager pager;
private MusicLibraryPagerAdapter pagerAdapter;
private MaterialCab cab;
public LibraryFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_library, container, false);
ButterKnife.bind(this, view);
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
pager.removeOnPageChangeListener(this);
ButterKnife.unbind(this);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
getMainActivity().setStatusbarColorAuto();
getMainActivity().setNavigationbarColorAuto();
getMainActivity().setTaskDescriptionColorAuto();
setUpToolbar();
setUpViewPager();
}
private void setUpToolbar() {
int primaryColor = ThemeStore.primaryColor(getActivity());
appbar.setBackgroundColor(primaryColor);
toolbar.setBackgroundColor(primaryColor);
toolbar.setNavigationIcon(R.drawable.ic_menu_white_24dp);
getActivity().setTitle(getResources().getString(R.string.app_name));
getMainActivity().setSupportActionBar(toolbar);
}
private void setUpViewPager() {
pagerAdapter = new MusicLibraryPagerAdapter(getActivity(), getChildFragmentManager());
pager.setAdapter(pagerAdapter);
pager.setOffscreenPageLimit(pagerAdapter.getCount() - 1);
tabs.setupWithViewPager(pager);
int primaryColor = ThemeStore.primaryColor(getActivity());
int normalColor = ToolbarContentTintHelper.toolbarSubtitleColor(getActivity(), primaryColor);
int selectedColor = ToolbarContentTintHelper.toolbarTitleColor(getActivity(), primaryColor);
TabLayoutUtil.setTabIconColors(tabs, normalColor, selectedColor);
tabs.setTabTextColors(normalColor, selectedColor);
tabs.setSelectedTabIndicatorColor(ThemeStore.accentColor(getActivity()));
int startPosition = PreferenceUtil.getInstance(getActivity()).getDefaultStartPage();
startPosition = startPosition == -1 ? PreferenceUtil.getInstance(getActivity()).getLastPage() : startPosition;
pager.setCurrentItem(startPosition);
PreferenceUtil.getInstance(getActivity()).setLastPage(startPosition); // just in case
pager.addOnPageChangeListener(this);
}
public Fragment getCurrentFragment() {
return pagerAdapter.getFragment(pager.getCurrentItem());
}
private boolean isPlaylistPage() {
return pager.getCurrentItem() == MusicLibraryPagerAdapter.MusicFragments.PLAYLIST.ordinal();
}
@Override
public MaterialCab openCab(final int menu, final MaterialCab.Callback callback) {
if (cab != null && cab.isActive()) cab.finish();
cab = new MaterialCab(getMainActivity(), R.id.cab_stub)
.setMenu(menu)
.setCloseDrawableRes(R.drawable.ic_close_white_24dp)
.setBackgroundColor(PhonographColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor(getActivity())))
.start(callback);
return cab;
}
public void addOnAppBarOffsetChangedListener(AppBarLayout.OnOffsetChangedListener onOffsetChangedListener) {
appbar.addOnOffsetChangedListener(onOffsetChangedListener);
}
public void removeOnAppBarOffsetChangedListener(AppBarLayout.OnOffsetChangedListener onOffsetChangedListener) {
appbar.removeOnOffsetChangedListener(onOffsetChangedListener);
}
public int getTotalAppBarScrollingRange() {
return appbar.getTotalScrollRange();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_main, menu);
if (isPlaylistPage()) {
menu.add(0, R.id.action_new_playlist, 0, R.string.new_playlist_title);
}
Fragment currentFragment = getCurrentFragment();
if (currentFragment instanceof AbsLibraryRecyclerViewCustomGridSizePagerFragment && currentFragment.isAdded()) {
AbsLibraryRecyclerViewCustomGridSizePagerFragment absLibraryRecyclerViewCustomGridSizeFragment = (AbsLibraryRecyclerViewCustomGridSizePagerFragment) currentFragment;
MenuItem gridSizeItem = menu.findItem(R.id.action_grid_size);
if (Util.isLandscape(getResources())) {
gridSizeItem.setTitle(R.string.action_grid_size_land);
}
setUpGridSizeMenu(absLibraryRecyclerViewCustomGridSizeFragment, gridSizeItem.getSubMenu());
menu.findItem(R.id.action_colored_footers).setChecked(absLibraryRecyclerViewCustomGridSizeFragment.usePalette());
menu.findItem(R.id.action_colored_footers).setEnabled(absLibraryRecyclerViewCustomGridSizeFragment.canUsePalette());
} else {
menu.removeItem(R.id.action_grid_size);
menu.removeItem(R.id.action_colored_footers);
}
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
Fragment currentFragment = getCurrentFragment();
if (currentFragment instanceof AbsLibraryRecyclerViewCustomGridSizePagerFragment) {
AbsLibraryRecyclerViewCustomGridSizePagerFragment absLibraryRecyclerViewCustomGridSizeFragment = (AbsLibraryRecyclerViewCustomGridSizePagerFragment) currentFragment;
if (item.getItemId() == R.id.action_colored_footers) {
item.setChecked(!item.isChecked());
absLibraryRecyclerViewCustomGridSizeFragment.setAndSaveUsePalette(item.isChecked());
return true;
}
if (handleGridSizeMenuItem(absLibraryRecyclerViewCustomGridSizeFragment, item)) {
return true;
}
}
int id = item.getItemId();
switch (id) {
case R.id.action_sleep_timer:
new SleepTimerDialog().show(getChildFragmentManager(), "SET_SLEEP_TIMER");
return true;
case R.id.action_equalizer:
NavigationUtil.openEqualizer(getActivity());
return true;
case R.id.action_shuffle_all:
MusicPlayerRemote.openAndShuffleQueue(SongLoader.getAllSongs(getActivity()), true);
return true;
case R.id.action_new_playlist:
CreatePlaylistDialog.create().show(getChildFragmentManager(), "CREATE_PLAYLIST");
return true;
case R.id.action_search:
startActivity(new Intent(getActivity(), SearchActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}
private void setUpGridSizeMenu(@NonNull AbsLibraryRecyclerViewCustomGridSizePagerFragment fragment, @NonNull SubMenu gridSizeMenu) {
switch (fragment.getGridSize()) {
case 1:
gridSizeMenu.findItem(R.id.action_grid_size_1).setChecked(true);
break;
case 2:
gridSizeMenu.findItem(R.id.action_grid_size_2).setChecked(true);
break;
case 3:
gridSizeMenu.findItem(R.id.action_grid_size_3).setChecked(true);
break;
case 4:
gridSizeMenu.findItem(R.id.action_grid_size_4).setChecked(true);
break;
case 5:
gridSizeMenu.findItem(R.id.action_grid_size_5).setChecked(true);
break;
case 6:
gridSizeMenu.findItem(R.id.action_grid_size_6).setChecked(true);
break;
case 7:
gridSizeMenu.findItem(R.id.action_grid_size_7).setChecked(true);
break;
case 8:
gridSizeMenu.findItem(R.id.action_grid_size_8).setChecked(true);
break;
}
int maxGridSize = fragment.getMaxGridSize();
if (maxGridSize < 8) {
gridSizeMenu.findItem(R.id.action_grid_size_8).setVisible(false);
}
if (maxGridSize < 7) {
gridSizeMenu.findItem(R.id.action_grid_size_7).setVisible(false);
}
if (maxGridSize < 6) {
gridSizeMenu.findItem(R.id.action_grid_size_6).setVisible(false);
}
if (maxGridSize < 5) {
gridSizeMenu.findItem(R.id.action_grid_size_5).setVisible(false);
}
if (maxGridSize < 4) {
gridSizeMenu.findItem(R.id.action_grid_size_4).setVisible(false);
}
if (maxGridSize < 3) {
gridSizeMenu.findItem(R.id.action_grid_size_3).setVisible(false);
}
}
private boolean handleGridSizeMenuItem(@NonNull AbsLibraryRecyclerViewCustomGridSizePagerFragment fragment, @NonNull MenuItem item) {
int gridSize = 0;
switch (item.getItemId()) {
case R.id.action_grid_size_1:
gridSize = 1;
break;
case R.id.action_grid_size_2:
gridSize = 2;
break;
case R.id.action_grid_size_3:
gridSize = 3;
break;
case R.id.action_grid_size_4:
gridSize = 4;
break;
case R.id.action_grid_size_5:
gridSize = 5;
break;
case R.id.action_grid_size_6:
gridSize = 6;
break;
case R.id.action_grid_size_7:
gridSize = 7;
break;
case R.id.action_grid_size_8:
gridSize = 8;
break;
}
if (gridSize > 0) {
item.setChecked(true);
fragment.setAndSaveGridSize(gridSize);
toolbar.getMenu().findItem(R.id.action_colored_footers).setEnabled(fragment.canUsePalette());
return true;
}
return false;
}
@Override
public boolean onBackPressed() {
if (cab != null && cab.isActive()) {
cab.finish();
return true;
}
return false;
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
PreferenceUtil.getInstance(getActivity()).setLastPage(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
}

View file

@ -0,0 +1,22 @@
package com.kabouzeid.gramophone.ui.fragments.libraryfragments;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import com.kabouzeid.gramophone.ui.fragments.LibraryFragment;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class AbsLibraryPagerFragment extends Fragment {
public LibraryFragment getLibraryFragment() {
return (LibraryFragment) getParentFragment();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
}
}

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
package com.kabouzeid.gramophone.ui.fragments.libraryfragments;
import android.support.annotation.LayoutRes;
import android.support.v7.widget.RecyclerView;
@ -9,7 +9,7 @@ import com.kabouzeid.gramophone.util.Util;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsMainActivityRecyclerViewCustomGridSizeFragment<A extends RecyclerView.Adapter, LM extends RecyclerView.LayoutManager> extends AbsMainActivityRecyclerViewFragment<A, LM> {
public abstract class AbsLibraryRecyclerViewCustomGridSizePagerFragment<A extends RecyclerView.Adapter, LM extends RecyclerView.LayoutManager> extends AbsLibraryRecyclerViewPagerFragment<A, LM> {
private int gridSize;
private boolean usePaletteInitialized;

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
package com.kabouzeid.gramophone.ui.fragments.libraryfragments;
import android.os.Bundle;
import android.support.annotation.LayoutRes;
@ -27,9 +27,9 @@ 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 AbsLibraryRecyclerViewPagerFragment<A extends RecyclerView.Adapter, LM extends RecyclerView.LayoutManager> extends AbsLibraryPagerFragment implements OnOffsetChangedListener, MusicServiceEventListener {
public static final String TAG = AbsMainActivityRecyclerViewFragment.class.getSimpleName();
public static final String TAG = AbsLibraryRecyclerViewPagerFragment.class.getSimpleName();
@Bind(R.id.container)
View container;
@ -53,8 +53,8 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getMainActivity().addOnAppBarOffsetChangedListener(this);
getMainActivity().addMusicServiceEventListener(this);
getLibraryFragment().addOnAppBarOffsetChangedListener(this);
getLibraryFragment().getMainActivity().addMusicServiceEventListener(this);
setUpRecyclerView();
@ -104,7 +104,7 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int i) {
container.setPadding(container.getPaddingLeft(), container.getPaddingTop(), container.getPaddingRight(), getMainActivity().getTotalAppBarScrollingRange() + i);
container.setPadding(container.getPaddingLeft(), container.getPaddingTop(), container.getPaddingRight(), getLibraryFragment().getTotalAppBarScrollingRange() + i);
}
@Override
@ -132,18 +132,6 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
}
@Override
public void enableViews() {
super.enableViews();
recyclerView.setEnabled(true);
}
@Override
public void disableViews() {
super.disableViews();
recyclerView.setEnabled(false);
}
private void checkIsEmpty() {
if (empty != null) {
RecyclerView.Adapter adapter = getAdapter();
@ -171,8 +159,8 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
@Override
public void onDestroyView() {
super.onDestroyView();
getMainActivity().removeOnAppBarOffsetChangedListener(this);
getMainActivity().removeMusicServiceEventListener(this);
getLibraryFragment().removeOnAppBarOffsetChangedListener(this);
getLibraryFragment().getMainActivity().removeMusicServiceEventListener(this);
ButterKnife.unbind(this);
}
}

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
package com.kabouzeid.gramophone.ui.fragments.libraryfragments;
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
@ -11,8 +11,8 @@ import com.kabouzeid.gramophone.util.PreferenceUtil;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class AlbumsFragment extends AbsMainActivityRecyclerViewCustomGridSizeFragment<AlbumAdapter, GridLayoutManager> {
public static final String TAG = AlbumsFragment.class.getSimpleName();
public class AlbumsPagerFragment extends AbsLibraryRecyclerViewCustomGridSizePagerFragment<AlbumAdapter, GridLayoutManager> {
public static final String TAG = AlbumsPagerFragment.class.getSimpleName();
@Override
protected GridLayoutManager createLayoutManager() {
@ -25,11 +25,11 @@ public class AlbumsFragment extends AbsMainActivityRecyclerViewCustomGridSizeFra
int itemLayoutRes = getItemLayoutRes();
applyRecyclerViewPaddingForLayoutRes(itemLayoutRes);
return new AlbumAdapter(
getMainActivity(),
getLibraryFragment().getMainActivity(),
AlbumLoader.getAllAlbums(getActivity()),
itemLayoutRes,
loadUsePalette(),
getMainActivity());
getLibraryFragment());
}
@Override

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
package com.kabouzeid.gramophone.ui.fragments.libraryfragments;
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
@ -11,9 +11,9 @@ import com.kabouzeid.gramophone.util.PreferenceUtil;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class ArtistsFragment extends AbsMainActivityRecyclerViewCustomGridSizeFragment<ArtistAdapter, GridLayoutManager> {
public class ArtistsPagerFragment extends AbsLibraryRecyclerViewCustomGridSizePagerFragment<ArtistAdapter, GridLayoutManager> {
public static final String TAG = ArtistsFragment.class.getSimpleName();
public static final String TAG = ArtistsPagerFragment.class.getSimpleName();
@NonNull
@Override
@ -27,11 +27,11 @@ public class ArtistsFragment extends AbsMainActivityRecyclerViewCustomGridSizeFr
int itemLayoutRes = getItemLayoutRes();
applyRecyclerViewPaddingForLayoutRes(itemLayoutRes);
return new ArtistAdapter(
getMainActivity(),
getLibraryFragment().getMainActivity(),
ArtistLoader.getAllArtists(getActivity()),
itemLayoutRes,
loadUsePalette(),
getMainActivity());
getLibraryFragment());
}
@Override

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
package com.kabouzeid.gramophone.ui.fragments.libraryfragments;
import android.support.annotation.NonNull;
import android.support.v7.widget.LinearLayoutManager;
@ -16,9 +16,9 @@ import java.util.ArrayList;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class PlaylistsFragment extends AbsMainActivityRecyclerViewFragment<PlaylistAdapter, LinearLayoutManager> {
public class PlaylistsPagerFragment extends AbsLibraryRecyclerViewPagerFragment<PlaylistAdapter, LinearLayoutManager> {
public static final String TAG = PlaylistsFragment.class.getSimpleName();
public static final String TAG = PlaylistsPagerFragment.class.getSimpleName();
@NonNull
@Override
@ -29,7 +29,7 @@ public class PlaylistsFragment extends AbsMainActivityRecyclerViewFragment<Playl
@NonNull
@Override
protected PlaylistAdapter createAdapter() {
return new PlaylistAdapter(getMainActivity(), getAllPlaylists(), R.layout.item_list_single_row, getMainActivity());
return new PlaylistAdapter(getLibraryFragment().getMainActivity(), getAllPlaylists(), R.layout.item_list_single_row, getLibraryFragment());
}
@Override

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
package com.kabouzeid.gramophone.ui.fragments.libraryfragments;
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
@ -8,7 +8,6 @@ import com.kabouzeid.gramophone.adapter.song.ShuffleButtonSongAdapter;
import com.kabouzeid.gramophone.adapter.song.SongAdapter;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.MainActivity;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import java.util.ArrayList;
@ -16,9 +15,9 @@ import java.util.ArrayList;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class SongsFragment extends AbsMainActivityRecyclerViewCustomGridSizeFragment<SongAdapter, GridLayoutManager> {
public class SongsPagerFragment extends AbsLibraryRecyclerViewCustomGridSizePagerFragment<SongAdapter, GridLayoutManager> {
public static final String TAG = SongsFragment.class.getSimpleName();
public static final String TAG = SongsPagerFragment.class.getSimpleName();
@NonNull
@Override
@ -29,7 +28,6 @@ public class SongsFragment extends AbsMainActivityRecyclerViewCustomGridSizeFrag
@NonNull
@Override
protected SongAdapter createAdapter() {
MainActivity mainActivity = getMainActivity();
ArrayList<Song> songs = SongLoader.getAllSongs(getActivity());
int itemLayoutRes = getItemLayoutRes();
applyRecyclerViewPaddingForLayoutRes(itemLayoutRes);
@ -37,18 +35,18 @@ public class SongsFragment extends AbsMainActivityRecyclerViewCustomGridSizeFrag
if (getGridSize() <= getMaxGridSizeForList()) {
return new ShuffleButtonSongAdapter(
mainActivity,
getLibraryFragment().getMainActivity(),
songs,
itemLayoutRes,
usePalette,
mainActivity);
getLibraryFragment());
}
return new SongAdapter(
mainActivity,
getLibraryFragment().getMainActivity(),
songs,
itemLayoutRes,
usePalette,
mainActivity);
getLibraryFragment());
}
@Override

View file

@ -1,47 +0,0 @@
package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
import com.kabouzeid.gramophone.ui.activities.MainActivity;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsMainActivityFragment extends Fragment implements KabViewsDisableAble {
private boolean areViewsEnabled;
@NonNull
protected MainActivity getMainActivity() {
return (MainActivity) getActivity();
}
@Override
public void enableViews() {
areViewsEnabled = true;
}
@Override
public void disableViews() {
areViewsEnabled = false;
}
@Override
public boolean areViewsEnabled() {
return areViewsEnabled;
}
@Override
public void onResume() {
super.onResume();
enableViews();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
}
}

View file

@ -12,7 +12,6 @@ import android.widget.Toast;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.ui.activities.AlbumDetailActivity;
import com.kabouzeid.gramophone.ui.activities.ArtistDetailActivity;
@ -24,8 +23,6 @@ import com.kabouzeid.gramophone.ui.activities.PlaylistDetailActivity;
public class NavigationUtil {
public static void goToArtist(@NonNull final Activity activity, final int artistId, @Nullable Pair... sharedElements) {
if (!disableViewsAndCheckIsReadyForTransition(activity)) return;
final Intent intent = new Intent(activity, ArtistDetailActivity.class);
intent.putExtra(ArtistDetailActivity.EXTRA_ARTIST_ID, artistId);
@ -34,8 +31,6 @@ public class NavigationUtil {
}
public static void goToAlbum(@NonNull final Activity activity, final int albumId, @Nullable Pair... sharedElements) {
if (!disableViewsAndCheckIsReadyForTransition(activity)) return;
final Intent intent = new Intent(activity, AlbumDetailActivity.class);
intent.putExtra(AlbumDetailActivity.EXTRA_ALBUM_ID, albumId);
@ -44,24 +39,12 @@ public class NavigationUtil {
}
public static void goToPlaylist(@NonNull final Activity activity, final Playlist playlist, @Nullable Pair... sharedElements) {
if (!disableViewsAndCheckIsReadyForTransition(activity)) return;
final Intent intent = new Intent(activity, PlaylistDetailActivity.class);
intent.putExtra(PlaylistDetailActivity.EXTRA_PLAYLIST, playlist);
activity.startActivity(intent);
}
private static boolean disableViewsAndCheckIsReadyForTransition(@NonNull final Activity activity) {
if (activity instanceof KabViewsDisableAble) {
if (((KabViewsDisableAble) activity).areViewsEnabled()) {
((KabViewsDisableAble) activity).disableViews();
return true;
}
}
return false;
}
public static void openEqualizer(@NonNull final Activity activity) {
final int sessionId = MusicPlayerRemote.getAudioSessionId();
if (sessionId == AudioEffect.ERROR_BAD_VALUE) {

View file

@ -13,7 +13,8 @@ import com.kabouzeid.gramophone.helper.SortOrder;
public final class PreferenceUtil {
public static final String GENERAL_THEME = "general_theme";
public static final String DEFAULT_START_PAGE = "default_start_page";
public static final String LAST_START_PAGE = "last_start_page";
public static final String LAST_PAGE = "last_start_page";
public static final String LAST_MUSIC_CHOOSER = "last_music_chooser";
public static final String ARTIST_SORT_ORDER = "artist_sort_order";
public static final String ARTIST_SONG_SORT_ORDER = "artist_song_sort_order";
@ -100,16 +101,24 @@ public final class PreferenceUtil {
return Integer.parseInt(mPreferences.getString(DEFAULT_START_PAGE, "-1"));
}
public void setLastStartPage(final int value) {
public void setLastPage(final int value) {
final SharedPreferences.Editor editor = mPreferences.edit();
editor.putInt(LAST_START_PAGE, value);
editor.putInt(LAST_PAGE, value);
editor.apply();
}
public static final int DEFAULT_PAGE = 0;
public final int getLastPage() {
return mPreferences.getInt(LAST_PAGE, 0);
}
public final int getLastStartPage() {
return mPreferences.getInt(LAST_START_PAGE, DEFAULT_PAGE);
public void setLastMusicChooser(final int value) {
final SharedPreferences.Editor editor = mPreferences.edit();
editor.putInt(LAST_MUSIC_CHOOSER, value);
editor.apply();
}
public final int getLastMusicChooser() {
return mPreferences.getInt(LAST_MUSIC_CHOOSER, 0);
}
public final boolean coloredNotification() {

View file

@ -1,65 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
<FrameLayout android:id="@+id/fragment_container"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="0dp"
tools:ignore="UnusedAttribute">
<include layout="@layout/status_bar" />
</FrameLayout>
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="UnusedAttribute">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_scrollFlags="scroll|enterAlways">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
style="@style/Toolbar"
android:elevation="0dp"
tools:ignore="UnusedAttribute">
</android.support.v7.widget.Toolbar>
<ViewStub
android:id="@+id/cab_stub"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" />
</FrameLayout>
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="@dimen/tab_height"
app:tabContentStart="72dp"
app:tabMode="scrollable" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
</LinearLayout>
android:layout_height="match_parent" />

View file

@ -0,0 +1,50 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="UnusedAttribute">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/status_bar" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="@dimen/toolbar_elevation"
tools:ignore="UnusedAttribute">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
style="@style/Toolbar"
android:background="@android:color/transparent" />
<ViewStub
android:id="@+id/cab_stub"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" />
</FrameLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
</LinearLayout>
<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="Placeholder"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/empty_text_size" />
</FrameLayout>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.kabouzeid.gramophone.ui.fragments.LibraryFragment">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="0dp"
tools:ignore="UnusedAttribute">
<include layout="@layout/status_bar" />
</FrameLayout>
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="UnusedAttribute">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_scrollFlags="scroll|enterAlways">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
style="@style/Toolbar"
android:elevation="0dp"
tools:ignore="UnusedAttribute">
</android.support.v7.widget.Toolbar>
<ViewStub
android:id="@+id/cab_stub"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" />
</FrameLayout>
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="@dimen/tab_height"
app:tabContentStart="72dp"
app:tabMode="scrollable" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
</LinearLayout>

View file

@ -9,10 +9,9 @@
android:icon="@drawable/ic_library_music_white_24dp"
android:title="@string/library" />
<item
android:enabled="false"
android:id="@+id/nav_folders"
android:icon="@drawable/ic_folder_white_24dp"
android:title="Folders (soon)" />
android:title="@string/folders" />
</group>
<group

View file

@ -236,4 +236,7 @@
<string name="folders">Folders</string>
<string name="saved_playlist_to">Saved playlist to %s.</string>
<string name="failed_to_save_playlist">Failed to save playlist (%s).</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
</resources>

View file

@ -5,6 +5,7 @@
<item>@string/albums</item>
<item>@string/artists</item>
<item>@string/playlists</item>
<item>@string/folders</item>
</string-array>
<string-array name="pref_start_page_list_values">
@ -13,6 +14,7 @@
<item>1</item>
<item>2</item>
<item>3</item>
<item>-2</item>
</string-array>
<string-array name="pref_general_theme_list_titles">