MediaPickerActivity.java revision 87bbf3c40cd044c3daa9fad28fb94e8570fcae05
1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.music;
18
19import android.app.ListActivity;
20import android.content.Context;
21import android.content.Intent;
22import android.content.ContentUris;
23import android.database.Cursor;
24import android.net.Uri;
25import android.os.Bundle;
26import android.os.RemoteException;
27import android.provider.MediaStore;
28import android.view.View;
29import android.view.ViewGroup;
30import android.widget.ImageView;
31import android.widget.ListView;
32import android.widget.SimpleCursorAdapter;
33import android.widget.TextView;
34
35import java.util.ArrayList;
36
37public class MediaPickerActivity extends ListActivity implements MusicUtils.Defs
38{
39
40    public MediaPickerActivity()
41    {
42    }
43
44    /** Called when the activity is first created. */
45    @Override
46    public void onCreate(Bundle icicle)
47    {
48        super.onCreate(icicle);
49
50        mFirstYear = getIntent().getStringExtra("firstyear");
51        mLastYear = getIntent().getStringExtra("lastyear");
52
53        if (mFirstYear == null) {
54            setTitle(R.string.all_title);
55        } else if (mFirstYear.equals(mLastYear)) {
56            setTitle(mFirstYear);
57        } else {
58            setTitle(mFirstYear + "-" + mLastYear);
59        }
60        MusicUtils.bindToService(this);
61        init();
62    }
63
64    @Override
65    public void onDestroy() {
66        MusicUtils.unbindFromService(this);
67        super.onDestroy();
68        if (mCursor != null) {
69            mCursor.close();
70        }
71    }
72
73    public void init() {
74
75        setContentView(R.layout.media_picker_activity);
76
77        MakeCursor();
78        if (null == mCursor || 0 == mCursor.getCount()) {
79            return;
80        }
81
82        PickListAdapter adapter = new PickListAdapter(
83                this,
84                R.layout.track_list_item,
85                mCursor,
86                new String[] {},
87                new int[] {});
88
89        setListAdapter(adapter);
90    }
91
92    @Override
93    protected void onListItemClick(ListView l, View v, int position, long id)
94    {
95        mCursor.moveToPosition(position);
96        String type = mCursor.getString(mCursor.getColumnIndexOrThrow(
97                MediaStore.Audio.Media.MIME_TYPE));
98
99        String action = getIntent().getAction();
100        if (Intent.ACTION_GET_CONTENT.equals(action)) {
101            Uri uri;
102
103            long mediaId;
104            if (type.startsWith("video")) {
105                uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
106                mediaId = mCursor.getLong(mCursor.getColumnIndexOrThrow(
107                        MediaStore.Video.Media._ID));
108            } else {
109                uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
110                mediaId = mCursor.getLong(mCursor.getColumnIndexOrThrow(
111                        MediaStore.Audio.Media._ID));
112            }
113
114            setResult(RESULT_OK, new Intent().setData(ContentUris.withAppendedId(uri, mediaId)));
115            finish();
116            return;
117        }
118
119        // Need to stop the playbackservice, in case it is busy playing audio
120        // and the user selected a video.
121        if (MusicUtils.sService != null) {
122            try {
123                MusicUtils.sService.stop();
124            } catch (RemoteException ex) {
125            }
126        }
127        Intent intent = new Intent(Intent.ACTION_VIEW);
128        intent.setDataAndType(ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id), type);
129
130        startActivity(intent);
131    }
132
133    private void MakeCursor() {
134        String[] audiocols = new String[] {
135                MediaStore.Audio.Media._ID,
136                MediaStore.Audio.Media.ARTIST,
137                MediaStore.Audio.Media.ALBUM,
138                MediaStore.Audio.Media.TITLE,
139                MediaStore.Audio.Media.DATA,
140                MediaStore.Audio.Media.MIME_TYPE,
141                MediaStore.Audio.Media.YEAR
142        };
143        String[] videocols = new String[] {
144                MediaStore.Audio.Media._ID,
145                MediaStore.Audio.Media.TITLE,
146                MediaStore.Audio.Media.ARTIST,
147                MediaStore.Audio.Media.ALBUM,
148                MediaStore.Audio.Media.TITLE,
149                MediaStore.Audio.Media.DATA,
150                MediaStore.Audio.Media.MIME_TYPE
151        };
152
153        Cursor[] cs;
154        // Use ArrayList for the moment, since we don't know the size of
155        // Cursor[]. If the length of Corsor[] larger than really used,
156        // a NPE will come up when access the content of Corsor[].
157        ArrayList<Cursor> cList = new ArrayList<Cursor>();
158        Intent intent = getIntent();
159        String type = intent.getType();
160
161        if (mFirstYear != null) {
162            // If mFirstYear is not null, the picker only for audio because
163            // video has no year column.
164            if(type.equals("video/*")) {
165                mCursor = null;
166                return;
167            }
168
169            mWhereClause = MediaStore.Audio.Media.YEAR + ">=" + mFirstYear + " AND " +
170                           MediaStore.Audio.Media.YEAR + "<=" + mLastYear;
171        }
172
173        // If use Cursor[] as before, the Cursor[i] could be null when there is
174        // no video/audio/sdcard. Then a NPE will come up when access the content of the
175        // Array.
176
177        Cursor c;
178        if (type.equals("video/*")) {
179            // Only video.
180            c = MusicUtils.query(this, MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
181                    videocols, null , null, mSortOrder);
182            if (c != null) {
183                cList.add(c);
184            }
185        } else {
186            c = MusicUtils.query(this, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
187                    audiocols, mWhereClause , null, mSortOrder);
188
189            if (c != null) {
190                cList.add(c);
191            }
192
193            if (mFirstYear == null && intent.getType().equals("media/*")) {
194                // video has no year column
195                c = MusicUtils.query(this, MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
196                    videocols, null , null, mSortOrder);
197                if (c != null) {
198                    cList.add(c);
199                }
200            }
201        }
202
203        // Get the ArrayList size.
204        int size = cList.size();
205        if (0 == size) {
206            // If no video/audio/SDCard exist, return.
207            mCursor = null;
208            return;
209        }
210
211        // The size is known now, we're sure each item of Cursor[] is not null.
212        cs = new Cursor[size];
213        cs = cList.toArray(cs);
214        mCursor = new SortCursor(cs, MediaStore.Audio.Media.TITLE);
215    }
216
217    private Cursor mCursor;
218    private String mSortOrder = MediaStore.Audio.Media.TITLE + " COLLATE UNICODE";
219    private String mFirstYear;
220    private String mLastYear;
221    private String mWhereClause;
222
223    static class PickListAdapter extends SimpleCursorAdapter {
224        int mTitleIdx;
225        int mArtistIdx;
226        int mAlbumIdx;
227        int mMimeIdx;
228
229        PickListAdapter(Context context, int layout, Cursor cursor, String[] from, int[] to) {
230            super(context, layout, cursor, from, to);
231
232            mTitleIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE);
233            mArtistIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST);
234            mAlbumIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM);
235            mMimeIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.MIME_TYPE);
236        }
237
238        @Override
239        public View newView(Context context, Cursor cursor, ViewGroup parent) {
240           View v = super.newView(context, cursor, parent);
241           ImageView iv = (ImageView) v.findViewById(R.id.icon);
242           iv.setVisibility(View.VISIBLE);
243           ViewGroup.LayoutParams p = iv.getLayoutParams();
244           p.width = ViewGroup.LayoutParams.WRAP_CONTENT;
245           p.height = ViewGroup.LayoutParams.WRAP_CONTENT;
246
247           TextView tv = (TextView) v.findViewById(R.id.duration);
248           tv.setVisibility(View.GONE);
249           iv = (ImageView) v.findViewById(R.id.play_indicator);
250           iv.setVisibility(View.GONE);
251
252           return v;
253        }
254
255        @Override
256        public void bindView(View view, Context context, Cursor cursor) {
257
258            TextView tv = (TextView) view.findViewById(R.id.line1);
259            String name = cursor.getString(mTitleIdx);
260            tv.setText(name);
261
262            tv = (TextView) view.findViewById(R.id.line2);
263            name = cursor.getString(mAlbumIdx);
264            StringBuilder builder = new StringBuilder();
265            if (name == null || name.equals(MediaStore.UNKNOWN_STRING)) {
266                builder.append(context.getString(R.string.unknown_album_name));
267            } else {
268                builder.append(name);
269            }
270            builder.append("\n");
271            name = cursor.getString(mArtistIdx);
272            if (name == null || name.equals(MediaStore.UNKNOWN_STRING)) {
273                builder.append(context.getString(R.string.unknown_artist_name));
274            } else {
275                builder.append(name);
276            }
277            tv.setText(builder.toString());
278
279            String text = cursor.getString(mMimeIdx);
280            ImageView iv = (ImageView) view.findViewById(R.id.icon);;
281            if("audio/midi".equals(text)) {
282                iv.setImageResource(R.drawable.midi);
283            } else if(text != null && (text.startsWith("audio") ||
284                    text.equals("application/ogg") ||
285                    text.equals("application/x-ogg"))) {
286                iv.setImageResource(R.drawable.ic_search_category_music_song);
287            } else if(text != null && text.startsWith("video")) {
288                iv.setImageResource(R.drawable.movie);
289            } else {
290                iv.setImageResource(0);
291            }
292        }
293    }
294}
295