278 lines
10 KiB
Java
278 lines
10 KiB
Java
/*
|
|
* Copyright (C) 2007 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.music;
|
|
|
|
import com.android.music.MusicUtils.ServiceToken;
|
|
|
|
import android.app.ListActivity;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.content.ContentUris;
|
|
import android.database.Cursor;
|
|
import android.net.Uri;
|
|
import android.os.Bundle;
|
|
import android.os.RemoteException;
|
|
import android.provider.MediaStore;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.ImageView;
|
|
import android.widget.ListView;
|
|
import android.widget.SimpleCursorAdapter;
|
|
import android.widget.TextView;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
public class MediaPickerActivity extends ListActivity implements MusicUtils.Defs {
|
|
private ServiceToken mToken;
|
|
|
|
public MediaPickerActivity() {}
|
|
|
|
/** Called when the activity is first created. */
|
|
@Override
|
|
public void onCreate(Bundle icicle) {
|
|
super.onCreate(icicle);
|
|
|
|
mFirstYear = getIntent().getStringExtra("firstyear");
|
|
mLastYear = getIntent().getStringExtra("lastyear");
|
|
|
|
if (mFirstYear == null) {
|
|
setTitle(R.string.all_title);
|
|
} else if (mFirstYear.equals(mLastYear)) {
|
|
setTitle(mFirstYear);
|
|
} else {
|
|
setTitle(mFirstYear + "-" + mLastYear);
|
|
}
|
|
mToken = MusicUtils.bindToService(this);
|
|
init();
|
|
}
|
|
|
|
@Override
|
|
public void onDestroy() {
|
|
MusicUtils.unbindFromService(mToken);
|
|
super.onDestroy();
|
|
if (mCursor != null) {
|
|
mCursor.close();
|
|
}
|
|
}
|
|
|
|
public void init() {
|
|
setContentView(R.layout.media_picker_activity);
|
|
|
|
MakeCursor();
|
|
if (null == mCursor || 0 == mCursor.getCount()) {
|
|
return;
|
|
}
|
|
|
|
PickListAdapter adapter = new PickListAdapter(
|
|
this, R.layout.track_list_item, mCursor, new String[] {}, new int[] {});
|
|
|
|
setListAdapter(adapter);
|
|
}
|
|
|
|
@Override
|
|
protected void onListItemClick(ListView l, View v, int position, long id) {
|
|
mCursor.moveToPosition(position);
|
|
String type =
|
|
mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.MIME_TYPE));
|
|
|
|
String action = getIntent().getAction();
|
|
if (Intent.ACTION_GET_CONTENT.equals(action)) {
|
|
Uri uri;
|
|
|
|
long mediaId;
|
|
if (type.startsWith("video")) {
|
|
uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
|
|
mediaId =
|
|
mCursor.getLong(mCursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));
|
|
} else {
|
|
uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
|
|
mediaId =
|
|
mCursor.getLong(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
|
|
}
|
|
|
|
setResult(RESULT_OK, new Intent().setData(ContentUris.withAppendedId(uri, mediaId)));
|
|
finish();
|
|
return;
|
|
}
|
|
|
|
// Need to stop the playbackservice, in case it is busy playing audio
|
|
// and the user selected a video.
|
|
if (MusicUtils.sService != null) {
|
|
try {
|
|
MusicUtils.sService.stop();
|
|
} catch (RemoteException ex) {
|
|
}
|
|
}
|
|
Intent intent = new Intent(Intent.ACTION_VIEW);
|
|
intent.setDataAndType(
|
|
ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id), type);
|
|
|
|
startActivity(intent);
|
|
}
|
|
|
|
private void MakeCursor() {
|
|
String[] audiocols = new String[] {MediaStore.Audio.Media._ID,
|
|
MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,
|
|
MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA,
|
|
MediaStore.Audio.Media.MIME_TYPE, MediaStore.Audio.Media.YEAR};
|
|
String[] videocols = new String[] {MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE,
|
|
MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,
|
|
MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA,
|
|
MediaStore.Audio.Media.MIME_TYPE};
|
|
|
|
Cursor[] cs;
|
|
// Use ArrayList for the moment, since we don't know the size of
|
|
// Cursor[]. If the length of Corsor[] larger than really used,
|
|
// a NPE will come up when access the content of Corsor[].
|
|
ArrayList<Cursor> cList = new ArrayList<Cursor>();
|
|
Intent intent = getIntent();
|
|
String type = intent.getType();
|
|
|
|
if (mFirstYear != null) {
|
|
// If mFirstYear is not null, the picker only for audio because
|
|
// video has no year column.
|
|
if (type.equals("video/*")) {
|
|
mCursor = null;
|
|
return;
|
|
}
|
|
|
|
mWhereClause = MediaStore.Audio.Media.YEAR + ">=" + mFirstYear + " AND "
|
|
+ MediaStore.Audio.Media.YEAR + "<=" + mLastYear;
|
|
}
|
|
|
|
// If use Cursor[] as before, the Cursor[i] could be null when there is
|
|
// no video/audio/sdcard. Then a NPE will come up when access the content of the
|
|
// Array.
|
|
|
|
Cursor c;
|
|
if (type.equals("video/*")) {
|
|
// Only video.
|
|
c = MusicUtils.query(this, MediaStore.Video.Media.EXTERNAL_CONTENT_URI, videocols, null,
|
|
null, mSortOrder);
|
|
if (c != null) {
|
|
cList.add(c);
|
|
}
|
|
} else {
|
|
c = MusicUtils.query(this, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, audiocols,
|
|
mWhereClause, null, mSortOrder);
|
|
|
|
if (c != null) {
|
|
cList.add(c);
|
|
}
|
|
|
|
if (mFirstYear == null && intent.getType().equals("media/*")) {
|
|
// video has no year column
|
|
c = MusicUtils.query(this, MediaStore.Video.Media.EXTERNAL_CONTENT_URI, videocols,
|
|
null, null, mSortOrder);
|
|
if (c != null) {
|
|
cList.add(c);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Get the ArrayList size.
|
|
int size = cList.size();
|
|
if (0 == size) {
|
|
// If no video/audio/SDCard exist, return.
|
|
mCursor = null;
|
|
return;
|
|
}
|
|
|
|
// The size is known now, we're sure each item of Cursor[] is not null.
|
|
cs = new Cursor[size];
|
|
cs = cList.toArray(cs);
|
|
mCursor = new SortCursor(cs, MediaStore.Audio.Media.TITLE);
|
|
}
|
|
|
|
private Cursor mCursor;
|
|
private String mSortOrder = MediaStore.Audio.Media.TITLE + " COLLATE UNICODE";
|
|
private String mFirstYear;
|
|
private String mLastYear;
|
|
private String mWhereClause;
|
|
|
|
static class PickListAdapter extends SimpleCursorAdapter {
|
|
int mTitleIdx;
|
|
int mArtistIdx;
|
|
int mAlbumIdx;
|
|
int mMimeIdx;
|
|
|
|
PickListAdapter(Context context, int layout, Cursor cursor, String[] from, int[] to) {
|
|
super(context, layout, cursor, from, to);
|
|
|
|
mTitleIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE);
|
|
mArtistIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST);
|
|
mAlbumIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM);
|
|
mMimeIdx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.MIME_TYPE);
|
|
}
|
|
|
|
@Override
|
|
public View newView(Context context, Cursor cursor, ViewGroup parent) {
|
|
View v = super.newView(context, cursor, parent);
|
|
ImageView iv = (ImageView) v.findViewById(R.id.icon);
|
|
iv.setVisibility(View.VISIBLE);
|
|
ViewGroup.LayoutParams p = iv.getLayoutParams();
|
|
p.width = ViewGroup.LayoutParams.WRAP_CONTENT;
|
|
p.height = ViewGroup.LayoutParams.WRAP_CONTENT;
|
|
|
|
TextView tv = (TextView) v.findViewById(R.id.duration);
|
|
tv.setVisibility(View.GONE);
|
|
iv = (ImageView) v.findViewById(R.id.play_indicator);
|
|
iv.setVisibility(View.GONE);
|
|
|
|
return v;
|
|
}
|
|
|
|
@Override
|
|
public void bindView(View view, Context context, Cursor cursor) {
|
|
TextView tv = (TextView) view.findViewById(R.id.line1);
|
|
String name = cursor.getString(mTitleIdx);
|
|
tv.setText(name);
|
|
|
|
tv = (TextView) view.findViewById(R.id.line2);
|
|
name = cursor.getString(mAlbumIdx);
|
|
StringBuilder builder = new StringBuilder();
|
|
if (name == null || name.equals(MediaStore.UNKNOWN_STRING)) {
|
|
builder.append(context.getString(R.string.unknown_album_name));
|
|
} else {
|
|
builder.append(name);
|
|
}
|
|
builder.append("\n");
|
|
name = cursor.getString(mArtistIdx);
|
|
if (name == null || name.equals(MediaStore.UNKNOWN_STRING)) {
|
|
builder.append(context.getString(R.string.unknown_artist_name));
|
|
} else {
|
|
builder.append(name);
|
|
}
|
|
tv.setText(builder.toString());
|
|
|
|
String text = cursor.getString(mMimeIdx);
|
|
ImageView iv = (ImageView) view.findViewById(R.id.icon);
|
|
;
|
|
if ("audio/midi".equals(text)) {
|
|
iv.setImageResource(R.drawable.midi);
|
|
} else if (text != null && (text.startsWith("audio") || text.equals("application/ogg")
|
|
|| text.equals("application/x-ogg"))) {
|
|
iv.setImageResource(R.drawable.ic_search_category_music_song);
|
|
} else if (text != null && text.startsWith("video")) {
|
|
iv.setImageResource(R.drawable.movie);
|
|
} else {
|
|
iv.setImageResource(0);
|
|
}
|
|
}
|
|
}
|
|
}
|