OSDN Git Service

Eleven: lots of ui tweaks (fonts, padding, grid layout) and cancel tasks smarter
[android-x86/packages-apps-Eleven.git] / src / com / cyngn / eleven / ui / activities / HomeActivity.java
1 /*
2  * Copyright (C) 2012 Andrew Neal Licensed under the Apache License, Version 2.0
3  * (the "License"); you may not use this file except in compliance with the
4  * License. You may obtain a copy of the License at
5  * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
6  * or agreed to in writing, software distributed under the License is
7  * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
8  * KIND, either express or implied. See the License for the specific language
9  * governing permissions and limitations under the License.
10  */
11
12 package com.cyngn.eleven.ui.activities;
13
14 import android.content.Intent;
15 import android.graphics.Color;
16 import android.os.Bundle;
17 import android.support.v4.app.Fragment;
18 import android.support.v4.view.ViewPager;
19 import android.view.View;
20 import android.widget.ImageView;
21
22 import com.cyngn.eleven.R;
23 import com.cyngn.eleven.slidinguppanel.SlidingUpPanelLayout;
24 import com.cyngn.eleven.slidinguppanel.SlidingUpPanelLayout.SimplePanelSlideListener;
25 import com.cyngn.eleven.ui.HeaderBar;
26 import com.cyngn.eleven.ui.fragments.AudioPlayerFragment;
27 import com.cyngn.eleven.ui.fragments.phone.MusicBrowserPhoneFragment;
28 import com.cyngn.eleven.utils.ApolloUtils;
29 import com.cyngn.eleven.utils.MusicUtils;
30 import com.cyngn.eleven.widgets.BlurScrimImage;
31
32 /**
33  * This class is used to display the {@link ViewPager} used to swipe between the
34  * main {@link Fragment}s used to browse the user's music.
35  *
36  * @author Andrew Neal (andrewdneal@gmail.com)
37  */
38 public class HomeActivity extends BaseActivity {
39     public static final String ACTION_VIEW_BROWSE = "com.cyngn.eleven.ui.activities.HomeActivity.view.Browse";
40     public static final String ACTION_VIEW_MUSIC_PLAYER = "com.cyngn.eleven.ui.activities.HomeActivity.view.MusicPlayer";
41     public static final String ACTION_VIEW_QUEUE = "com.cyngn.eleven.ui.activities.HomeActivity.view.Queue";
42
43     enum Panel {
44         Browse,
45         MusicPlayer,
46         Queue,
47         None,
48     }
49
50     private SlidingUpPanelLayout mFirstPanel;
51     private HeaderBar mFirstHeaderBar;
52     private SlidingUpPanelLayout mSecondPanel;
53     private HeaderBar mSecondHeaderBar;
54     private Panel mTargetNavigatePanel;
55
56     // this is the blurred image that goes behind the now playing and queue fragments
57     private BlurScrimImage mBlurScrimImage;
58
59     /**
60      * {@inheritDoc}
61      */
62     @Override
63     protected void onCreate(final Bundle savedInstanceState) {
64         super.onCreate(savedInstanceState);
65
66         if (savedInstanceState == null) {
67             getSupportFragmentManager().beginTransaction()
68                     .replace(R.id.activity_base_content, new MusicBrowserPhoneFragment()).commit();
69         }
70
71         mTargetNavigatePanel = Panel.None;
72
73         setupFirstPanel();
74         setupSecondPanel();
75
76         // get the blur scrim image
77         findViewById(R.id.bottom_action_bar_parent).setBackgroundColor(Color.TRANSPARENT);
78         mBlurScrimImage = (BlurScrimImage)findViewById(R.id.blurScrimImage);
79
80         // if we've been launched by an intent, parse it
81         Intent launchIntent = getIntent();
82         if (launchIntent != null) {
83             parseIntent(launchIntent);
84         }
85     }
86
87     private void setupFirstPanel() {
88         mFirstPanel = (SlidingUpPanelLayout)findViewById(R.id.sliding_layout);
89         mFirstPanel.setPanelSlideListener(new SimplePanelSlideListener() {
90             @Override
91             public void onPanelSlide(View panel, float slideOffset) {
92                 if (slideOffset > 0.8f) {
93                     getActionBar().hide();
94                 } else if (slideOffset < 0.75f) {
95                     getActionBar().show();
96                 }
97             }
98
99             @Override
100             public void onPanelExpanded(View panel) {
101                 checkTargetNavigation();
102             }
103
104             @Override
105             public void onPanelCollapsed(View panel) {
106                 checkTargetNavigation();
107             }
108         });
109
110         // setup the header bar
111         mFirstHeaderBar = setupHeaderBar(R.id.firstHeaderBar, R.string.page_now_playing,
112                 R.drawable.btn_queue_icon,
113                 new View.OnClickListener() {
114                     @Override
115                     public void onClick(View v) {
116                         showPanel(Panel.Queue);
117                     }
118                 });
119     }
120
121     private void setupSecondPanel() {
122         mSecondPanel = (SlidingUpPanelLayout)findViewById(R.id.sliding_layout2);
123         mSecondPanel.setPanelSlideListener(new SimplePanelSlideListener() {
124             @Override
125             public void onPanelSlide(View panel, float slideOffset) {
126                 mFirstPanel.setSlidingEnabled(false);
127             }
128
129             @Override
130             public void onPanelExpanded(View panel) {
131                 checkTargetNavigation();
132             }
133
134             @Override
135             public void onPanelCollapsed(View panel) {
136                 mFirstPanel.setSlidingEnabled(true);
137                 checkTargetNavigation();
138             }
139         });
140
141         // setup the header bar
142         mSecondHeaderBar = setupHeaderBar(R.id.secondHeaderBar, R.string.page_play_queue,
143                 R.drawable.btn_playback_icon,
144                 new View.OnClickListener() {
145                     @Override
146                     public void onClick(View v) {
147                         showPanel(Panel.MusicPlayer);
148                     }
149                 });
150
151         // set the drag view offset to allow the panel to go past the top of the viewport
152         // since the previous view's is hiding the slide offset, we need to subtract that
153         // from action bat height
154         int slideOffset = getResources().getDimensionPixelOffset(R.dimen.sliding_panel_indicator_height);
155         slideOffset -= ApolloUtils.getActionBarHeight(this);
156         mSecondPanel.setSlidePanelOffset(slideOffset);
157     }
158
159     @Override
160     protected void onNewIntent(Intent intent) {
161         super.onNewIntent(intent);
162
163         parseIntent(intent);
164     }
165
166     private void parseIntent(Intent intent) {
167         Panel targetPanel = null;
168
169         if (intent.getAction() != null) {
170             String action = intent.getAction();
171             if (action.equals(ACTION_VIEW_BROWSE)) {
172                 targetPanel = Panel.Browse;
173             } else if (action.equals(ACTION_VIEW_MUSIC_PLAYER)) {
174                 targetPanel = Panel.MusicPlayer;
175             } if (action.equals(ACTION_VIEW_QUEUE)) {
176                 targetPanel = Panel.Queue;
177             }
178         } else {
179             AudioPlayerFragment player = getAudioPlayerFragment();
180             if (player != null && player.startPlayback()) {
181                 targetPanel = Panel.MusicPlayer;
182             }
183         }
184
185         if (targetPanel != null) {
186             showPanel(targetPanel);
187         }
188     }
189
190     /**
191      * {@inheritDoc}
192      */
193     @Override
194     public int setContentView() {
195         return R.layout.activity_base;
196     }
197
198     @Override
199     public void onBackPressed() {
200         Panel panel = getCurrentPanel();
201         switch (panel) {
202             case Browse:
203                 super.onBackPressed();
204                 break;
205             case MusicPlayer:
206                 showPanel(Panel.Browse);
207                 break;
208             case Queue:
209                 showPanel(Panel.MusicPlayer);
210                 break;
211         }
212     }
213
214     protected void showPanel(Panel panel) {
215         // TODO: Add ability to do this instantaneously as opposed to animate
216         switch (panel) {
217             case Browse:
218                 // if we are two panels over, we need special logic to jump twice
219                 mTargetNavigatePanel = panel;
220                 mSecondPanel.collapsePanel();
221                 mFirstPanel.collapsePanel();
222                 break;
223             case MusicPlayer:
224                 mSecondPanel.collapsePanel();
225                 mFirstPanel.expandPanel();
226                 break;
227             case Queue:
228                 // if we are two panels over, we need special logic to jump twice
229                 mTargetNavigatePanel = panel;
230                 mSecondPanel.expandPanel();
231                 mFirstPanel.expandPanel();
232                 break;
233         }
234     }
235
236     /**
237      * This checks if we are at our target panel, and if not, continues the motion
238      */
239     protected void checkTargetNavigation() {
240         if (mTargetNavigatePanel != Panel.None) {
241             if (mTargetNavigatePanel == getCurrentPanel()) {
242                 mTargetNavigatePanel = Panel.None;
243             } else {
244                 showPanel(mTargetNavigatePanel);
245             }
246         }
247     }
248
249     protected Panel getCurrentPanel() {
250         if (mSecondPanel.isPanelExpanded()) {
251             return Panel.Queue;
252         } else if (mFirstPanel.isPanelExpanded()) {
253             return Panel.MusicPlayer;
254         } else {
255             return Panel.Browse;
256         }
257     }
258
259     @Override
260     protected void updateMetaInfo() {
261         super.updateMetaInfo();
262
263         // load the blurred image
264         mBlurScrimImage.loadBlurImage(ApolloUtils.getImageFetcher(this));
265
266         // Set the artist name
267         mFirstHeaderBar.setTitleText(MusicUtils.getArtistName());
268     }
269
270     protected AudioPlayerFragment getAudioPlayerFragment() {
271         return (AudioPlayerFragment)getSupportFragmentManager().findFragmentById(R.id.audioPlayerFragment);
272     }
273
274     protected HeaderBar setupHeaderBar(final int containerId, final int textId,
275                                        final int customIconId, final View.OnClickListener listener) {
276         final HeaderBar headerBar = (HeaderBar) findViewById(containerId);
277         headerBar.setTitleText(textId);
278         headerBar.setupCustomButton(customIconId, listener);
279         headerBar.setBackgroundColor(Color.TRANSPARENT);
280         headerBar.setBackListener(new View.OnClickListener() {
281             @Override
282             public void onClick(View v) {
283                 showPanel(Panel.Browse);
284             }
285         });
286
287         return headerBar;
288     }
289 }