OSDN Git Service

Eleven: ignore clicks on ArtistDetail header
authorWilhelm Fitzpatrick <rafial@cyngn.com>
Thu, 23 Oct 2014 21:28:18 +0000 (14:28 -0700)
committerlinus_lee <llee@cyngn.com>
Thu, 20 Nov 2014 20:51:35 +0000 (12:51 -0800)
https://cyanogen.atlassian.net/browse/MUSIC-126

Change-Id: Ic338b3fc6f60cfb830c38651019b0d77653e9a90

12 files changed:
src/com/cyngn/eleven/adapters/DetailSongAdapter.java
src/com/cyngn/eleven/ui/HeaderBar.java
src/com/cyngn/eleven/ui/activities/BaseActivity.java
src/com/cyngn/eleven/ui/activities/HomeActivity.java
src/com/cyngn/eleven/ui/fragments/AlbumDetailFragment.java
src/com/cyngn/eleven/ui/fragments/ArtistDetailFragment.java
src/com/cyngn/eleven/ui/fragments/AudioPlayerFragment.java
src/com/cyngn/eleven/ui/fragments/IChildFragment.java [new file with mode: 0644]
src/com/cyngn/eleven/ui/fragments/PlaylistDetailFragment.java
src/com/cyngn/eleven/ui/fragments/phone/MusicBrowserPhoneFragment.java
src/com/cyngn/eleven/ui/fragments/profile/SmartPlaylistFragment.java
src/com/cyngn/eleven/utils/NavUtils.java

index 9532d6b..ee17968 100644 (file)
@@ -96,6 +96,8 @@ public abstract class DetailSongAdapter extends BaseAdapter
         // 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];
index 9739e99..e6180d0 100644 (file)
@@ -150,7 +150,6 @@ public class HeaderBar extends LinearLayout {
                 return true;
             case R.id.menu_clear_queue:
                 MusicUtils.clearQueue();
-                NavUtils.goHome(mFragment.getActivity());
                 return true;
             default:
                 break;
index 52ad06d..484098b 100644 (file)
@@ -184,10 +184,6 @@ public abstract class BaseActivity extends FragmentActivity implements ServiceCo
                 NavUtils.openSearch(BaseActivity.this, "");
                 return true;
 
-            case android.R.id.home:
-                getSupportFragmentManager().popBackStack();
-                return true;
-
             default:
                 break;
         }
index 10cc3b3..4a5f08f 100644 (file)
@@ -24,11 +24,14 @@ import android.support.v4.app.Fragment;
 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;
@@ -37,6 +40,7 @@ import com.cyngn.eleven.ui.fragments.profile.LastAddedFragment;
 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();
@@ -47,6 +51,7 @@ public class HomeActivity extends SlidingPanelActivity {
     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;
 
@@ -54,6 +59,12 @@ public class HomeActivity extends SlidingPanelActivity {
     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);
@@ -65,10 +76,16 @@ public class HomeActivity extends SlidingPanelActivity {
 
         // 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() {
@@ -206,4 +223,54 @@ public class HomeActivity extends SlidingPanelActivity {
         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);
+        }
+    }
+
+
 }
index f0f1b91..a9a18d3 100644 (file)
@@ -10,6 +10,7 @@ import com.cyngn.eleven.Config;
 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;
@@ -24,7 +25,7 @@ import com.cyngn.eleven.widgets.LoadingEmptyContainer;
 
 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;
@@ -187,4 +188,9 @@ public class AlbumDetailFragment extends DetailFragment {
 
         mSongAdapter.setCurrentlyPlayingTrack(MusicUtils.getCurrentTrack());
     }
+
+    @Override
+    public PagerAdapter.MusicFragments getMusicFragmentParent() {
+        return PagerAdapter.MusicFragments.ALBUM;
+    }
 }
index 6013cec..b67088f 100644 (file)
@@ -15,6 +15,7 @@ import com.cyngn.eleven.Config;
 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;
@@ -30,7 +31,7 @@ import com.cyngn.eleven.widgets.LoadingEmptyContainer;
 
 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;
 
@@ -228,4 +229,9 @@ public class ArtistDetailFragment extends FadingBarFragment {
 
         mSongAdapter.setCurrentlyPlayingTrack(MusicUtils.getCurrentTrack());
     }
+
+    @Override
+    public PagerAdapter.MusicFragments getMusicFragmentParent() {
+        return PagerAdapter.MusicFragments.ARTIST;
+    }
 }
index af7719e..9df4889 100644 (file)
@@ -194,23 +194,6 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection {
     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();
@@ -760,7 +743,6 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection {
                 return true;
             case R.id.menu_clear_queue:
                 MusicUtils.clearQueue();
-                NavUtils.goHome(getActivity());
                 return true;
             default:
                 break;
diff --git a/src/com/cyngn/eleven/ui/fragments/IChildFragment.java b/src/com/cyngn/eleven/ui/fragments/IChildFragment.java
new file mode 100644 (file)
index 0000000..1e750f2
--- /dev/null
@@ -0,0 +1,10 @@
+/*
+ * Copyright (C) 2014 Cyanogen, Inc.
+ */
+package com.cyngn.eleven.ui.fragments;
+
+import com.cyngn.eleven.adapters.PagerAdapter;
+
+public interface IChildFragment {
+    PagerAdapter.MusicFragments getMusicFragmentParent();
+}
index 39c6434..82048da 100644 (file)
@@ -15,6 +15,7 @@ import android.widget.ImageView;
 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;
@@ -40,7 +41,7 @@ import java.util.TreeSet;
 
 public class PlaylistDetailFragment extends FadingBarFragment implements
         LoaderCallbacks<List<Song>>, OnItemClickListener, DropListener,
-        RemoveListener, DragScrollProfile {
+        RemoveListener, DragScrollProfile, IChildFragment {
 
     /**
      * LoaderCallbacks identifier
@@ -386,4 +387,9 @@ public class PlaylistDetailFragment extends FadingBarFragment implements
 
         restartLoader();
     }
+
+    @Override
+    public PagerAdapter.MusicFragments getMusicFragmentParent() {
+        return PagerAdapter.MusicFragments.PLAYLIST;
+    }
 }
index 871d82b..c63e016 100644 (file)
@@ -44,6 +44,7 @@ import com.viewpagerindicator.TabPageIndicator;
  * @author Andrew Neal (andrewdneal@gmail.com)
  */
 public class MusicBrowserPhoneFragment extends BaseFragment {
+    public static final int INVALID_PAGE_INDEX = -1;
 
     /**
      * Pager
@@ -58,6 +59,11 @@ public class MusicBrowserPhoneFragment extends BaseFragment {
     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() {
@@ -102,14 +108,31 @@ public class MusicBrowserPhoneFragment extends BaseFragment {
         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);
+        }
     }
 
     /**
index 235244a..1418f2c 100644 (file)
@@ -12,15 +12,17 @@ import com.cyngn.eleven.Config.SmartPlaylistType;
 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
      */
@@ -108,6 +110,10 @@ implements ConfirmDialog.ConfirmCallback {
         }
     }
 
+    public PagerAdapter.MusicFragments getMusicFragmentParent() {
+        return PagerAdapter.MusicFragments.PLAYLIST;
+    }
+
     protected abstract SmartPlaylistType getSmartPlaylistType();
 
     /** text for menu item that shuffles items in this playlist */
index 8dad960..a19d226 100644 (file)
@@ -152,11 +152,12 @@ public final class NavUtils {
      * 
      * @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);
     }
 }