diff options
author | Alexander Martinz <amartinz@shiftphones.com> | 2019-02-27 12:46:39 +0100 |
---|---|---|
committer | Bruno Martins <bgcngm@gmail.com> | 2020-04-17 20:25:15 +0200 |
commit | daecf8f7313823a061e997c0cd9e9eb77dae0d74 (patch) | |
tree | ab854b5c62574c2eb5ab49107cb270685f16b503 | |
parent | bb1a94df20948cb07052ceb12d9e996bbdb9571f (diff) | |
download | android_packages_apps_Eleven-daecf8f7313823a061e997c0cd9e9eb77dae0d74.tar.gz android_packages_apps_Eleven-daecf8f7313823a061e997c0cd9e9eb77dae0d74.tar.bz2 android_packages_apps_Eleven-daecf8f7313823a061e997c0cd9e9eb77dae0d74.zip |
AudioPlayer: convert headerbar into toolbar
Use a toolbar instead of a popup menu.
Turn the "Add to playlist" button into a menu item as well
and show an AlertDialog instead of a ContextMenu when pressing
on it.
When creating the "Add to playlist" dialog, do not add a
"New playlist" item by default and instead turn it into a
dialog action.
Change-Id: Ie54f49ba422ec0ef15f9437b3a74abfd56782e65
Signed-off-by: Alexander Martinz <amartinz@shiftphones.com>
Signed-off-by: Joey <joey@lineageos.org>
-rw-r--r-- | res/layout/audio_player_header_bar.xml | 54 | ||||
-rw-r--r-- | res/menu/audio_player.xml | 11 | ||||
-rw-r--r-- | src/org/lineageos/eleven/menu/CreateNewPlaylist.java | 2 | ||||
-rw-r--r-- | src/org/lineageos/eleven/ui/fragments/AudioPlayerFragment.java | 276 | ||||
-rw-r--r-- | src/org/lineageos/eleven/utils/MusicUtils.java | 29 | ||||
-rw-r--r-- | src/org/lineageos/eleven/utils/PopupMenuHelper.java | 21 |
6 files changed, 151 insertions, 242 deletions
diff --git a/res/layout/audio_player_header_bar.xml b/res/layout/audio_player_header_bar.xml index 75f5f4f..7934b10 100644 --- a/res/layout/audio_player_header_bar.xml +++ b/res/layout/audio_player_header_bar.xml @@ -13,56 +13,26 @@ See the License for the specific language governing permissions and limitations under the License. --> - -<RelativeLayout +<androidx.appcompat.widget.Toolbar 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:id="@+id/audio_player_header" android:layout_width="match_parent" - android:layout_height="?actionBarSize" + android:layout_height="?android:attr/actionBarSize" android:background="@android:color/transparent" android:elevation="@dimen/action_bar_elevation" - android:orientation="horizontal" - android:paddingBottom="2dp" - android:paddingStart="@dimen/header_bar_padding_left" - android:paddingTop="2dp" + android:theme="@style/ToolBarTheme" + app:popupTheme="@style/ToolBarPopupTheme" tools:background="@color/blue_dark"> <LinearLayout - android:id="@+id/header_bar_button_container" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentEnd="true" - android:layout_centerVertical="true" - android:orientation="horizontal"> - - <ImageView - android:id="@+id/header_bar_add_button" - android:layout_width="@dimen/header_bar_custom_button_width" - android:layout_height="@dimen/header_bar_button_height" - android:layout_gravity="center_vertical" - android:layout_weight="0" - android:background="@drawable/selectable_background" - android:scaleType="centerInside" - android:src="@drawable/btn_add_to_playlist" /> - - <ImageView - android:id="@+id/header_bar_menu_button" - android:layout_width="@dimen/header_bar_menu_button_width" - android:layout_height="@dimen/header_bar_button_height" - android:layout_gravity="center_vertical" - android:layout_weight="0" - android:background="@drawable/selectable_background" - android:scaleType="centerInside" - android:src="@drawable/menu_button_light" /> - </LinearLayout> - - <LinearLayout android:id="@+id/header_bar_text_container" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentStart="true" - android:layout_centerVertical="true" - android:layout_toStartOf="@id/header_bar_button_container" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_gravity="center_vertical" + android:layout_weight="1" + android:gravity="center_vertical" android:orientation="vertical"> <TextView @@ -89,4 +59,4 @@ android:textSize="@dimen/text_size_micro" tools:text="Name of Artist" /> </LinearLayout> -</RelativeLayout> +</androidx.appcompat.widget.Toolbar> diff --git a/res/menu/audio_player.xml b/res/menu/audio_player.xml index 294810a..9cdb00a 100644 --- a/res/menu/audio_player.xml +++ b/res/menu/audio_player.xml @@ -15,10 +15,17 @@ See the License for the specific language governing permissions and limitations under the License. --> -<menu xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:android="http://schemas.android.com/apk/res/android" > +<menu + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> <item + android:id="@+id/menu_audio_player_add_to_playlist" + android:icon="@drawable/btn_add_to_playlist" + android:orderInCategory="40" + android:title="@string/add_to_playlist" + app:showAsAction="ifRoom" /> + <item android:id="@+id/menu_audio_player_equalizer" android:orderInCategory="41" android:title="@string/menu_equalizer" diff --git a/src/org/lineageos/eleven/menu/CreateNewPlaylist.java b/src/org/lineageos/eleven/menu/CreateNewPlaylist.java index 3eaced5..ebd467e 100644 --- a/src/org/lineageos/eleven/menu/CreateNewPlaylist.java +++ b/src/org/lineageos/eleven/menu/CreateNewPlaylist.java @@ -74,7 +74,7 @@ public class CreateNewPlaylist extends BasePlaylistDialog { public void onSaveClick() { final String playlistName = mPlaylist.getText().toString(); if (playlistName != null && playlistName.length() > 0) { - final int playlistId = (int)MusicUtils.getIdForPlaylist(getActivity(), + final int playlistId = (int) MusicUtils.getIdForPlaylist(getActivity(), playlistName); if (playlistId >= 0) { MusicUtils.clearPlaylist(getActivity(), playlistId); diff --git a/src/org/lineageos/eleven/ui/fragments/AudioPlayerFragment.java b/src/org/lineageos/eleven/ui/fragments/AudioPlayerFragment.java index 1cd4879..3b3f59d 100644 --- a/src/org/lineageos/eleven/ui/fragments/AudioPlayerFragment.java +++ b/src/org/lineageos/eleven/ui/fragments/AudioPlayerFragment.java @@ -16,13 +16,13 @@ */ package org.lineageos.eleven.ui.fragments; +import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; -import android.graphics.Outline; import android.media.AudioManager; import android.os.Bundle; import android.os.Handler; @@ -39,12 +39,11 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.view.ViewOutlineProvider; -import android.widget.ImageView; -import android.widget.PopupMenu; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.viewpager.widget.ViewPager; @@ -57,7 +56,6 @@ import org.lineageos.eleven.loaders.NowPlayingCursor; import org.lineageos.eleven.loaders.QueueLoader; import org.lineageos.eleven.menu.CreateNewPlaylist; import org.lineageos.eleven.menu.DeleteDialog; -import org.lineageos.eleven.menu.FragmentMenuItems; import org.lineageos.eleven.ui.activities.HomeActivity; import org.lineageos.eleven.utils.ElevenUtils; import org.lineageos.eleven.utils.MusicUtils; @@ -69,28 +67,22 @@ import org.lineageos.eleven.widgets.NoResultsContainer; import org.lineageos.eleven.widgets.VisualizerView; import java.lang.ref.WeakReference; +import java.util.List; public class AudioPlayerFragment extends Fragment implements ServiceConnection { private static final String TAG = AudioPlayerFragment.class.getSimpleName(); - /** - * Used to keep context menu items from bleeding into other fragments - */ - private static final int GROUP_ID = 15; + private AlertDialog mAlertDialog; // fragment view private ViewGroup mRootView; + private Toolbar mPlayerToolBar; + // Header views private TextView mSongTitle; private TextView mArtistName; - // Playlist Button - private ImageView mAddToPlaylistButton; - - // Menu Button - private ImageView mMenuButton; - // Message to refresh the time private static final int REFRESH_TIME = 1; @@ -115,9 +107,6 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection { // Image cache private ImageFetcher mImageFetcher; - // popup menu for pressing the menu icon - private PopupMenu mPopupMenu; - // Lyrics text view private TextView mLyricsText; @@ -142,14 +131,12 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection { @Override public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container, - final Bundle savedInstanceState) { + final Bundle savedInstanceState) { // The View for the fragment's UI mRootView = (ViewGroup) inflater.inflate(R.layout.activity_player_fragment, container, false); - // Header title values initHeaderBar(); - initPlaybackControls(); mVisualizerView = mRootView.findViewById(R.id.visualizerView); @@ -162,6 +149,107 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection { } @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + setHasOptionsMenu(true); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + + final Menu playerMenu = mPlayerToolBar.getMenu(); + playerMenu.clear(); + + // Shuffle all + inflater.inflate(R.menu.shuffle_all, playerMenu); + if (MusicUtils.getQueueSize() > 0) { + // ringtone, and equalizer + inflater.inflate(R.menu.audio_player, playerMenu); + + if (!NavUtils.hasEffectsPanel(getActivity())) { + playerMenu.removeItem(R.id.menu_audio_player_equalizer); + } + + // save queue/clear queue + inflater.inflate(R.menu.queue, playerMenu); + } + // Settings + inflater.inflate(R.menu.activity_base, playerMenu); + + final int playerMenuSize = playerMenu.size(); + for (int i = 0; i < playerMenuSize; i++) { + playerMenu.getItem(i).setOnMenuItemClickListener(this::onOptionsItemSelected); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_audio_player_add_to_playlist: { + // save the current track id + mSelectedId = MusicUtils.getCurrentAudioId(); + final List<String> menuItemList = MusicUtils.makePlaylist(getActivity()); + + final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle(R.string.add_to_playlist) + .setItems(menuItemList.toArray(new String[0]), (dialog, which) -> { + final long playListId = MusicUtils.getIdForPlaylist(getActivity(), + menuItemList.get(which)); + MusicUtils.addToPlaylist(getActivity(), new long[]{mSelectedId}, + playListId); + }) + .setPositiveButton(R.string.new_playlist, (dialog, which) -> { + dialog.dismiss(); + CreateNewPlaylist.getInstance(new long[]{mSelectedId}) + .show(getFragmentManager(), "CreatePlaylist"); + }); + mAlertDialog = builder.show(); + return true; + } + case R.id.menu_shuffle_all: + // 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_equalizer: + // Sound effects + NavUtils.openEffectsPanel(getActivity(), HomeActivity.EQUALIZER); + return true; + case R.id.menu_settings: + // Settings + NavUtils.openSettings(getActivity()); + return true; + case R.id.menu_audio_player_more_by_artist: + NavUtils.openArtistProfile(getActivity(), MusicUtils.getArtistName()); + 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; + case R.id.menu_save_queue: + NowPlayingCursor queue = (NowPlayingCursor) QueueLoader + .makeQueueCursor(getActivity()); + CreateNewPlaylist.getInstance(MusicUtils.getSongListForCursor(queue)).show( + getFragmentManager(), "CreatePlaylist"); + queue.close(); + return true; + case R.id.menu_clear_queue: + MusicUtils.clearQueue(); + return true; + default: + break; + } + + return super.onOptionsItemSelected(item); + } + + @Override public void onServiceConnected(final ComponentName name, final IBinder service) { // Set the playback drawables mMainPlaybackControls.updatePlaybackControls(); @@ -213,6 +301,10 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection { // pause the update callback for the play pause progress button mTimeHandler.removeMessages(REFRESH_TIME); + if (mAlertDialog != null) { + mAlertDialog.dismiss(); + } + mImageFetcher.flush(); // Unbind from the service @@ -231,44 +323,11 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection { * Initializes the header bar */ private void initHeaderBar() { - final View headerBar = mRootView.findViewById(R.id.audio_player_header); - final int bottomActionBarHeight = - getResources().getDimensionPixelSize(R.dimen.bottom_action_bar_height); - - headerBar.setOutlineProvider(new ViewOutlineProvider() { - @Override - public void getOutline(View view, Outline outline) { - // since we only want the top and bottom shadows, pad the horizontal width - // to hide the shadows. Can't seem to find a better way to do this - int padWidth = (int)(0.2f * view.getWidth()); - outline.setRect(-padWidth, -bottomActionBarHeight, view.getWidth() + padWidth, - view.getHeight()); - } - }); + mPlayerToolBar = mRootView.findViewById(R.id.audio_player_header); // Title text mSongTitle = mRootView.findViewById(R.id.header_bar_song_title); mArtistName = mRootView.findViewById(R.id.header_bar_artist_title); - - // Setup the playlist button - add a click listener to show the context - mAddToPlaylistButton = mRootView.findViewById(R.id.header_bar_add_button); - - // Create the context menu when requested - mAddToPlaylistButton.setOnCreateContextMenuListener((menu, v, menuInfo) -> { - MusicUtils.makePlaylistMenu(getActivity(), GROUP_ID, menu); - menu.setHeaderTitle(R.string.add_to_playlist); - }); - - // add a click listener to show the context - mAddToPlaylistButton.setOnClickListener(v -> { - // save the current track id - mSelectedId = MusicUtils.getCurrentAudioId(); - mAddToPlaylistButton.showContextMenu(); - }); - - // Add the menu button - mMenuButton = mRootView.findViewById(R.id.header_bar_menu_button); - mMenuButton.setOnClickListener(v -> showPopupMenu()); } /** @@ -374,11 +433,9 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection { if(queueSize == 0) { mAlbumArtViewPager.setVisibility(View.GONE); mQueueEmpty.showNoResults(); - mAddToPlaylistButton.setVisibility(View.GONE); } else { mAlbumArtViewPager.setVisibility(View.VISIBLE); mQueueEmpty.hideAll(); - mAddToPlaylistButton.setVisibility(View.VISIBLE); } } @@ -410,110 +467,6 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection { return MusicUtils.UPDATE_FREQUENCY_MS; } - public void showPopupMenu() { - // create the popup menu - if (mPopupMenu == null) { - mPopupMenu = new PopupMenu(getActivity(), mMenuButton); - mPopupMenu.setOnMenuItemClickListener(this::onPopupMenuItemClick); - } - - final Menu menu = mPopupMenu.getMenu(); - final MenuInflater inflater = mPopupMenu.getMenuInflater(); - menu.clear(); - - // Shuffle all - inflater.inflate(R.menu.shuffle_all, menu); - if (MusicUtils.getQueueSize() > 0) { - // ringtone, and equalizer - inflater.inflate(R.menu.audio_player, menu); - - if (!NavUtils.hasEffectsPanel(getActivity())) { - menu.removeItem(R.id.menu_audio_player_equalizer); - } - - // save queue/clear queue - inflater.inflate(R.menu.queue, menu); - } - // Settings - inflater.inflate(R.menu.activity_base, menu); - - // show the popup - mPopupMenu.show(); - } - - public boolean onPopupMenuItemClick(final MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_shuffle_all: - // 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_equalizer: - // Sound effects - NavUtils.openEffectsPanel(getActivity(), HomeActivity.EQUALIZER); - return true; - case R.id.menu_settings: - // Settings - NavUtils.openSettings(getActivity()); - return true; - case R.id.menu_audio_player_more_by_artist: - NavUtils.openArtistProfile(getActivity(), MusicUtils.getArtistName()); - 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; - case R.id.menu_save_queue: - NowPlayingCursor queue = (NowPlayingCursor) QueueLoader - .makeQueueCursor(getActivity()); - CreateNewPlaylist.getInstance(MusicUtils.getSongListForCursor(queue)).show( - getFragmentManager(), "CreatePlaylist"); - queue.close(); - return true; - case R.id.menu_clear_queue: - MusicUtils.clearQueue(); - return true; - default: - break; - } - - return false; - } - - public void dismissPopupMenu() { - if (mPopupMenu != null) { - mPopupMenu.dismiss(); - } - } - - @Override - public boolean onContextItemSelected(MenuItem item) { - if (item.getGroupId() == GROUP_ID) { - switch (item.getItemId()) { - case FragmentMenuItems.NEW_PLAYLIST: - CreateNewPlaylist.getInstance(new long[]{ - mSelectedId - }).show(getFragmentManager(), "CreatePlaylist"); - return true; - case FragmentMenuItems.PLAYLIST_SELECTED: - final long mPlaylistId = item.getIntent().getLongExtra("playlist", 0); - MusicUtils.addToPlaylist(getActivity(), new long[]{ - mSelectedId - }, mPlaylistId); - return true; - default: - break; - } - } - - return super.onContextItemSelected(item); - } - public void onLyrics(String lyrics) { if (TextUtils.isEmpty(lyrics) || !PreferenceUtils.getInstance(getActivity()).getShowLyrics()) { @@ -606,7 +559,6 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection { // Current info audioPlayerFragment.updateNowPlayingInfo(); - audioPlayerFragment.dismissPopupMenu(); break; case MusicPlaybackService.PLAYSTATE_CHANGED: audioPlayerFragment.mMainPlaybackControls.updatePlayPauseState(); diff --git a/src/org/lineageos/eleven/utils/MusicUtils.java b/src/org/lineageos/eleven/utils/MusicUtils.java index d409fc7..1dacd5d 100644 --- a/src/org/lineageos/eleven/utils/MusicUtils.java +++ b/src/org/lineageos/eleven/utils/MusicUtils.java @@ -48,6 +48,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.WorkerThread; +import org.lineageos.eleven.BuildConfig; import org.lineageos.eleven.Config.IdType; import org.lineageos.eleven.Config.SmartPlaylistType; import org.lineageos.eleven.IElevenService; @@ -1006,8 +1007,11 @@ public final class MusicUtils { * @return The ID for a playlist. */ public static long getIdForPlaylist(final Context context, final String name) { - try (Cursor cursor = context.getContentResolver().query( - Playlists.EXTERNAL_CONTENT_URI, + if (BuildConfig.DEBUG) { + Log.d(TAG, "getIdForPlaylist(" + name + ")"); + } + + try (Cursor cursor = context.getContentResolver().query(Playlists.EXTERNAL_CONTENT_URI, new String[]{BaseColumns._ID}, PlaylistsColumns.NAME + "=?", new String[]{name}, PlaylistsColumns.NAME)) { if (cursor != null) { @@ -1504,27 +1508,6 @@ public final class MusicUtils { } /** - * Creates a sub menu used to add items to a new playlist or an existing - * one. - * - * @param context The {@link Context} to use. - * @param groupId The group Id of the menu. - * @param menu The {@link Menu} to add to. - */ - public static void makePlaylistMenu(final Context context, final int groupId, - final Menu menu) { - menu.clear(); - - final List<String> menuItemList = makePlaylist(context); - for (final String name : menuItemList) { - final Intent intent = new Intent(); - intent.putExtra("playlist", getIdForPlaylist(context, name)); - menu.add(groupId, FragmentMenuItems.PLAYLIST_SELECTED, Menu.NONE, name) - .setIntent(intent); - } - } - - /** * Called when one of the lists should refresh or requery. */ public static void refresh() { diff --git a/src/org/lineageos/eleven/utils/PopupMenuHelper.java b/src/org/lineageos/eleven/utils/PopupMenuHelper.java index 1cc6f72..05694d1 100644 --- a/src/org/lineageos/eleven/utils/PopupMenuHelper.java +++ b/src/org/lineageos/eleven/utils/PopupMenuHelper.java @@ -340,18 +340,15 @@ public abstract class PopupMenuHelper implements PopupMenu.OnMenuItemClickListen final AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); builder.setTitle(R.string.add_to_playlist); final List<String> menuItemList = MusicUtils.makePlaylist(mActivity); - builder.setItems(menuItemList.toArray(new String[0]), new DialogInterface.OnClickListener() { - @Override public void onClick(DialogInterface dialog, int which) { - if (which == 0) { - CreateNewPlaylist.getInstance(getIdList()).show( - mFragmentManager, "CreatePlaylist"); - return; - } - - final String name = menuItemList.get(which); - final long playListId = MusicUtils.getIdForPlaylist(mActivity, name); - MusicUtils.addToPlaylist(mActivity, getIdList(), playListId); - } + builder.setItems(menuItemList.toArray(new String[0]), (dialog, which) -> { + final String name = menuItemList.get(which); + final long playListId = MusicUtils.getIdForPlaylist(mActivity, name); + MusicUtils.addToPlaylist(mActivity, getIdList(), playListId); + }); + builder.setPositiveButton(R.string.new_playlist, (dialog, which) -> { + dialog.dismiss(); + CreateNewPlaylist.getInstance(getIdList()) + .show(mFragmentManager, "CreatePlaylist"); }); builder.show(); return true; |