MediaPickerActivity.java revision 6cb8bc92e0ca524a76a6fa3f6814b43ea9a3b30d
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 com.android.internal.database.SortCursor; 20 21import android.app.ListActivity; 22import android.content.Context; 23import android.content.Intent; 24import android.content.ContentUris; 25import android.database.Cursor; 26import android.media.MediaFile; 27import android.net.Uri; 28import android.os.Bundle; 29import android.os.RemoteException; 30import android.provider.MediaStore; 31import android.view.View; 32import android.view.ViewGroup; 33import android.widget.ImageView; 34import android.widget.ListView; 35import android.widget.SimpleCursorAdapter; 36import android.widget.TextView; 37 38import java.util.ArrayList; 39 40public class MediaPickerActivity extends ListActivity implements MusicUtils.Defs 41{ 42 43 public MediaPickerActivity() 44 { 45 } 46 47 /** Called when the activity is first created. */ 48 @Override 49 public void onCreate(Bundle icicle) 50 { 51 super.onCreate(icicle); 52 53 mFirstYear = getIntent().getStringExtra("firstyear"); 54 mLastYear = getIntent().getStringExtra("lastyear"); 55 56 if (mFirstYear == null) { 57 setTitle(R.string.all_title); 58 } else if (mFirstYear.equals(mLastYear)) { 59 setTitle(mFirstYear); 60 } else { 61 setTitle(mFirstYear + "-" + mLastYear); 62 } 63 MusicUtils.bindToService(this); 64 init(); 65 } 66 67 @Override 68 public void onDestroy() { 69 MusicUtils.unbindFromService(this); 70 super.onDestroy(); 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.getColumnIndex(MediaStore.Audio.Media.MIME_TYPE)); 97 98 String action = getIntent().getAction(); 99 if (Intent.ACTION_GET_CONTENT.equals(action)) { 100 Uri uri; 101 102 long mediaId; 103 if (type.startsWith("video")) { 104 uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 105 mediaId = mCursor.getLong(mCursor.getColumnIndex(MediaStore.Video.Media._ID)); 106 } else { 107 uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 108 mediaId = mCursor.getLong(mCursor.getColumnIndex(MediaStore.Audio.Media._ID)); 109 } 110 111 setResult(RESULT_OK, new Intent().setData(ContentUris.withAppendedId(uri, mediaId))); 112 finish(); 113 return; 114 } 115 116 // Need to stop the playbackservice, in case it is busy playing audio 117 // and the user selected a video. 118 if (MusicUtils.sService != null) { 119 try { 120 MusicUtils.sService.stop(); 121 } catch (RemoteException ex) { 122 } 123 } 124 Intent intent = new Intent(Intent.ACTION_VIEW); 125 intent.setDataAndType(ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id), type); 126 127 startActivity(intent); 128 } 129 130 private void MakeCursor() { 131 String[] audiocols = new String[] { 132 MediaStore.Audio.Media._ID, 133 MediaStore.Audio.Media.ARTIST, 134 MediaStore.Audio.Media.ALBUM, 135 MediaStore.Audio.Media.TITLE, 136 MediaStore.Audio.Media.DATA, 137 MediaStore.Audio.Media.MIME_TYPE, 138 MediaStore.Audio.Media.YEAR 139 }; 140 String[] videocols = new String[] { 141 MediaStore.Audio.Media._ID, 142 MediaStore.Audio.Media.TITLE, 143 MediaStore.Audio.Media.ARTIST, 144 MediaStore.Audio.Media.ALBUM, 145 MediaStore.Audio.Media.TITLE, 146 MediaStore.Audio.Media.DATA, 147 MediaStore.Audio.Media.MIME_TYPE 148 }; 149 150 Cursor[] cs; 151 // Use ArrayList for the moment, since we don't know the size of 152 // Cursor[]. If the length of Corsor[] larger than really used, 153 // a NPE will come up when access the content of Corsor[]. 154 ArrayList<Cursor> cList = new ArrayList<Cursor>(); 155 Intent intent = getIntent(); 156 String type = intent.getType(); 157 158 if (mFirstYear != null) { 159 // If mFirstYear is not null, the picker only for audio because 160 // video has no year column. 161 if(type.equals("video/*")) { 162 mCursor = null; 163 return; 164 } 165 166 mWhereClause = MediaStore.Audio.Media.YEAR + ">=" + mFirstYear + " AND " + 167 MediaStore.Audio.Media.YEAR + "<=" + mLastYear; 168 } 169 170 // If use Cursor[] as before, the Cursor[i] could be null when there is 171 // no video/audio/sdcard. Then a NPE will come up when access the content of the 172 // Array. 173 174 Cursor c; 175 if (type.equals("video/*")) { 176 // Only video. 177 c = MusicUtils.query(this, MediaStore.Video.Media.EXTERNAL_CONTENT_URI, 178 videocols, null , null, mSortOrder); 179 if (c != null) { 180 cList.add(c); 181 } 182 } else { 183 c = MusicUtils.query(this, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 184 audiocols, mWhereClause , null, mSortOrder); 185 186 if (c != null) { 187 cList.add(c); 188 } 189 190 if (mFirstYear == null && intent.getType().equals("media/*")) { 191 // video has no year column 192 c = MusicUtils.query(this, MediaStore.Video.Media.EXTERNAL_CONTENT_URI, 193 videocols, null , null, mSortOrder); 194 if (c != null) { 195 cList.add(c); 196 } 197 } 198 } 199 200 // Get the ArrayList size. 201 int size = cList.size(); 202 if (0 == size) { 203 // If no video/audio/SDCard exist, return. 204 mCursor = null; 205 return; 206 } 207 208 // The size is known now, we're sure each item of Cursor[] is not null. 209 cs = new Cursor[size]; 210 cs = cList.toArray(cs); 211 mCursor = new SortCursor(cs, MediaStore.Audio.Media.TITLE); 212 } 213 214 private Cursor mCursor; 215 private String mSortOrder = MediaStore.Audio.Media.TITLE + " COLLATE UNICODE"; 216 private String mFirstYear; 217 private String mLastYear; 218 private String mWhereClause; 219 220 class PickListAdapter extends SimpleCursorAdapter { 221 int mTitleIdx; 222 int mArtistIdx; 223 int mAlbumIdx; 224 int mMimeIdx; 225 226 PickListAdapter(Context context, int layout, Cursor cursor, String[] from, int[] to) { 227 super(context, layout, cursor, from, to); 228 229 mTitleIdx = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE); 230 mArtistIdx = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST); 231 mAlbumIdx = cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM); 232 mMimeIdx = cursor.getColumnIndex(MediaStore.Audio.Media.MIME_TYPE); 233 } 234 235 @Override 236 public View newView(Context context, Cursor cursor, ViewGroup parent) { 237 View v = super.newView(context, cursor, parent); 238 ImageView iv = (ImageView) v.findViewById(R.id.icon); 239 iv.setVisibility(View.VISIBLE); 240 ViewGroup.LayoutParams p = iv.getLayoutParams(); 241 p.width = ViewGroup.LayoutParams.WRAP_CONTENT; 242 p.height = ViewGroup.LayoutParams.WRAP_CONTENT; 243 244 TextView tv = (TextView) v.findViewById(R.id.duration); 245 tv.setVisibility(View.GONE); 246 iv = (ImageView) v.findViewById(R.id.play_indicator); 247 iv.setVisibility(View.GONE); 248 249 return v; 250 } 251 252 @Override 253 public void bindView(View view, Context context, Cursor cursor) { 254 255 TextView tv = (TextView) view.findViewById(R.id.line1); 256 String name = cursor.getString(mTitleIdx); 257 tv.setText(name); 258 259 tv = (TextView) view.findViewById(R.id.line2); 260 name = cursor.getString(mAlbumIdx); 261 StringBuilder builder = new StringBuilder(); 262 if (name == null || name.equals(MediaFile.UNKNOWN_STRING)) { 263 builder.append(context.getString(R.string.unknown_album_name)); 264 } else { 265 builder.append(name); 266 } 267 builder.append("\n"); 268 name = cursor.getString(mArtistIdx); 269 if (name == null || name.equals(MediaFile.UNKNOWN_STRING)) { 270 builder.append(context.getString(R.string.unknown_artist_name)); 271 } else { 272 builder.append(name); 273 } 274 tv.setText(builder.toString()); 275 276 String text = cursor.getString(mMimeIdx); 277 ImageView iv = (ImageView) view.findViewById(R.id.icon);; 278 if("audio/midi".equals(text)) { 279 iv.setImageResource(R.drawable.midi); 280 } else if(text != null && (text.startsWith("audio") || 281 text.equals("application/ogg") || 282 text.equals("application/x-ogg"))) { 283 iv.setImageResource(R.drawable.ic_search_category_music_song); 284 } else if(text != null && text.startsWith("video")) { 285 iv.setImageResource(R.drawable.movie); 286 } else { 287 iv.setImageResource(0); 288 } 289 } 290 } 291} 292