diff --git a/res/layout/song_selector.xml b/res/layout/song_selector.xml
index 35615ab5..eefcf533 100644
--- a/res/layout/song_selector.xml
+++ b/res/layout/song_selector.xml
@@ -62,4 +62,9 @@
android:layout_alignParentRight="true"
android:src="@android:drawable/ic_menu_close_clear_cancel" />
-
\ No newline at end of file
+
+
diff --git a/res/layout/song_status.xml b/res/layout/song_status.xml
new file mode 100644
index 00000000..7a1aede1
--- /dev/null
+++ b/res/layout/song_status.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index eee819e8..921b87a7 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -33,6 +33,8 @@
Albums
Songs
+ None
+
Audio Output
Volume
@@ -55,6 +57,8 @@
Use text suggestions when editing the filter text
Open on Startup
Open song selector on startup
+ Controls in Selector
+ Show the currently playing song and media controls in the selector window
Default Action
What to do when an item is tapped
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
index 58c44d0e..b524d9c7 100644
--- a/res/xml/preferences.xml
+++ b/res/xml/preferences.xml
@@ -48,6 +48,11 @@
android:title="@string/selector_on_startup_title"
android:summary="@string/selector_on_startup_summary"
android:defaultValue="false" />
+
-
\ No newline at end of file
+
diff --git a/src/org/kreed/vanilla/CoverView.java b/src/org/kreed/vanilla/CoverView.java
index fa2f6123..82024764 100644
--- a/src/org/kreed/vanilla/CoverView.java
+++ b/src/org/kreed/vanilla/CoverView.java
@@ -43,6 +43,10 @@ import android.view.ViewConfiguration;
import android.widget.Scroller;
public final class CoverView extends View implements Handler.Callback {
+ public static interface Callback {
+ void songChanged(Song song);
+ };
+
private static final int STORE_SIZE = 3;
private static int SNAP_VELOCITY = -1;
@@ -58,6 +62,7 @@ public final class CoverView extends View implements Handler.Callback {
private IPlaybackService mService;
private Scroller mScroller;
private Handler mHandler = new Handler(this);
+ private Callback mCallback;
private Song[] mSongs = new Song[3];
private Bitmap[] mBitmaps = new Bitmap[3];
@@ -109,11 +114,21 @@ public final class CoverView extends View implements Handler.Callback {
bitmap.recycle();
}
+ public Song getCurrentSong()
+ {
+ return mSongs[STORE_SIZE / 2];
+ }
+
public boolean hasSeparateInfo()
{
return mSeparateInfo;
}
+ public void setCallback(Callback callback)
+ {
+ mCallback = callback;
+ }
+
public void setSeparateInfo(boolean separate)
{
mSeparateInfo = separate;
@@ -410,6 +425,9 @@ public final class CoverView extends View implements Handler.Callback {
reset();
invalidate();
+ if (mCallback != null)
+ mCallback.songChanged(mSongs[STORE_SIZE / 2]);
+
mHandler.sendMessage(mHandler.obtainMessage(SET_SONG, delta, 0));
mHandler.sendEmptyMessage(i);
}
diff --git a/src/org/kreed/vanilla/FullPlaybackActivity.java b/src/org/kreed/vanilla/FullPlaybackActivity.java
index e2dc4728..50e32687 100644
--- a/src/org/kreed/vanilla/FullPlaybackActivity.java
+++ b/src/org/kreed/vanilla/FullPlaybackActivity.java
@@ -42,19 +42,20 @@ import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
-public class FullPlaybackActivity extends PlaybackActivity implements View.OnClickListener, SeekBar.OnSeekBarChangeListener, View.OnFocusChangeListener, Handler.Callback {
+public class FullPlaybackActivity extends PlaybackActivity implements View.OnClickListener, SeekBar.OnSeekBarChangeListener, View.OnFocusChangeListener, Handler.Callback, CoverView.Callback {
private IPlaybackService mService;
private Handler mHandler = new Handler(this);
private RelativeLayout mMessageOverlay;
private View mControlsTop;
private View mControlsBottom;
+ private SongSelector mSongSelector;
private ImageView mPlayPauseButton;
private SeekBar mSeekBar;
private TextView mSeekText;
- private int mState;
+ int mState;
private int mDuration;
private boolean mSeekBarTracking;
@@ -175,6 +176,9 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli
setService(null);
}
}
+
+ if (mSongSelector != null)
+ mSongSelector.change(intent);
}
public void fillMenu(Menu menu, boolean fromDialog)
@@ -249,8 +253,10 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli
@Override
public Dialog onCreateDialog(int id)
{
- if (id == SONG_SELECTOR)
- return new SongSelector(this);
+ if (id == SONG_SELECTOR) {
+ mSongSelector = new SongSelector(this);
+ return mSongSelector;
+ }
return null;
}
@@ -407,4 +413,10 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli
if (hasFocus)
sendHideMessage();
}
+
+ public void songChanged(Song song)
+ {
+ if (mSongSelector != null)
+ mSongSelector.updateSong(song);
+ }
}
diff --git a/src/org/kreed/vanilla/PlaybackActivity.java b/src/org/kreed/vanilla/PlaybackActivity.java
index fcecb765..9a16f120 100644
--- a/src/org/kreed/vanilla/PlaybackActivity.java
+++ b/src/org/kreed/vanilla/PlaybackActivity.java
@@ -33,7 +33,7 @@ import android.view.KeyEvent;
import android.view.View;
public abstract class PlaybackActivity extends Activity implements ServiceConnection {
- protected CoverView mCoverView;
+ CoverView mCoverView;
@Override
public void onCreate(Bundle state)
@@ -155,4 +155,4 @@ public abstract class PlaybackActivity extends Activity implements ServiceConnec
onServiceChange(intent);
}
};
-}
\ No newline at end of file
+}
diff --git a/src/org/kreed/vanilla/SongSelector.java b/src/org/kreed/vanilla/SongSelector.java
index 04b6e264..b43061bf 100644
--- a/src/org/kreed/vanilla/SongSelector.java
+++ b/src/org/kreed/vanilla/SongSelector.java
@@ -33,6 +33,7 @@ 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;
@@ -45,6 +46,7 @@ import android.view.Menu;
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;
@@ -54,14 +56,19 @@ import android.widget.TabHost;
import android.widget.TextView;
import android.widget.Toast;
+import android.util.Log;
+
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);
+
private TabHost mTabHost;
private TextView mTextFilter;
private View mClearButton;
- private Handler mHandler = new Handler(this);
-
+ private View mStatus;
+ private TextView mStatusText;
+ private ControlButton mPlayPauseButton;
private ViewGroup mLimiterViews;
private int mDefaultAction;
@@ -129,6 +136,26 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
int inputType = settings.getBoolean("filter_suggestions", false) ? InputType.TYPE_CLASS_TEXT : InputType.TYPE_TEXT_VARIATION_FILTER;
mTextFilter.setInputType(inputType);
+ 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;
}
@@ -241,8 +268,19 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
public void onClick(View view)
{
+ int id = view.getId();
if (view == mClearButton) {
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 {
int i = (Integer)view.getTag();
String[] limiter;
@@ -379,4 +417,26 @@ public class SongSelector extends Dialog implements AdapterView.OnItemClickListe
getAdapter(i).requery();
}
};
+
+ 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));
+ }
+ }
}