From e417f4a5f8f0a2e53deb5eba7059a83d85432a9e Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Mon, 23 Mar 2020 01:46:50 +0100 Subject: Added bottom sheet to activity --- .../danoeh/antennapod/activity/MainActivity.java | 41 ++++++++++++--- .../antennapod/fragment/AudioPlayerFragment.java | 60 +++++++++++----------- .../fragment/ExternalPlayerFragment.java | 10 ++-- .../antennapod/fragment/NavDrawerFragment.java | 1 - app/src/main/res/layout/audioplayer_fragment.xml | 10 ++++ app/src/main/res/layout/main.xml | 48 ++++++++--------- 6 files changed, 101 insertions(+), 69 deletions(-) (limited to 'app') diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java index 35328f0c3..c8b10751d 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java @@ -23,6 +23,7 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import com.bumptech.glide.Glide; +import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.snackbar.Snackbar; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.event.MessageEvent; @@ -34,7 +35,6 @@ import de.danoeh.antennapod.fragment.AddFeedFragment; import de.danoeh.antennapod.fragment.AudioPlayerFragment; import de.danoeh.antennapod.fragment.DownloadsFragment; import de.danoeh.antennapod.fragment.EpisodesFragment; -import de.danoeh.antennapod.fragment.ExternalPlayerFragment; import de.danoeh.antennapod.fragment.FeedItemlistFragment; import de.danoeh.antennapod.fragment.NavDrawerFragment; import de.danoeh.antennapod.fragment.PlaybackHistoryFragment; @@ -68,6 +68,7 @@ public class MainActivity extends CastEnabledActivity { private DrawerLayout drawerLayout; private View navDrawer; private ActionBarDrawerToggle drawerToggle; + private BottomSheetBehavior sheetBehavior; private long lastBackButtonPressTime = 0; @NonNull @@ -112,15 +113,34 @@ public class MainActivity extends CastEnabledActivity { } } } - ExternalPlayerFragment externalPlayerFragment = new ExternalPlayerFragment(); - transaction.replace(R.id.playerFragment, externalPlayerFragment, ExternalPlayerFragment.TAG); NavDrawerFragment navDrawerFragment = new NavDrawerFragment(); transaction.replace(R.id.navDrawerFragment, navDrawerFragment, NavDrawerFragment.TAG); - + AudioPlayerFragment audioPlayerFragment = new AudioPlayerFragment(); + transaction.replace(R.id.audioplayerFragment, audioPlayerFragment, AudioPlayerFragment.TAG); transaction.commit(); checkFirstLaunch(); PreferenceUpgrader.checkUpgrades(this); + View bottomSheet = findViewById(R.id.audioplayerFragment); + sheetBehavior = BottomSheetBehavior.from(bottomSheet); + sheetBehavior.setPeekHeight((int) getResources().getDimension(R.dimen.external_player_height)); + sheetBehavior.setHideable(false); + sheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { + @Override + public void onStateChanged(@NonNull View view, int state) { + + } + + @Override + public void onSlide(@NonNull View view, float slideOffset) { + AudioPlayerFragment audioPlayer = + (AudioPlayerFragment) getSupportFragmentManager().findFragmentByTag(AudioPlayerFragment.TAG); + float condensedSlideOffset = Math.max(0.0f, Math.min(0.1f, slideOffset - 0.5f)) / 0.1f; + audioPlayer.getExternalPlayerHolder().setAlpha(1 - condensedSlideOffset); + audioPlayer.getExternalPlayerHolder().setVisibility( + condensedSlideOffset > 0.99f ? View.GONE : View.VISIBLE); + } + }); } @Override @@ -152,6 +172,14 @@ public class MainActivity extends CastEnabledActivity { return drawerLayout != null && navDrawer != null && drawerLayout.isDrawerOpen(navDrawer); } + public void expandBottomSheet() { + sheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); + } + + public void collapseBottomSheet() { + sheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); + } + public void loadFragment(String tag, Bundle args) { Log.d(TAG, "loadFragment(tag: " + tag + ", args: " + args + ")"); Fragment fragment; @@ -159,9 +187,6 @@ public class MainActivity extends CastEnabledActivity { case QueueFragment.TAG: fragment = new QueueFragment(); break; - case AudioPlayerFragment.TAG: - fragment = new AudioPlayerFragment(); - break; case EpisodesFragment.TAG: fragment = new EpisodesFragment(); break; @@ -344,6 +369,8 @@ public class MainActivity extends CastEnabledActivity { public void onBackPressed() { if (isDrawerOpen()) { drawerLayout.closeDrawer(navDrawer); + } else if (sheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) { + collapseBottomSheet(); } else if (getSupportFragmentManager().getBackStackEntryCount() != 0) { super.onBackPressed(); } else { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java index 7fcb3f973..7d8500f44 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java @@ -6,17 +6,13 @@ import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; 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.ImageButton; import android.widget.SeekBar; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; @@ -55,7 +51,8 @@ import java.util.List; /** * Shows the audio player. */ -public class AudioPlayerFragment extends Fragment implements SeekBar.OnSeekBarChangeListener { +public class AudioPlayerFragment extends Fragment implements + SeekBar.OnSeekBarChangeListener, Toolbar.OnMenuItemClickListener { public static final String TAG = "AudioPlayerFragment"; private static final int POS_COVER = 0; private static final int POS_DESCR = 1; @@ -69,7 +66,6 @@ public class AudioPlayerFragment extends Fragment implements SeekBar.OnSeekBarCh TextView txtvPlaybackSpeed; private ViewPager pager; private PagerIndicatorView pageIndicator; - private AudioPlayerPagerAdapter pagerAdapter; private TextView txtvPosition; private TextView txtvLength; private SeekBar sbPosition; @@ -79,6 +75,7 @@ public class AudioPlayerFragment extends Fragment implements SeekBar.OnSeekBarCh private ImageButton butFF; private TextView txtvFF; private ImageButton butSkip; + private Toolbar toolbar; private PlaybackController controller; private boolean showTimeLeft; @@ -87,9 +84,16 @@ public class AudioPlayerFragment extends Fragment implements SeekBar.OnSeekBarCh public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View root = inflater.inflate(R.layout.audioplayer_fragment, container, false); - Toolbar toolbar = root.findViewById(R.id.toolbar); + toolbar = root.findViewById(R.id.toolbar); toolbar.setTitle(""); - ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); + toolbar.setNavigationOnClickListener(v -> ((MainActivity) getActivity()).collapseBottomSheet()); + toolbar.setOnMenuItemClickListener(this); + setupOptionsMenu(); + + ExternalPlayerFragment externalPlayerFragment = new ExternalPlayerFragment(); + getFragmentManager().beginTransaction() + .replace(R.id.playerFragment, externalPlayerFragment, ExternalPlayerFragment.TAG) + .commit(); butPlaybackSpeed = root.findViewById(R.id.butPlaybackSpeed); txtvPlaybackSpeed = root.findViewById(R.id.txtvPlaybackSpeed); @@ -111,7 +115,7 @@ public class AudioPlayerFragment extends Fragment implements SeekBar.OnSeekBarCh sbPosition.setOnSeekBarChangeListener(this); pager = root.findViewById(R.id.pager); - pagerAdapter = new AudioPlayerPagerAdapter(getFragmentManager()); + AudioPlayerPagerAdapter pagerAdapter = new AudioPlayerPagerAdapter(getFragmentManager()); pager.setAdapter(pagerAdapter); pageIndicator = root.findViewById(R.id.page_indicator); pageIndicator.setViewPager(pager); @@ -120,6 +124,10 @@ public class AudioPlayerFragment extends Fragment implements SeekBar.OnSeekBarCh return root; } + public View getExternalPlayerHolder() { + return getView().findViewById(R.id.playerFragment); + } + private void setupControlButtons() { butRev.setOnClickListener(v -> { if (controller != null) { @@ -256,7 +264,7 @@ public class AudioPlayerFragment extends Fragment implements SeekBar.OnSeekBarCh @Override public void onSleepTimerUpdate() { - getActivity().invalidateOptionsMenu(); + setupOptionsMenu(); } @Override @@ -313,7 +321,7 @@ public class AudioPlayerFragment extends Fragment implements SeekBar.OnSeekBarCh } updatePosition(new PlaybackPositionEvent(controller.getPosition(), controller.getDuration())); updatePlaybackSpeedButton(); - getActivity().invalidateOptionsMenu(); + setupOptionsMenu(); List chapters = controller.getMedia().getChapters(); boolean hasChapters = chapters != null && !chapters.isEmpty(); @@ -324,7 +332,7 @@ public class AudioPlayerFragment extends Fragment implements SeekBar.OnSeekBarCh public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); - setHasOptionsMenu(true); + //setHasOptionsMenu(true); } @Override @@ -371,7 +379,7 @@ public class AudioPlayerFragment extends Fragment implements SeekBar.OnSeekBarCh @Subscribe(threadMode = ThreadMode.MAIN) public void favoritesChanged(FavoritesEvent event) { - getActivity().invalidateOptionsMenu(); + setupOptionsMenu(); } @Override @@ -407,34 +415,26 @@ public class AudioPlayerFragment extends Fragment implements SeekBar.OnSeekBarCh } } - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - /*if (Flavors.FLAVOR == Flavors.PLAY) { - requestCastButton(MenuItem.SHOW_AS_ACTION_ALWAYS); - }*/ - inflater.inflate(R.menu.mediaplayer, menu); - } - - @Override - public void onPrepareOptionsMenu(Menu menu) { - super.onPrepareOptionsMenu(menu); + public void setupOptionsMenu() { + if (toolbar.getMenu().size() == 0) { + toolbar.inflateMenu(R.menu.mediaplayer); + } if (controller == null) { return; } Playable media = controller.getMedia(); boolean isFeedMedia = media instanceof FeedMedia; - menu.findItem(R.id.open_feed_item).setVisible(isFeedMedia); + toolbar.getMenu().findItem(R.id.open_feed_item).setVisible(isFeedMedia); if (isFeedMedia) { - FeedItemMenuHandler.onPrepareMenu(menu, ((FeedMedia) media).getItem()); + FeedItemMenuHandler.onPrepareMenu(toolbar.getMenu(), ((FeedMedia) media).getItem()); } - menu.findItem(R.id.set_sleeptimer_item).setVisible(!controller.sleepTimerActive()); - menu.findItem(R.id.disable_sleeptimer_item).setVisible(controller.sleepTimerActive()); + toolbar.getMenu().findItem(R.id.set_sleeptimer_item).setVisible(!controller.sleepTimerActive()); + toolbar.getMenu().findItem(R.id.disable_sleeptimer_item).setVisible(controller.sleepTimerActive()); } @Override - public boolean onOptionsItemSelected(MenuItem item) { + public boolean onMenuItemClick(MenuItem item) { if (controller == null) { return false; } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java index ce2232a55..fa753aac8 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java @@ -1,9 +1,7 @@ package de.danoeh.antennapod.fragment; import android.content.Intent; -import android.os.Build; import android.os.Bundle; -import androidx.core.app.ActivityOptionsCompat; import androidx.fragment.app.Fragment; import android.util.Log; import android.view.LayoutInflater; @@ -18,6 +16,7 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import de.danoeh.antennapod.R; +import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.core.event.PlaybackPositionEvent; import de.danoeh.antennapod.core.feed.MediaType; import de.danoeh.antennapod.core.glide.ApGlideSettings; @@ -69,13 +68,10 @@ public class ExternalPlayerFragment extends Fragment { Log.d(TAG, "layoutInfo was clicked"); if (controller != null && controller.getMedia() != null) { - Intent intent = PlaybackService.getPlayerActivityIntent(getActivity(), controller.getMedia()); - if (controller.getMedia().getMediaType() == MediaType.AUDIO) { - ActivityOptionsCompat options = ActivityOptionsCompat - .makeSceneTransitionAnimation(getActivity(), imgvCover, "coverTransition"); - startActivity(intent, options.toBundle()); + ((MainActivity) getActivity()).expandBottomSheet(); } else { + Intent intent = PlaybackService.getPlayerActivityIntent(getActivity(), controller.getMedia()); startActivity(intent); } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java index 0ab6b78b9..63969345c 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java @@ -56,7 +56,6 @@ public class NavDrawerFragment extends Fragment implements AdapterView.OnItemCli public static final String TAG = "NavDrawerFragment"; public static final String[] NAV_DRAWER_TAGS = { - AudioPlayerFragment.TAG, QueueFragment.TAG, EpisodesFragment.TAG, SubscriptionFragment.TAG, diff --git a/app/src/main/res/layout/audioplayer_fragment.xml b/app/src/main/res/layout/audioplayer_fragment.xml index efd64ef3b..17352b93d 100644 --- a/app/src/main/res/layout/audioplayer_fragment.xml +++ b/app/src/main/res/layout/audioplayer_fragment.xml @@ -12,6 +12,7 @@ android:minHeight="?attr/actionBarSize" android:theme="?attr/actionBarTheme" android:layout_alignParentTop="true" + app:navigationIcon="?homeAsUpIndicator" android:id="@+id/toolbar"/> + + - - - + android:layout_height="match_parent"> - + + + + android:id="@+id/navDrawerFragment" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginEnd="24dp" + android:layout_marginRight="24dp" + android:layout_gravity="start" + android:orientation="vertical" /> \ No newline at end of file -- cgit v1.2.3