/* * Copyright (C) 2007 The Android Open Source 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.feebe.music; import android.app.Activity; import android.app.SearchManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.graphics.drawable.Drawable; import android.media.AudioManager; import android.net.Uri; import android.os.Bundle; import android.os.RemoteException; import android.os.IBinder; import android.provider.MediaStore; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.Window; import android.widget.ImageButton; import android.widget.TextView; public class MusicBrowserActivity extends Activity implements MusicUtils.Defs, View.OnClickListener { private View mNowPlayingView; private TextView mTitle; private TextView mArtist; private boolean mAutoShuffle = false; private static final int SEARCH_MUSIC = CHILD_MENU_BASE; public MusicBrowserActivity() { } /** * Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setVolumeControlStream(AudioManager.STREAM_MUSIC); String shuf = getIntent().getStringExtra("autoshuffle"); if ("true".equals(shuf)) { mAutoShuffle = true; } MusicUtils.bindToService(this, new ServiceConnection() { public void onServiceConnected(ComponentName classname, IBinder obj) { updateMenu(); } public void onServiceDisconnected(ComponentName classname) { updateMenu(); } }); setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); init(); } @Override public void onDestroy() { MusicUtils.unbindFromService(this); super.onDestroy(); } public void init() { setContentView(R.layout.music_library); mNowPlayingView = findViewById(R.id.nowplaying); mTitle = (TextView) mNowPlayingView.findViewById(R.id.title); mArtist = (TextView) mNowPlayingView.findViewById(R.id.artist); View b = (View) findViewById(R.id.browse_button); b.setOnClickListener(this); b = (View) findViewById(R.id.albums_button); b.setOnClickListener(this); b = (View) findViewById(R.id.tracks_button); b.setOnClickListener(this); b = (View) findViewById(R.id.playlists_button); b.setOnClickListener(this); } private void updateMenu() { try { if (MusicUtils.sService != null && MusicUtils.sService.getAudioId() != -1) { makeNowPlayingView(); mNowPlayingView.setVisibility(View.VISIBLE); return; } } catch (RemoteException ex) { } mNowPlayingView.setVisibility(View.INVISIBLE); } @Override public void onResume() { super.onResume(); IntentFilter f = new IntentFilter(); f.addAction(MediaPlaybackService.META_CHANGED); registerReceiver(mStatusListener, new IntentFilter(f)); updateMenu(); if (mAutoShuffle) { mAutoShuffle = false; doAutoShuffle(); } } @Override public void onPause() { super.onPause(); unregisterReceiver(mStatusListener); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, PARTY_SHUFFLE, 0, R.string.party_shuffle); // icon will be set in onPrepareOptionsMenu() menu.add(0, SEARCH_MUSIC, 0, R.string.search_title).setIcon(android.R.drawable.ic_menu_search); return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { MenuItem item = menu.findItem(PARTY_SHUFFLE); if (item != null) { int shuffle = MusicUtils.getCurrentShuffleMode(); if (shuffle == MediaPlaybackService.SHUFFLE_AUTO) { item.setIcon(R.drawable.ic_menu_party_shuffle); item.setTitle(R.string.party_shuffle_off); } else { item.setIcon(R.drawable.ic_menu_party_shuffle); item.setTitle(R.string.party_shuffle); } } return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { Intent intent; try { switch (item.getItemId()) { case PARTY_SHUFFLE: int shuffle = MusicUtils.sService.getShuffleMode(); if (shuffle == MediaPlaybackService.SHUFFLE_AUTO) { MusicUtils.sService.setShuffleMode(MediaPlaybackService.SHUFFLE_NONE); } else { MusicUtils.sService.setShuffleMode(MediaPlaybackService.SHUFFLE_AUTO); } break; case SEARCH_MUSIC: { startSearch("", false, null, false); return true; } } } catch (RemoteException ex) { } return super.onOptionsItemSelected(item); } public void onClick(View v) { Intent intent; switch (v.getId()) { case R.id.browse_button: intent = new Intent(Intent.ACTION_PICK); intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/artistalbum"); startActivity(intent); break; case R.id.albums_button: intent = new Intent(Intent.ACTION_PICK); intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/album"); startActivity(intent); break; case R.id.tracks_button: intent = new Intent(Intent.ACTION_PICK); intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/track"); startActivity(intent); break; case R.id.playlists_button: intent = new Intent(Intent.ACTION_PICK); intent.setDataAndType(Uri.EMPTY, MediaStore.Audio.Playlists.CONTENT_TYPE); startActivity(intent); break; case R.id.nowplaying: intent = new Intent("com.android.music.PLAYBACK_VIEWER"); startActivity(intent); break; } } private void doAutoShuffle() { bindService((new Intent()).setClass(this, MediaPlaybackService.class), autoshuffle, 0); } private ServiceConnection autoshuffle = new ServiceConnection() { public void onServiceConnected(ComponentName classname, IBinder obj) { // we need to be able to bind again, so unbind try { unbindService(this); } catch (IllegalArgumentException e) { } IMediaPlaybackService serv = IMediaPlaybackService.Stub.asInterface(obj); if (serv != null) { try { serv.setShuffleMode(MediaPlaybackService.SHUFFLE_AUTO); updateMenu(); } catch (RemoteException ex) { } } } public void onServiceDisconnected(ComponentName classname) { } }; private void makeNowPlayingView() { try { mTitle.setText(MusicUtils.sService.getTrackName()); String artistName = MusicUtils.sService.getArtistName(); if (MediaFile.UNKNOWN_STRING.equals(artistName)) { artistName = getString(R.string.unknown_artist_name); } mArtist.setText(artistName); mNowPlayingView.setOnFocusChangeListener(mFocuser); mNowPlayingView.setOnClickListener(this); } catch (RemoteException ex) { } } View.OnFocusChangeListener mFocuser = new View.OnFocusChangeListener() { Drawable mBack; public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { if (mBack == null) { mBack = mNowPlayingView.getBackground(); } Drawable dr = getResources().getDrawable(android.R.drawable.menuitem_background); dr.setState(new int[] { android.R.attr.state_focused}); mNowPlayingView.setBackgroundDrawable(dr); mNowPlayingView.setSelected(true); } else { mNowPlayingView.setBackgroundDrawable(mBack); mNowPlayingView.setSelected(false); } } }; private BroadcastReceiver mStatusListener = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // this receiver is only used for META_CHANGED events updateMenu(); } }; }