summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorlinus_lee <llee@cyngn.com>2014-08-26 17:23:44 -0700
committerlinus_lee <llee@cyngn.com>2014-11-20 11:58:47 -0800
commitf5a90f5f31ffcb83e8323c8dc97e65b649724286 (patch)
treef5eebfe133335dc4649a98c348666ff1649ab665 /src
parente3cfcdad5e941ae2e7b2704f72d2fad9945ab5f5 (diff)
downloadandroid_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.java135
-rw-r--r--src/com/cyngn/eleven/ui/activities/BaseActivity.java2
-rw-r--r--src/com/cyngn/eleven/ui/activities/HomeActivity.java71
-rw-r--r--src/com/cyngn/eleven/ui/fragments/AudioPlayerFragment.java82
-rw-r--r--src/com/cyngn/eleven/ui/fragments/QueueFragment.java29
-rw-r--r--src/com/cyngn/eleven/utils/NavUtils.java1
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();
}
}