// id is in this case the index in the underlying collection,
// which is what we are interested in here -- so use as position
int position = (int)id;
+ // ignore clicks on the header
+ if(id < 0) { return; }
// play clicked song and enqueue the rest of the songs in the Adapter
int songCount = getCount();
long[] toPlay = new long[songCount];
return true;
case R.id.menu_clear_queue:
MusicUtils.clearQueue();
- NavUtils.goHome(mFragment.getActivity());
return true;
default:
break;
NavUtils.openSearch(BaseActivity.this, "");
return true;
- case android.R.id.home:
- getSupportFragmentManager().popBackStack();
- return true;
-
default:
break;
}
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.text.TextUtils;
+import android.view.MenuItem;
+
import com.cyngn.eleven.Config;
import com.cyngn.eleven.R;
import com.cyngn.eleven.cache.ImageFetcher;
import com.cyngn.eleven.ui.fragments.AlbumDetailFragment;
import com.cyngn.eleven.ui.fragments.ArtistDetailFragment;
+import com.cyngn.eleven.ui.fragments.IChildFragment;
import com.cyngn.eleven.ui.fragments.ISetupActionBar;
import com.cyngn.eleven.ui.fragments.PlaylistDetailFragment;
import com.cyngn.eleven.ui.fragments.RecentFragment;
import com.cyngn.eleven.ui.fragments.profile.TopTracksFragment;
import com.cyngn.eleven.utils.ApolloUtils;
import com.cyngn.eleven.utils.MusicUtils;
+import com.cyngn.eleven.utils.NavUtils;
public class HomeActivity extends SlidingPanelActivity {
private static final String ACTION_PREFIX = HomeActivity.class.getName();
public static final String ACTION_VIEW_ALBUM_DETAILS = ACTION_PREFIX + ".view.AlbumDetails";
public static final String ACTION_VIEW_PLAYLIST_DETAILS = ACTION_PREFIX + ".view.PlaylistDetails";
public static final String ACTION_VIEW_SMART_PLAYLIST = ACTION_PREFIX + ".view.SmartPlaylist";
+ public static final String EXTRA_BROWSE_PAGE_IDX = "BrowsePageIndex";
private static final int NEW_PHOTO = 1;
private boolean mLoadedBaseFragment = false;
private Handler mHandler = new Handler();
+ /**
+ * Used by the up action to determine how to handle this
+ */
+ protected boolean mTopLevelActivity = false;
+
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// if the intent didn't cause us to load a fragment, load the music browse one
if (!mLoadedBaseFragment) {
+ final MusicBrowserPhoneFragment fragment = new MusicBrowserPhoneFragment();
+ if (launchIntent != null) {
+ fragment.setDefaultPageIdx(launchIntent.getIntExtra(EXTRA_BROWSE_PAGE_IDX,
+ MusicBrowserPhoneFragment.INVALID_PAGE_INDEX));
+ }
getSupportFragmentManager().beginTransaction()
- .replace(R.id.activity_base_content, new MusicBrowserPhoneFragment()).commit();
+ .replace(R.id.activity_base_content, fragment).commit();
mLoadedBaseFragment = true;
+ mTopLevelActivity = true;
}
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
intent.setType("image/*");
startActivityForResult(intent, NEW_PHOTO);
}
+
+ @Override
+ public boolean onOptionsItemSelected(final MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ navigateToTop();
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ /**
+ * Navigates to the top Activity and places the view to the correct page
+ */
+ protected void navigateToTop() {
+ final Fragment topFragment = getTopFragment();
+ int targetFragmentIndex = MusicBrowserPhoneFragment.INVALID_PAGE_INDEX;
+ if (topFragment instanceof IChildFragment) {
+ targetFragmentIndex = ((IChildFragment)topFragment).getMusicFragmentParent().ordinal();
+ }
+
+ // If we are the top activity in the stack (as determined by the activity that has loaded
+ // the MusicBrowserPhoneFragment) then clear the back stack and move the browse fragment
+ // to the appropriate page as per Android up standards
+ if (mTopLevelActivity) {
+ clearBackStack();
+ MusicBrowserPhoneFragment musicFragment = (MusicBrowserPhoneFragment) getTopFragment();
+ musicFragment.setDefaultPageIdx(targetFragmentIndex);
+ showPanel(Panel.Browse);
+ } else {
+ // I've tried all other combinations with parent activities, support.NavUtils and
+ // there is no easy way to achieve what we want that I'm aware of, so clear everything
+ // and jump to the right page
+ NavUtils.goHome(this, targetFragmentIndex);
+ }
+ }
+
+ /**
+ * Immediately clears the backstack
+ */
+ protected void clearBackStack() {
+ final FragmentManager fragmentManager = getSupportFragmentManager();
+ if (fragmentManager.getBackStackEntryCount() > 0) {
+ final int id = fragmentManager.getBackStackEntryAt(0).getId();
+ fragmentManager.popBackStackImmediate(id, FragmentManager.POP_BACK_STACK_INCLUSIVE);
+ }
+ }
+
+
}
import com.cyngn.eleven.R;
import com.cyngn.eleven.adapters.AlbumDetailSongAdapter;
import com.cyngn.eleven.adapters.DetailSongAdapter;
+import com.cyngn.eleven.adapters.PagerAdapter;
import com.cyngn.eleven.cache.ImageFetcher;
import com.cyngn.eleven.model.Album;
import com.cyngn.eleven.model.Song;
import java.util.List;
-public class AlbumDetailFragment extends DetailFragment {
+public class AlbumDetailFragment extends DetailFragment implements IChildFragment {
private static final int LOADER_ID = 1;
private ListView mSongs;
mSongAdapter.setCurrentlyPlayingTrack(MusicUtils.getCurrentTrack());
}
+
+ @Override
+ public PagerAdapter.MusicFragments getMusicFragmentParent() {
+ return PagerAdapter.MusicFragments.ALBUM;
+ }
}
import com.cyngn.eleven.R;
import com.cyngn.eleven.adapters.ArtistDetailAlbumAdapter;
import com.cyngn.eleven.adapters.ArtistDetailSongAdapter;
+import com.cyngn.eleven.adapters.PagerAdapter;
import com.cyngn.eleven.cache.ImageFetcher;
import com.cyngn.eleven.menu.FragmentMenuItems;
import com.cyngn.eleven.model.Album;
import java.util.TreeSet;
-public class ArtistDetailFragment extends FadingBarFragment {
+public class ArtistDetailFragment extends FadingBarFragment implements IChildFragment {
private final int ALBUM_LOADER_ID = 0;
private final int SONG_LOADER_ID = 1;
mSongAdapter.setCurrentlyPlayingTrack(MusicUtils.getCurrentTrack());
}
+
+ @Override
+ public PagerAdapter.MusicFragments getMusicFragmentParent() {
+ return PagerAdapter.MusicFragments.ARTIST;
+ }
}
public void onServiceDisconnected(ComponentName name) {
}
- public void onDelete(long[] ids) {
- if (MusicUtils.getQueue().length == 0) {
- NavUtils.goHome(getActivity());
- }
- }
-
- public void onVisible() {
- // Set the playback drawables
- updatePlaybackControls();
- // Current info
- updateNowPlayingInfo();
- }
-
- public void onHidden() {
-
- }
-
@Override
public void onStart() {
super.onStart();
return true;
case R.id.menu_clear_queue:
MusicUtils.clearQueue();
- NavUtils.goHome(getActivity());
return true;
default:
break;
--- /dev/null
+/*
+ * Copyright (C) 2014 Cyanogen, Inc.
+ */
+package com.cyngn.eleven.ui.fragments;
+
+import com.cyngn.eleven.adapters.PagerAdapter;
+
+public interface IChildFragment {
+ PagerAdapter.MusicFragments getMusicFragmentParent();
+}
import android.widget.TextView;
import com.cyngn.eleven.Config;
import com.cyngn.eleven.R;
+import com.cyngn.eleven.adapters.PagerAdapter;
import com.cyngn.eleven.adapters.ProfileSongAdapter;
import com.cyngn.eleven.cache.ImageFetcher;
import com.cyngn.eleven.dragdrop.DragSortListView;
public class PlaylistDetailFragment extends FadingBarFragment implements
LoaderCallbacks<List<Song>>, OnItemClickListener, DropListener,
- RemoveListener, DragScrollProfile {
+ RemoveListener, DragScrollProfile, IChildFragment {
/**
* LoaderCallbacks identifier
restartLoader();
}
+
+ @Override
+ public PagerAdapter.MusicFragments getMusicFragmentParent() {
+ return PagerAdapter.MusicFragments.PLAYLIST;
+ }
}
* @author Andrew Neal (andrewdneal@gmail.com)
*/
public class MusicBrowserPhoneFragment extends BaseFragment {
+ public static final int INVALID_PAGE_INDEX = -1;
/**
* Pager
private PreferenceUtils mPreferences;
/**
+ * A pre-defined page index to navigate to
+ */
+ private int mDefaultPageIdx = INVALID_PAGE_INDEX;
+
+ /**
* Empty constructor as per the {@link Fragment} documentation
*/
public MusicBrowserPhoneFragment() {
mViewPager.setAdapter(mPagerAdapter);
// Offscreen pager loading limit
mViewPager.setOffscreenPageLimit(mPagerAdapter.getCount() - 1);
- // Start on the last page the user was on
- mViewPager.setCurrentItem(mPreferences.getStartPage());
// Initialze the TPI
final TabPageIndicator pageIndicator = (TabPageIndicator)mRootView
.findViewById(R.id.fragment_home_phone_pager_titles);
// Attach the ViewPager
pageIndicator.setViewPager(mViewPager);
+
+ if (mDefaultPageIdx != INVALID_PAGE_INDEX) {
+ navigateToPage(mDefaultPageIdx);
+ } else {
+ // Start on the last page the user was on
+ navigateToPage(mPreferences.getStartPage());
+ }
+ }
+
+ public void setDefaultPageIdx(final int pageIdx) {
+ mDefaultPageIdx = pageIdx;
+ navigateToPage(mDefaultPageIdx);
+ }
+
+ private void navigateToPage(final int idx) {
+ // this may be called before the view is created, so do a check for mViewPager
+ if (idx != INVALID_PAGE_INDEX && mViewPager != null) {
+ mViewPager.setCurrentItem(idx);
+ }
}
/**
import com.cyngn.eleven.Config;
import com.cyngn.eleven.R;
import com.cyngn.eleven.adapters.SongAdapter;
+import com.cyngn.eleven.adapters.PagerAdapter;
import com.cyngn.eleven.menu.ConfirmDialog;
import com.cyngn.eleven.model.Playlist;
+import com.cyngn.eleven.ui.fragments.IChildFragment;
import com.cyngn.eleven.utils.MusicUtils;
import com.cyngn.eleven.utils.PlaylistPopupMenuHelper;
import com.cyngn.eleven.utils.PopupMenuHelper;
import com.cyngn.eleven.utils.PopupMenuHelper.PopupMenuType;
public abstract class SmartPlaylistFragment extends BasicSongFragment
-implements ConfirmDialog.ConfirmCallback {
+ implements ConfirmDialog.ConfirmCallback, IChildFragment {
/**
* LoaderCallbacks identifier
*/
}
}
+ public PagerAdapter.MusicFragments getMusicFragmentParent() {
+ return PagerAdapter.MusicFragments.PLAYLIST;
+ }
+
protected abstract SmartPlaylistType getSmartPlaylistType();
/** text for menu item that shuffles items in this playlist */
*
* @param activity The {@link Activity} to use.
*/
- public static void goHome(final Activity activity) {
+ public static void goHome(final Activity activity, final int browseIndex) {
final Intent intent = new Intent(activity, HomeActivity.class);
intent.setAction(HomeActivity.ACTION_VIEW_BROWSE);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK
- | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ | Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.putExtra(HomeActivity.EXTRA_BROWSE_PAGE_IDX, browseIndex);
activity.startActivity(intent);
}
}