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