OSDN Git Service

overhaul
[android-x86/packages-apps-Eleven.git] / src / com / andrew / apollo / activities / AudioPlayerHolder.java
1 /**\r
2  * \r
3  */\r
4 \r
5 package com.andrew.apollo.activities;\r
6 \r
7 import android.content.BroadcastReceiver;\r
8 import android.content.ComponentName;\r
9 import android.content.Context;\r
10 import android.content.Intent;\r
11 import android.content.IntentFilter;\r
12 import android.content.ServiceConnection;\r
13 import android.content.pm.ActivityInfo;\r
14 import android.content.res.Resources;\r
15 import android.media.AudioManager;\r
16 import android.media.audiofx.AudioEffect;\r
17 import android.os.Bundle;\r
18 import android.os.IBinder;\r
19 import android.os.RemoteException;\r
20 import android.provider.BaseColumns;\r
21 import android.provider.MediaStore.Audio;\r
22 import android.support.v4.app.FragmentActivity;\r
23 import android.support.v4.view.ViewPager;\r
24 import android.view.Menu;\r
25 import android.view.MenuInflater;\r
26 import android.view.MenuItem;\r
27 import android.widget.FrameLayout;\r
28 import android.widget.ImageView;\r
29 import android.widget.TextView;\r
30 \r
31 import com.andrew.apollo.AudioPlayerFragment;\r
32 import com.andrew.apollo.Constants;\r
33 import com.andrew.apollo.IApolloService;\r
34 import com.andrew.apollo.R;\r
35 import com.andrew.apollo.adapters.PagerAdapter;\r
36 import com.andrew.apollo.list.fragments.TracksFragment;\r
37 import com.andrew.apollo.preferences.SettingsHolder;\r
38 import com.andrew.apollo.service.ApolloService;\r
39 import com.andrew.apollo.service.ServiceToken;\r
40 import com.andrew.apollo.utils.ApolloUtils;\r
41 import com.andrew.apollo.utils.MusicUtils;\r
42 import com.andrew.apollo.utils.ThemeUtils;\r
43 \r
44 /**\r
45  * @author Andrew Neal\r
46  * @Note This is the "holder" for the @TracksFragment(queue) and @AudioPlayerFragment\r
47  */\r
48 public class AudioPlayerHolder extends FragmentActivity implements ServiceConnection, Constants {\r
49 \r
50     private ServiceToken mToken;\r
51 \r
52     // Options\r
53     private static final int FAVORITE = 0;\r
54 \r
55     private static final int SEARCH = 1;\r
56 \r
57     private static final int EFFECTS_PANEL = 0;\r
58 \r
59     @Override\r
60     protected void onCreate(Bundle icicle) {\r
61         // For the theme chooser and overflow MenuItem\r
62         if (ThemeUtils.overflowLight(this)) {\r
63             setTheme(R.style.Apollo_Holo);\r
64         } else {\r
65             setTheme(R.style.Apollo_Holo_Light);\r
66         }\r
67         // Landscape mode on phone isn't ready\r
68         if (!ApolloUtils.isTablet(this))\r
69             setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);\r
70 \r
71         // Control Media volume\r
72         setVolumeControlStream(AudioManager.STREAM_MUSIC);\r
73 \r
74         // Layout\r
75         setContentView(R.layout.audio_player_browser);\r
76 \r
77         // Set up the colorstrip\r
78         initColorstrip();\r
79 \r
80         // Set up the ActionBar\r
81         initActionBar();\r
82 \r
83         // Important!\r
84         initPager();\r
85         super.onCreate(icicle);\r
86     }\r
87 \r
88     @Override\r
89     public void onServiceConnected(ComponentName name, IBinder obj) {\r
90         MusicUtils.mService = IApolloService.Stub.asInterface(obj);\r
91     }\r
92 \r
93     @Override\r
94     public void onServiceDisconnected(ComponentName name) {\r
95         MusicUtils.mService = null;\r
96     }\r
97 \r
98     /**\r
99      * Update the MenuItems in the ActionBar\r
100      */\r
101     private final BroadcastReceiver mMediaStatusReceiver = new BroadcastReceiver() {\r
102 \r
103         @Override\r
104         public void onReceive(Context context, Intent intent) {\r
105             invalidateOptionsMenu();\r
106         }\r
107 \r
108     };\r
109 \r
110     @Override\r
111     protected void onStart() {\r
112         // Bind to Service\r
113         mToken = MusicUtils.bindToService(this, this);\r
114 \r
115         IntentFilter filter = new IntentFilter();\r
116         filter.addAction(ApolloService.META_CHANGED);\r
117         filter.addAction(ApolloService.PLAYSTATE_CHANGED);\r
118 \r
119         registerReceiver(mMediaStatusReceiver, filter);\r
120         super.onStart();\r
121     }\r
122 \r
123     @Override\r
124     protected void onStop() {\r
125         // Unbind\r
126         if (MusicUtils.mService != null) {\r
127             MusicUtils.unbindFromService(mToken);\r
128             mToken = null;\r
129         }\r
130 \r
131         unregisterReceiver(mMediaStatusReceiver);\r
132         super.onStop();\r
133     }\r
134 \r
135     @Override\r
136     public boolean onCreateOptionsMenu(Menu menu) {\r
137         menu.add(0, FAVORITE, 0, R.string.cd_favorite).setShowAsAction(\r
138                 MenuItem.SHOW_AS_ACTION_IF_ROOM);\r
139         menu.add(0, SEARCH, 0, R.string.cd_search).setIcon(R.drawable.apollo_holo_light_search)\r
140                 .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);\r
141 \r
142         MenuInflater inflater = getMenuInflater();\r
143         inflater.inflate(R.menu.overflow_now_playing, menu);\r
144         return super.onCreateOptionsMenu(menu);\r
145     }\r
146 \r
147     @Override\r
148     public boolean onPrepareOptionsMenu(Menu menu) {\r
149         MenuItem favorite = menu.findItem(FAVORITE);\r
150         MenuItem search = menu.findItem(SEARCH);\r
151         if (MusicUtils.mService != null && MusicUtils.getCurrentAudioId() != -1) {\r
152             if (MusicUtils.isFavorite(this, MusicUtils.getCurrentAudioId())) {\r
153                 favorite.setIcon(R.drawable.apollo_holo_light_favorite_selected);\r
154             } else {\r
155                 favorite.setIcon(R.drawable.apollo_holo_light_favorite_normal);\r
156                 // Theme chooser\r
157                 ThemeUtils.setActionBarItem(this, favorite, "apollo_favorite_normal");\r
158             }\r
159         }\r
160         // Theme chooser\r
161         ThemeUtils.setActionBarItem(this, search, "apollo_search");\r
162         return super.onPrepareOptionsMenu(menu);\r
163     }\r
164 \r
165     @Override\r
166     public boolean onOptionsItemSelected(MenuItem item) {\r
167 \r
168         switch (item.getItemId()) {\r
169             case android.R.id.home: {\r
170                 Intent intent = new Intent();\r
171                 intent.setClass(this, MusicLibrary.class);\r
172                 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);\r
173                 startActivity(intent);\r
174                 finish();\r
175                 break;\r
176             }\r
177             case FAVORITE: {\r
178                 MusicUtils.toggleFavorite();\r
179                 invalidateOptionsMenu();\r
180                 break;\r
181             }\r
182             case SEARCH: {\r
183                 onSearchRequested();\r
184                 break;\r
185             }\r
186             case R.id.add_to_playlist: {\r
187                 Intent intent = new Intent(INTENT_ADD_TO_PLAYLIST);\r
188                 long[] list = new long[1];\r
189                 list[0] = MusicUtils.getCurrentAudioId();\r
190                 intent.putExtra(INTENT_PLAYLIST_LIST, list);\r
191                 startActivity(intent);\r
192                 break;\r
193             }\r
194             case R.id.eq: {\r
195                 Intent i = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL);\r
196                 i.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, MusicUtils.getCurrentAudioId());\r
197                 startActivityForResult(i, EFFECTS_PANEL);\r
198                 break;\r
199             }\r
200             case R.id.play_store: {\r
201                 ApolloUtils.shopFor(this, MusicUtils.getArtistName());\r
202                 break;\r
203             }\r
204             case R.id.share: {\r
205                 shareCurrentTrack();\r
206                 break;\r
207             }\r
208             case R.id.settings: {\r
209                 startActivity(new Intent(this, SettingsHolder.class));\r
210                 break;\r
211             }\r
212             default:\r
213                 break;\r
214         }\r
215         return super.onOptionsItemSelected(item);\r
216     }\r
217 \r
218     private void initActionBar() {\r
219         ApolloUtils.showUpTitleOnly(getActionBar());\r
220 \r
221         // The ActionBar Title and UP ids are hidden.\r
222         int titleId = Resources.getSystem().getIdentifier("action_bar_title", "id", "android");\r
223         int upId = Resources.getSystem().getIdentifier("up", "id", "android");\r
224 \r
225         TextView actionBarTitle = (TextView)findViewById(titleId);\r
226         ImageView actionBarUp = (ImageView)findViewById(upId);\r
227 \r
228         // Theme chooser\r
229         ThemeUtils.setActionBarBackground(this, getActionBar(), "action_bar_background");\r
230         ThemeUtils.setTextColor(this, actionBarTitle, "action_bar_title_color");\r
231         ThemeUtils.initThemeChooser(this, actionBarUp, "action_bar_up", THEME_ITEM_BACKGROUND);\r
232     }\r
233 \r
234     /**\r
235      * @return Share intent\r
236      * @throws RemoteException\r
237      */\r
238     private String shareCurrentTrack() {\r
239         if (MusicUtils.getTrackName() == null || MusicUtils.getArtistName() == null) {\r
240 \r
241         }\r
242 \r
243         Intent shareIntent = new Intent();\r
244         String currentTrackMessage = getResources().getString(R.string.now_listening_to) + " "\r
245                 + MusicUtils.getTrackName() + " " + getResources().getString(R.string.by) + " "\r
246                 + MusicUtils.getArtistName();\r
247 \r
248         shareIntent.setAction(Intent.ACTION_SEND);\r
249         shareIntent.setType("text/plain");\r
250         shareIntent.putExtra(Intent.EXTRA_TEXT, currentTrackMessage);\r
251 \r
252         startActivity(Intent.createChooser(shareIntent,\r
253                 getResources().getString(R.string.share_track_using)));\r
254         return currentTrackMessage;\r
255     }\r
256 \r
257     /**\r
258      * Initiate ViewPager and PagerAdapter\r
259      */\r
260     public void initPager() {\r
261         // Initiate PagerAdapter\r
262         PagerAdapter mPagerAdapter = new PagerAdapter(getSupportFragmentManager());\r
263         Bundle bundle = new Bundle();\r
264         bundle.putString(MIME_TYPE, Audio.Playlists.CONTENT_TYPE);\r
265         bundle.putLong(BaseColumns._ID, PLAYLIST_QUEUE);\r
266         mPagerAdapter.addFragment(new TracksFragment(bundle));\r
267         // Artists\r
268         mPagerAdapter.addFragment(new AudioPlayerFragment());\r
269 \r
270         // Initiate ViewPager\r
271         ViewPager mViewPager = (ViewPager)findViewById(R.id.viewPager);\r
272         mViewPager.setPageMargin(getResources().getInteger(R.integer.viewpager_margin_width));\r
273         mViewPager.setPageMarginDrawable(R.drawable.viewpager_margin);\r
274         mViewPager.setOffscreenPageLimit(mPagerAdapter.getCount());\r
275         mViewPager.setAdapter(mPagerAdapter);\r
276         mViewPager.setCurrentItem(1);\r
277 \r
278         // Theme chooser\r
279         ThemeUtils.initThemeChooser(this, mViewPager, "viewpager", THEME_ITEM_BACKGROUND);\r
280         ThemeUtils.setMarginDrawable(this, mViewPager, "viewpager_margin");\r
281     }\r
282 \r
283     /**\r
284      * For the theme chooser\r
285      */\r
286     private void initColorstrip() {\r
287         FrameLayout mColorstrip = (FrameLayout)findViewById(R.id.colorstrip);\r
288         mColorstrip.setBackgroundColor(getResources().getColor(R.color.holo_blue_dark));\r
289         ThemeUtils.setBackgroundColor(this, mColorstrip, "colorstrip");\r
290     }\r
291 }\r