diff options
author | ByteHamster <info@bytehamster.com> | 2020-03-23 01:46:50 +0100 |
---|---|---|
committer | ByteHamster <info@bytehamster.com> | 2020-03-23 01:46:50 +0100 |
commit | e417f4a5f8f0a2e53deb5eba7059a83d85432a9e (patch) | |
tree | 116347b35be2a30d53267be45767d0793bb211f3 /app | |
parent | 16d0a1befa09aaa40e29ff906bc86f5a1d496fb5 (diff) | |
download | AntennaPod-e417f4a5f8f0a2e53deb5eba7059a83d85432a9e.zip |
Added bottom sheet to activity
Diffstat (limited to 'app')
6 files changed, 101 insertions, 69 deletions
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<Chapter> 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"/> <de.danoeh.antennapod.view.PagerIndicatorView @@ -23,6 +24,15 @@ android:layout_below="@id/toolbar" android:layout_centerHorizontal="true"/> + <FrameLayout + android:id="@+id/playerFragment" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentTop="true" + android:background="?android:attr/windowBackground" + tools:layout_height="@dimen/external_player_height" + tools:background="@android:color/holo_green_light" /> + <androidx.viewpager.widget.ViewPager android:id="@+id/pager" android:layout_width="match_parent" diff --git a/app/src/main/res/layout/main.xml b/app/src/main/res/layout/main.xml index 89b7e0c47..90088b792 100644 --- a/app/src/main/res/layout/main.xml +++ b/app/src/main/res/layout/main.xml @@ -1,42 +1,42 @@ <?xml version="1.0" encoding="utf-8"?> <androidx.drawerlayout.widget.DrawerLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/drawer_layout" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <RelativeLayout - android:id="@+id/content" + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> - <FrameLayout - android:id="@+id/playerFragment" + <androidx.coordinatorlayout.widget.CoordinatorLayout + android:id="@+id/overview_coordinator_layout" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_alignParentBottom="true" - tools:layout_height="64dp" - tools:background="@android:color/holo_green_light" /> + android:layout_height="match_parent"> <FrameLayout android:id="@+id/main_view" android:layout_width="match_parent" - android:layout_height="0px" - android:layout_above="@id/playerFragment" + android:layout_height="match_parent" android:layout_alignParentTop="true" android:foreground="?android:windowContentOverlay" + android:layout_marginBottom="@dimen/external_player_height" tools:background="@android:color/holo_red_dark" /> - </RelativeLayout> + <FrameLayout + android:id="@+id/audioplayerFragment" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="?android:attr/windowBackground" + app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior" /> + + </androidx.coordinatorlayout.widget.CoordinatorLayout> <FrameLayout - 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" /> + 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" /> </androidx.drawerlayout.widget.DrawerLayout>
\ No newline at end of file |