summaryrefslogtreecommitdiffstats
path: root/src/org/lineageos/eleven/ui/activities/SlidingPanelActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/lineageos/eleven/ui/activities/SlidingPanelActivity.java')
-rw-r--r--src/org/lineageos/eleven/ui/activities/SlidingPanelActivity.java323
1 files changed, 323 insertions, 0 deletions
diff --git a/src/org/lineageos/eleven/ui/activities/SlidingPanelActivity.java b/src/org/lineageos/eleven/ui/activities/SlidingPanelActivity.java
new file mode 100644
index 0000000..c7b72a3
--- /dev/null
+++ b/src/org/lineageos/eleven/ui/activities/SlidingPanelActivity.java
@@ -0,0 +1,323 @@
+/*
+ * Copyright (C) 2012 Andrew Neal
+ * Copyright (C) 2014 The CyanogenMod Project
+ * Licensed under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
+ * or agreed to in writing, software distributed under the License is
+ * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+
+package com.cyanogenmod.eleven.ui.activities;
+
+import android.graphics.Color;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.view.ViewPager;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import com.cyanogenmod.eleven.R;
+import com.cyanogenmod.eleven.slidinguppanel.SlidingUpPanelLayout;
+import com.cyanogenmod.eleven.slidinguppanel.SlidingUpPanelLayout.SimplePanelSlideListener;
+import com.cyanogenmod.eleven.ui.HeaderBar;
+import com.cyanogenmod.eleven.ui.fragments.AudioPlayerFragment;
+import com.cyanogenmod.eleven.ui.fragments.QueueFragment;
+import com.cyanogenmod.eleven.utils.ApolloUtils;
+import com.cyanogenmod.eleven.utils.MusicUtils;
+import com.cyanogenmod.eleven.widgets.BlurScrimImage;
+
+/**
+ * This class is used to display the {@link ViewPager} used to swipe between the
+ * main {@link Fragment}s used to browse the user's music.
+ *
+ * @author Andrew Neal (andrewdneal@gmail.com)
+ */
+public abstract class SlidingPanelActivity extends BaseActivity {
+
+ public enum Panel {
+ Browse,
+ MusicPlayer,
+ Queue,
+ None,
+ }
+
+ private static final String STATE_KEY_CURRENT_PANEL = "CurrentPanel";
+
+ private SlidingUpPanelLayout mFirstPanel;
+ private SlidingUpPanelLayout mSecondPanel;
+ protected Panel mTargetNavigatePanel;
+
+ private final ShowPanelClickListener mShowBrowse = new ShowPanelClickListener(Panel.Browse);
+ private final ShowPanelClickListener mShowMusicPlayer = new ShowPanelClickListener(Panel.MusicPlayer);
+
+ // this is the blurred image that goes behind the now playing and queue fragments
+ private BlurScrimImage mBlurScrimImage;
+
+ /**
+ * Opens the now playing screen
+ */
+ private final View.OnClickListener mOpenNowPlaying = new View.OnClickListener() {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onClick(final View v) {
+ if (MusicUtils.getCurrentAudioId() != -1) {
+ openAudioPlayer();
+ } else {
+ MusicUtils.shuffleAll(SlidingPanelActivity.this);
+ }
+ }
+ };
+
+ @Override
+ protected void initBottomActionBar() {
+ super.initBottomActionBar();
+ // Bottom action bar
+ final LinearLayout bottomActionBar = (LinearLayout)findViewById(R.id.bottom_action_bar);
+ // Display the now playing screen or shuffle if this isn't anything
+ // playing
+ bottomActionBar.setOnClickListener(mOpenNowPlaying);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mTargetNavigatePanel = Panel.None;
+
+ setupFirstPanel();
+ setupSecondPanel();
+
+ // get the blur scrim image
+ mBlurScrimImage = (BlurScrimImage)findViewById(R.id.blurScrimImage);
+
+ if (savedInstanceState != null) {
+ int panelIndex = savedInstanceState.getInt(STATE_KEY_CURRENT_PANEL,
+ Panel.Browse.ordinal());
+ Panel targetPanel = Panel.values()[panelIndex];
+
+ showPanel(targetPanel);
+ mTargetNavigatePanel = Panel.None;
+
+ if (targetPanel == Panel.Queue) {
+ mFirstPanel.setSlidingEnabled(false);
+ }
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+
+ outState.putInt(STATE_KEY_CURRENT_PANEL, getCurrentPanel().ordinal());
+ }
+
+ private void setupFirstPanel() {
+ mFirstPanel = (SlidingUpPanelLayout)findViewById(R.id.sliding_layout);
+ mFirstPanel.setPanelSlideListener(new SimplePanelSlideListener() {
+ @Override
+ public void onPanelSlide(View panel, float slideOffset) {
+ onSlide(slideOffset);
+ }
+
+ @Override
+ public void onPanelExpanded(View panel) {
+ checkTargetNavigation();
+ }
+
+ @Override
+ public void onPanelCollapsed(View panel) {
+ checkTargetNavigation();
+ }
+ });
+ }
+
+ private void setupSecondPanel() {
+ mSecondPanel = (SlidingUpPanelLayout)findViewById(R.id.sliding_layout2);
+ mSecondPanel.setPanelSlideListener(new SimplePanelSlideListener() {
+ @Override
+ public void onPanelSlide(View panel, float slideOffset) {
+ // if we are not going to a specific panel, then disable sliding to prevent
+ // the two sliding panels from fighting for touch input
+ if (mTargetNavigatePanel == Panel.None) {
+ mFirstPanel.setSlidingEnabled(false);
+ }
+
+ onSlide(slideOffset);
+ }
+
+ @Override
+ public void onPanelExpanded(View panel) {
+ checkTargetNavigation();
+ }
+
+ @Override
+ public void onPanelCollapsed(View panel) {
+ // re-enable sliding when the second panel is collapsed
+ mFirstPanel.setSlidingEnabled(true);
+ checkTargetNavigation();
+ }
+ });
+
+ // setup the header bar
+ setupHeaderBar(R.id.secondHeaderBar, R.string.page_play_queue, mShowMusicPlayer);
+
+ // 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
+ // from action bat height
+ int slideOffset = getResources().getDimensionPixelOffset(R.dimen.sliding_panel_indicator_height);
+ slideOffset -= ApolloUtils.getActionBarHeight(this);
+ mSecondPanel.setSlidePanelOffset(slideOffset);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int setContentView() {
+ return R.layout.activity_base;
+ }
+
+ @Override
+ public void onBackPressed() {
+ Panel panel = getCurrentPanel();
+ switch (panel) {
+ case Browse:
+ super.onBackPressed();
+ break;
+ default:
+ case MusicPlayer:
+ showPanel(Panel.Browse);
+ break;
+ case Queue:
+ showPanel(Panel.MusicPlayer);
+ break;
+ }
+ }
+
+ public void openAudioPlayer() {
+ showPanel(Panel.MusicPlayer);
+ }
+
+ public void showPanel(Panel panel) {
+ // if we are already at our target panel, then don't do anything
+ if (panel == getCurrentPanel()) {
+ return;
+ }
+
+ // TODO: Add ability to do this instantaneously as opposed to animate
+ switch (panel) {
+ case Browse:
+ // if we are two panels over, we need special logic to jump twice
+ mTargetNavigatePanel = panel;
+ mSecondPanel.collapsePanel();
+ // re-enable sliding on first panel so we can collapse it
+ mFirstPanel.setSlidingEnabled(true);
+ mFirstPanel.collapsePanel();
+ break;
+ case MusicPlayer:
+ mSecondPanel.collapsePanel();
+ mFirstPanel.expandPanel();
+ break;
+ case Queue:
+ // if we are two panels over, we need special logic to jump twice
+ mTargetNavigatePanel = panel;
+ mSecondPanel.expandPanel();
+ mFirstPanel.expandPanel();
+ break;
+ }
+ }
+
+ protected void onSlide(float slideOffset) {
+ }
+
+ /**
+ * This checks if we are at our target panel and resets our flag if we are there
+ */
+ protected void checkTargetNavigation() {
+ if (mTargetNavigatePanel == getCurrentPanel()) {
+ mTargetNavigatePanel = Panel.None;
+ }
+
+ getAudioPlayerFragment().setVisualizerVisible(getCurrentPanel() == Panel.MusicPlayer);
+ }
+
+ public Panel getCurrentPanel() {
+ if (mSecondPanel.isPanelExpanded()) {
+ return Panel.Queue;
+ } else if (mFirstPanel.isPanelExpanded()) {
+ return Panel.MusicPlayer;
+ } else {
+ return Panel.Browse;
+ }
+ }
+
+ public void clearMetaInfo() {
+ super.clearMetaInfo();
+ mBlurScrimImage.transitionToDefaultState();
+ }
+
+ @Override
+ public void onMetaChanged() {
+ super.onMetaChanged();
+
+ // load the blurred image
+ mBlurScrimImage.loadBlurImage(ApolloUtils.getImageFetcher(this));
+ }
+
+ @Override
+ public void onCacheUnpaused() {
+ super.onCacheUnpaused();
+
+ // load the blurred image
+ mBlurScrimImage.loadBlurImage(ApolloUtils.getImageFetcher(this));
+ }
+
+ protected AudioPlayerFragment getAudioPlayerFragment() {
+ return (AudioPlayerFragment)getSupportFragmentManager().findFragmentById(R.id.audioPlayerFragment);
+ }
+
+ protected QueueFragment getQueueFragment() {
+ return (QueueFragment)getSupportFragmentManager().findFragmentById(R.id.queueFragment);
+ }
+
+ protected HeaderBar setupHeaderBar(final int containerId, final int textId,
+ final View.OnClickListener headerClickListener) {
+ final HeaderBar headerBar = (HeaderBar) findViewById(containerId);
+ headerBar.setFragment(getQueueFragment());
+ headerBar.setTitleText(textId);
+ headerBar.setBackgroundColor(Color.TRANSPARENT);
+ headerBar.setBackListener(mShowBrowse);
+ headerBar.setHeaderClickListener(headerClickListener);
+
+ return headerBar;
+ }
+
+ private class ShowPanelClickListener implements View.OnClickListener {
+
+ private Panel mTargetPanel;
+
+ public ShowPanelClickListener(Panel targetPanel) {
+ mTargetPanel = targetPanel;
+ }
+
+ @Override
+ public void onClick(View v) {
+ showPanel(mTargetPanel);
+ }
+ }
+}