diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 09c30b27..7c484501 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -15,6 +15,9 @@
+
-
+
\ No newline at end of file
diff --git a/src/org/kreed/vanilla/CoverView.java b/src/org/kreed/vanilla/CoverView.java
index 424e83eb..35e8bff4 100644
--- a/src/org/kreed/vanilla/CoverView.java
+++ b/src/org/kreed/vanilla/CoverView.java
@@ -137,11 +137,15 @@ public final class CoverView extends View implements Handler.Callback {
public void setPlaybackService(IPlaybackService service)
{
mService = service;
- try {
- mTimelinePos = mService.getTimelinePos();
- } catch (RemoteException e) {
- mService = null;
+
+ if (mService != null) {
+ try {
+ mTimelinePos = mService.getTimelinePos();
+ } catch (RemoteException e) {
+ mService = null;
+ }
}
+
refreshSongs();
}
@@ -428,7 +432,6 @@ public final class CoverView extends View implements Handler.Callback {
if (mCallback != null)
mCallback.songChanged(mSongs[STORE_SIZE / 2]);
- mHandler.sendMessage(mHandler.obtainMessage(SET_SONG, delta, 0));
mHandler.sendEmptyMessage(i);
}
@@ -563,6 +566,7 @@ public final class CoverView extends View implements Handler.Callback {
return true;
}
+ @Override
public void computeScroll()
{
if (mScroller.computeScrollOffset()) {
@@ -575,20 +579,13 @@ public final class CoverView extends View implements Handler.Callback {
}
private static final int GO = 10;
- private static final int SET_SONG = 11;
public boolean handleMessage(Message message)
{
try {
switch (message.what) {
case GO:
- if (message.arg1 == 0)
- mService.toggleFlag(PlaybackService.FLAG_PLAYING);
- else
- shiftCover(message.arg1);
- break;
- case SET_SONG:
- mService.setCurrentSong(message.arg1);
+ shiftCover(message.arg1);
break;
default:
int i = message.what;
diff --git a/src/org/kreed/vanilla/FullPlaybackActivity.java b/src/org/kreed/vanilla/FullPlaybackActivity.java
index d823f9fb..1cd9938e 100644
--- a/src/org/kreed/vanilla/FullPlaybackActivity.java
+++ b/src/org/kreed/vanilla/FullPlaybackActivity.java
@@ -21,12 +21,10 @@ package org.kreed.vanilla;
import org.kreed.vanilla.IPlaybackService;
import org.kreed.vanilla.R;
-import android.app.Dialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
-import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
import android.preference.PreferenceManager;
@@ -40,12 +38,8 @@ import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;
-import android.widget.Toast;
-
-public class FullPlaybackActivity extends PlaybackActivity implements View.OnClickListener, SeekBar.OnSeekBarChangeListener, Handler.Callback, CoverView.Callback {
- private IPlaybackService mService;
- private Handler mHandler = new Handler(this);
+public class FullPlaybackActivity extends PlaybackActivity implements View.OnClickListener, SeekBar.OnSeekBarChangeListener, CoverView.Callback {
private RelativeLayout mMessageOverlay;
private View mControlsTop;
private View mControlsBottom;
@@ -60,17 +54,6 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli
private boolean mSeekBarTracking;
private boolean mPaused;
- private static final int SONG_SELECTOR = 8;
-
- private static final int MENU_QUIT = 0;
- private static final int MENU_DISPLAY = 1;
- private static final int MENU_PREFS = 2;
- private static final int MENU_LIBRARY = 3;
- private static final int MENU_SHUFFLE = 4;
- private static final int MENU_PLAYBACK = 5;
- private static final int MENU_REPEAT = 6;
- public static final int MENU_SEARCH = 7;
-
@Override
public void onCreate(Bundle icicle)
{
@@ -78,7 +61,7 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
if (icicle == null && settings.getBoolean("selector_on_startup", false))
- showDialog(SONG_SELECTOR);
+ startActivity(new Intent(this, SongSelector.class));
setContentView(R.layout.full_playback);
@@ -162,8 +145,6 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli
{
super.setService(service);
- mService = service;
-
if (service != null) {
try {
mDuration = service.getDuration();
@@ -180,96 +161,47 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli
if (mService != null) {
try {
mDuration = mService.getDuration();
- mHandler.sendEmptyMessage(UPDATE_PROGRESS);
+ mHandler.sendEmptyMessage(MSG_UPDATE_PROGRESS);
} catch (RemoteException e) {
setService(null);
}
}
if (mSongSelector != null)
- mSongSelector.change(intent);
- }
-
- public void fillMenu(Menu menu, boolean fromDialog)
- {
- if (fromDialog) {
- menu.add(0, MENU_PLAYBACK, 0, R.string.playback_view).setIcon(android.R.drawable.ic_menu_gallery);
- menu.add(0, MENU_SEARCH, 0, R.string.search).setIcon(android.R.drawable.ic_menu_search);
- } else {
- menu.add(0, MENU_LIBRARY, 0, R.string.library).setIcon(android.R.drawable.ic_menu_add);
- menu.add(0, MENU_DISPLAY, 0, R.string.display_mode).setIcon(android.R.drawable.ic_menu_gallery);
- }
- menu.add(0, MENU_PREFS, 0, R.string.settings).setIcon(android.R.drawable.ic_menu_preferences);
- menu.add(0, MENU_SHUFFLE, 0, R.string.shuffle_enable).setIcon(R.drawable.ic_menu_shuffle);
- menu.add(0, MENU_REPEAT, 0, R.string.repeat_enable).setIcon(R.drawable.ic_menu_refresh);
- menu.add(0, MENU_QUIT, 0, R.string.quit).setIcon(android.R.drawable.ic_menu_close_clear_cancel);
+ mSongSelector.onServiceChange(intent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
- fillMenu(menu, false);
- return true;
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu)
- {
- boolean isShuffling = (mState & PlaybackService.FLAG_SHUFFLE) != 0;
- menu.findItem(MENU_SHUFFLE).setTitle(isShuffling ? R.string.shuffle_disable : R.string.shuffle_enable);
- boolean isRepeating = (mState & PlaybackService.FLAG_REPEAT) != 0;
- menu.findItem(MENU_REPEAT).setTitle(isRepeating ? R.string.repeat_disable : R.string.repeat_enable);
- return true;
+ menu.add(0, MENU_LIBRARY, 0, R.string.library).setIcon(android.R.drawable.ic_menu_add);
+ menu.add(0, MENU_DISPLAY, 0, R.string.display_mode).setIcon(android.R.drawable.ic_menu_gallery);
+ return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId()) {
- case MENU_QUIT:
- ContextApplication.quit(this);
- break;
- case MENU_SHUFFLE:
- mHandler.sendMessage(mHandler.obtainMessage(TOGGLE_FLAG, PlaybackService.FLAG_SHUFFLE, 0));
- break;
- case MENU_REPEAT:
- mHandler.sendMessage(mHandler.obtainMessage(TOGGLE_FLAG, PlaybackService.FLAG_REPEAT, 0));
- break;
- case MENU_PREFS:
- startActivity(new Intent(this, PreferencesActivity.class));
- break;
- case MENU_PLAYBACK:
- dismissDialog(SONG_SELECTOR);
- break;
case MENU_LIBRARY:
- showDialog(SONG_SELECTOR);
- break;
+ startActivity(new Intent(this, SongSelector.class));
+ return true;
case MENU_DISPLAY:
mCoverView.toggleDisplayMode();
- mHandler.sendEmptyMessage(SAVE_DISPLAY_MODE);
- break;
+ mHandler.sendEmptyMessage(MSG_SAVE_DISPLAY_MODE);
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
}
-
- return true;
}
@Override
public boolean onSearchRequested()
{
- showDialog(SONG_SELECTOR);
+ startActivity(new Intent(this, SongSelector.class));
return false;
}
- @Override
- public Dialog onCreateDialog(int id)
- {
- if (id == SONG_SELECTOR) {
- mSongSelector = new SongSelector(this);
- return mSongSelector;
- }
- return null;
- }
-
@Override
public boolean onKeyUp(int keyCode, KeyEvent event)
{
@@ -283,6 +215,9 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli
return super.onKeyUp(keyCode, event);
}
+ /**
+ * Converts a duration in milliseconds to [HH:]MM:SS
+ */
private String stringForTime(int ms)
{
int seconds = ms / 1000;
@@ -298,6 +233,9 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli
return String.format("%02d:%02d", minutes, seconds);
}
+ /**
+ * Update seek bar progress and schedule another update in one second
+ */
private void updateProgress()
{
if (mPaused || mControlsTop.getVisibility() != View.VISIBLE || (mState & PlaybackService.FLAG_PLAYING) == 0)
@@ -315,11 +253,13 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli
mSeekBar.setProgress(mDuration == 0 ? 0 : (int)(1000 * position / mDuration));
mSeekText.setText(stringForTime((int)position) + " / " + stringForTime(mDuration));
+ // Try to update right when the duration increases by one second
long next = 1000 - position % 1000;
- mHandler.removeMessages(UPDATE_PROGRESS);
- mHandler.sendEmptyMessageDelayed(UPDATE_PROGRESS, next);
+ mHandler.removeMessages(MSG_UPDATE_PROGRESS);
+ mHandler.sendEmptyMessageDelayed(MSG_UPDATE_PROGRESS, next);
}
+ @Override
public void onClick(View view)
{
if (view == mCoverView) {
@@ -339,45 +279,25 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli
}
}
- private static final int UPDATE_PROGRESS = 1;
- private static final int SAVE_DISPLAY_MODE = 2;
- private static final int TOGGLE_FLAG = 3;
+ private static final int MSG_UPDATE_PROGRESS = 10;
+ private static final int MSG_SAVE_DISPLAY_MODE = 11;
+ @Override
public boolean handleMessage(Message message)
{
switch (message.what) {
- case UPDATE_PROGRESS:
+ case MSG_UPDATE_PROGRESS:
updateProgress();
- break;
- case SAVE_DISPLAY_MODE:
+ return true;
+ case MSG_SAVE_DISPLAY_MODE:
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(FullPlaybackActivity.this);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("separate_info", mCoverView.hasSeparateInfo());
editor.commit();
- break;
- case TOGGLE_FLAG:
- int flag = message.arg1;
- boolean enabling = (mState & flag) == 0;
- int text = -1;
- if (flag == PlaybackService.FLAG_SHUFFLE)
- text = enabling ? R.string.shuffle_enabling : R.string.shuffle_disabling;
- else if (flag == PlaybackService.FLAG_REPEAT)
- text = enabling ? R.string.repeat_enabling : R.string.repeat_disabling;
-
- if (text != -1)
- Toast.makeText(FullPlaybackActivity.this, text, Toast.LENGTH_SHORT).show();
-
- try {
- mService.toggleFlag(flag);
- } catch (RemoteException e) {
- setService(null);
- }
- break;
+ return true;
default:
- return false;
+ return super.handleMessage(message);
}
-
- return true;
}
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
@@ -406,4 +326,4 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli
if (mSongSelector != null)
mSongSelector.updateSong(song);
}
-}
+}
\ No newline at end of file
diff --git a/src/org/kreed/vanilla/MiniPlaybackActivity.java b/src/org/kreed/vanilla/MiniPlaybackActivity.java
index 58677d5b..54d40ec9 100644
--- a/src/org/kreed/vanilla/MiniPlaybackActivity.java
+++ b/src/org/kreed/vanilla/MiniPlaybackActivity.java
@@ -29,9 +29,11 @@ import android.view.ViewGroup;
import android.view.Window;
import android.widget.ImageView;
+/**
+ * Playback activity that displays itself like a dialog, i.e. as a small window
+ * with a border. Includes a CoverView and control buttons.
+ */
public class MiniPlaybackActivity extends PlaybackActivity implements View.OnClickListener {
- private View mOpenButton;
- private View mKillButton;
private ImageView mPlayPauseButton;
@Override
@@ -44,10 +46,10 @@ public class MiniPlaybackActivity extends PlaybackActivity implements View.OnCli
mCoverView = (CoverView)findViewById(R.id.cover_view);
- mOpenButton = findViewById(R.id.open_button);
- mOpenButton.setOnClickListener(this);
- mKillButton = findViewById(R.id.kill_button);
- mKillButton.setOnClickListener(this);
+ View openButton = findViewById(R.id.open_button);
+ openButton.setOnClickListener(this);
+ View killButton = findViewById(R.id.kill_button);
+ killButton.setOnClickListener(this);
View previousButton = findViewById(R.id.previous);
previousButton.setOnClickListener(this);
mPlayPauseButton = (ImageView)findViewById(R.id.play_pause);
@@ -65,23 +67,28 @@ public class MiniPlaybackActivity extends PlaybackActivity implements View.OnCli
mPlayPauseButton.setImageResource((state & PlaybackService.FLAG_PLAYING) == 0 ? R.drawable.play : R.drawable.pause);
}
+ @Override
public void onClick(View view)
{
- if (view == mKillButton) {
+ switch (view.getId()) {
+ case R.id.kill_button:
ContextApplication.quit(this);
- } else if (view == mOpenButton) {
+ break;
+ case R.id.open_button:
startActivity(new Intent(this, FullPlaybackActivity.class));
finish();
- } else {
+ break;
+ default:
super.onClick(view);
}
}
}
-/*
+/**
* Custom layout that acts like a very simple vertical LinearLayout with
* special case: CoverViews will be made square at all costs.
- *
+ */
+/*
* I would prefer this to be a nested class, but it does not seem like
* Android's layout inflater supports referencing nested classes in XML.
*/
diff --git a/src/org/kreed/vanilla/PlaybackActivity.java b/src/org/kreed/vanilla/PlaybackActivity.java
index 9a16f120..42e831d1 100644
--- a/src/org/kreed/vanilla/PlaybackActivity.java
+++ b/src/org/kreed/vanilla/PlaybackActivity.java
@@ -26,14 +26,23 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
+import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
import android.view.View;
+import android.widget.Toast;
+
+public class PlaybackActivity extends Activity implements ServiceConnection, Handler.Callback {
+ Handler mHandler = new Handler(this);
-public abstract class PlaybackActivity extends Activity implements ServiceConnection {
CoverView mCoverView;
+ IPlaybackService mService;
+ int mState;
@Override
public void onCreate(Bundle state)
@@ -103,13 +112,17 @@ public abstract class PlaybackActivity extends Activity implements ServiceConnec
try {
switch (view.getId()) {
case R.id.next:
- mCoverView.go(1);
+ if (mCoverView != null)
+ mCoverView.go(1);
+ mHandler.sendMessage(mHandler.obtainMessage(MSG_SET_SONG, 1, 0));
break;
case R.id.play_pause:
- mCoverView.go(0);
+ mHandler.sendMessage(mHandler.obtainMessage(MSG_TOGGLE_FLAG, PlaybackService.FLAG_PLAYING, 0));
break;
case R.id.previous:
- mCoverView.go(-1);
+ if (mCoverView != null)
+ mCoverView.go(-1);
+ mHandler.sendMessage(mHandler.obtainMessage(MSG_SET_SONG, -1, 0));
break;
}
} catch (RemoteException e) {
@@ -118,12 +131,31 @@ public abstract class PlaybackActivity extends Activity implements ServiceConnec
}
}
- protected abstract void setState(int state);
+ /**
+ * Sets mState
to state
. Override to implement
+ * further behavior in subclasses.
+ *
+ * @param state PlaybackService state
+ */
+ protected void setState(int state)
+ {
+ mState = state;
+ }
+ /**
+ * Sets up components when the PlaybackService is bound to. Override to
+ * implement further post-connection behavior.
+ *
+ * @param service PlaybackService interface
+ */
protected void setService(IPlaybackService service)
{
- if (service != null) {
+ mService = service;
+
+ if (mCoverView != null)
mCoverView.setPlaybackService(service);
+
+ if (service != null) {
try {
setState(service.getState());
} catch (RemoteException e) {
@@ -150,9 +182,105 @@ public abstract class PlaybackActivity extends Activity implements ServiceConnec
@Override
public void onReceive(Context context, Intent intent)
{
- mCoverView.onReceive(intent);
+ if (mCoverView != null)
+ mCoverView.onReceive(intent);
if (PlaybackService.EVENT_CHANGED.equals(intent.getAction()))
onServiceChange(intent);
}
};
-}
+
+ static final int MENU_QUIT = 0;
+ static final int MENU_DISPLAY = 1;
+ static final int MENU_PREFS = 2;
+ static final int MENU_LIBRARY = 3;
+ static final int MENU_SHUFFLE = 4;
+ static final int MENU_PLAYBACK = 5;
+ static final int MENU_REPEAT = 6;
+ static final int MENU_SEARCH = 7;
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu)
+ {
+ menu.add(0, MENU_PREFS, 0, R.string.settings).setIcon(android.R.drawable.ic_menu_preferences);
+ menu.add(0, MENU_SHUFFLE, 0, R.string.shuffle_enable).setIcon(R.drawable.ic_menu_shuffle);
+ menu.add(0, MENU_REPEAT, 0, R.string.repeat_enable).setIcon(R.drawable.ic_menu_refresh);
+ menu.add(0, MENU_QUIT, 0, R.string.quit).setIcon(android.R.drawable.ic_menu_close_clear_cancel);
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu)
+ {
+ boolean isShuffling = (mState & PlaybackService.FLAG_SHUFFLE) != 0;
+ menu.findItem(MENU_SHUFFLE).setTitle(isShuffling ? R.string.shuffle_disable : R.string.shuffle_enable);
+ boolean isRepeating = (mState & PlaybackService.FLAG_REPEAT) != 0;
+ menu.findItem(MENU_REPEAT).setTitle(isRepeating ? R.string.repeat_disable : R.string.repeat_enable);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item)
+ {
+ switch (item.getItemId()) {
+ case MENU_QUIT:
+ ContextApplication.quit(this);
+ return true;
+ case MENU_SHUFFLE:
+ mHandler.sendMessage(mHandler.obtainMessage(MSG_TOGGLE_FLAG, PlaybackService.FLAG_SHUFFLE, 0));
+ return true;
+ case MENU_REPEAT:
+ mHandler.sendMessage(mHandler.obtainMessage(MSG_TOGGLE_FLAG, PlaybackService.FLAG_REPEAT, 0));
+ return true;
+ case MENU_PREFS:
+ startActivity(new Intent(this, PreferencesActivity.class));
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Tell PlaybackService to toggle a state flag (passed as arg1) and display
+ * a message notifying that the flag was toggled.
+ */
+ static final int MSG_TOGGLE_FLAG = 0;
+ /**
+ * Tell PlaybackService to move to a song a position delta (passed as arg1).
+ */
+ static final int MSG_SET_SONG = 1;
+
+ public boolean handleMessage(Message message)
+ {
+ switch (message.what) {
+ case MSG_TOGGLE_FLAG:
+ int flag = message.arg1;
+ boolean enabling = (mState & flag) == 0;
+ int text = -1;
+ if (flag == PlaybackService.FLAG_SHUFFLE)
+ text = enabling ? R.string.shuffle_enabling : R.string.shuffle_disabling;
+ else if (flag == PlaybackService.FLAG_REPEAT)
+ text = enabling ? R.string.repeat_enabling : R.string.repeat_disabling;
+
+ if (text != -1)
+ Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
+
+ try {
+ mService.toggleFlag(flag);
+ } catch (RemoteException e) {
+ setService(null);
+ }
+ break;
+ case MSG_SET_SONG:
+ try {
+ mService.setCurrentSong(message.arg1);
+ } catch (RemoteException e) {
+ setService(null);
+ }
+ break;
+ default:
+ return false;
+ }
+
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/src/org/kreed/vanilla/SongSelector.java b/src/org/kreed/vanilla/SongSelector.java
index 2bf3dd28..41a980bf 100644
--- a/src/org/kreed/vanilla/SongSelector.java
+++ b/src/org/kreed/vanilla/SongSelector.java
@@ -20,9 +20,7 @@ package org.kreed.vanilla;
import org.kreed.vanilla.R;
-import android.app.Dialog;
import android.content.ContentResolver;
-import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
@@ -31,9 +29,7 @@ import android.graphics.Color;
import android.graphics.drawable.PaintDrawable;
import android.net.Uri;
import android.os.Bundle;
-import android.os.Handler;
import android.os.Message;
-import android.os.RemoteException;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.text.Editable;
@@ -47,7 +43,6 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStub;
-import android.view.Window;
import android.widget.AdapterView;
import android.widget.Filter;
import android.widget.LinearLayout;
@@ -56,11 +51,7 @@ import android.widget.TabHost;
import android.widget.TextView;
import android.widget.Toast;
-public class SongSelector extends Dialog implements AdapterView.OnItemClickListener, TextWatcher, View.OnClickListener, TabHost.OnTabChangeListener, Filter.FilterListener, Handler.Callback {
- private static final int MSG_INIT = 0;
-
- private Handler mHandler = new Handler(this);
-
+public class SongSelector extends PlaybackActivity implements AdapterView.OnItemClickListener, TextWatcher, View.OnClickListener, TabHost.OnTabChangeListener, Filter.FilterListener {
private TabHost mTabHost;
private View mSearchBox;
@@ -74,7 +65,6 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
private ViewGroup mLimiterViews;
- private boolean mOnStartUp;
private int mDefaultAction;
private boolean mDefaultIsLastAction;
@@ -91,24 +81,21 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
ListView view = (ListView)findViewById(id);
view.setOnItemClickListener(this);
view.setOnCreateContextMenuListener(this);
- view.setAdapter(new MediaAdapter(getContext(), store, fields, fieldKeys, true));
- }
-
- public SongSelector(Context context)
- {
- super(context, android.R.style.Theme_NoTitleBar);
+ view.setAdapter(new MediaAdapter(this, store, fields, fieldKeys, true));
}
@Override
public void onCreate(Bundle state)
{
+ super.onCreate(state);
+
setContentView(R.layout.song_selector);
mTabHost = (TabHost)findViewById(android.R.id.tabhost);
mTabHost.setup();
mTabHost.setOnTabChangedListener(this);
- Resources res = getContext().getResources();
+ Resources res = getResources();
mTabHost.addTab(mTabHost.newTabSpec("tab_artists").setIndicator(res.getText(R.string.artists), res.getDrawable(R.drawable.tab_artists)).setContent(R.id.artist_list));
mTabHost.addTab(mTabHost.newTabSpec("tab_albums").setIndicator(res.getText(R.string.albums), res.getDrawable(R.drawable.tab_albums)).setContent(R.id.album_list));
mTabHost.addTab(mTabHost.newTabSpec("tab_songs").setIndicator(res.getText(R.string.songs), res.getDrawable(R.drawable.tab_songs)).setContent(R.id.song_list));
@@ -129,44 +116,30 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
@Override
public void onStart()
{
- // reset queue pos
- Context context = getContext();
- context.startService(new Intent(context, PlaybackService.class));
- }
+ super.onStart();
- @Override
- public void onWindowFocusChanged(boolean hasFocus)
- {
- if (hasFocus) {
- SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getContext());
- int inputType = settings.getBoolean("filter_suggestions", false) ? InputType.TYPE_CLASS_TEXT : InputType.TYPE_TEXT_VARIATION_FILTER;
- mTextFilter.setInputType(inputType);
+ SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
+ int inputType = settings.getBoolean("filter_suggestions", false) ? InputType.TYPE_CLASS_TEXT : InputType.TYPE_TEXT_VARIATION_FILTER;
+ mTextFilter.setInputType(inputType);
- mOnStartUp = settings.getBoolean("selector_on_startup", false);
+ boolean status = settings.getBoolean("selector_status", false);
+ if (status && mStatus == null) {
+ mStatus = findViewById(R.id.status);
+ if (mStatus == null)
+ mStatus = ((ViewStub)findViewById(R.id.status_stub)).inflate();
+ mStatusText = (TextView)mStatus.findViewById(R.id.status_text);
+ mPlayPauseButton = (ControlButton)mStatus.findViewById(R.id.play_pause);
+ ControlButton next = (ControlButton)mStatus.findViewById(R.id.next);
- boolean status = settings.getBoolean("selector_status", false);
- if (status && mStatus == null) {
- mStatus = findViewById(R.id.status);
- if (mStatus == null)
- mStatus = ((ViewStub)findViewById(R.id.status_stub)).inflate();
- mStatusText = (TextView)mStatus.findViewById(R.id.status_text);
- mPlayPauseButton = (ControlButton)mStatus.findViewById(R.id.play_pause);
- ControlButton next = (ControlButton)mStatus.findViewById(R.id.next);
-
- mPlayPauseButton.setOnClickListener(this);
- next.setOnClickListener(this);
-
- FullPlaybackActivity owner = (FullPlaybackActivity)getOwnerActivity();
- updateState(owner.mState);
- updateSong(owner.mCoverView.getCurrentSong());
- } else if (!status && mStatus != null) {
- mStatus.setVisibility(View.GONE);
- mStatus = null;
- }
-
- mDefaultAction = Integer.parseInt(settings.getString("default_action_int", "0"));
- mLastActedId = 0;
+ mPlayPauseButton.setOnClickListener(this);
+ next.setOnClickListener(this);
+ } else if (!status && mStatus != null) {
+ mStatus.setVisibility(View.GONE);
+ mStatus = null;
}
+
+ mDefaultAction = Integer.parseInt(settings.getString("default_action_int", "0"));
+ mLastActedId = 0;
}
@Override
@@ -177,10 +150,8 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
if (mSearchBoxVisible) {
mTextFilter.setText("");
setSearchBoxVisible(false);
- } else if (mOnStartUp) {
- getOwnerActivity().finish();
} else {
- dismiss();
+ finish();
}
return true;
case KeyEvent.KEYCODE_SEARCH:
@@ -205,17 +176,17 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
private void sendSongIntent(MediaAdapter.MediaView view, int action)
{
int res = action == PlaybackService.ACTION_PLAY ? R.string.playing : R.string.enqueued;
- String text = getContext().getResources().getString(res, view.getTitle());
- Toast.makeText(getContext(), text, Toast.LENGTH_SHORT).show();
+ String text = getResources().getString(res, view.getTitle());
+ Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
long id = view.getMediaId();
int field = view.getFieldCount();
- Intent intent = new Intent(getContext(), PlaybackService.class);
+ Intent intent = new Intent(this, PlaybackService.class);
intent.putExtra("type", field);
intent.putExtra("action", action);
intent.putExtra("id", id);
- getContext().startService(intent);
+ startService(intent);
mLastActedId = id;
}
@@ -237,7 +208,7 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
if (mediaView.isExpanderPressed())
expand(mediaView);
else if (id == mLastActedId)
- dismiss();
+ finish();
else
sendSongIntent(mediaView, mDefaultAction);
}
@@ -278,7 +249,7 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
PaintDrawable background = new PaintDrawable(Color.GRAY);
background.setCornerRadius(5);
- TextView view = new TextView(getContext());
+ TextView view = new TextView(this);
view.setSingleLine();
view.setEllipsize(TextUtils.TruncateAt.MARQUEE);
view.setText(limiter[i] + " | X");
@@ -297,25 +268,15 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
updateLimiterViews();
}
+ @Override
public void onClick(View view)
{
- int id = view.getId();
if (view == mClearButton) {
if (mTextFilter.getText().length() == 0)
setSearchBoxVisible(false);
else
mTextFilter.setText("");
- } else if (id == R.id.play_pause) {
- try {
- ((FullPlaybackActivity)getOwnerActivity()).mCoverView.go(0);
- } catch (RemoteException e) {
- }
- } else if (id == R.id.next) {
- try {
- ((FullPlaybackActivity)getOwnerActivity()).mCoverView.go(1);
- } catch (RemoteException e) {
- }
- } else {
+ } else if (view.getTag() != null) {
int i = (Integer)view.getTag();
String[] limiter;
if (i == 0) {
@@ -333,6 +294,8 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
}
updateLimiterViews();
+ } else {
+ super.onClick(view);
}
}
@@ -373,43 +336,27 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
return true;
}
-
+
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
- ((FullPlaybackActivity)getOwnerActivity()).fillMenu(menu, true);
- return true;
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu)
- {
- return ((FullPlaybackActivity)getOwnerActivity()).onPrepareOptionsMenu(menu);
+ menu.add(0, MENU_PLAYBACK, 0, R.string.playback_view).setIcon(android.R.drawable.ic_menu_gallery);
+ menu.add(0, MENU_SEARCH, 0, R.string.search).setIcon(android.R.drawable.ic_menu_search);
+ return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
- if (item.getItemId() == FullPlaybackActivity.MENU_SEARCH) {
+ switch (item.getItemId()) {
+ case MENU_SEARCH:
setSearchBoxVisible(!mSearchBoxVisible);
return true;
- }
-
- return ((FullPlaybackActivity)getOwnerActivity()).onOptionsItemSelected(item);
- }
-
- // onContextItemSelected and friends are not called when they should be. Do
- // so here to work around this bug.
- @Override
- public boolean onMenuItemSelected(int featureId, MenuItem item)
- {
- switch (featureId) {
- case Window.FEATURE_CONTEXT_MENU:
- return onContextItemSelected(item);
- case Window.FEATURE_OPTIONS_PANEL:
- return onOptionsItemSelected(item);
+ case MENU_PLAYBACK:
+ startActivity(new Intent(this, FullPlaybackActivity.class));
+ return true;
default:
- return super.onMenuItemSelected(featureId, item);
+ return super.onOptionsItemSelected(item);
}
}
@@ -423,9 +370,12 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event)
{
- return PlaybackActivity.handleKeyLongPress(getContext(), keyCode);
+ return PlaybackActivity.handleKeyLongPress(this, keyCode);
}
+ private static final int MSG_INIT = 10;
+
+ @Override
public boolean handleMessage(Message message)
{
switch (message.what) {
@@ -436,9 +386,9 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
ListView view = (ListView)findViewById(R.id.song_list);
view.setOnItemClickListener(SongSelector.this);
view.setOnCreateContextMenuListener(SongSelector.this);
- view.setAdapter(new SongMediaAdapter(getContext()));
+ view.setAdapter(new SongMediaAdapter(this));
- ContentResolver resolver = ContextApplication.getContext().getContentResolver();
+ ContentResolver resolver = getContentResolver();
resolver.registerContentObserver(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, true, mObserver);
break;
default:
@@ -457,28 +407,6 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
}
};
- public void updateSong(Song song)
- {
- if (mStatusText != null)
- mStatusText.setText(song == null ? getContext().getResources().getText(R.string.none) : song.title);
- }
-
- public void updateState(int state)
- {
- if (mPlayPauseButton != null) {
- boolean playing = (state & PlaybackService.FLAG_PLAYING) != 0;
- mPlayPauseButton.setImageResource(playing ? R.drawable.pause : R.drawable.play);
- }
- }
-
- public void change(Intent intent)
- {
- if (PlaybackService.EVENT_CHANGED.equals(intent.getAction())) {
- updateSong((Song)intent.getParcelableExtra("song"));
- updateState(intent.getIntExtra("state", 0));
- }
- }
-
private void setSearchBoxVisible(boolean visible)
{
mSearchBoxVisible = visible;
@@ -486,4 +414,22 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
if (visible)
mSearchBox.requestFocus();
}
+
+ @Override
+ protected void onServiceChange(Intent intent)
+ {
+ if (mStatusText != null) {
+ Song song = intent.getParcelableExtra("song");
+ mStatusText.setText(song == null ? getResources().getText(R.string.none) : song.title);
+ }
+ }
+
+ @Override
+ protected void setState(int state)
+ {
+ if (mPlayPauseButton != null) {
+ boolean playing = (state & PlaybackService.FLAG_PLAYING) != 0;
+ mPlayPauseButton.setImageResource(playing ? R.drawable.pause : R.drawable.play);
+ }
+ }
}
\ No newline at end of file