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)); + } + } }