blob: fccee6d78287e72e7cdd7d6bd6abe92d900eb4cc [file] [log] [blame]
The Android Open Source Project792a2202009-03-03 19:32:30 -08001/*
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
Jack Hef02d3c62017-02-21 00:39:22 -050019import android.app.Activity;
The Android Open Source Project792a2202009-03-03 19:32:30 -080020import android.app.ListActivity;
Jack Hef02d3c62017-02-21 00:39:22 -050021import android.content.*;
The Android Open Source Project792a2202009-03-03 19:32:30 -080022import android.database.Cursor;
Marco Nelissen9825b3c2010-01-04 16:55:00 -080023import android.database.MatrixCursor;
The Android Open Source Project792a2202009-03-03 19:32:30 -080024import android.database.MergeCursor;
25import android.database.sqlite.SQLiteException;
26import android.media.AudioManager;
Jack Hef02d3c62017-02-21 00:39:22 -050027import android.media.MediaDescription;
28import android.media.MediaMetadata;
29import android.media.browse.MediaBrowser;
30import android.media.session.MediaController;
31import android.media.session.MediaSession;
The Android Open Source Project792a2202009-03-03 19:32:30 -080032import android.net.Uri;
33import android.os.Bundle;
The Android Open Source Project792a2202009-03-03 19:32:30 -080034import android.provider.MediaStore;
35import android.util.Log;
Jack Hef02d3c62017-02-21 00:39:22 -050036import android.view.LayoutInflater;
The Android Open Source Project792a2202009-03-03 19:32:30 -080037import android.view.View;
38import android.view.ViewGroup;
39import android.view.Window;
Jack Hef02d3c62017-02-21 00:39:22 -050040import android.widget.*;
41import com.android.music.utils.LogHelper;
42import com.android.music.utils.MediaIDHelper;
The Android Open Source Project792a2202009-03-03 19:32:30 -080043
Marco Nelissen9825b3c2010-01-04 16:55:00 -080044import java.text.Collator;
45import java.util.ArrayList;
Jack Hef02d3c62017-02-21 00:39:22 -050046import java.util.List;
Marco Nelissen9825b3c2010-01-04 16:55:00 -080047
Jack Heb0fba8b2017-01-26 15:54:38 -080048public class PlaylistBrowserActivity
Jack Hef02d3c62017-02-21 00:39:22 -050049 extends ListActivity implements View.OnCreateContextMenuListener {
50 private static final String TAG = LogHelper.makeLogTag(PlaylistBrowserActivity.class);
The Android Open Source Project792a2202009-03-03 19:32:30 -080051 private PlaylistListAdapter mAdapter;
52 boolean mAdapterSent;
Jack Hef02d3c62017-02-21 00:39:22 -050053 private static final MediaBrowser.MediaItem DEFAULT_PARENT_ITEM = new MediaBrowser.MediaItem(
54 new MediaDescription.Builder()
55 .setMediaId(MediaIDHelper.MEDIA_ID_MUSICS_BY_PLAYLIST)
56 .setTitle("Playlists")
57 .build(),
58 MediaBrowser.MediaItem.FLAG_BROWSABLE);
The Android Open Source Project792a2202009-03-03 19:32:30 -080059
Jack Hef02d3c62017-02-21 00:39:22 -050060 private MediaBrowser mMediaBrowser;
61 private MediaBrowser.MediaItem mParentItem;
The Android Open Source Project792a2202009-03-03 19:32:30 -080062
63 /** Called when the activity is first created. */
64 @Override
Jack Heb0fba8b2017-01-26 15:54:38 -080065 public void onCreate(Bundle icicle) {
The Android Open Source Project792a2202009-03-03 19:32:30 -080066 super.onCreate(icicle);
Jack Hef02d3c62017-02-21 00:39:22 -050067 LogHelper.d(TAG, "onCreate()");
68 // Process past states
69 Intent intent = getIntent();
70 if (icicle != null) {
71 LogHelper.d(TAG, "Launch by saved instance state");
72 mParentItem = icicle.getParcelable(MusicUtils.TAG_PARENT_ITEM);
73 MusicUtils.updateNowPlaying(this);
74 } else if (intent != null) {
75 LogHelper.d(TAG, "Launch by intent");
76 mParentItem = intent.getExtras().getParcelable(MusicUtils.TAG_PARENT_ITEM);
The Android Open Source Project792a2202009-03-03 19:32:30 -080077 }
Jack Hef02d3c62017-02-21 00:39:22 -050078 if (mParentItem == null) {
79 LogHelper.d(TAG, "Launch by default parameters");
80 mParentItem = DEFAULT_PARENT_ITEM;
81 }
Marco Nelissenec0c57a2009-12-12 12:27:11 -080082 requestWindowFeature(Window.FEATURE_NO_TITLE);
The Android Open Source Project792a2202009-03-03 19:32:30 -080083 setVolumeControlStream(AudioManager.STREAM_MUSIC);
The Android Open Source Project792a2202009-03-03 19:32:30 -080084
Jack Hef02d3c62017-02-21 00:39:22 -050085 setTitle(R.string.playlists_title);
The Android Open Source Project792a2202009-03-03 19:32:30 -080086 setContentView(R.layout.media_picker_activity);
Marco Nelissenec0c57a2009-12-12 12:27:11 -080087 MusicUtils.updateButtonBar(this, R.id.playlisttab);
The Android Open Source Project792a2202009-03-03 19:32:30 -080088 ListView lv = getListView();
89 lv.setOnCreateContextMenuListener(this);
90 lv.setTextFilterEnabled(true);
91
92 mAdapter = (PlaylistListAdapter) getLastNonConfigurationInstance();
93 if (mAdapter == null) {
Jack Heb0fba8b2017-01-26 15:54:38 -080094 // Log.i("@@@", "starting query");
Jack Hef02d3c62017-02-21 00:39:22 -050095 mAdapter = new PlaylistListAdapter(this, R.layout.track_list_item);
The Android Open Source Project792a2202009-03-03 19:32:30 -080096 setTitle(R.string.working_playlists);
The Android Open Source Project792a2202009-03-03 19:32:30 -080097 } else {
98 mAdapter.setActivity(this);
The Android Open Source Project792a2202009-03-03 19:32:30 -080099 }
Jack Hef02d3c62017-02-21 00:39:22 -0500100 setListAdapter(mAdapter);
101 Log.d(TAG, "Creating MediaBrowser");
102 mMediaBrowser = new MediaBrowser(this, new ComponentName(this, MediaPlaybackService.class),
103 mConnectionCallback, null);
The Android Open Source Project792a2202009-03-03 19:32:30 -0800104 }
Jack Heb0fba8b2017-01-26 15:54:38 -0800105
The Android Open Source Project792a2202009-03-03 19:32:30 -0800106 @Override
107 public Object onRetainNonConfigurationInstance() {
108 PlaylistListAdapter a = mAdapter;
109 mAdapterSent = true;
110 return a;
111 }
Jack Heb0fba8b2017-01-26 15:54:38 -0800112
The Android Open Source Project792a2202009-03-03 19:32:30 -0800113 @Override
114 public void onDestroy() {
Marco Nelissen0164ebf2009-08-13 09:58:43 -0700115 setListAdapter(null);
116 mAdapter = null;
The Android Open Source Project792a2202009-03-03 19:32:30 -0800117 super.onDestroy();
118 }
Jack Heb0fba8b2017-01-26 15:54:38 -0800119
The Android Open Source Project792a2202009-03-03 19:32:30 -0800120 @Override
121 public void onResume() {
122 super.onResume();
The Android Open Source Project792a2202009-03-03 19:32:30 -0800123 }
Jack Hef02d3c62017-02-21 00:39:22 -0500124
The Android Open Source Project792a2202009-03-03 19:32:30 -0800125 @Override
126 public void onPause() {
The Android Open Source Project792a2202009-03-03 19:32:30 -0800127 super.onPause();
128 }
Jack Hef02d3c62017-02-21 00:39:22 -0500129
130 @Override
131 public void onStart() {
132 Log.d(TAG, "onStart()");
133 super.onStart();
134 mMediaBrowser.connect();
135 }
136
137 @Override
138 public void onStop() {
139 Log.d(TAG, "onStop()");
140 super.onStop();
141 mMediaBrowser.disconnect();
142 }
143
144 private MediaBrowser.SubscriptionCallback mSubscriptionCallback =
145 new MediaBrowser.SubscriptionCallback() {
146
147 @Override
148 public void onChildrenLoaded(
149 String parentId, List<MediaBrowser.MediaItem> children) {
150 mAdapter.clear();
151 mAdapter.notifyDataSetInvalidated();
152 for (MediaBrowser.MediaItem item : children) {
153 mAdapter.add(item);
154 }
155 mAdapter.notifyDataSetChanged();
156 }
157
158 @Override
159 public void onError(String id) {
160 Toast.makeText(getApplicationContext(), R.string.error_loading_media,
161 Toast.LENGTH_LONG)
162 .show();
163 }
164 };
165
166 private MediaBrowser.ConnectionCallback mConnectionCallback =
167 new MediaBrowser.ConnectionCallback() {
168 @Override
169 public void onConnected() {
170 Log.d(TAG, "onConnected: session token " + mMediaBrowser.getSessionToken());
171 mMediaBrowser.subscribe(mParentItem.getMediaId(), mSubscriptionCallback);
172 if (mMediaBrowser.getSessionToken() == null) {
173 throw new IllegalArgumentException("No Session token");
174 }
175 MediaController mediaController = new MediaController(
176 PlaylistBrowserActivity.this, mMediaBrowser.getSessionToken());
177 mediaController.registerCallback(mMediaControllerCallback);
178 PlaylistBrowserActivity.this.setMediaController(mediaController);
179 if (mediaController.getMetadata() != null) {
180 MusicUtils.updateNowPlaying(PlaylistBrowserActivity.this);
181 }
182 }
183
184 @Override
185 public void onConnectionFailed() {
186 Log.d(TAG, "onConnectionFailed");
187 }
188
189 @Override
190 public void onConnectionSuspended() {
191 Log.d(TAG, "onConnectionSuspended");
192 PlaylistBrowserActivity.this.setMediaController(null);
193 }
194 };
195
196 private MediaController.Callback mMediaControllerCallback = new MediaController.Callback() {
The Android Open Source Project792a2202009-03-03 19:32:30 -0800197 @Override
Jack Hef02d3c62017-02-21 00:39:22 -0500198 public void onMetadataChanged(MediaMetadata metadata) {
199 super.onMetadataChanged(metadata);
200 MusicUtils.updateNowPlaying(PlaylistBrowserActivity.this);
The Android Open Source Project792a2202009-03-03 19:32:30 -0800201 }
202 };
Jack Heb0fba8b2017-01-26 15:54:38 -0800203
Jack Hef02d3c62017-02-21 00:39:22 -0500204 private class PlaylistListAdapter extends ArrayAdapter<MediaBrowser.MediaItem> {
205 private int mLayoutId;
206 private Activity mActivity;
The Android Open Source Project792a2202009-03-03 19:32:30 -0800207
Jack Hef02d3c62017-02-21 00:39:22 -0500208 PlaylistListAdapter(PlaylistBrowserActivity currentactivity, int layout) {
209 super(currentactivity, layout);
The Android Open Source Project792a2202009-03-03 19:32:30 -0800210 mActivity = currentactivity;
Jack Hef02d3c62017-02-21 00:39:22 -0500211 mLayoutId = layout;
The Android Open Source Project792a2202009-03-03 19:32:30 -0800212 }
Jack Hef02d3c62017-02-21 00:39:22 -0500213
214 private class ViewHolder {
215 TextView line1;
216 TextView line2;
217 ImageView icon;
218 ImageView play_indicator;
The Android Open Source Project792a2202009-03-03 19:32:30 -0800219 }
220
221 public void setActivity(PlaylistBrowserActivity newactivity) {
222 mActivity = newactivity;
223 }
Jack Heb0fba8b2017-01-26 15:54:38 -0800224
The Android Open Source Project792a2202009-03-03 19:32:30 -0800225 @Override
Jack Hef02d3c62017-02-21 00:39:22 -0500226 public View getView(int position, View convertView, ViewGroup parent) {
227 if (convertView == null) {
228 convertView = LayoutInflater.from(getContext()).inflate(mLayoutId, parent, false);
229 ViewHolder vhx = new ViewHolder();
230 vhx.line1 = (TextView) convertView.findViewById(R.id.line1);
231 vhx.line2 = (TextView) convertView.findViewById(R.id.line2);
232 vhx.icon = (ImageView) convertView.findViewById(R.id.icon);
233 vhx.play_indicator = (ImageView) convertView.findViewById(R.id.play_indicator);
234 convertView.setTag(vhx);
The Android Open Source Project792a2202009-03-03 19:32:30 -0800235 }
Jack Hef02d3c62017-02-21 00:39:22 -0500236 ViewHolder vh = (ViewHolder) convertView.getTag();
237 MediaBrowser.MediaItem item = getItem(position);
238 vh.line1.setText(item.getDescription().getTitle());
239 vh.line2.setVisibility(View.GONE);
240 vh.play_indicator.setVisibility(View.GONE);
241 vh.icon.setImageResource(R.drawable.ic_mp_playlist_list);
242 ViewGroup.LayoutParams p = vh.icon.getLayoutParams();
The Android Open Source Project792a2202009-03-03 19:32:30 -0800243 p.width = ViewGroup.LayoutParams.WRAP_CONTENT;
244 p.height = ViewGroup.LayoutParams.WRAP_CONTENT;
Jack Hef02d3c62017-02-21 00:39:22 -0500245 return convertView;
The Android Open Source Project792a2202009-03-03 19:32:30 -0800246 }
247 }
Jack Heb0fba8b2017-01-26 15:54:38 -0800248
Jack Hef02d3c62017-02-21 00:39:22 -0500249 @Override
250 protected void onListItemClick(ListView l, View v, int position, long id) {
251 MediaBrowser.MediaItem item = mAdapter.getItem(position);
252 Intent intent = new Intent(Intent.ACTION_PICK);
253 intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/track");
254 intent.putExtra(MusicUtils.TAG_PARENT_ITEM, item);
255 startActivity(intent);
256 }
The Android Open Source Project792a2202009-03-03 19:32:30 -0800257}