OSDN Git Service

c7b72a3d2b4a4cc92ef1c408ebed8fc7de046e54
[android-x86/packages-apps-Eleven.git] / src / com / cyanogenmod / eleven / ui / activities / SlidingPanelActivity.java
1 /*
2  * Copyright (C) 2012 Andrew Neal
3  * Copyright (C) 2014 The CyanogenMod Project
4  * Licensed under the Apache License, Version 2.0
5  * (the "License"); you may not use this file except in compliance with the
6  * License. You may obtain a copy of the License at
7  * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
8  * or agreed to in writing, software distributed under the License is
9  * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
10  * KIND, either express or implied. See the License for the specific language
11  * governing permissions and limitations under the License.
12  */
13
14 package com.cyanogenmod.eleven.ui.activities;
15
16 import android.graphics.Color;
17 import android.os.Bundle;
18 import android.support.v4.app.Fragment;
19 import android.support.v4.view.ViewPager;
20 import android.view.View;
21 import android.widget.LinearLayout;
22
23 import com.cyanogenmod.eleven.R;
24 import com.cyanogenmod.eleven.slidinguppanel.SlidingUpPanelLayout;
25 import com.cyanogenmod.eleven.slidinguppanel.SlidingUpPanelLayout.SimplePanelSlideListener;
26 import com.cyanogenmod.eleven.ui.HeaderBar;
27 import com.cyanogenmod.eleven.ui.fragments.AudioPlayerFragment;
28 import com.cyanogenmod.eleven.ui.fragments.QueueFragment;
29 import com.cyanogenmod.eleven.utils.ApolloUtils;
30 import com.cyanogenmod.eleven.utils.MusicUtils;
31 import com.cyanogenmod.eleven.widgets.BlurScrimImage;
32
33 /**
34  * This class is used to display the {@link ViewPager} used to swipe between the
35  * main {@link Fragment}s used to browse the user's music.
36  *
37  * @author Andrew Neal (andrewdneal@gmail.com)
38  */
39 public abstract class SlidingPanelActivity extends BaseActivity {
40
41     public enum Panel {
42         Browse,
43         MusicPlayer,
44         Queue,
45         None,
46     }
47
48     private static final String STATE_KEY_CURRENT_PANEL = "CurrentPanel";
49
50     private SlidingUpPanelLayout mFirstPanel;
51     private SlidingUpPanelLayout mSecondPanel;
52     protected Panel mTargetNavigatePanel;
53
54     private final ShowPanelClickListener mShowBrowse = new ShowPanelClickListener(Panel.Browse);
55     private final ShowPanelClickListener mShowMusicPlayer = new ShowPanelClickListener(Panel.MusicPlayer);
56
57     // this is the blurred image that goes behind the now playing and queue fragments
58     private BlurScrimImage mBlurScrimImage;
59
60     /**
61      * Opens the now playing screen
62      */
63     private final View.OnClickListener mOpenNowPlaying = new View.OnClickListener() {
64
65         /**
66          * {@inheritDoc}
67          */
68         @Override
69         public void onClick(final View v) {
70             if (MusicUtils.getCurrentAudioId() != -1) {
71                 openAudioPlayer();
72             } else {
73                 MusicUtils.shuffleAll(SlidingPanelActivity.this);
74             }
75         }
76     };
77
78     @Override
79     protected void initBottomActionBar() {
80         super.initBottomActionBar();
81         // Bottom action bar
82         final LinearLayout bottomActionBar = (LinearLayout)findViewById(R.id.bottom_action_bar);
83         // Display the now playing screen or shuffle if this isn't anything
84         // playing
85         bottomActionBar.setOnClickListener(mOpenNowPlaying);
86     }
87
88     /**
89      * {@inheritDoc}
90      */
91     @Override
92     protected void onCreate(final Bundle savedInstanceState) {
93         super.onCreate(savedInstanceState);
94
95         mTargetNavigatePanel = Panel.None;
96
97         setupFirstPanel();
98         setupSecondPanel();
99
100         // get the blur scrim image
101         mBlurScrimImage = (BlurScrimImage)findViewById(R.id.blurScrimImage);
102
103         if (savedInstanceState != null) {
104             int panelIndex = savedInstanceState.getInt(STATE_KEY_CURRENT_PANEL,
105                     Panel.Browse.ordinal());
106             Panel targetPanel = Panel.values()[panelIndex];
107
108             showPanel(targetPanel);
109             mTargetNavigatePanel = Panel.None;
110
111             if (targetPanel == Panel.Queue) {
112                 mFirstPanel.setSlidingEnabled(false);
113             }
114         }
115     }
116
117     @Override
118     protected void onSaveInstanceState(Bundle outState) {
119         super.onSaveInstanceState(outState);
120
121         outState.putInt(STATE_KEY_CURRENT_PANEL, getCurrentPanel().ordinal());
122     }
123
124     private void setupFirstPanel() {
125         mFirstPanel = (SlidingUpPanelLayout)findViewById(R.id.sliding_layout);
126         mFirstPanel.setPanelSlideListener(new SimplePanelSlideListener() {
127             @Override
128             public void onPanelSlide(View panel, float slideOffset) {
129                 onSlide(slideOffset);
130             }
131
132             @Override
133             public void onPanelExpanded(View panel) {
134                 checkTargetNavigation();
135             }
136
137             @Override
138             public void onPanelCollapsed(View panel) {
139                 checkTargetNavigation();
140             }
141         });
142     }
143
144     private void setupSecondPanel() {
145         mSecondPanel = (SlidingUpPanelLayout)findViewById(R.id.sliding_layout2);
146         mSecondPanel.setPanelSlideListener(new SimplePanelSlideListener() {
147             @Override
148             public void onPanelSlide(View panel, float slideOffset) {
149                 // if we are not going to a specific panel, then disable sliding to prevent
150                 // the two sliding panels from fighting for touch input
151                 if (mTargetNavigatePanel == Panel.None) {
152                     mFirstPanel.setSlidingEnabled(false);
153                 }
154
155                 onSlide(slideOffset);
156             }
157
158             @Override
159             public void onPanelExpanded(View panel) {
160                 checkTargetNavigation();
161             }
162
163             @Override
164             public void onPanelCollapsed(View panel) {
165                 // re-enable sliding when the second panel is collapsed
166                 mFirstPanel.setSlidingEnabled(true);
167                 checkTargetNavigation();
168             }
169         });
170
171         // setup the header bar
172         setupHeaderBar(R.id.secondHeaderBar, R.string.page_play_queue, mShowMusicPlayer);
173
174         // set the drag view offset to allow the panel to go past the top of the viewport
175         // since the previous view's is hiding the slide offset, we need to subtract that
176         // from action bat height
177         int slideOffset = getResources().getDimensionPixelOffset(R.dimen.sliding_panel_indicator_height);
178         slideOffset -= ApolloUtils.getActionBarHeight(this);
179         mSecondPanel.setSlidePanelOffset(slideOffset);
180     }
181
182     @Override
183     protected void onPause() {
184         super.onPause();
185     }
186
187     /**
188      * {@inheritDoc}
189      */
190     @Override
191     public int setContentView() {
192         return R.layout.activity_base;
193     }
194
195     @Override
196     public void onBackPressed() {
197         Panel panel = getCurrentPanel();
198         switch (panel) {
199             case Browse:
200                 super.onBackPressed();
201                 break;
202             default:
203             case MusicPlayer:
204                 showPanel(Panel.Browse);
205                 break;
206             case Queue:
207                 showPanel(Panel.MusicPlayer);
208                 break;
209         }
210     }
211
212     public void openAudioPlayer() {
213         showPanel(Panel.MusicPlayer);
214     }
215
216     public void showPanel(Panel panel) {
217         // if we are already at our target panel, then don't do anything
218         if (panel == getCurrentPanel()) {
219             return;
220         }
221
222         // TODO: Add ability to do this instantaneously as opposed to animate
223         switch (panel) {
224             case Browse:
225                 // if we are two panels over, we need special logic to jump twice
226                 mTargetNavigatePanel = panel;
227                 mSecondPanel.collapsePanel();
228                 // re-enable sliding on first panel so we can collapse it
229                 mFirstPanel.setSlidingEnabled(true);
230                 mFirstPanel.collapsePanel();
231                 break;
232             case MusicPlayer:
233                 mSecondPanel.collapsePanel();
234                 mFirstPanel.expandPanel();
235                 break;
236             case Queue:
237                 // if we are two panels over, we need special logic to jump twice
238                 mTargetNavigatePanel = panel;
239                 mSecondPanel.expandPanel();
240                 mFirstPanel.expandPanel();
241                 break;
242         }
243     }
244
245     protected void onSlide(float slideOffset) {
246     }
247
248     /**
249      * This checks if we are at our target panel and resets our flag if we are there
250      */
251     protected void checkTargetNavigation() {
252         if (mTargetNavigatePanel == getCurrentPanel()) {
253             mTargetNavigatePanel = Panel.None;
254         }
255
256         getAudioPlayerFragment().setVisualizerVisible(getCurrentPanel() == Panel.MusicPlayer);
257     }
258
259     public Panel getCurrentPanel() {
260         if (mSecondPanel.isPanelExpanded()) {
261             return Panel.Queue;
262         } else if (mFirstPanel.isPanelExpanded()) {
263             return Panel.MusicPlayer;
264         } else {
265             return Panel.Browse;
266         }
267     }
268
269     public void clearMetaInfo() {
270         super.clearMetaInfo();
271         mBlurScrimImage.transitionToDefaultState();
272     }
273
274     @Override
275     public void onMetaChanged() {
276         super.onMetaChanged();
277
278         // load the blurred image
279         mBlurScrimImage.loadBlurImage(ApolloUtils.getImageFetcher(this));
280     }
281
282     @Override
283     public void onCacheUnpaused() {
284         super.onCacheUnpaused();
285
286         // load the blurred image
287         mBlurScrimImage.loadBlurImage(ApolloUtils.getImageFetcher(this));
288     }
289
290     protected AudioPlayerFragment getAudioPlayerFragment() {
291         return (AudioPlayerFragment)getSupportFragmentManager().findFragmentById(R.id.audioPlayerFragment);
292     }
293
294     protected QueueFragment getQueueFragment() {
295         return (QueueFragment)getSupportFragmentManager().findFragmentById(R.id.queueFragment);
296     }
297
298     protected HeaderBar setupHeaderBar(final int containerId, final int textId,
299                                        final View.OnClickListener headerClickListener) {
300         final HeaderBar headerBar = (HeaderBar) findViewById(containerId);
301         headerBar.setFragment(getQueueFragment());
302         headerBar.setTitleText(textId);
303         headerBar.setBackgroundColor(Color.TRANSPARENT);
304         headerBar.setBackListener(mShowBrowse);
305         headerBar.setHeaderClickListener(headerClickListener);
306
307         return headerBar;
308     }
309
310     private class ShowPanelClickListener implements View.OnClickListener {
311
312         private Panel mTargetPanel;
313
314         public ShowPanelClickListener(Panel targetPanel) {
315             mTargetPanel = targetPanel;
316         }
317
318         @Override
319         public void onClick(View v) {
320             showPanel(mTargetPanel);
321         }
322     }
323 }