diff options
author | linus_lee <llee@cyngn.com> | 2014-08-26 17:23:44 -0700 |
---|---|---|
committer | linus_lee <llee@cyngn.com> | 2014-11-20 11:58:47 -0800 |
commit | f5a90f5f31ffcb83e8323c8dc97e65b649724286 (patch) | |
tree | f5eebfe133335dc4649a98c348666ff1649ab665 /src | |
parent | e3cfcdad5e941ae2e7b2704f72d2fad9945ab5f5 (diff) | |
download | android_packages_apps_Eleven-f5a90f5f31ffcb83e8323c8dc97e65b649724286.tar.gz android_packages_apps_Eleven-f5a90f5f31ffcb83e8323c8dc97e65b649724286.tar.bz2 android_packages_apps_Eleven-f5a90f5f31ffcb83e8323c8dc97e65b649724286.zip |
Eleven: Hook back in menu button into the now playing and queue menu buttons
Change-Id: I07491fe9c1aac87a599a91136db8f5c395cddab3
Diffstat (limited to 'src')
-rw-r--r-- | src/com/cyngn/eleven/ui/HeaderBar.java | 135 | ||||
-rw-r--r-- | src/com/cyngn/eleven/ui/activities/BaseActivity.java | 2 | ||||
-rw-r--r-- | src/com/cyngn/eleven/ui/activities/HomeActivity.java | 71 | ||||
-rw-r--r-- | src/com/cyngn/eleven/ui/fragments/AudioPlayerFragment.java | 82 | ||||
-rw-r--r-- | src/com/cyngn/eleven/ui/fragments/QueueFragment.java | 29 | ||||
-rw-r--r-- | src/com/cyngn/eleven/utils/NavUtils.java | 1 |
6 files changed, 252 insertions, 68 deletions
diff --git a/src/com/cyngn/eleven/ui/HeaderBar.java b/src/com/cyngn/eleven/ui/HeaderBar.java new file mode 100644 index 0000000..a80bcac --- /dev/null +++ b/src/com/cyngn/eleven/ui/HeaderBar.java @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2014 Cyanogen, Inc. + */ +package com.cyngn.eleven.ui; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.PopupMenu; + +import com.cyngn.eleven.R; +import com.cyngn.eleven.widgets.theme.HoloSelector; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; + + +/** + * Simple Header bar wrapper class that also has its own menu bar button. + * It can collect a list of popup menu creators and create a pop up menu + * from the list + */ +public class HeaderBar extends LinearLayout implements View.OnClickListener, + PopupMenu.OnMenuItemClickListener { + + public static interface PopupMenuCreator { + public void onCreatePopupMenu(final Menu menu, final MenuInflater inflater); + public void clearHeaderBars(); + public void addHeaderBar(final WeakReference<HeaderBar> headerBar); + public boolean onPopupMenuItemClick(final MenuItem item); + } + + private ImageView mMenuButton; + private ArrayList<WeakReference<PopupMenuCreator>> mListPopupMenuCreator; + private PopupMenu mPopupMenu; + + public HeaderBar(Context context, AttributeSet attrs) { + super(context, attrs); + + mListPopupMenuCreator = new ArrayList<WeakReference<PopupMenuCreator>>(); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + mMenuButton = (ImageView)findViewById(R.id.header_bar_menu_button); + mMenuButton.setBackground(new HoloSelector(getContext())); + mMenuButton.setOnClickListener(this); + updateMenuButtonVisibility(); + + mPopupMenu = new PopupMenu(getContext(), mMenuButton); + mPopupMenu.setOnMenuItemClickListener(this); + } + + public void clear() { + // first dismiss the popup menu + dismissPopupMenu(); + + // disconnect the popup menu creators + for (WeakReference<PopupMenuCreator> creator : mListPopupMenuCreator) { + PopupMenuCreator popupMenuCreator = creator.get(); + if (popupMenuCreator != null) { + popupMenuCreator.clearHeaderBars(); + } + } + + // clear the list + mListPopupMenuCreator.clear(); + } + + public void add(PopupMenuCreator popupMenuCreator) { + // add it to the list + mListPopupMenuCreator.add(new WeakReference<PopupMenuCreator>(popupMenuCreator)); + + // let the popup menu creator know about this header bar + popupMenuCreator.addHeaderBar(new WeakReference<HeaderBar>(this)); + + // update the visibility of the menu button + updateMenuButtonVisibility(); + } + + private void updateMenuButtonVisibility() { + // if there are no items, hide the button + if (mListPopupMenuCreator.size() == 0) { + mMenuButton.setVisibility(GONE); + } else { + mMenuButton.setVisibility(VISIBLE); + } + } + + @Override + public void onClick(View v) { + // clear any previous items + mPopupMenu.getMenu().clear(); + + // walk through each popup menu creator and inflate + for (WeakReference<PopupMenuCreator> creator : mListPopupMenuCreator) { + PopupMenuCreator popupMenuCreator = creator.get(); + if (popupMenuCreator != null) { + popupMenuCreator.onCreatePopupMenu(mPopupMenu.getMenu(), + mPopupMenu.getMenuInflater()); + } + } + + // show the popup + mPopupMenu.show(); + } + + public void dismissPopupMenu() { + if (mPopupMenu != null) { + mPopupMenu.dismiss(); + } + } + + @Override + public boolean onMenuItemClick(MenuItem item) { + // walk through each popup menu creator until one of them acknowledges the click + for (WeakReference<PopupMenuCreator> creator : mListPopupMenuCreator) { + PopupMenuCreator popupMenuCreator = creator.get(); + if (popupMenuCreator != null) { + if (popupMenuCreator.onPopupMenuItemClick(item)) { + return true; + } + } + } + + return false; + } +} diff --git a/src/com/cyngn/eleven/ui/activities/BaseActivity.java b/src/com/cyngn/eleven/ui/activities/BaseActivity.java index 996f790..173994f 100644 --- a/src/com/cyngn/eleven/ui/activities/BaseActivity.java +++ b/src/com/cyngn/eleven/ui/activities/BaseActivity.java @@ -129,7 +129,7 @@ public abstract class BaseActivity extends FragmentActivity implements ServiceCo // Initialize the broadcast receiver mPlaybackStatus = new PlaybackStatus(this); - getActionBar().setTitle(getString(R.string.app_name)); + getActionBar().setTitle(getString(R.string.app_name_uppercase)); // Set the layout setContentView(setContentView()); diff --git a/src/com/cyngn/eleven/ui/activities/HomeActivity.java b/src/com/cyngn/eleven/ui/activities/HomeActivity.java index 938e718..d30c9a5 100644 --- a/src/com/cyngn/eleven/ui/activities/HomeActivity.java +++ b/src/com/cyngn/eleven/ui/activities/HomeActivity.java @@ -16,12 +16,17 @@ import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.view.ViewPager; +import android.view.MenuInflater; import android.view.View; import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.PopupMenu; import android.widget.TextView; import com.cyngn.eleven.R; import com.cyngn.eleven.slidinguppanel.SlidingUpPanelLayout; +import com.cyngn.eleven.slidinguppanel.SlidingUpPanelLayout.SimplePanelSlideListener; +import com.cyngn.eleven.ui.HeaderBar; import com.cyngn.eleven.ui.fragments.AudioPlayerFragment; import com.cyngn.eleven.ui.fragments.QueueFragment; import com.cyngn.eleven.ui.fragments.phone.MusicBrowserPhoneFragment; @@ -59,12 +64,6 @@ public class HomeActivity extends BaseActivity { getSupportFragmentManager().beginTransaction() .replace(R.id.activity_base_content, new MusicBrowserPhoneFragment()).commit(); - getSupportFragmentManager().beginTransaction() - .replace(R.id.audioPlayerFragment, new AudioPlayerFragment()).commit(); - - getSupportFragmentManager().beginTransaction() - .replace(R.id.queueFragment, new QueueFragment()).commit(); - // set the action bar background color to be the background theme color mActionBarColor = getResources().getColor(R.color.header_action_bar_color); getActionBar().setBackgroundDrawable(new ColorDrawable(mActionBarColor)); @@ -81,8 +80,7 @@ public class HomeActivity extends BaseActivity { private void setupFirstPanel() { mFirstPanel = (SlidingUpPanelLayout)findViewById(R.id.sliding_layout); - setHeaderText(R.id.firstHeaderBar, R.string.page_now_playing); - mFirstPanel.setPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() { + mFirstPanel.setPanelSlideListener(new SimplePanelSlideListener() { @Override public void onPanelSlide(View panel, float slideOffset) { if (slideOffset > 0.8f) { @@ -91,32 +89,15 @@ public class HomeActivity extends BaseActivity { getActionBar().show(); } } - - @Override - public void onPanelCollapsed(View panel) { - - } - - @Override - public void onPanelExpanded(View panel) { - - } - - @Override - public void onPanelAnchored(View panel) { - - } - - @Override - public void onPanelHidden(View panel) { - - } }); + + // setup the header bar + setupHeaderBar(R.id.firstHeaderBar, R.string.app_name_uppercase); //R.string.page_now_playing); } private void setupSecondPanel() { mSecondPanel = (SlidingUpPanelLayout)findViewById(R.id.sliding_layout2); - mSecondPanel.setPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() { + mSecondPanel.setPanelSlideListener(new SimplePanelSlideListener() { @Override public void onPanelSlide(View panel, float slideOffset) { mFirstPanel.setSlidingEnabled(false); @@ -126,25 +107,10 @@ public class HomeActivity extends BaseActivity { public void onPanelCollapsed(View panel) { mFirstPanel.setSlidingEnabled(true); } - - @Override - public void onPanelExpanded(View panel) { - - } - - @Override - public void onPanelAnchored(View panel) { - - } - - @Override - public void onPanelHidden(View panel) { - - } }); - // set the text of the second header - setHeaderText(R.id.secondHeaderBar, R.string.page_play_queue); + // setup the header bar + setupHeaderBar(R.id.secondHeaderBar, R.string.page_play_queue); // set the drag view offset to allow the panel to go past the top of the viewport // since the previous view's is hiding the slide offset, we need to subtract that @@ -241,9 +207,16 @@ public class HomeActivity extends BaseActivity { return (AudioPlayerFragment)getSupportFragmentManager().findFragmentById(R.id.audioPlayerFragment); } - protected void setHeaderText(int containerId, int textId) { - View container = findViewById(containerId); - TextView textView = (TextView)container.findViewById(R.id.header_bar_title); + protected QueueFragment getQueueFragment() { + return (QueueFragment)getSupportFragmentManager().findFragmentById(R.id.queueFragment); + } + + protected void setupHeaderBar(final int containerId, final int textId) { + final HeaderBar headerBar = (HeaderBar)findViewById(containerId); + TextView textView = (TextView)headerBar.findViewById(R.id.header_bar_title); textView.setText(textId); + + headerBar.add(getAudioPlayerFragment()); + headerBar.add(getQueueFragment()); } } diff --git a/src/com/cyngn/eleven/ui/fragments/AudioPlayerFragment.java b/src/com/cyngn/eleven/ui/fragments/AudioPlayerFragment.java index c4a9383..7c3d305 100644 --- a/src/com/cyngn/eleven/ui/fragments/AudioPlayerFragment.java +++ b/src/com/cyngn/eleven/ui/fragments/AudioPlayerFragment.java @@ -19,6 +19,9 @@ import android.os.Message; import android.os.SystemClock; import android.support.v4.app.Fragment; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; @@ -32,6 +35,8 @@ import android.provider.MediaStore.Audio.Artists; import com.cyngn.eleven.MusicPlaybackService; import com.cyngn.eleven.R; import com.cyngn.eleven.cache.ImageFetcher; +import com.cyngn.eleven.menu.DeleteDialog; +import com.cyngn.eleven.ui.HeaderBar; import com.cyngn.eleven.utils.ApolloUtils; import com.cyngn.eleven.utils.MusicUtils; import com.cyngn.eleven.utils.NavUtils; @@ -41,11 +46,12 @@ import com.cyngn.eleven.widgets.RepeatingImageButton; import com.cyngn.eleven.widgets.ShuffleButton; import java.lang.ref.WeakReference; +import java.util.ArrayList; import static com.cyngn.eleven.utils.MusicUtils.mService; public class AudioPlayerFragment extends Fragment implements ServiceConnection, - SeekBar.OnSeekBarChangeListener { + SeekBar.OnSeekBarChangeListener, HeaderBar.PopupMenuCreator { // fragment view private ViewGroup mRootView; @@ -104,6 +110,9 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection, // Image cache private ImageFetcher mImageFetcher; + // Tracks the Header bars that trigger popup menu options + private ArrayList<WeakReference<HeaderBar>> mHeaderBarList = new ArrayList<WeakReference<HeaderBar>>(); + private long mPosOverride = -1; private long mStartSeekPos = 0; @@ -160,8 +169,7 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection, // Current info updateNowPlayingInfo(); // Update the favorites icon - // TODO: Revisit - // invalidateOptionsMenu(); + dismissPopupMenu(); } @Override @@ -626,6 +634,71 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection, } }; + @Override + public void onCreatePopupMenu(final Menu menu, final MenuInflater inflater) { + // Shuffle all + inflater.inflate(R.menu.shuffle, menu); + // Share, ringtone, and equalizer + inflater.inflate(R.menu.audio_player, menu); + // Settings + inflater.inflate(R.menu.activity_base, menu); + } + + @Override + public boolean onPopupMenuItemClick(final MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_shuffle: + // Shuffle all the songs + MusicUtils.shuffleAll(getActivity()); + return true; + case R.id.menu_audio_player_ringtone: + // Set the current track as a ringtone + MusicUtils.setRingtone(getActivity(), MusicUtils.getCurrentAudioId()); + return true; + case R.id.menu_audio_player_share: + // Share the current meta data + shareCurrentTrack(); + return true; + case R.id.menu_audio_player_equalizer: + // Sound effects + NavUtils.openEffectsPanel(getActivity()); + return true; + case R.id.menu_settings: + // Settings + NavUtils.openSettings(getActivity()); + return true; + case R.id.menu_audio_player_delete: + // Delete current song + DeleteDialog.newInstance(MusicUtils.getTrackName(), new long[]{ + MusicUtils.getCurrentAudioId() + }, null).show(getActivity().getSupportFragmentManager(), "DeleteDialog"); + return true; + default: + break; + } + + return false; + } + + @Override + public void addHeaderBar(final WeakReference<HeaderBar> headerBar) { + mHeaderBarList.add(headerBar); + } + + @Override + public void clearHeaderBars() { + mHeaderBarList.clear(); + } + + public void dismissPopupMenu() { + for (WeakReference<HeaderBar> headerBarRef : mHeaderBarList) { + HeaderBar headerBar = headerBarRef.get(); + if (headerBar != null) { + headerBar.dismissPopupMenu(); + } + } + } + /** * Used to update the current time string */ @@ -677,8 +750,7 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection, // Current info mReference.get().updateNowPlayingInfo(); // Update the favorites icon - // TODO: Revist - // mReference.get().invalidateOptionsMenu(); + mReference.get().dismissPopupMenu(); } else if (action.equals(MusicPlaybackService.PLAYSTATE_CHANGED)) { // Set the play and pause image mReference.get().mPlayPauseButton.updateState(); diff --git a/src/com/cyngn/eleven/ui/fragments/QueueFragment.java b/src/com/cyngn/eleven/ui/fragments/QueueFragment.java index 150c195..0df8be0 100644 --- a/src/com/cyngn/eleven/ui/fragments/QueueFragment.java +++ b/src/com/cyngn/eleven/ui/fragments/QueueFragment.java @@ -48,6 +48,8 @@ import com.cyngn.eleven.menu.FragmentMenuItems; import com.cyngn.eleven.model.Song; import com.cyngn.eleven.provider.FavoritesStore; import com.cyngn.eleven.recycler.RecycleHolder; +import com.cyngn.eleven.ui.HeaderBar; +import com.cyngn.eleven.ui.HeaderBar.PopupMenuCreator; import com.cyngn.eleven.utils.MusicUtils; import com.cyngn.eleven.utils.NavUtils; import com.viewpagerindicator.TitlePageIndicator; @@ -61,7 +63,7 @@ import java.util.List; * @author Andrew Neal (andrewdneal@gmail.com) */ public class QueueFragment extends Fragment implements LoaderCallbacks<List<Song>>, - OnItemClickListener, DropListener, RemoveListener, DragScrollProfile { + OnItemClickListener, DropListener, RemoveListener, DragScrollProfile, PopupMenuCreator { /** * Used to keep context menu items from bleeding into other fragments @@ -159,7 +161,6 @@ public class QueueFragment extends Fragment implements LoaderCallbacks<List<Song @Override public void onActivityCreated(final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - // TODO: Hook up the options menu to the custom action bar we have // Initialize the broadcast receiver mQueueUpdateListener = new QueueUpdateListener(this); @@ -194,20 +195,23 @@ public class QueueFragment extends Fragment implements LoaderCallbacks<List<Song } } - /** - * {@inheritDoc} - */ @Override - public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { + public void onCreatePopupMenu(final Menu menu, final MenuInflater inflater) { inflater.inflate(R.menu.queue, menu); - super.onCreateOptionsMenu(menu, inflater); } - /** - * {@inheritDoc} - */ @Override - public boolean onOptionsItemSelected(final MenuItem item) { + public void addHeaderBar(final WeakReference<HeaderBar> headerBar) { + // do nothing since we don't need to invalidate the popup menu + } + + @Override + public void clearHeaderBars() { + // do nothing since we don't need to invalidate the popup menu + } + + @Override + public boolean onPopupMenuItemClick(final MenuItem item) { switch (item.getItemId()) { case R.id.menu_save_queue: NowPlayingCursor queue = (NowPlayingCursor)QueueLoader @@ -224,7 +228,8 @@ public class QueueFragment extends Fragment implements LoaderCallbacks<List<Song default: break; } - return super.onOptionsItemSelected(item); + + return false; } /** diff --git a/src/com/cyngn/eleven/utils/NavUtils.java b/src/com/cyngn/eleven/utils/NavUtils.java index 80c6f29..9900989 100644 --- a/src/com/cyngn/eleven/utils/NavUtils.java +++ b/src/com/cyngn/eleven/utils/NavUtils.java @@ -142,6 +142,5 @@ public final class NavUtils { final Intent intent = new Intent(activity, HomeActivity.class); intent.setAction(HomeActivity.ACTION_VIEW_BROWSE); activity.startActivity(intent); - activity.finish(); } } |