1792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project/* 2792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * 4792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * you may not use this file except in compliance with the License. 6792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * You may obtain a copy of the License at 7792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * 8792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * 10792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * See the License for the specific language governing permissions and 14792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * limitations under the License. 15792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project */ 16792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 17792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectpackage com.android.music; 18792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 19f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissenimport com.android.music.MusicUtils.ServiceToken; 20f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen 21792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.app.Activity; 22792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.app.AlertDialog; 230657c9efaa7146d5f2ab169ca46c48a22f64e893Marco Nelissenimport android.app.KeyguardManager; 24792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.app.SearchManager; 25792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.BroadcastReceiver; 26792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.ComponentName; 27b7841acd23f0cf4fd8db604d73bdf14e57994fd9Marco Nelissenimport android.content.ContentResolver; 28c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissenimport android.content.ContentUris; 29792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.Context; 30792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.DialogInterface; 31792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.Intent; 32792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.IntentFilter; 33792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.content.ServiceConnection; 34f2ef3b5153fd2f447939f267d8887ff3bba0d13fMarco Nelissenimport android.content.pm.ResolveInfo; 35b7841acd23f0cf4fd8db604d73bdf14e57994fd9Marco Nelissenimport android.content.res.Configuration; 36c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissenimport android.database.Cursor; 37792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.graphics.Bitmap; 38f2ef3b5153fd2f447939f267d8887ff3bba0d13fMarco Nelissenimport android.media.audiofx.AudioEffect; 39792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.media.AudioManager; 40792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.net.Uri; 41792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Bundle; 42792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Handler; 43792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.IBinder; 44792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Looper; 45792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.Message; 4687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissenimport android.os.RemoteException; 47792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.os.SystemClock; 48792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.provider.MediaStore; 49792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.text.Layout; 50792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.text.TextUtils.TruncateAt; 51792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.util.Log; 52792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.KeyEvent; 53792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.Menu; 54792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.MenuItem; 55792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.MotionEvent; 56792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.SubMenu; 57792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.View; 58792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.ViewConfiguration; 59792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.view.Window; 60792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ImageButton; 61792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ImageView; 62792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.ProgressBar; 63792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.SeekBar; 64792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.TextView; 65792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.Toast; 66792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectimport android.widget.SeekBar.OnSeekBarChangeListener; 67792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 68792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 69792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Projectpublic class MediaPlaybackActivity extends Activity implements MusicUtils.Defs, 70792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project View.OnTouchListener, View.OnLongClickListener 71792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project{ 72792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private static final int USE_AS_RINGTONE = CHILD_MENU_BASE; 738d08ec235831d71fdd7f7b6f7757c2bc19528faeMarco Nelissen 74792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private boolean mSeeking = false; 75cd582c608545d42545dc999ffa46690a45c7ac03Marco Nelissen private boolean mDeviceHasDpad; 76792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private long mStartSeekPos = 0; 77792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private long mLastSeekEventTime; 78792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private IMediaPlaybackService mService = null; 79792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private RepeatingImageButton mPrevButton; 80792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private ImageButton mPauseButton; 81792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private RepeatingImageButton mNextButton; 82792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private ImageButton mRepeatButton; 83792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private ImageButton mShuffleButton; 84792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private ImageButton mQueueButton; 85792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private Worker mAlbumArtWorker; 86792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private AlbumArtHandler mAlbumArtHandler; 87792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private Toast mToast; 88792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private int mTouchSlop; 89f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen private ServiceToken mToken; 90792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 91792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public MediaPlaybackActivity() 92792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 93792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 94792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 95792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project /** Called when the activity is first created. */ 96792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 97792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onCreate(Bundle icicle) 98792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 99792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onCreate(icicle); 100792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setVolumeControlStream(AudioManager.STREAM_MUSIC); 101792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 102792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumArtWorker = new Worker("album art worker"); 103792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumArtHandler = new AlbumArtHandler(mAlbumArtWorker.getLooper()); 104792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 105792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project requestWindowFeature(Window.FEATURE_NO_TITLE); 106792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setContentView(R.layout.audio_player); 107792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 108792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentTime = (TextView) findViewById(R.id.currenttime); 109792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mTotalTime = (TextView) findViewById(R.id.totaltime); 110792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mProgress = (ProgressBar) findViewById(android.R.id.progress); 111792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbum = (ImageView) findViewById(R.id.album); 112792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mArtistName = (TextView) findViewById(R.id.artistname); 113792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumName = (TextView) findViewById(R.id.albumname); 114792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mTrackName = (TextView) findViewById(R.id.trackname); 115792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 116792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project View v = (View)mArtistName.getParent(); 117792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project v.setOnTouchListener(this); 118792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project v.setOnLongClickListener(this); 119792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 120792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project v = (View)mAlbumName.getParent(); 121792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project v.setOnTouchListener(this); 122792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project v.setOnLongClickListener(this); 123792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 124792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project v = (View)mTrackName.getParent(); 125792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project v.setOnTouchListener(this); 126792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project v.setOnLongClickListener(this); 127792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 128792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPrevButton = (RepeatingImageButton) findViewById(R.id.prev); 129792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPrevButton.setOnClickListener(mPrevListener); 130792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPrevButton.setRepeatListener(mRewListener, 260); 131792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPauseButton = (ImageButton) findViewById(R.id.pause); 132792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPauseButton.requestFocus(); 133792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPauseButton.setOnClickListener(mPauseListener); 134792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mNextButton = (RepeatingImageButton) findViewById(R.id.next); 135792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mNextButton.setOnClickListener(mNextListener); 136792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mNextButton.setRepeatListener(mFfwdListener, 260); 137792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project seekmethod = 1; 138792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 139cd582c608545d42545dc999ffa46690a45c7ac03Marco Nelissen mDeviceHasDpad = (getResources().getConfiguration().navigation == 140b7841acd23f0cf4fd8db604d73bdf14e57994fd9Marco Nelissen Configuration.NAVIGATION_DPAD); 141792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 142792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mQueueButton = (ImageButton) findViewById(R.id.curplaylist); 143792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mQueueButton.setOnClickListener(mQueueListener); 144792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mShuffleButton = ((ImageButton) findViewById(R.id.shuffle)); 145792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mShuffleButton.setOnClickListener(mShuffleListener); 146792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mRepeatButton = ((ImageButton) findViewById(R.id.repeat)); 147792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mRepeatButton.setOnClickListener(mRepeatListener); 148792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 149792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mProgress instanceof SeekBar) { 150792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project SeekBar seeker = (SeekBar) mProgress; 151792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project seeker.setOnSeekBarChangeListener(mSeekListener); 152792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 153792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mProgress.setMax(1000); 154792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 155792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop(); 156792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 157792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 158792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int mInitialX = -1; 159792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int mLastX = -1; 160792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int mTextWidth = 0; 161792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int mViewWidth = 0; 162792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project boolean mDraggingLabel = false; 163792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 164792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project TextView textViewForContainer(View v) { 165792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project View vv = v.findViewById(R.id.artistname); 166792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (vv != null) return (TextView) vv; 167792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vv = v.findViewById(R.id.albumname); 168792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (vv != null) return (TextView) vv; 169792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project vv = v.findViewById(R.id.trackname); 170792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (vv != null) return (TextView) vv; 171792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return null; 172792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 173792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 174792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onTouch(View v, MotionEvent event) { 175792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int action = event.getAction(); 176792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project TextView tv = textViewForContainer(v); 177792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (tv == null) { 178792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return false; 179792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 180792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (action == MotionEvent.ACTION_DOWN) { 181792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project v.setBackgroundColor(0xff606060); 182792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mInitialX = mLastX = (int) event.getX(); 183792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mDraggingLabel = false; 184792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else if (action == MotionEvent.ACTION_UP || 185792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project action == MotionEvent.ACTION_CANCEL) { 186792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project v.setBackgroundColor(0); 187792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mDraggingLabel) { 188792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Message msg = mLabelScroller.obtainMessage(0, tv); 189792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLabelScroller.sendMessageDelayed(msg, 1000); 190792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 191792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else if (action == MotionEvent.ACTION_MOVE) { 192792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mDraggingLabel) { 193792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int scrollx = tv.getScrollX(); 194792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int x = (int) event.getX(); 195792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int delta = mLastX - x; 196792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (delta != 0) { 197792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLastX = x; 198792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project scrollx += delta; 199792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (scrollx > mTextWidth) { 200792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // scrolled the text completely off the view to the left 201792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project scrollx -= mTextWidth; 202792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project scrollx -= mViewWidth; 203792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 204792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (scrollx < -mViewWidth) { 205792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // scrolled the text completely off the view to the right 206792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project scrollx += mViewWidth; 207792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project scrollx += mTextWidth; 208792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 209792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project tv.scrollTo(scrollx, 0); 210792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 211792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 212792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 213792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int delta = mInitialX - (int) event.getX(); 214792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (Math.abs(delta) > mTouchSlop) { 215792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // start moving 216792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLabelScroller.removeMessages(0, tv); 217792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 218792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // Only turn ellipsizing off when it's not already off, because it 219792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // causes the scroll position to be reset to 0. 220792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (tv.getEllipsize() != null) { 221792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project tv.setEllipsize(null); 222792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 223792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Layout ll = tv.getLayout(); 224792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // layout might be null if the text just changed, or ellipsizing 225792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // was just turned off 226792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (ll == null) { 227792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return false; 228792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 229792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // get the non-ellipsized line width, to determine whether scrolling 230792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // should even be allowed 231792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mTextWidth = (int) tv.getLayout().getLineWidth(0); 232792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mViewWidth = tv.getWidth(); 233792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mViewWidth > mTextWidth) { 234792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project tv.setEllipsize(TruncateAt.END); 235792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project v.cancelLongPress(); 236792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return false; 237792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 238792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mDraggingLabel = true; 239792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project tv.setHorizontalFadingEdgeEnabled(true); 240792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project v.cancelLongPress(); 241792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 242792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 243792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 244792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return false; 245792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 246792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 247792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Handler mLabelScroller = new Handler() { 248792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 249792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void handleMessage(Message msg) { 250792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project TextView tv = (TextView) msg.obj; 251792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int x = tv.getScrollX(); 252792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project x = x * 3 / 4; 253792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project tv.scrollTo(x, 0); 254792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (x == 0) { 255792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project tv.setEllipsize(TruncateAt.END); 256792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 257792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Message newmsg = obtainMessage(0, tv); 258792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLabelScroller.sendMessageDelayed(newmsg, 15); 259792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 260792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 261792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 262792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 263792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onLongClick(View view) { 264792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 265792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project CharSequence title = null; 266792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String mime = null; 267792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String query = null; 268792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String artist; 269792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String album; 270792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String song; 271c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen long audioid; 272792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 273792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 274792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project artist = mService.getArtistName(); 275792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project album = mService.getAlbumName(); 276792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project song = mService.getTrackName(); 277c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen audioid = mService.getAudioId(); 278792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 279792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 280f7b53aba686d8d2819e3fd341097078d85a723beMarco Nelissen } catch (NullPointerException ex) { 281f7b53aba686d8d2819e3fd341097078d85a723beMarco Nelissen // we might not actually have the service yet 282f7b53aba686d8d2819e3fd341097078d85a723beMarco Nelissen return true; 283792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 284c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen 285f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen if (MediaStore.UNKNOWN_STRING.equals(album) && 286f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen MediaStore.UNKNOWN_STRING.equals(artist) && 287c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen song != null && 288c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen song.startsWith("recording")) { 289c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen // not music 290c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen return false; 291c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen } 2929df6e7376ac6c26b980bc352c62b7f6af8314b98Marco Nelissen 2939df6e7376ac6c26b980bc352c62b7f6af8314b98Marco Nelissen if (audioid < 0) { 2949df6e7376ac6c26b980bc352c62b7f6af8314b98Marco Nelissen return false; 2959df6e7376ac6c26b980bc352c62b7f6af8314b98Marco Nelissen } 2969df6e7376ac6c26b980bc352c62b7f6af8314b98Marco Nelissen 297c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen Cursor c = MusicUtils.query(this, 298c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, audioid), 299c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen new String[] {MediaStore.Audio.Media.IS_MUSIC}, null, null, null); 300c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen boolean ismusic = true; 301c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen if (c != null) { 302c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen if (c.moveToFirst()) { 303c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen ismusic = c.getInt(0) != 0; 304c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen } 305c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen c.close(); 306c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen } 307c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen if (!ismusic) { 308c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen return false; 309c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen } 310c5f5f1322960d4e30bc0e99377ad04d0ddf4055aMarco Nelissen 311c839849c33a6c27d247a256799c505c316a738a0Andreas Huber boolean knownartist = 312f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen (artist != null) && !MediaStore.UNKNOWN_STRING.equals(artist); 313c839849c33a6c27d247a256799c505c316a738a0Andreas Huber 314c839849c33a6c27d247a256799c505c316a738a0Andreas Huber boolean knownalbum = 315f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen (album != null) && !MediaStore.UNKNOWN_STRING.equals(album); 316792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 317792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (knownartist && view.equals(mArtistName.getParent())) { 318792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project title = artist; 319756c3f57f11a7bb3bf1cf1333ee8ffbc51039748Marco Nelissen query = artist; 320792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mime = MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE; 321792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else if (knownalbum && view.equals(mAlbumName.getParent())) { 322792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project title = album; 323792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (knownartist) { 324792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project query = artist + " " + album; 325792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 326792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project query = album; 327792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 328792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mime = MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE; 329792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else if (view.equals(mTrackName.getParent()) || !knownartist || !knownalbum) { 330f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen if ((song == null) || MediaStore.UNKNOWN_STRING.equals(song)) { 331c839849c33a6c27d247a256799c505c316a738a0Andreas Huber // A popup of the form "Search for null/'' using ..." is pretty 332c839849c33a6c27d247a256799c505c316a738a0Andreas Huber // unhelpful, plus, we won't find any way to buy it anyway. 333c839849c33a6c27d247a256799c505c316a738a0Andreas Huber return true; 334c839849c33a6c27d247a256799c505c316a738a0Andreas Huber } 335c839849c33a6c27d247a256799c505c316a738a0Andreas Huber 336792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project title = song; 337792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (knownartist) { 338792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project query = artist + " " + song; 339792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 340792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project query = song; 341792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 342792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mime = "audio/*"; // the specific type doesn't matter, so don't bother retrieving it 343792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 344792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project throw new RuntimeException("shouldn't be here"); 345792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 346792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project title = getString(R.string.mediasearch, title); 347792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 348792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent i = new Intent(); 349792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 350792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.setAction(MediaStore.INTENT_ACTION_MEDIA_SEARCH); 351792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(SearchManager.QUERY, query); 352792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if(knownartist) { 353792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist); 354792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 355792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if(knownalbum) { 356792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(MediaStore.EXTRA_MEDIA_ALBUM, album); 357792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 358792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(MediaStore.EXTRA_MEDIA_TITLE, song); 359792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, mime); 360792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 361792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startActivity(Intent.createChooser(i, title)); 362792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 363792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 364792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 365792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private OnSeekBarChangeListener mSeekListener = new OnSeekBarChangeListener() { 366792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onStartTrackingTouch(SeekBar bar) { 367792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLastSeekEventTime = 0; 368c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project mFromTouch = true; 369792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 370c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project public void onProgressChanged(SeekBar bar, int progress, boolean fromuser) { 371c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project if (!fromuser || (mService == null)) return; 372c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project long now = SystemClock.elapsedRealtime(); 373c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project if ((now - mLastSeekEventTime) > 250) { 374c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project mLastSeekEventTime = now; 375c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project mPosOverride = mDuration * progress / 1000; 376c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project try { 377c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project mService.seek(mPosOverride); 378c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project } catch (RemoteException ex) { 379c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project } 380c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project 381c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project // trackball event, allow progress updates 382c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project if (!mFromTouch) { 383c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project refreshNow(); 384c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project mPosOverride = -1; 385792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 386792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 387792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 388792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onStopTrackingTouch(SeekBar bar) { 389792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPosOverride = -1; 390c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project mFromTouch = false; 391792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 392792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 393792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 394792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private View.OnClickListener mQueueListener = new View.OnClickListener() { 395792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onClick(View v) { 396792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startActivity( 397792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project new Intent(Intent.ACTION_EDIT) 398792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project .setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/track") 399792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project .putExtra("playlist", "nowplaying") 400792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ); 401792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 402792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 403792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 404792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private View.OnClickListener mShuffleListener = new View.OnClickListener() { 405792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onClick(View v) { 406792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project toggleShuffle(); 407792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 408792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 409792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 410792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private View.OnClickListener mRepeatListener = new View.OnClickListener() { 411792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onClick(View v) { 412792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project cycleRepeat(); 413792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 414792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 415792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 416792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private View.OnClickListener mPauseListener = new View.OnClickListener() { 417792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onClick(View v) { 418792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project doPauseResume(); 419792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 420792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 421792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 422792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private View.OnClickListener mPrevListener = new View.OnClickListener() { 423792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onClick(View v) { 424792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService == null) return; 425792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 426792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService.position() < 2000) { 427792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.prev(); 428792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 429792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.seek(0); 430792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.play(); 431792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 432792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 433792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 434792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 435792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 436792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 437792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private View.OnClickListener mNextListener = new View.OnClickListener() { 438792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onClick(View v) { 439792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService == null) return; 440792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 441792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.next(); 442792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 443792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 444792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 445792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 446792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 447792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private RepeatingImageButton.RepeatListener mRewListener = 448792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project new RepeatingImageButton.RepeatListener() { 449792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onRepeat(View v, long howlong, int repcnt) { 450792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project scanBackward(repcnt, howlong); 451792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 452792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 453792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 454792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private RepeatingImageButton.RepeatListener mFfwdListener = 455792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project new RepeatingImageButton.RepeatListener() { 456792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onRepeat(View v, long howlong, int repcnt) { 457792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project scanForward(repcnt, howlong); 458792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 459792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 460792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 461792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 462792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onStop() { 463792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project paused = true; 464792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mHandler.removeMessages(REFRESH); 465792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project unregisterReceiver(mStatusListener); 466f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen MusicUtils.unbindFromService(mToken); 46747b989bf6205eb8dd51c2c1fa118f6b703f2f66dMarco Nelissen mService = null; 468792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onStop(); 469792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 470792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 471792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 472792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onStart() { 473792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onStart(); 474792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project paused = false; 475792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 476f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen mToken = MusicUtils.bindToService(this, osc); 477f33a575c2b09095d58ad7af527113f767e4c37b1Marco Nelissen if (mToken == null) { 478792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // something went wrong 479792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mHandler.sendEmptyMessage(QUIT); 480792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 481792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 482792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project IntentFilter f = new IntentFilter(); 483792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addAction(MediaPlaybackService.PLAYSTATE_CHANGED); 484792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project f.addAction(MediaPlaybackService.META_CHANGED); 485792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project registerReceiver(mStatusListener, new IntentFilter(f)); 486792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project updateTrackInfo(); 487792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project long next = refreshNow(); 488792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project queueNextRefresh(next); 489792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 490792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 491792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 492792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onNewIntent(Intent intent) { 493792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setIntent(intent); 494792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 495792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 496792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 497792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onResume() { 498792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onResume(); 499792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project updateTrackInfo(); 500792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setPauseButtonImage(); 501792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 502792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 503792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 504792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onDestroy() 505792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 506792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumArtWorker.quit(); 507792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onDestroy(); 508792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project //System.out.println("***************** playback activity onDestroy\n"); 509792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 510792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 511792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 512792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onCreateOptionsMenu(Menu menu) { 513792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super.onCreateOptionsMenu(menu); 5149d989c480204167cf983ba4dc3eac9dec5cddef9Marco Nelissen // Don't show the menu items if we got launched by path/filedescriptor, or 5159d989c480204167cf983ba4dc3eac9dec5cddef9Marco Nelissen // if we're in one shot mode. In most cases, these menu items are not 5169d989c480204167cf983ba4dc3eac9dec5cddef9Marco Nelissen // useful in those modes, so for consistency we never show them in these 5179d989c480204167cf983ba4dc3eac9dec5cddef9Marco Nelissen // modes, instead of tailoring them to the specific file being played. 5188d08ec235831d71fdd7f7b6f7757c2bc19528faeMarco Nelissen if (MusicUtils.getCurrentAudioId() >= 0) { 5199d989c480204167cf983ba4dc3eac9dec5cddef9Marco Nelissen menu.add(0, GOTO_START, 0, R.string.goto_start).setIcon(R.drawable.ic_menu_music_library); 5209d989c480204167cf983ba4dc3eac9dec5cddef9Marco Nelissen menu.add(0, PARTY_SHUFFLE, 0, R.string.party_shuffle); // icon will be set in onPrepareOptionsMenu() 521792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project SubMenu sub = menu.addSubMenu(0, ADD_TO_PLAYLIST, 0, 522792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project R.string.add_to_playlist).setIcon(android.R.drawable.ic_menu_add); 5230657c9efaa7146d5f2ab169ca46c48a22f64e893Marco Nelissen // these next two are in a separate group, so they can be shown/hidden as needed 5240657c9efaa7146d5f2ab169ca46c48a22f64e893Marco Nelissen // based on the keyguard state 5250657c9efaa7146d5f2ab169ca46c48a22f64e893Marco Nelissen menu.add(1, USE_AS_RINGTONE, 0, R.string.ringtone_menu_short) 5260657c9efaa7146d5f2ab169ca46c48a22f64e893Marco Nelissen .setIcon(R.drawable.ic_menu_set_as_ringtone); 5270657c9efaa7146d5f2ab169ca46c48a22f64e893Marco Nelissen menu.add(1, DELETE_ITEM, 0, R.string.delete_item) 5280657c9efaa7146d5f2ab169ca46c48a22f64e893Marco Nelissen .setIcon(R.drawable.ic_menu_delete); 529f2ef3b5153fd2f447939f267d8887ff3bba0d13fMarco Nelissen 530f2ef3b5153fd2f447939f267d8887ff3bba0d13fMarco Nelissen Intent i = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL); 531f2ef3b5153fd2f447939f267d8887ff3bba0d13fMarco Nelissen if (getPackageManager().resolveActivity(i, 0) != null) { 5327c065604aeca9d4de9efa7426dfb7827c9291fd8Marco Nelissen menu.add(0, EFFECTS_PANEL, 0, R.string.effectspanel).setIcon(R.drawable.ic_menu_eq); 533f2ef3b5153fd2f447939f267d8887ff3bba0d13fMarco Nelissen } 534f2ef3b5153fd2f447939f267d8887ff3bba0d13fMarco Nelissen 5359d989c480204167cf983ba4dc3eac9dec5cddef9Marco Nelissen return true; 536792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 5379d989c480204167cf983ba4dc3eac9dec5cddef9Marco Nelissen return false; 538792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 539792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 540792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 541792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onPrepareOptionsMenu(Menu menu) { 54221c22aee0db97d6e494af0c450312a44724ceeb4Gloria Wang if (mService == null) return false; 543792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MenuItem item = menu.findItem(PARTY_SHUFFLE); 544792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (item != null) { 545792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int shuffle = MusicUtils.getCurrentShuffleMode(); 546792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (shuffle == MediaPlaybackService.SHUFFLE_AUTO) { 547792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project item.setIcon(R.drawable.ic_menu_party_shuffle); 548792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project item.setTitle(R.string.party_shuffle_off); 549792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 550792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project item.setIcon(R.drawable.ic_menu_party_shuffle); 551792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project item.setTitle(R.string.party_shuffle); 552792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 553792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 55464de08b138b2ba6aae61a1a4c240ffb181103d73Marco Nelissen 5551c0d6005816e6aaa53aff249c67a77b6290fede0Marco Nelissen item = menu.findItem(ADD_TO_PLAYLIST); 5561c0d6005816e6aaa53aff249c67a77b6290fede0Marco Nelissen if (item != null) { 5571c0d6005816e6aaa53aff249c67a77b6290fede0Marco Nelissen SubMenu sub = item.getSubMenu(); 5581c0d6005816e6aaa53aff249c67a77b6290fede0Marco Nelissen MusicUtils.makePlaylistMenu(this, sub); 5591c0d6005816e6aaa53aff249c67a77b6290fede0Marco Nelissen } 56064de08b138b2ba6aae61a1a4c240ffb181103d73Marco Nelissen 5610657c9efaa7146d5f2ab169ca46c48a22f64e893Marco Nelissen KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 5620657c9efaa7146d5f2ab169ca46c48a22f64e893Marco Nelissen menu.setGroupVisible(1, !km.inKeyguardRestrictedInputMode()); 56364de08b138b2ba6aae61a1a4c240ffb181103d73Marco Nelissen 564792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 565792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 566792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 567792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 568792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 569792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent intent; 570792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 571792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch (item.getItemId()) { 572792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case GOTO_START: 573792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent = new Intent(); 574792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.setClass(this, MusicBrowserActivity.class); 5752e8e5a2c9f6460dcfece2ecfbb31d6819b59c337Marco Nelissen intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 576792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startActivity(intent); 577ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen finish(); 578792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 579792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case USE_AS_RINGTONE: { 580792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // Set the system setting to make this the current ringtone 581792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService != null) { 582792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.setRingtone(this, mService.getAudioId()); 583792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 584792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 585792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 586792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case PARTY_SHUFFLE: 587ec0c57a414c3563ebbf5767d92787a6a3f4a8820Marco Nelissen MusicUtils.togglePartyShuffle(); 588792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setShuffleButtonImage(); 589792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 590792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 591792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case NEW_PLAYLIST: { 592792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent = new Intent(); 593792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.setClass(this, CreatePlaylist.class); 594792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startActivityForResult(intent, NEW_PLAYLIST); 595792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 596792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 597792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 598792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case PLAYLIST_SELECTED: { 599bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long [] list = new long[1]; 600792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project list[0] = MusicUtils.getCurrentAudioId(); 601bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long playlist = item.getIntent().getLongExtra("playlist", 0); 602792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.addToPlaylist(this, list, playlist); 603792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 604792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 605792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 606792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case DELETE_ITEM: { 607792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService != null) { 608bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long [] list = new long[1]; 609792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project list[0] = MusicUtils.getCurrentAudioId(); 610792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Bundle b = new Bundle(); 611ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer String f; 612ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer if (android.os.Environment.isExternalStorageRemovable()) { 613ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer f = getString(R.string.delete_song_desc, mService.getTrackName()); 614ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer } else { 615ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer f = getString(R.string.delete_song_desc_nosdcard, mService.getTrackName()); 616ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer } 617ecf5b6577ed52056fa8ae6035805bfed9f50c2f3Eric Fischer b.putString("description", f); 618bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen b.putLongArray("items", list); 619792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent = new Intent(); 620792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.setClass(this, DeleteItems.class); 621792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.putExtras(b); 622792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startActivityForResult(intent, -1); 623792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 624792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 625792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 626f2ef3b5153fd2f447939f267d8887ff3bba0d13fMarco Nelissen 627f2ef3b5153fd2f447939f267d8887ff3bba0d13fMarco Nelissen case EFFECTS_PANEL: { 628f2ef3b5153fd2f447939f267d8887ff3bba0d13fMarco Nelissen Intent i = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL); 629f2ef3b5153fd2f447939f267d8887ff3bba0d13fMarco Nelissen i.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, mService.getAudioSessionId()); 630f2ef3b5153fd2f447939f267d8887ff3bba0d13fMarco Nelissen startActivityForResult(i, EFFECTS_PANEL); 631f2ef3b5153fd2f447939f267d8887ff3bba0d13fMarco Nelissen return true; 632f2ef3b5153fd2f447939f267d8887ff3bba0d13fMarco Nelissen } 633792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 634792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 635792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 636792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return super.onOptionsItemSelected(item); 637792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 638792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 639792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 640792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 641792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (resultCode != RESULT_OK) { 642792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return; 643792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 644792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch (requestCode) { 645792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case NEW_PLAYLIST: 646792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Uri uri = intent.getData(); 647792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (uri != null) { 648bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long [] list = new long[1]; 649792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project list[0] = MusicUtils.getCurrentAudioId(); 650792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int playlist = Integer.parseInt(uri.getLastPathSegment()); 651792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project MusicUtils.addToPlaylist(this, list, playlist); 652792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 653792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 654792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 655792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 656792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final int keyboard[][] = { 657792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 658792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_Q, 659792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_W, 660792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_E, 661792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_R, 662792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_T, 663792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_Y, 664792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_U, 665792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_I, 666792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_O, 667792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_P, 668792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }, 669792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 670792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_A, 671792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_S, 672792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_D, 673792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_F, 674792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_G, 675792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_H, 676792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_J, 677792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_K, 678792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_L, 679792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_DEL, 680792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }, 681792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 682792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_Z, 683792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_X, 684792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_C, 685792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_V, 686792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_B, 687792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_N, 688792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_M, 689792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_COMMA, 690792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_PERIOD, 691792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project KeyEvent.KEYCODE_ENTER 692792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 693792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 694792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 695792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 696792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private int lastX; 697792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private int lastY; 698792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 699792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private boolean seekMethod1(int keyCode) 700792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 701c5020e2833a6925aa1e6a753c9b922166e31e691Marco Nelissen if (mService == null) return false; 702792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project for(int x=0;x<10;x++) { 703792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project for(int y=0;y<3;y++) { 704792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if(keyboard[y][x] == keyCode) { 705792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int dir = 0; 706792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // top row 707792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if(x == lastX && y == lastY) dir = 0; 708792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project else if (y == 0 && lastY == 0 && x > lastX) dir = 1; 709792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project else if (y == 0 && lastY == 0 && x < lastX) dir = -1; 710792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // bottom row 711792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project else if (y == 2 && lastY == 2 && x > lastX) dir = -1; 712792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project else if (y == 2 && lastY == 2 && x < lastX) dir = 1; 713792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // moving up 714792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project else if (y < lastY && x <= 4) dir = 1; 715792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project else if (y < lastY && x >= 5) dir = -1; 716792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // moving down 717792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project else if (y > lastY && x <= 4) dir = -1; 718792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project else if (y > lastY && x >= 5) dir = 1; 719792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project lastX = x; 720792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project lastY = y; 721792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 722792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.seek(mService.position() + dir * 5); 723792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 724792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 725792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project refreshNow(); 726792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 727792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 728792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 729792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 730792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project lastX = -1; 731792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project lastY = -1; 732792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return false; 733792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 734792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 735792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private boolean seekMethod2(int keyCode) 736792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 737792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService == null) return false; 738792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project for(int i=0;i<10;i++) { 739792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if(keyboard[0][i] == keyCode) { 740792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int seekpercentage = 100*i/10; 741792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 742792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.seek(mService.duration() * seekpercentage / 100); 743792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 744792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 745792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project refreshNow(); 746792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 747792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 748792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 749792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return false; 750792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 751792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 752792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 753792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onKeyUp(int keyCode, KeyEvent event) { 754792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 755792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch(keyCode) 756792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 757792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_DPAD_LEFT: 758cd582c608545d42545dc999ffa46690a45c7ac03Marco Nelissen if (!useDpadMusicControl()) { 759792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 760792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 761792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService != null) { 762792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (!mSeeking && mStartSeekPos >= 0) { 763792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPauseButton.requestFocus(); 764792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mStartSeekPos < 1000) { 765792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.prev(); 766792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 767792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.seek(0); 768792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 769792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 770792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project scanBackward(-1, event.getEventTime() - event.getDownTime()); 771792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPauseButton.requestFocus(); 772792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mStartSeekPos = -1; 773792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 774792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 775792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mSeeking = false; 776792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPosOverride = -1; 777792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 778792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_DPAD_RIGHT: 779cd582c608545d42545dc999ffa46690a45c7ac03Marco Nelissen if (!useDpadMusicControl()) { 780792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 781792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 782792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService != null) { 783792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (!mSeeking && mStartSeekPos >= 0) { 784792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPauseButton.requestFocus(); 785792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.next(); 786792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 787792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project scanForward(-1, event.getEventTime() - event.getDownTime()); 788792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPauseButton.requestFocus(); 789792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mStartSeekPos = -1; 790792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 791792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 792792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mSeeking = false; 793792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPosOverride = -1; 794792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 795792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 796792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 797792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 798792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return super.onKeyUp(keyCode, event); 799792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 800792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 801cd582c608545d42545dc999ffa46690a45c7ac03Marco Nelissen private boolean useDpadMusicControl() { 802cd582c608545d42545dc999ffa46690a45c7ac03Marco Nelissen if (mDeviceHasDpad && (mPrevButton.isFocused() || 803cd582c608545d42545dc999ffa46690a45c7ac03Marco Nelissen mNextButton.isFocused() || 804cd582c608545d42545dc999ffa46690a45c7ac03Marco Nelissen mPauseButton.isFocused())) { 805cd582c608545d42545dc999ffa46690a45c7ac03Marco Nelissen return true; 806cd582c608545d42545dc999ffa46690a45c7ac03Marco Nelissen } 807cd582c608545d42545dc999ffa46690a45c7ac03Marco Nelissen return false; 808cd582c608545d42545dc999ffa46690a45c7ac03Marco Nelissen } 809cd582c608545d42545dc999ffa46690a45c7ac03Marco Nelissen 810792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 811792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) 812792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 813792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int direction = -1; 814792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int repcnt = event.getRepeatCount(); 815792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 816792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if((seekmethod==0)?seekMethod1(keyCode):seekMethod2(keyCode)) 817792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 818792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 819792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch(keyCode) 820792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 821792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project/* 822792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // image scale 823792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_Q: av.adjustParams(-0.05, 0.0, 0.0, 0.0, 0.0,-1.0); break; 824792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_E: av.adjustParams( 0.05, 0.0, 0.0, 0.0, 0.0, 1.0); break; 825792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // image translate 826792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_W: av.adjustParams( 0.0, 0.0,-1.0, 0.0, 0.0, 0.0); break; 827792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_X: av.adjustParams( 0.0, 0.0, 1.0, 0.0, 0.0, 0.0); break; 828792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_A: av.adjustParams( 0.0,-1.0, 0.0, 0.0, 0.0, 0.0); break; 829792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_D: av.adjustParams( 0.0, 1.0, 0.0, 0.0, 0.0, 0.0); break; 830792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // camera rotation 831792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_R: av.adjustParams( 0.0, 0.0, 0.0, 0.0, 0.0,-1.0); break; 832792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_U: av.adjustParams( 0.0, 0.0, 0.0, 0.0, 0.0, 1.0); break; 833792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // camera translate 834792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_Y: av.adjustParams( 0.0, 0.0, 0.0, 0.0,-1.0, 0.0); break; 835792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_N: av.adjustParams( 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); break; 836792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_G: av.adjustParams( 0.0, 0.0, 0.0,-1.0, 0.0, 0.0); break; 837792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_J: av.adjustParams( 0.0, 0.0, 0.0, 1.0, 0.0, 0.0); break; 838792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 839792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project*/ 840792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 841792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_SLASH: 842792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project seekmethod = 1 - seekmethod; 843792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 844792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 845792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_DPAD_LEFT: 846cd582c608545d42545dc999ffa46690a45c7ac03Marco Nelissen if (!useDpadMusicControl()) { 847792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 848792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 849792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (!mPrevButton.hasFocus()) { 850792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPrevButton.requestFocus(); 851792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 852792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project scanBackward(repcnt, event.getEventTime() - event.getDownTime()); 853792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 854792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_DPAD_RIGHT: 855cd582c608545d42545dc999ffa46690a45c7ac03Marco Nelissen if (!useDpadMusicControl()) { 856792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 857792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 858792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (!mNextButton.hasFocus()) { 859792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mNextButton.requestFocus(); 860792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 861792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project scanForward(repcnt, event.getEventTime() - event.getDownTime()); 862792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 863792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 864792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_S: 865792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project toggleShuffle(); 866792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 867792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 868792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_DPAD_CENTER: 869792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case KeyEvent.KEYCODE_SPACE: 870792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project doPauseResume(); 871792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return true; 872792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 873792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return super.onKeyDown(keyCode, event); 874792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 875792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 876792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private void scanBackward(int repcnt, long delta) { 877792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if(mService == null) return; 878792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 879792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if(repcnt == 0) { 880792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mStartSeekPos = mService.position(); 881792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLastSeekEventTime = 0; 882792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mSeeking = false; 883792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 884792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mSeeking = true; 885792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (delta < 5000) { 886792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // seek at 10x speed for the first 5 seconds 887792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project delta = delta * 10; 888792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 889792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // seek at 40x after that 890792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project delta = 50000 + (delta - 5000) * 40; 891792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 892792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project long newpos = mStartSeekPos - delta; 893792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (newpos < 0) { 894792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // move to previous track 895792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.prev(); 896792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project long duration = mService.duration(); 897792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mStartSeekPos += duration; 898792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project newpos += duration; 899792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 900792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (((delta - mLastSeekEventTime) > 250) || repcnt < 0){ 901792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.seek(newpos); 902792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLastSeekEventTime = delta; 903792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 904792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (repcnt >= 0) { 905792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPosOverride = newpos; 906792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 907792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPosOverride = -1; 908792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 909792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project refreshNow(); 910792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 911792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 912792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 913792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 914792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 915792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private void scanForward(int repcnt, long delta) { 916792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if(mService == null) return; 917792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 918792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if(repcnt == 0) { 919792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mStartSeekPos = mService.position(); 920792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLastSeekEventTime = 0; 921792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mSeeking = false; 922792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 923792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mSeeking = true; 924792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (delta < 5000) { 925792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // seek at 10x speed for the first 5 seconds 926792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project delta = delta * 10; 927792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 928792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // seek at 40x after that 929792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project delta = 50000 + (delta - 5000) * 40; 930792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 931792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project long newpos = mStartSeekPos + delta; 932792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project long duration = mService.duration(); 933792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (newpos >= duration) { 934792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // move to next track 935792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.next(); 936792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mStartSeekPos -= duration; // is OK to go negative 937792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project newpos -= duration; 938792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 939792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (((delta - mLastSeekEventTime) > 250) || repcnt < 0){ 940792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.seek(newpos); 941792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLastSeekEventTime = delta; 942792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 943792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (repcnt >= 0) { 944792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPosOverride = newpos; 945792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 946792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPosOverride = -1; 947792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 948792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project refreshNow(); 949792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 950792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 951792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 952792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 953792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 954792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private void doPauseResume() { 955792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 956792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if(mService != null) { 957792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService.isPlaying()) { 958792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.pause(); 959792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 960792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.play(); 961792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 962792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project refreshNow(); 963792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setPauseButtonImage(); 964792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 965792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 966792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 967792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 968792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 969792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private void toggleShuffle() { 970792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService == null) { 971792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return; 972792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 973792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 974792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int shuffle = mService.getShuffleMode(); 975792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (shuffle == MediaPlaybackService.SHUFFLE_NONE) { 976792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.setShuffleMode(MediaPlaybackService.SHUFFLE_NORMAL); 977792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService.getRepeatMode() == MediaPlaybackService.REPEAT_CURRENT) { 978792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.setRepeatMode(MediaPlaybackService.REPEAT_ALL); 979792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setRepeatButtonImage(); 980792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 981792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project showToast(R.string.shuffle_on_notif); 982792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else if (shuffle == MediaPlaybackService.SHUFFLE_NORMAL || 983792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project shuffle == MediaPlaybackService.SHUFFLE_AUTO) { 984792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.setShuffleMode(MediaPlaybackService.SHUFFLE_NONE); 985792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project showToast(R.string.shuffle_off_notif); 986792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 987792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Log.e("MediaPlaybackActivity", "Invalid shuffle mode: " + shuffle); 988792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 989792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setShuffleButtonImage(); 990792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 991792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 992792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 993792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 994792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private void cycleRepeat() { 995792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService == null) { 996792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return; 997792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 998792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 999792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int mode = mService.getRepeatMode(); 1000792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mode == MediaPlaybackService.REPEAT_NONE) { 1001792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.setRepeatMode(MediaPlaybackService.REPEAT_ALL); 1002792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project showToast(R.string.repeat_all_notif); 1003792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else if (mode == MediaPlaybackService.REPEAT_ALL) { 1004792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.setRepeatMode(MediaPlaybackService.REPEAT_CURRENT); 1005792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService.getShuffleMode() != MediaPlaybackService.SHUFFLE_NONE) { 1006792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.setShuffleMode(MediaPlaybackService.SHUFFLE_NONE); 1007792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setShuffleButtonImage(); 1008792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1009792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project showToast(R.string.repeat_current_notif); 1010792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 1011792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.setRepeatMode(MediaPlaybackService.REPEAT_NONE); 1012792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project showToast(R.string.repeat_off_notif); 1013792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1014792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setRepeatButtonImage(); 1015792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 1016792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1017792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1018792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1019792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1020792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private void showToast(int resid) { 1021792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mToast == null) { 1022792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT); 1023792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1024792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mToast.setText(resid); 1025792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mToast.show(); 1026792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1027792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1028792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private void startPlayback() { 1029792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1030792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if(mService == null) 1031792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return; 1032792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent intent = getIntent(); 1033792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String filename = ""; 1034792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Uri uri = intent.getData(); 1035792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (uri != null && uri.toString().length() > 0) { 1036792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // If this is a file:// URI, just use the path directly instead 1037792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // of going through the open-from-filedescriptor codepath. 1038792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String scheme = uri.getScheme(); 1039792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if ("file".equals(scheme)) { 1040792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project filename = uri.getPath(); 1041792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 1042792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project filename = uri.toString(); 1043792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1044792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 1045b7841acd23f0cf4fd8db604d73bdf14e57994fd9Marco Nelissen mService.stop(); 10468d08ec235831d71fdd7f7b6f7757c2bc19528faeMarco Nelissen mService.openFile(filename); 1047b7841acd23f0cf4fd8db604d73bdf14e57994fd9Marco Nelissen mService.play(); 1048b7841acd23f0cf4fd8db604d73bdf14e57994fd9Marco Nelissen setIntent(new Intent()); 1049792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (Exception ex) { 1050792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Log.d("MediaPlaybackActivity", "couldn't start playback: " + ex); 1051792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1052792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1053792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1054792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project updateTrackInfo(); 1055792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project long next = refreshNow(); 1056792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project queueNextRefresh(next); 1057792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1058792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1059792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private ServiceConnection osc = new ServiceConnection() { 1060792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onServiceConnected(ComponentName classname, IBinder obj) { 1061792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService = IMediaPlaybackService.Stub.asInterface(obj); 1062792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startPlayback(); 1063792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 1064792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // Assume something is playing when the service says it is, 1065792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // but also if the audio ID is valid but the service is paused. 1066792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService.getAudioId() >= 0 || mService.isPlaying() || 1067792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mService.getPath() != null) { 1068792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // something is playing now, we're done 10698d08ec235831d71fdd7f7b6f7757c2bc19528faeMarco Nelissen mRepeatButton.setVisibility(View.VISIBLE); 10708d08ec235831d71fdd7f7b6f7757c2bc19528faeMarco Nelissen mShuffleButton.setVisibility(View.VISIBLE); 10718d08ec235831d71fdd7f7b6f7757c2bc19528faeMarco Nelissen mQueueButton.setVisibility(View.VISIBLE); 10728d08ec235831d71fdd7f7b6f7757c2bc19528faeMarco Nelissen setRepeatButtonImage(); 10738d08ec235831d71fdd7f7b6f7757c2bc19528faeMarco Nelissen setShuffleButtonImage(); 1074792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setPauseButtonImage(); 1075792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return; 1076792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1077792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 1078792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1079792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // Service is dead or not playing anything. If we got here as part 1080792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // of a "play this file" Intent, exit. Otherwise go to the Music 1081792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // app start screen. 1082792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (getIntent().getData() == null) { 1083792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_MAIN); 1084792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 1085792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project intent.setClass(MediaPlaybackActivity.this, MusicBrowserActivity.class); 1086792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project startActivity(intent); 1087792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1088792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project finish(); 1089792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1090792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onServiceDisconnected(ComponentName classname) { 10913cbfa9f9ca4f4e5c19b12094d0a8a82d9a1d9467Marco Nelissen mService = null; 1092792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1093792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 1094792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1095792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private void setRepeatButtonImage() { 109621c22aee0db97d6e494af0c450312a44724ceeb4Gloria Wang if (mService == null) return; 1097792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 1098792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch (mService.getRepeatMode()) { 1099792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case MediaPlaybackService.REPEAT_ALL: 1100792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mRepeatButton.setImageResource(R.drawable.ic_mp_repeat_all_btn); 1101792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 1102792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case MediaPlaybackService.REPEAT_CURRENT: 1103792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mRepeatButton.setImageResource(R.drawable.ic_mp_repeat_once_btn); 1104792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 1105792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project default: 1106792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mRepeatButton.setImageResource(R.drawable.ic_mp_repeat_off_btn); 1107792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 1108792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1109792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 1110792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1111792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1112792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1113792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private void setShuffleButtonImage() { 111421c22aee0db97d6e494af0c450312a44724ceeb4Gloria Wang if (mService == null) return; 1115792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 1116792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch (mService.getShuffleMode()) { 1117792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case MediaPlaybackService.SHUFFLE_NONE: 1118792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mShuffleButton.setImageResource(R.drawable.ic_mp_shuffle_off_btn); 1119792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 1120792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case MediaPlaybackService.SHUFFLE_AUTO: 1121792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mShuffleButton.setImageResource(R.drawable.ic_mp_partyshuffle_on_btn); 1122792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 1123792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project default: 1124792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mShuffleButton.setImageResource(R.drawable.ic_mp_shuffle_on_btn); 1125792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 1126792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1127792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 1128792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1129792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1130792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1131792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private void setPauseButtonImage() { 1132792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 1133792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService != null && mService.isPlaying()) { 1134792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPauseButton.setImageResource(android.R.drawable.ic_media_pause); 1135792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 1136792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mPauseButton.setImageResource(android.R.drawable.ic_media_play); 1137792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1138792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 1139792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1140792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1141792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1142792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private ImageView mAlbum; 1143792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private TextView mCurrentTime; 1144792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private TextView mTotalTime; 1145792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private TextView mArtistName; 1146792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private TextView mAlbumName; 1147792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private TextView mTrackName; 1148792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private ProgressBar mProgress; 1149792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private long mPosOverride = -1; 1150c85f677e7b692c0f1a7cba82dd24070d236dc407The Android Open Source Project private boolean mFromTouch = false; 1151792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private long mDuration; 1152792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private int seekmethod; 1153792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private boolean paused; 1154792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1155792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private static final int REFRESH = 1; 1156792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private static final int QUIT = 2; 1157792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private static final int GET_ALBUM_ART = 3; 1158792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private static final int ALBUM_ART_DECODED = 4; 1159792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1160792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private void queueNextRefresh(long delay) { 1161792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (!paused) { 1162792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Message msg = mHandler.obtainMessage(REFRESH); 1163792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mHandler.removeMessages(REFRESH); 1164792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mHandler.sendMessageDelayed(msg, delay); 1165792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1166792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1167792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1168792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private long refreshNow() { 1169792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if(mService == null) 1170792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return 500; 1171792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 1172792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project long pos = mPosOverride < 0 ? mService.position() : mPosOverride; 1173792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project long remaining = 1000 - (pos % 1000); 1174792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if ((pos >= 0) && (mDuration > 0)) { 1175792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentTime.setText(MusicUtils.makeTimeString(this, pos / 1000)); 1176792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1177792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService.isPlaying()) { 1178792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentTime.setVisibility(View.VISIBLE); 1179792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 1180792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // blink the counter 1181792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project int vis = mCurrentTime.getVisibility(); 1182792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentTime.setVisibility(vis == View.INVISIBLE ? View.VISIBLE : View.INVISIBLE); 1183792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project remaining = 500; 1184792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1185792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1186792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mProgress.setProgress((int) (1000 * pos / mDuration)); 1187792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 1188792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mCurrentTime.setText("--:--"); 1189792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mProgress.setProgress(1000); 1190792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1191792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // return the number of milliseconds until the next full second, so 1192792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // the counter can be updated at just the right time 1193792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return remaining; 1194792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 1195792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1196792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return 500; 1197792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1198792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1199792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final Handler mHandler = new Handler() { 1200792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 1201792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void handleMessage(Message msg) { 1202792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project switch (msg.what) { 1203792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case ALBUM_ART_DECODED: 1204792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbum.setImageBitmap((Bitmap)msg.obj); 1205792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbum.getDrawable().setDither(true); 1206792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 1207792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1208792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case REFRESH: 1209792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project long next = refreshNow(); 1210792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project queueNextRefresh(next); 1211792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 1212792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1213792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project case QUIT: 1214792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // This can be moved back to onCreate once the bug that prevents 1215792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // Dialogs from being started from onCreate/onResume is fixed. 1216792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project new AlertDialog.Builder(MediaPlaybackActivity.this) 1217792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project .setTitle(R.string.service_start_error_title) 1218792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project .setMessage(R.string.service_start_error_msg) 1219792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project .setPositiveButton(R.string.service_start_error_button, 1220792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project new DialogInterface.OnClickListener() { 1221792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onClick(DialogInterface dialog, int whichButton) { 1222792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project finish(); 1223792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1224792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }) 1225792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project .setCancelable(false) 1226792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project .show(); 1227792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 1228792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1229792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project default: 1230792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project break; 1231792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1232792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1233792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 1234792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1235792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private BroadcastReceiver mStatusListener = new BroadcastReceiver() { 1236792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project @Override 1237792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void onReceive(Context context, Intent intent) { 1238792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String action = intent.getAction(); 1239792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (action.equals(MediaPlaybackService.META_CHANGED)) { 1240792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // redraw the artist/title info and 1241792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // set new max for progress bar 1242792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project updateTrackInfo(); 1243792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setPauseButtonImage(); 1244792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project queueNextRefresh(1); 12456b507de7beda7f4a8b969b437dfbf81f5ecd5e5eMarco Nelissen } else if (action.equals(MediaPlaybackService.PLAYSTATE_CHANGED)) { 1246792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project setPauseButtonImage(); 1247792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1248792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1249792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project }; 1250792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1251bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen private static class AlbumSongIdWrapper { 1252bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen public long albumid; 1253bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen public long songid; 1254bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen AlbumSongIdWrapper(long aid, long sid) { 1255bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen albumid = aid; 1256bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen songid = sid; 1257bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen } 1258bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen } 1259bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen 1260792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private void updateTrackInfo() { 1261792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (mService == null) { 1262792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return; 1263792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1264792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 1265792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String path = mService.getPath(); 1266792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (path == null) { 1267792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project finish(); 1268792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return; 1269792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1270792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1271bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long songid = mService.getAudioId(); 12727a16cc726fd83eff0095f3f82364d1438773218fMarco Nelissen if (songid < 0 && path.toLowerCase().startsWith("http://")) { 12737a16cc726fd83eff0095f3f82364d1438773218fMarco Nelissen // Once we can get album art and meta data from MediaPlayer, we 12747a16cc726fd83eff0095f3f82364d1438773218fMarco Nelissen // can show that info again when streaming. 1275792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ((View) mArtistName.getParent()).setVisibility(View.INVISIBLE); 1276792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ((View) mAlbumName.getParent()).setVisibility(View.INVISIBLE); 1277792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbum.setVisibility(View.GONE); 1278792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mTrackName.setText(path); 1279792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumArtHandler.removeMessages(GET_ALBUM_ART); 1280bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen mAlbumArtHandler.obtainMessage(GET_ALBUM_ART, new AlbumSongIdWrapper(-1, -1)).sendToTarget(); 1281792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } else { 1282792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ((View) mArtistName.getParent()).setVisibility(View.VISIBLE); 1283792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project ((View) mAlbumName.getParent()).setVisibility(View.VISIBLE); 1284792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String artistName = mService.getArtistName(); 1285f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen if (MediaStore.UNKNOWN_STRING.equals(artistName)) { 1286792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project artistName = getString(R.string.unknown_artist_name); 1287792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1288792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mArtistName.setText(artistName); 1289792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project String albumName = mService.getAlbumName(); 1290bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long albumid = mService.getAlbumId(); 1291f4d4b342061ade12eb7903f454df62814179906fMarco Nelissen if (MediaStore.UNKNOWN_STRING.equals(albumName)) { 1292792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project albumName = getString(R.string.unknown_album_name); 1293792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project albumid = -1; 1294792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1295792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumName.setText(albumName); 1296792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mTrackName.setText(mService.getTrackName()); 1297792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumArtHandler.removeMessages(GET_ALBUM_ART); 1298bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen mAlbumArtHandler.obtainMessage(GET_ALBUM_ART, new AlbumSongIdWrapper(albumid, songid)).sendToTarget(); 1299792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbum.setVisibility(View.VISIBLE); 1300792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1301792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mDuration = mService.duration(); 1302792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mTotalTime.setText(MusicUtils.makeTimeString(this, mDuration / 1000)); 1303792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (RemoteException ex) { 1304792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project finish(); 1305792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1306792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1307792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1308792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public class AlbumArtHandler extends Handler { 1309bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen private long mAlbumId = -1; 1310792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1311792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public AlbumArtHandler(Looper looper) { 1312792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project super(looper); 1313792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1314bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen @Override 1315792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void handleMessage(Message msg) 1316792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project { 1317bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long albumid = ((AlbumSongIdWrapper) msg.obj).albumid; 1318bd447b61c42589133257fb7992ccbed18a507a46Marco Nelissen long songid = ((AlbumSongIdWrapper) msg.obj).songid; 1319792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (msg.what == GET_ALBUM_ART && (mAlbumId != albumid || albumid < 0)) { 1320792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project // while decoding the new image, show the default album art 1321792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Message numsg = mHandler.obtainMessage(ALBUM_ART_DECODED, null); 1322792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mHandler.removeMessages(ALBUM_ART_DECODED); 1323792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mHandler.sendMessageDelayed(numsg, 300); 132405f5bd5cadee488840ce0d3dbfbbd5f9e1f26043Marco Nelissen // Don't allow default artwork here, because we want to fall back to song-specific 132505f5bd5cadee488840ce0d3dbfbbd5f9e1f26043Marco Nelissen // album art if we can't find anything for the album. 132605f5bd5cadee488840ce0d3dbfbbd5f9e1f26043Marco Nelissen Bitmap bm = MusicUtils.getArtwork(MediaPlaybackActivity.this, songid, albumid, false); 1327792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (bm == null) { 13287a16cc726fd83eff0095f3f82364d1438773218fMarco Nelissen bm = MusicUtils.getArtwork(MediaPlaybackActivity.this, songid, -1); 1329792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project albumid = -1; 1330792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1331792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project if (bm != null) { 1332792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project numsg = mHandler.obtainMessage(ALBUM_ART_DECODED, bm); 1333792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mHandler.removeMessages(ALBUM_ART_DECODED); 1334792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mHandler.sendMessage(numsg); 1335792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1336792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mAlbumId = albumid; 1337792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1338792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1339792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1340792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1341756c3f57f11a7bb3bf1cf1333ee8ffbc51039748Marco Nelissen private static class Worker implements Runnable { 1342792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private final Object mLock = new Object(); 1343792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project private Looper mLooper; 1344792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1345792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project /** 1346792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * Creates a worker thread with the given name. The thread 1347792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * then runs a {@link android.os.Looper}. 1348792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project * @param name A name for the new thread 1349792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project */ 1350792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Worker(String name) { 1351792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Thread t = new Thread(null, this, name); 1352792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project t.setPriority(Thread.MIN_PRIORITY); 1353792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project t.start(); 1354792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project synchronized (mLock) { 1355792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project while (mLooper == null) { 1356792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project try { 1357792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLock.wait(); 1358792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } catch (InterruptedException ex) { 1359792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1360792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1361792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1362792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1363792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1364792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public Looper getLooper() { 1365792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project return mLooper; 1366792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1367792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1368792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void run() { 1369792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project synchronized (mLock) { 1370792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Looper.prepare(); 1371792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLooper = Looper.myLooper(); 1372792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLock.notifyAll(); 1373792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1374792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project Looper.loop(); 1375792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1376792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1377792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project public void quit() { 1378792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project mLooper.quit(); 1379792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1380792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project } 1381792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project} 1382792a2206a4f05f6bd13fce902d3663892d2947afThe Android Open Source Project 1383