am a38ba1d9: (-s ours) Import revised translations.  DO NOT MERGE

Merge commit 'a38ba1d91492cb46740043c732c8eac5d65788a6' into eclair

* commit 'a38ba1d91492cb46740043c732c8eac5d65788a6':
  Import revised translations.  DO NOT MERGE
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 7659377..8b8bbfc 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -27,17 +27,17 @@
         android:label="@string/musicbrowserlabel"
         android:taskAffinity="android.task.music"
         android:allowTaskReparenting="true">
+        <meta-data
+            android:name="android.app.default_searchable"
+            android:value=".QueryBrowserActivity"
+        />
         <activity android:name="MusicBrowserActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
-             <meta-data
-                android:name="android.app.default_searchable"
-                android:value=".QueryBrowserActivity"
-             /> 
-       </activity>
+        </activity>
         <receiver android:name="MediaButtonIntentReceiver">
             <intent-filter>
                 <action android:name="android.intent.action.MEDIA_BUTTON" />
@@ -123,6 +123,7 @@
                 android:theme="@android:style/Theme.NoTitleBar">
             <intent-filter>
                 <action android:name="android.intent.action.SEARCH" />
+                <action android:name="android.intent.action.MEDIA_SEARCH" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
             <meta-data
diff --git a/res/drawable-finger/appwidget_bg.9.png b/res/drawable-finger/appwidget_bg.9.png
deleted file mode 100644
index 688d131..0000000
--- a/res/drawable-finger/appwidget_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi-finger/album_border_large.9.png b/res/drawable-hdpi-finger/album_border_large.9.png
new file mode 100644
index 0000000..d31cce9
--- /dev/null
+++ b/res/drawable-hdpi-finger/album_border_large.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/albumart_mp_unknown.png b/res/drawable-hdpi-finger/albumart_mp_unknown.png
new file mode 100644
index 0000000..ab88184
--- /dev/null
+++ b/res/drawable-hdpi-finger/albumart_mp_unknown.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/albumart_mp_unknown_list.png b/res/drawable-hdpi-finger/albumart_mp_unknown_list.png
new file mode 100644
index 0000000..5c3a380
--- /dev/null
+++ b/res/drawable-hdpi-finger/albumart_mp_unknown_list.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/appwidget_bg.9.png b/res/drawable-hdpi-finger/appwidget_bg.9.png
new file mode 100644
index 0000000..6861664
--- /dev/null
+++ b/res/drawable-hdpi-finger/appwidget_bg.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/appwidget_inner.9.png b/res/drawable-hdpi-finger/appwidget_inner.9.png
new file mode 100644
index 0000000..625ee46
--- /dev/null
+++ b/res/drawable-hdpi-finger/appwidget_inner.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/appwidget_next_focused.png b/res/drawable-hdpi-finger/appwidget_next_focused.png
new file mode 100644
index 0000000..cc9d9df
--- /dev/null
+++ b/res/drawable-hdpi-finger/appwidget_next_focused.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/appwidget_next_normal.png b/res/drawable-hdpi-finger/appwidget_next_normal.png
new file mode 100644
index 0000000..658f4f2
--- /dev/null
+++ b/res/drawable-hdpi-finger/appwidget_next_normal.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/appwidget_next_pressed.png b/res/drawable-hdpi-finger/appwidget_next_pressed.png
new file mode 100644
index 0000000..4110ac3
--- /dev/null
+++ b/res/drawable-hdpi-finger/appwidget_next_pressed.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/appwidget_pause_focused.png b/res/drawable-hdpi-finger/appwidget_pause_focused.png
new file mode 100644
index 0000000..4fb8cb6
--- /dev/null
+++ b/res/drawable-hdpi-finger/appwidget_pause_focused.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/appwidget_pause_normal.png b/res/drawable-hdpi-finger/appwidget_pause_normal.png
new file mode 100644
index 0000000..610aa3b
--- /dev/null
+++ b/res/drawable-hdpi-finger/appwidget_pause_normal.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/appwidget_pause_pressed.png b/res/drawable-hdpi-finger/appwidget_pause_pressed.png
new file mode 100644
index 0000000..7e1d55a
--- /dev/null
+++ b/res/drawable-hdpi-finger/appwidget_pause_pressed.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/appwidget_play_focused.png b/res/drawable-hdpi-finger/appwidget_play_focused.png
new file mode 100644
index 0000000..79c6b61
--- /dev/null
+++ b/res/drawable-hdpi-finger/appwidget_play_focused.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/appwidget_play_normal.png b/res/drawable-hdpi-finger/appwidget_play_normal.png
new file mode 100644
index 0000000..75622b8
--- /dev/null
+++ b/res/drawable-hdpi-finger/appwidget_play_normal.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/appwidget_play_pressed.png b/res/drawable-hdpi-finger/appwidget_play_pressed.png
new file mode 100644
index 0000000..1a8d227
--- /dev/null
+++ b/res/drawable-hdpi-finger/appwidget_play_pressed.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/btn_music_highlight.9.png b/res/drawable-hdpi-finger/btn_music_highlight.9.png
new file mode 100644
index 0000000..31ef51b
--- /dev/null
+++ b/res/drawable-hdpi-finger/btn_music_highlight.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/btn_music_normal.9.png b/res/drawable-hdpi-finger/btn_music_normal.9.png
new file mode 100644
index 0000000..48eec8b
--- /dev/null
+++ b/res/drawable-hdpi-finger/btn_music_normal.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/btn_music_pressed.9.png b/res/drawable-hdpi-finger/btn_music_pressed.9.png
new file mode 100644
index 0000000..755c525
--- /dev/null
+++ b/res/drawable-hdpi-finger/btn_music_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_menu_delete.png b/res/drawable-hdpi-finger/ic_menu_delete.png
new file mode 100644
index 0000000..13fe5e4
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_menu_delete.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_menu_music_library.png b/res/drawable-hdpi-finger/ic_menu_music_library.png
new file mode 100644
index 0000000..70a5915
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_menu_music_library.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_menu_party_shuffle.png b/res/drawable-hdpi-finger/ic_menu_party_shuffle.png
new file mode 100644
index 0000000..08bb20a
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_menu_party_shuffle.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_menu_playback.png b/res/drawable-hdpi-finger/ic_menu_playback.png
new file mode 100644
index 0000000..10af07f
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_menu_playback.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_menu_set_as_ringtone.png b/res/drawable-hdpi-finger/ic_menu_set_as_ringtone.png
new file mode 100644
index 0000000..6e4530d
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_menu_set_as_ringtone.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_menu_shuffle.png b/res/drawable-hdpi-finger/ic_menu_shuffle.png
new file mode 100644
index 0000000..22ee1d5
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_menu_shuffle.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_album_playback.png b/res/drawable-hdpi-finger/ic_mp_album_playback.png
new file mode 100644
index 0000000..bcdb405
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_album_playback.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_artist_list.png b/res/drawable-hdpi-finger/ic_mp_artist_list.png
new file mode 100644
index 0000000..6b82c3d
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_artist_list.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_artist_playback.png b/res/drawable-hdpi-finger/ic_mp_artist_playback.png
new file mode 100644
index 0000000..a90f03a
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_artist_playback.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_current_playlist_btn.png b/res/drawable-hdpi-finger/ic_mp_current_playlist_btn.png
new file mode 100644
index 0000000..b4353f5
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_current_playlist_btn.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_move.png b/res/drawable-hdpi-finger/ic_mp_move.png
new file mode 100644
index 0000000..ee9034b
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_move.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_partyshuffle_on_btn.png b/res/drawable-hdpi-finger/ic_mp_partyshuffle_on_btn.png
new file mode 100644
index 0000000..4370a24
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_partyshuffle_on_btn.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_playlist_list.png b/res/drawable-hdpi-finger/ic_mp_playlist_list.png
new file mode 100644
index 0000000..94dadf1
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_playlist_list.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_playlist_recently_added_list.png b/res/drawable-hdpi-finger/ic_mp_playlist_recently_added_list.png
new file mode 100644
index 0000000..3082e15
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_playlist_recently_added_list.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_repeat_all_btn.png b/res/drawable-hdpi-finger/ic_mp_repeat_all_btn.png
new file mode 100644
index 0000000..c2eb837
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_repeat_all_btn.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_repeat_off_btn.png b/res/drawable-hdpi-finger/ic_mp_repeat_off_btn.png
new file mode 100644
index 0000000..df41013
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_repeat_off_btn.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_repeat_once_btn.png b/res/drawable-hdpi-finger/ic_mp_repeat_once_btn.png
new file mode 100644
index 0000000..819eda2
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_repeat_once_btn.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_screen_albums.png b/res/drawable-hdpi-finger/ic_mp_screen_albums.png
new file mode 100644
index 0000000..c22c0fd
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_screen_albums.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_screen_artists.png b/res/drawable-hdpi-finger/ic_mp_screen_artists.png
new file mode 100644
index 0000000..1a3deef
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_screen_artists.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_screen_playlists.png b/res/drawable-hdpi-finger/ic_mp_screen_playlists.png
new file mode 100644
index 0000000..4cbe083
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_screen_playlists.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_screen_tracks.png b/res/drawable-hdpi-finger/ic_mp_screen_tracks.png
new file mode 100644
index 0000000..ebfa00c
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_screen_tracks.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_sd_card.png b/res/drawable-hdpi-finger/ic_mp_sd_card.png
new file mode 100644
index 0000000..fa05320
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_sd_card.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_shuffle_off_btn.png b/res/drawable-hdpi-finger/ic_mp_shuffle_off_btn.png
new file mode 100644
index 0000000..2ec500e
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_shuffle_off_btn.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_shuffle_on_btn.png b/res/drawable-hdpi-finger/ic_mp_shuffle_on_btn.png
new file mode 100644
index 0000000..c9ec3bf
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_shuffle_on_btn.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_song_list.png b/res/drawable-hdpi-finger/ic_mp_song_list.png
new file mode 100644
index 0000000..e86fdf3
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_song_list.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_mp_song_playback.png b/res/drawable-hdpi-finger/ic_mp_song_playback.png
new file mode 100644
index 0000000..3a609ca
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_mp_song_playback.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_search_category_music_song.png b/res/drawable-hdpi-finger/ic_search_category_music_song.png
new file mode 100644
index 0000000..182ac6a
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_search_category_music_song.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/ic_slide_keyboard.png b/res/drawable-hdpi-finger/ic_slide_keyboard.png
new file mode 100644
index 0000000..fc75cff
--- /dev/null
+++ b/res/drawable-hdpi-finger/ic_slide_keyboard.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/indicator_ic_mp_playing_large.png b/res/drawable-hdpi-finger/indicator_ic_mp_playing_large.png
new file mode 100644
index 0000000..4867510
--- /dev/null
+++ b/res/drawable-hdpi-finger/indicator_ic_mp_playing_large.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/indicator_ic_mp_playing_list.png b/res/drawable-hdpi-finger/indicator_ic_mp_playing_list.png
new file mode 100644
index 0000000..683c9ea
--- /dev/null
+++ b/res/drawable-hdpi-finger/indicator_ic_mp_playing_list.png
Binary files differ
diff --git a/res/drawable-hdpi-finger/stat_notify_musicplayer.png b/res/drawable-hdpi-finger/stat_notify_musicplayer.png
new file mode 100644
index 0000000..bfd3e6a
--- /dev/null
+++ b/res/drawable-hdpi-finger/stat_notify_musicplayer.png
Binary files differ
diff --git a/res/drawable-hdpi/app_music.png b/res/drawable-hdpi/app_music.png
new file mode 100644
index 0000000..545f0e4
--- /dev/null
+++ b/res/drawable-hdpi/app_music.png
Binary files differ
diff --git a/res/drawable-hdpi/app_video.png b/res/drawable-hdpi/app_video.png
new file mode 100644
index 0000000..6249d61
--- /dev/null
+++ b/res/drawable-hdpi/app_video.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_launcher_shortcut_music_playlist.png b/res/drawable-hdpi/ic_launcher_shortcut_music_playlist.png
new file mode 100644
index 0000000..910c654
--- /dev/null
+++ b/res/drawable-hdpi/ic_launcher_shortcut_music_playlist.png
Binary files differ
diff --git a/res/drawable-hdpi/midi.png b/res/drawable-hdpi/midi.png
new file mode 100644
index 0000000..9d3bf5b
--- /dev/null
+++ b/res/drawable-hdpi/midi.png
Binary files differ
diff --git a/res/drawable-hdpi/movie.png b/res/drawable-hdpi/movie.png
new file mode 100644
index 0000000..85a8a62
--- /dev/null
+++ b/res/drawable-hdpi/movie.png
Binary files differ
diff --git a/res/drawable-land-hdpi-finger/albumart_mp_unknown.png b/res/drawable-land-hdpi-finger/albumart_mp_unknown.png
new file mode 100644
index 0000000..8d1e861
--- /dev/null
+++ b/res/drawable-land-hdpi-finger/albumart_mp_unknown.png
Binary files differ
diff --git a/res/drawable-land-hdpi-finger/btn_music_highlight.9.png b/res/drawable-land-hdpi-finger/btn_music_highlight.9.png
new file mode 100644
index 0000000..fa12c42
--- /dev/null
+++ b/res/drawable-land-hdpi-finger/btn_music_highlight.9.png
Binary files differ
diff --git a/res/drawable-land-hdpi-finger/btn_music_normal.9.png b/res/drawable-land-hdpi-finger/btn_music_normal.9.png
new file mode 100644
index 0000000..4be02e6
--- /dev/null
+++ b/res/drawable-land-hdpi-finger/btn_music_normal.9.png
Binary files differ
diff --git a/res/drawable-land-hdpi-finger/btn_music_pressed.9.png b/res/drawable-land-hdpi-finger/btn_music_pressed.9.png
new file mode 100644
index 0000000..3cf8813
--- /dev/null
+++ b/res/drawable-land-hdpi-finger/btn_music_pressed.9.png
Binary files differ
diff --git a/res/drawable-land-finger/albumart_mp_unknown.png b/res/drawable-land-mdpi-finger/albumart_mp_unknown.png
similarity index 100%
rename from res/drawable-land-finger/albumart_mp_unknown.png
rename to res/drawable-land-mdpi-finger/albumart_mp_unknown.png
Binary files differ
diff --git a/res/drawable-land-finger/btn_music_highlight.9.png b/res/drawable-land-mdpi-finger/btn_music_highlight.9.png
similarity index 100%
rename from res/drawable-land-finger/btn_music_highlight.9.png
rename to res/drawable-land-mdpi-finger/btn_music_highlight.9.png
Binary files differ
diff --git a/res/drawable-land-finger/btn_music_normal.9.png b/res/drawable-land-mdpi-finger/btn_music_normal.9.png
similarity index 100%
rename from res/drawable-land-finger/btn_music_normal.9.png
rename to res/drawable-land-mdpi-finger/btn_music_normal.9.png
Binary files differ
diff --git a/res/drawable-land-finger/btn_music_pressed.9.png b/res/drawable-land-mdpi-finger/btn_music_pressed.9.png
similarity index 100%
rename from res/drawable-land-finger/btn_music_pressed.9.png
rename to res/drawable-land-mdpi-finger/btn_music_pressed.9.png
Binary files differ
diff --git a/res/drawable-finger/album_border_large.9.png b/res/drawable-mdpi-finger/album_border_large.9.png
similarity index 100%
rename from res/drawable-finger/album_border_large.9.png
rename to res/drawable-mdpi-finger/album_border_large.9.png
Binary files differ
diff --git a/res/drawable-finger/albumart_mp_unknown.png b/res/drawable-mdpi-finger/albumart_mp_unknown.png
similarity index 100%
rename from res/drawable-finger/albumart_mp_unknown.png
rename to res/drawable-mdpi-finger/albumart_mp_unknown.png
Binary files differ
diff --git a/res/drawable-finger/albumart_mp_unknown_list.png b/res/drawable-mdpi-finger/albumart_mp_unknown_list.png
similarity index 100%
rename from res/drawable-finger/albumart_mp_unknown_list.png
rename to res/drawable-mdpi-finger/albumart_mp_unknown_list.png
Binary files differ
diff --git a/res/drawable-mdpi-finger/appwidget_bg.9.png b/res/drawable-mdpi-finger/appwidget_bg.9.png
new file mode 100644
index 0000000..8e7e3d7
--- /dev/null
+++ b/res/drawable-mdpi-finger/appwidget_bg.9.png
Binary files differ
diff --git a/res/drawable-finger/appwidget_inner.9.png b/res/drawable-mdpi-finger/appwidget_inner.9.png
similarity index 100%
rename from res/drawable-finger/appwidget_inner.9.png
rename to res/drawable-mdpi-finger/appwidget_inner.9.png
Binary files differ
diff --git a/res/drawable-finger/appwidget_next_focused.png b/res/drawable-mdpi-finger/appwidget_next_focused.png
similarity index 100%
rename from res/drawable-finger/appwidget_next_focused.png
rename to res/drawable-mdpi-finger/appwidget_next_focused.png
Binary files differ
diff --git a/res/drawable-finger/appwidget_next_normal.png b/res/drawable-mdpi-finger/appwidget_next_normal.png
similarity index 100%
rename from res/drawable-finger/appwidget_next_normal.png
rename to res/drawable-mdpi-finger/appwidget_next_normal.png
Binary files differ
diff --git a/res/drawable-finger/appwidget_next_pressed.png b/res/drawable-mdpi-finger/appwidget_next_pressed.png
similarity index 100%
rename from res/drawable-finger/appwidget_next_pressed.png
rename to res/drawable-mdpi-finger/appwidget_next_pressed.png
Binary files differ
diff --git a/res/drawable-finger/appwidget_pause_focused.png b/res/drawable-mdpi-finger/appwidget_pause_focused.png
similarity index 100%
rename from res/drawable-finger/appwidget_pause_focused.png
rename to res/drawable-mdpi-finger/appwidget_pause_focused.png
Binary files differ
diff --git a/res/drawable-finger/appwidget_pause_normal.png b/res/drawable-mdpi-finger/appwidget_pause_normal.png
similarity index 100%
rename from res/drawable-finger/appwidget_pause_normal.png
rename to res/drawable-mdpi-finger/appwidget_pause_normal.png
Binary files differ
diff --git a/res/drawable-finger/appwidget_pause_pressed.png b/res/drawable-mdpi-finger/appwidget_pause_pressed.png
similarity index 100%
rename from res/drawable-finger/appwidget_pause_pressed.png
rename to res/drawable-mdpi-finger/appwidget_pause_pressed.png
Binary files differ
diff --git a/res/drawable-finger/appwidget_play_focused.png b/res/drawable-mdpi-finger/appwidget_play_focused.png
similarity index 100%
rename from res/drawable-finger/appwidget_play_focused.png
rename to res/drawable-mdpi-finger/appwidget_play_focused.png
Binary files differ
diff --git a/res/drawable-finger/appwidget_play_normal.png b/res/drawable-mdpi-finger/appwidget_play_normal.png
similarity index 100%
rename from res/drawable-finger/appwidget_play_normal.png
rename to res/drawable-mdpi-finger/appwidget_play_normal.png
Binary files differ
diff --git a/res/drawable-finger/appwidget_play_pressed.png b/res/drawable-mdpi-finger/appwidget_play_pressed.png
similarity index 100%
rename from res/drawable-finger/appwidget_play_pressed.png
rename to res/drawable-mdpi-finger/appwidget_play_pressed.png
Binary files differ
diff --git a/res/drawable-finger/btn_music_highlight.9.png b/res/drawable-mdpi-finger/btn_music_highlight.9.png
similarity index 100%
rename from res/drawable-finger/btn_music_highlight.9.png
rename to res/drawable-mdpi-finger/btn_music_highlight.9.png
Binary files differ
diff --git a/res/drawable-finger/btn_music_normal.9.png b/res/drawable-mdpi-finger/btn_music_normal.9.png
similarity index 100%
rename from res/drawable-finger/btn_music_normal.9.png
rename to res/drawable-mdpi-finger/btn_music_normal.9.png
Binary files differ
diff --git a/res/drawable-finger/btn_music_pressed.9.png b/res/drawable-mdpi-finger/btn_music_pressed.9.png
similarity index 100%
rename from res/drawable-finger/btn_music_pressed.9.png
rename to res/drawable-mdpi-finger/btn_music_pressed.9.png
Binary files differ
diff --git a/res/drawable-finger/ic_menu_delete.png b/res/drawable-mdpi-finger/ic_menu_delete.png
similarity index 100%
rename from res/drawable-finger/ic_menu_delete.png
rename to res/drawable-mdpi-finger/ic_menu_delete.png
Binary files differ
diff --git a/res/drawable-finger/ic_menu_music_library.png b/res/drawable-mdpi-finger/ic_menu_music_library.png
similarity index 100%
rename from res/drawable-finger/ic_menu_music_library.png
rename to res/drawable-mdpi-finger/ic_menu_music_library.png
Binary files differ
diff --git a/res/drawable-finger/ic_menu_party_shuffle.png b/res/drawable-mdpi-finger/ic_menu_party_shuffle.png
similarity index 100%
rename from res/drawable-finger/ic_menu_party_shuffle.png
rename to res/drawable-mdpi-finger/ic_menu_party_shuffle.png
Binary files differ
diff --git a/res/drawable-finger/ic_menu_playback.png b/res/drawable-mdpi-finger/ic_menu_playback.png
similarity index 100%
rename from res/drawable-finger/ic_menu_playback.png
rename to res/drawable-mdpi-finger/ic_menu_playback.png
Binary files differ
diff --git a/res/drawable-finger/ic_menu_set_as_ringtone.png b/res/drawable-mdpi-finger/ic_menu_set_as_ringtone.png
similarity index 100%
rename from res/drawable-finger/ic_menu_set_as_ringtone.png
rename to res/drawable-mdpi-finger/ic_menu_set_as_ringtone.png
Binary files differ
diff --git a/res/drawable-finger/ic_menu_shuffle.png b/res/drawable-mdpi-finger/ic_menu_shuffle.png
similarity index 100%
rename from res/drawable-finger/ic_menu_shuffle.png
rename to res/drawable-mdpi-finger/ic_menu_shuffle.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_album_playback.png b/res/drawable-mdpi-finger/ic_mp_album_playback.png
similarity index 100%
rename from res/drawable-finger/ic_mp_album_playback.png
rename to res/drawable-mdpi-finger/ic_mp_album_playback.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_artist_list.png b/res/drawable-mdpi-finger/ic_mp_artist_list.png
similarity index 100%
rename from res/drawable-finger/ic_mp_artist_list.png
rename to res/drawable-mdpi-finger/ic_mp_artist_list.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_artist_playback.png b/res/drawable-mdpi-finger/ic_mp_artist_playback.png
similarity index 100%
rename from res/drawable-finger/ic_mp_artist_playback.png
rename to res/drawable-mdpi-finger/ic_mp_artist_playback.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_current_playlist_btn.png b/res/drawable-mdpi-finger/ic_mp_current_playlist_btn.png
similarity index 100%
rename from res/drawable-finger/ic_mp_current_playlist_btn.png
rename to res/drawable-mdpi-finger/ic_mp_current_playlist_btn.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_move.png b/res/drawable-mdpi-finger/ic_mp_move.png
similarity index 100%
rename from res/drawable-finger/ic_mp_move.png
rename to res/drawable-mdpi-finger/ic_mp_move.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_partyshuffle_on_btn.png b/res/drawable-mdpi-finger/ic_mp_partyshuffle_on_btn.png
similarity index 100%
rename from res/drawable-finger/ic_mp_partyshuffle_on_btn.png
rename to res/drawable-mdpi-finger/ic_mp_partyshuffle_on_btn.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_playlist_list.png b/res/drawable-mdpi-finger/ic_mp_playlist_list.png
similarity index 100%
rename from res/drawable-finger/ic_mp_playlist_list.png
rename to res/drawable-mdpi-finger/ic_mp_playlist_list.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_playlist_recently_added_list.png b/res/drawable-mdpi-finger/ic_mp_playlist_recently_added_list.png
similarity index 100%
rename from res/drawable-finger/ic_mp_playlist_recently_added_list.png
rename to res/drawable-mdpi-finger/ic_mp_playlist_recently_added_list.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_repeat_all_btn.png b/res/drawable-mdpi-finger/ic_mp_repeat_all_btn.png
similarity index 100%
rename from res/drawable-finger/ic_mp_repeat_all_btn.png
rename to res/drawable-mdpi-finger/ic_mp_repeat_all_btn.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_repeat_off_btn.png b/res/drawable-mdpi-finger/ic_mp_repeat_off_btn.png
similarity index 100%
rename from res/drawable-finger/ic_mp_repeat_off_btn.png
rename to res/drawable-mdpi-finger/ic_mp_repeat_off_btn.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_repeat_once_btn.png b/res/drawable-mdpi-finger/ic_mp_repeat_once_btn.png
similarity index 100%
rename from res/drawable-finger/ic_mp_repeat_once_btn.png
rename to res/drawable-mdpi-finger/ic_mp_repeat_once_btn.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_screen_albums.png b/res/drawable-mdpi-finger/ic_mp_screen_albums.png
similarity index 100%
rename from res/drawable-finger/ic_mp_screen_albums.png
rename to res/drawable-mdpi-finger/ic_mp_screen_albums.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_screen_artists.png b/res/drawable-mdpi-finger/ic_mp_screen_artists.png
similarity index 100%
rename from res/drawable-finger/ic_mp_screen_artists.png
rename to res/drawable-mdpi-finger/ic_mp_screen_artists.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_screen_playlists.png b/res/drawable-mdpi-finger/ic_mp_screen_playlists.png
similarity index 100%
rename from res/drawable-finger/ic_mp_screen_playlists.png
rename to res/drawable-mdpi-finger/ic_mp_screen_playlists.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_screen_tracks.png b/res/drawable-mdpi-finger/ic_mp_screen_tracks.png
similarity index 100%
rename from res/drawable-finger/ic_mp_screen_tracks.png
rename to res/drawable-mdpi-finger/ic_mp_screen_tracks.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_sd_card.png b/res/drawable-mdpi-finger/ic_mp_sd_card.png
similarity index 100%
rename from res/drawable-finger/ic_mp_sd_card.png
rename to res/drawable-mdpi-finger/ic_mp_sd_card.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_shuffle_off_btn.png b/res/drawable-mdpi-finger/ic_mp_shuffle_off_btn.png
similarity index 100%
rename from res/drawable-finger/ic_mp_shuffle_off_btn.png
rename to res/drawable-mdpi-finger/ic_mp_shuffle_off_btn.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_shuffle_on_btn.png b/res/drawable-mdpi-finger/ic_mp_shuffle_on_btn.png
similarity index 100%
rename from res/drawable-finger/ic_mp_shuffle_on_btn.png
rename to res/drawable-mdpi-finger/ic_mp_shuffle_on_btn.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_song_list.png b/res/drawable-mdpi-finger/ic_mp_song_list.png
similarity index 100%
rename from res/drawable-finger/ic_mp_song_list.png
rename to res/drawable-mdpi-finger/ic_mp_song_list.png
Binary files differ
diff --git a/res/drawable-finger/ic_mp_song_playback.png b/res/drawable-mdpi-finger/ic_mp_song_playback.png
similarity index 100%
rename from res/drawable-finger/ic_mp_song_playback.png
rename to res/drawable-mdpi-finger/ic_mp_song_playback.png
Binary files differ
diff --git a/res/drawable-finger/ic_search_category_music_song.png b/res/drawable-mdpi-finger/ic_search_category_music_song.png
similarity index 100%
rename from res/drawable-finger/ic_search_category_music_song.png
rename to res/drawable-mdpi-finger/ic_search_category_music_song.png
Binary files differ
diff --git a/res/drawable-finger/ic_slide_keyboard.png b/res/drawable-mdpi-finger/ic_slide_keyboard.png
similarity index 100%
rename from res/drawable-finger/ic_slide_keyboard.png
rename to res/drawable-mdpi-finger/ic_slide_keyboard.png
Binary files differ
diff --git a/res/drawable-finger/indicator_ic_mp_playing_large.png b/res/drawable-mdpi-finger/indicator_ic_mp_playing_large.png
similarity index 100%
rename from res/drawable-finger/indicator_ic_mp_playing_large.png
rename to res/drawable-mdpi-finger/indicator_ic_mp_playing_large.png
Binary files differ
diff --git a/res/drawable-finger/indicator_ic_mp_playing_list.png b/res/drawable-mdpi-finger/indicator_ic_mp_playing_list.png
similarity index 100%
rename from res/drawable-finger/indicator_ic_mp_playing_list.png
rename to res/drawable-mdpi-finger/indicator_ic_mp_playing_list.png
Binary files differ
diff --git a/res/drawable-finger/stat_notify_musicplayer.png b/res/drawable-mdpi-finger/stat_notify_musicplayer.png
similarity index 100%
rename from res/drawable-finger/stat_notify_musicplayer.png
rename to res/drawable-mdpi-finger/stat_notify_musicplayer.png
Binary files differ
diff --git a/res/drawable/app_music.png b/res/drawable-mdpi/app_music.png
similarity index 100%
rename from res/drawable/app_music.png
rename to res/drawable-mdpi/app_music.png
Binary files differ
diff --git a/res/drawable/app_video.png b/res/drawable-mdpi/app_video.png
similarity index 100%
rename from res/drawable/app_video.png
rename to res/drawable-mdpi/app_video.png
Binary files differ
diff --git a/res/drawable/ic_launcher_shortcut_music_playlist.png b/res/drawable-mdpi/ic_launcher_shortcut_music_playlist.png
similarity index 100%
rename from res/drawable/ic_launcher_shortcut_music_playlist.png
rename to res/drawable-mdpi/ic_launcher_shortcut_music_playlist.png
Binary files differ
diff --git a/res/drawable/midi.png b/res/drawable-mdpi/midi.png
similarity index 100%
rename from res/drawable/midi.png
rename to res/drawable-mdpi/midi.png
Binary files differ
diff --git a/res/drawable/movie.png b/res/drawable-mdpi/movie.png
similarity index 100%
rename from res/drawable/movie.png
rename to res/drawable-mdpi/movie.png
Binary files differ
diff --git a/res/layout-finger/audio_player_common.xml b/res/layout-finger/audio_player_common.xml
index 95320d9..8297fa3 100644
--- a/res/layout-finger/audio_player_common.xml
+++ b/res/layout-finger/audio_player_common.xml
@@ -25,8 +25,8 @@
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:background="#ff5a5a5a"
-        android:paddingTop="1px"
-        android:paddingBottom="4px"
+        android:paddingTop="1dip"
+        android:paddingBottom="4dip"
         android:orientation="horizontal">
 
         <TextView android:id="@+id/currenttime"
@@ -40,7 +40,7 @@
             android:layout_gravity="bottom"
             android:layout_weight="1"
             android:layout_width="0dip"
-            android:paddingLeft="5px"
+            android:paddingLeft="5dip"
             android:layout_height="wrap_content" />
 
         <LinearLayout
@@ -48,8 +48,8 @@
             android:layout_height="wrap_content"
             android:orientation="horizontal"
             android:layout_gravity="bottom"
-            android:layout_marginTop="1px"
-            android:layout_marginBottom="2px"
+            android:layout_marginTop="1dip"
+            android:layout_marginBottom="2dip"
             android:gravity="center">
 
             <com.android.music.RepeatingImageButton android:id="@+id/prev" style="@android:style/MediaButton.Previous" />
@@ -69,7 +69,7 @@
             android:shadowDy="0"
             android:shadowRadius="3"
             android:gravity="right"
-            android:paddingRight="5px"
+            android:paddingRight="5dip"
             android:layout_gravity="bottom"
             android:layout_weight="1"
             android:layout_width="0dip"
@@ -81,9 +81,9 @@
         android:background="#ff5a5a5a"
         style="?android:attr/progressBarStyleHorizontal"
         android:layout_width="fill_parent"
-        android:layout_height="36px"
-        android:paddingLeft="5px"
-        android:paddingRight="5px"
-        android:paddingBottom="4px" />
+        android:layout_height="36dip"
+        android:paddingLeft="8dip"
+        android:paddingRight="8dip"
+        android:paddingBottom="4dip" />
 
 </merge>
diff --git a/res/layout-finger/confirm_delete.xml b/res/layout-finger/confirm_delete.xml
index be8d7ec..1fdf3fc 100644
--- a/res/layout-finger/confirm_delete.xml
+++ b/res/layout-finger/confirm_delete.xml
@@ -31,17 +31,17 @@
     <RelativeLayout
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
-        android:padding="6px"
+        android:padding="6dip"
         android:background="#ffffff" >
 
         <Button android:id="@+id/delete"
-            android:layout_width="120px" android:layout_height="wrap_content" 
+            android:layout_width="120dip" android:layout_height="wrap_content" 
             android:text="@string/delete_confirm_button_text"
             android:layout_gravity="center_horizontal"
             android:layout_alignParentLeft="true" />
 
         <Button android:id="@+id/cancel"
-            android:layout_width="120px" android:layout_height="wrap_content" 
+            android:layout_width="120dip" android:layout_height="wrap_content" 
             android:text="@string/cancel"
             android:layout_alignParentRight="true" />
 
diff --git a/res/layout-finger/weekpicker.xml b/res/layout-finger/weekpicker.xml
index 00ced6f..053a1e2 100644
--- a/res/layout-finger/weekpicker.xml
+++ b/res/layout-finger/weekpicker.xml
@@ -39,25 +39,25 @@
         android:focusable="true"
         android:focusableInTouchMode="true"
         android:layout_gravity="center_horizontal"
-        android:layout_marginTop="6px"
-        android:layout_marginBottom="6px"
+        android:layout_marginTop="6dip"
+        android:layout_marginBottom="6dip"
         />
     
     <!-- Set button -->
     <RelativeLayout
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
-        android:padding="6px"
+        android:padding="6dip"
         android:background="#ffffff" >
 
         <Button android:id="@+id/set"
-            android:layout_width="120px"
+            android:layout_width="120dip"
             android:layout_height="wrap_content"
             android:text="@string/weekpicker_set"
             android:layout_alignParentLeft="true" />
 
         <Button android:id="@+id/cancel"
-            android:layout_width="120px"
+            android:layout_width="120dip"
             android:layout_height="wrap_content" 
             android:text="@string/cancel"
             android:layout_alignParentRight="true" />
diff --git a/res/layout-keysexposed/create_playlist.xml b/res/layout-keysexposed/create_playlist.xml
index 1bf2252..9a91a46 100644
--- a/res/layout-keysexposed/create_playlist.xml
+++ b/res/layout-keysexposed/create_playlist.xml
@@ -40,16 +40,16 @@
     <RelativeLayout
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
-        android:padding="6px"
+        android:padding="6dip"
         android:background="#ffffff" >
 
         <Button android:id="@+id/create"
-            android:layout_width="120px" android:layout_height="wrap_content" 
+            android:layout_width="120dip" android:layout_height="wrap_content" 
             android:text="@string/create_playlist_create_text"
             android:layout_alignParentLeft="true" />
 
         <Button android:id="@+id/cancel"
-            android:layout_width="120px" android:layout_height="wrap_content" 
+            android:layout_width="120dip" android:layout_height="wrap_content" 
             android:text="@string/cancel"
             android:layout_alignParentRight="true" />
 
diff --git a/res/layout-keyshidden/create_playlist.xml b/res/layout-keyshidden/create_playlist.xml
index bb5c6ac..675228b 100644
--- a/res/layout-keyshidden/create_playlist.xml
+++ b/res/layout-keyshidden/create_playlist.xml
@@ -51,16 +51,16 @@
     <RelativeLayout
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
-        android:padding="6px"
+        android:padding="6dip"
         android:background="#ffffff" >
 
         <Button android:id="@+id/create"
-            android:layout_width="120px" android:layout_height="wrap_content" 
+            android:layout_width="120dip" android:layout_height="wrap_content" 
             android:text="@string/create_playlist_create_text"
             android:layout_alignParentLeft="true" />
 
         <Button android:id="@+id/cancel"
-            android:layout_width="120px" android:layout_height="wrap_content" 
+            android:layout_width="120dip" android:layout_height="wrap_content" 
             android:text="@string/cancel"
             android:layout_alignParentRight="true" />
 
diff --git a/res/layout-land-finger/audio_player.xml b/res/layout-land-finger/audio_player.xml
index 6d68f4d..a9c17f1 100644
--- a/res/layout-land-finger/audio_player.xml
+++ b/res/layout-land-finger/audio_player.xml
@@ -53,7 +53,8 @@
                     android:src="@drawable/ic_mp_current_playlist_btn"
                     android:layout_width="82dip"
                     android:layout_height="45dip"
-                    android:layout_marginRight="8dip" />
+                    android:layout_marginRight="8dip"
+                    android:nextFocusLeft="@id/curplaylist" />
 
                <ImageButton android:id="@+id/shuffle"
                     android:layout_width="82dip"
diff --git a/res/layout-port-finger-854x480/audio_player.xml b/res/layout-port-finger-854x480/audio_player.xml
new file mode 100644
index 0000000..fcb54dd
--- /dev/null
+++ b/res/layout-port-finger-854x480/audio_player.xml
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:orientation="vertical">
+
+    <ImageView
+        android:id="@+id/album"
+        android:background="@drawable/album_border_large"
+        android:layout_width="270dip"
+        android:layout_height="270dip"
+        android:layout_gravity="center_horizontal"
+        android:layout_marginTop="0dip" />
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:layout_gravity="center_horizontal">
+
+       <ImageButton android:id="@+id/curplaylist"
+            android:src="@drawable/ic_mp_current_playlist_btn"
+            android:layout_width="85dip"
+            android:layout_height="54dip" />
+
+       <ImageButton android:id="@+id/shuffle"
+            android:layout_width="85dip"
+            android:layout_height="54dip"
+            android:layout_marginLeft="19dip" />
+
+       <ImageButton android:id="@+id/repeat"
+            android:layout_width="85dip"
+            android:layout_height="54dip"
+            android:layout_marginLeft="19dip" />
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:baselineAligned="false"
+        android:paddingLeft="11dip"
+        android:paddingTop="2dip"
+        android:paddingBottom="4dip">
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginRight="4dip"
+            android:src="@drawable/ic_mp_artist_playback" />
+
+        <TextView android:id="@+id/artistname"
+            android:textSize="18sp"
+            android:singleLine="true"
+            android:ellipsize="end"
+            android:textStyle="bold"
+            android:layout_gravity="center_vertical"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content" />
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:baselineAligned="false"
+        android:paddingLeft="11dip"
+        android:paddingTop="4dip"
+        android:paddingBottom="8dip">
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginRight="4dip"
+            android:src="@drawable/ic_mp_album_playback" />
+
+        <TextView android:id="@+id/albumname"
+            android:textSize="14sp"
+            android:singleLine="true"
+            android:ellipsize="end"
+            android:layout_gravity="center_vertical"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content" />
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:baselineAligned="false"
+        android:paddingLeft="11dip"
+        android:paddingTop="0dip"
+        android:paddingBottom="8dip">
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginRight="4dip"
+            android:src="@drawable/ic_mp_song_playback" />
+
+        <TextView android:id="@+id/trackname"
+            android:textSize="14sp"
+            android:singleLine="true"
+            android:ellipsize="end"
+            android:layout_gravity="center_vertical"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content" />
+
+    </LinearLayout>
+
+    <include layout="@layout/audio_player_common" />
+
+</LinearLayout>
diff --git a/res/layout/media_picker_activity_expanding.xml b/res/layout/media_picker_activity_expanding.xml
index 3361431..888f909 100644
--- a/res/layout/media_picker_activity_expanding.xml
+++ b/res/layout/media_picker_activity_expanding.xml
@@ -29,7 +29,7 @@
         android:textSize="18sp"
         android:drawSelectorOnTop="false"
         android:fastScrollEnabled="true"
-        android:indicatorLeft="30dip" />
-        android:indicatorRight="60dip" />
+        android:indicatorLeft="8dip"
+        android:indicatorRight="52dip" />
 
 </LinearLayout>
diff --git a/res/layout/scanning.xml b/res/layout/scanning.xml
index ff3caa6..c4aa9ad 100644
--- a/res/layout/scanning.xml
+++ b/res/layout/scanning.xml
@@ -18,7 +18,7 @@
     android:orientation="vertical"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
-    android:padding="12px">
+    android:padding="12dip">
 
     <ProgressBar android:id="@+id/spinner"
         style="?android:attr/progressBarStyleLarge"
diff --git a/res/values-cs-keyshidden/strings.xml b/res/values-cs-keyshidden/strings.xml
index b1e81c6..02a5557 100644
--- a/res/values-cs-keyshidden/strings.xml
+++ b/res/values-cs-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"Otevřete klávesnici a zadejte název nového seznamu stop. Pokud zvolíte tlačítko Uložit, seznamu stop bude přidělen název %s."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"Otevřete klávesnici a zadejte název nového seznamu stop. Pokud zvolíte tlačítko Uložit, seznamu stop bude přidělen název <xliff:g id="PLAYLIST">%s</xliff:g>."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"Otevřete klávesnici a zadejte nový název seznamu stop <xliff:g id="PLAYLIST">%s</xliff:g>."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"Otevřete klávesnici a zadejte nový název seznamu stop <xliff:g id="PLAYLIST">%s</xliff:g>, nebo zvolte tlačítko Uložit a seznamu stop bude přidělen název %s."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"Otevřete klávesnici a zadejte nový název seznamu stop <xliff:g id="PLAYLIST">%1$s</xliff:g>, nebo zvolte tlačítko Uložit a seznamu stop bude přidělen název <xliff:g id="NAME">%2$s</xliff:g>."</string>
 </resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index dc65176..12328d9 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"Opakování všech skladeb."</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"Použít jako vyzváněcí tón telefonu"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"Použít jako vyzváněcí tón"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"Skladba %s byla nastavena jako vyzváněcí tón."</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"Skladba <xliff:g id="NAME">%s</xliff:g> byla nastavena jako vyzváněcí tón."</string>
     <string name="play_selection" msgid="2854921021814550018">"Přehrát"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"Přidat do seznamu stop"</string>
     <string name="queue" msgid="2937629819482787704">"Aktuální seznam stop"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"Nový seznam stop <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"1 skladba byla přidána do seznamu stop."</item>
-    <item quantity="other" msgid="7675242021325355213">"Počet skladeb přidaných do seznamu stop: %d."</item>
+    <item quantity="other" msgid="7662771987109627255">"Počet skladeb přidaných do seznamu stop: <xliff:g id="NUMBER">%d</xliff:g>"</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"Vybraný seznam stop je prázdný."</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"Uložit"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"Zrušit"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"Odstranit ze seznamu stop"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"Připojování k proudu <xliff:g id="HOST">%s</xliff:g>"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"Vyhledat skladbu %s pomocí:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"Vyhledat výraz „<xliff:g id="TERM">%s</xliff:g>“ pomocí:"</string>
     <string name="working_artists" msgid="8678357432732156580">"Interpreti…"</string>
     <string name="working_albums" msgid="8713273699401457426">"Alba…"</string>
     <string name="working_songs" msgid="2201491972050410684">"Skladby…"</string>
diff --git a/res/values-da-keyshidden/strings.xml b/res/values-da-keyshidden/strings.xml
index 4e1a59a..59219c7 100644
--- a/res/values-da-keyshidden/strings.xml
+++ b/res/values-da-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"Åbn tastaturet for at give din nye afspilningsliste et navn, eller vælg Gem for at give den navnet \"%s\"."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"Åbn tastaturet for at give din nye afspilningsliste et navn, eller vælg Gem for at give den navnet \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"Åbn tastaturet for at give afspilningslisten \"<xliff:g id="PLAYLIST">%s</xliff:g>\" et nyt navn."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"Åbn tastaturet for at give afspilningslisten \"<xliff:g id="PLAYLIST">%s</xliff:g>\" et navn, eller vælg Gem for at give den navnet \"%s\"."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"Åbn tastaturet for at give afspilningslisten \"<xliff:g id="PLAYLIST">%1$s</xliff:g>\" et navn, eller vælg Gem for at give den navnet \"<xliff:g id="NAME">%2$s</xliff:g>\"."</string>
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 67b223e..c76f19e 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"Gentager alle sange."</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"Brug som telefonringetone"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"Brug som ringetone"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"\"%s\" er indstillet som ringetone for telefonen."</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"\"<xliff:g id="NAME">%s</xliff:g>\" er indstillet som ringetone for telefonen."</string>
     <string name="play_selection" msgid="2854921021814550018">"Afspil"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"Føj til afspilningsliste"</string>
     <string name="queue" msgid="2937629819482787704">"Aktuel afspilningsliste"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"Ny afspilningsliste <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"Der blev føjet 1 sang til afspilningslisten."</item>
-    <item quantity="other" msgid="7675242021325355213">"%d sange føjet til afspilningsliste."</item>
+    <item quantity="other" msgid="7662771987109627255">"<xliff:g id="NUMBER">%d</xliff:g> sange føjet til afspilningsliste."</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"Den valgte afspilningsliste er tom."</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"Gem"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"Annuller"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"Fjern fra afspilningsliste"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"Forbinder til <xliff:g id="HOST">%s</xliff:g>"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"Søg efter %s ved hjælp af:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"Søg efter <xliff:g id="TERM">%s</xliff:g> ved hjælp af:"</string>
     <string name="working_artists" msgid="8678357432732156580">"Kunstnere ..."</string>
     <string name="working_albums" msgid="8713273699401457426">"Albummer ..."</string>
     <string name="working_songs" msgid="2201491972050410684">"Sange ..."</string>
diff --git a/res/values-de-keyshidden/strings.xml b/res/values-de-keyshidden/strings.xml
index 0afe514..54d3554 100644
--- a/res/values-de-keyshidden/strings.xml
+++ b/res/values-de-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"Ziehen Sie die Tastatur heraus, um für die neue Playlist einen Namen festzulegen, oder wählen Sie \"Speichern\", um sie mit dem Namen \"%s\" zu speichern."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"Öffnen Sie die Tastatur, um für Ihre neue Playlist einen Namen festzulegen, oder wählen Sie \"Speichern\", um sie mit dem Namen \"<xliff:g id="PLAYLIST">%s</xliff:g>\" zu speichern."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"Ziehen Sie die Tastatur heraus, um \"<xliff:g id="PLAYLIST">%s</xliff:g>\" umzubenennen."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"Ziehen Sie die Tastatur heraus, um die Playlist \"<xliff:g id="PLAYLIST">%s</xliff:g>\" umzubenennen, oder wählen Sie \"Speichern\", um sie mit dem Namen \"%s\" zu speichern."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"Öffnen Sie die Tastatur, um die Playlist \"<xliff:g id="PLAYLIST">%1$s</xliff:g>\" umzubenennen, oder wählen Sie \"Speichern\", um sie mit dem Namen \"<xliff:g id="NAME">%2$s</xliff:g>\" zu speichern."</string>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 400e070..be3b13b 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"Alle Titel werden wiederholt."</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"Als Telefonklingelton verwenden"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"Als Klingelton verwenden"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"\"%s\" als Telefonklingelton eingestellt"</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"\"<xliff:g id="NAME">%s</xliff:g>\" wurde als Telefonklingelton festgelegt."</string>
     <string name="play_selection" msgid="2854921021814550018">"Wiedergeben"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"Zur Playlist hinzufügen"</string>
     <string name="queue" msgid="2937629819482787704">"Aktuelle Playlist"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"Neue Playlist <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"1 Titel zur Playlist hinzugefügt"</item>
-    <item quantity="other" msgid="7675242021325355213">"%d Titel zur Playlist hinzugefügt."</item>
+    <item quantity="other" msgid="7662771987109627255">"<xliff:g id="NUMBER">%d</xliff:g> Titel wurden zur Playlist hinzugefügt."</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"Playlist ist leer"</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"Speichern"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"Abbrechen"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"Von Playlist entfernen"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"Verbindung mit <xliff:g id="HOST">%s</xliff:g> wird hergestellt"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"Nach %s suchen mithilfe von:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"Nach \"<xliff:g id="TERM">%s</xliff:g>\" suchen mithilfe von:"</string>
     <string name="working_artists" msgid="8678357432732156580">"Interpreten..."</string>
     <string name="working_albums" msgid="8713273699401457426">"Alben…"</string>
     <string name="working_songs" msgid="2201491972050410684">"Lieder…"</string>
diff --git a/res/values-el-keyshidden/strings.xml b/res/values-el-keyshidden/strings.xml
index 047803f..adee206 100644
--- a/res/values-el-keyshidden/strings.xml
+++ b/res/values-el-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"Ανοίξτε το πληκτρολόγιο για να δώσετε στην νέα λίστα αναπαραγωγής ένα όνομα ή επιλέξτε Αποθήκευση για να την ονομάσετε \"%s\"."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"Ανοίξτε το πληκτρολόγιο για να δώσετε στην νέα λίστα αναπαραγωγής ένα όνομα ή επιλέξτε Αποθήκευση για να την ονομάσετε \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"Ανοίξτε το πληκτρολόγιο για να δώσετε στη λίστα αναπαραγωγής \"<xliff:g id="PLAYLIST">%s</xliff:g>\" ένα νέο όνομα."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"Ανοίξτε το πληκτρολόγιο για να δώσετε στη λίστα αναπαραγωγής \"<xliff:g id="PLAYLIST">%s</xliff:g>\" ένα νέο όνομα ή επιλέξτε Αποθήκευση για να την ονομάσετε \"%s\"."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"Ανοίξτε το πληκτρολόγιο για να δώσετε στη λίστα αναπαραγωγής \"<xliff:g id="PLAYLIST">%1$s</xliff:g>\" ένα νέο όνομα ή επιλέξτε Αποθήκευση για να την ονομάσετε \"<xliff:g id="NAME">%2$s</xliff:g>\"."</string>
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index cdf4878..07d1ebb 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"Επανάληψη όλων των τραγουδιών."</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"Χρήση ως ήχος κλήσης τηλεφώνου"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"Χρήση ως ήχος κλήσης"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"Ορισμός του \"%s\" ως ήχος κλήσης τηλεφώνου."</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"Ορισμός του \"<xliff:g id="NAME">%s</xliff:g>\" ως ήχο κλήσης του τηλεφώνου."</string>
     <string name="play_selection" msgid="2854921021814550018">"Αναπαραγωγή"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"Προσθ.στη λίστα αναπαρ."</string>
     <string name="queue" msgid="2937629819482787704">"Τρέχουσα λίστα αναπαραγωγής"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"Νέα λίστα αναπαραγωγής <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"1 τραγούδι προστέθηκε στη λίστα αναπαραγωγής."</item>
-    <item quantity="other" msgid="7675242021325355213">"%d τραγούδια προστέθηκαν στη λίστα αναπαραγωγής."</item>
+    <item quantity="other" msgid="7662771987109627255">"<xliff:g id="NUMBER">%d</xliff:g> τραγούδια προστέθηκαν στη λίστα αναπαραγωγής."</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"Η λίστα αναπαραγωγής που επιλέξατε είναι κενή."</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"Αποθ/ση"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"Ακύρωση"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"Κατάργηση από τη λίστα αναπαραγωγής"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"Σύνδεση στο <xliff:g id="HOST">%s</xliff:g>"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"Αναζήτηση του %s με χρήση:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"Αναζήτηση του όρου \"<xliff:g id="TERM">%s</xliff:g>\" με χρήση:"</string>
     <string name="working_artists" msgid="8678357432732156580">"Καλλιτέχνες..."</string>
     <string name="working_albums" msgid="8713273699401457426">"Άλμπουμ..."</string>
     <string name="working_songs" msgid="2201491972050410684">"Τραγούδια..."</string>
diff --git a/res/values-es-keyshidden/strings.xml b/res/values-es-keyshidden/strings.xml
index 3536546..d228d8f 100644
--- a/res/values-es-keyshidden/strings.xml
+++ b/res/values-es-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"Abre el teclado para asignar un nombre a la nueva lista de reproducción o selecciona \"Guardar\" para llamarla \"%s\"."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"Abre el teclado para asignar un nombre a la nueva lista de reproducción o selecciona \"Guardar\" para llamarla \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"Abre el teclado para asignar un nombre nuevo a la lista de reproducción \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"Abre el teclado para asignar un nombre nuevo a la lista de reproducción <xliff:g id="PLAYLIST">%s</xliff:g> o selecciona \"Guardar\" para llamarla \"%s\"."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"Abre el teclado para asignar un nombre nuevo a la lista de reproducción \"<xliff:g id="PLAYLIST">%1$s</xliff:g>\" o selecciona \"Guardar\" para llamarla \"<xliff:g id="NAME">%2$s</xliff:g>\"."</string>
 </resources>
diff --git a/res/values-es-rUS-keyshidden/strings.xml b/res/values-es-rUS-keyshidden/strings.xml
index b037adc..6394d20 100644
--- a/res/values-es-rUS-keyshidden/strings.xml
+++ b/res/values-es-rUS-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"Abre el teclado para asignar un nombre a tu lista de reproducción nueva o selecciona Guardar para nombrarla \"%s\"."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"Abre el teclado para asignar un nombre a tu lista de reproducción nueva o selecciona Guardar para nombrarla \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"Abrir el teclado para asignar un nombre nuevo a la lista de reproducción \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"Abre el teclado para asignar un nombre nuevo a la lista de reproducción \"<xliff:g id="PLAYLIST">%s</xliff:g>\" o selecciona Guardar para nombrarla \"%s\"."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"Abre el teclado para asignar un nombre nuevo a la lista de reproducción \"<xliff:g id="PLAYLIST">%1$s</xliff:g>\" o selecciona Guardar para nombrarla \"<xliff:g id="NAME">%2$s</xliff:g>\"."</string>
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 0c13778..13c62f9 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"Repitiendo todas las canciones."</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"Usar como tono de timbre del teléfono"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"Usar como tono de timbre"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"\"%s\" definidos como tono de timbre del teléfono."</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"\"<xliff:g id="NAME">%s</xliff:g>\" definidos como tono de timbre del teléfono."</string>
     <string name="play_selection" msgid="2854921021814550018">"Reproducir"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"Agregar a lista de reproducción"</string>
     <string name="queue" msgid="2937629819482787704">"Lista de reproducción actual"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"Lista de reproducción nueva <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"Se agregó una canción a la lista de reproducción."</item>
-    <item quantity="other" msgid="7675242021325355213">"%d canciones agregadas a la lista de reproducción."</item>
+    <item quantity="other" msgid="7662771987109627255">"<xliff:g id="NUMBER">%d</xliff:g> canciones agregadas a la lista de reproducción."</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"La lista de reproducción seleccionada está vacía."</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"Guardar"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"Cancelar"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"Suprimir de la lista de reproducción"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"Conectándose a <xliff:g id="HOST">%s</xliff:g>"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"Buscar %s usando:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"Buscar <xliff:g id="TERM">%s</xliff:g> mediante:"</string>
     <string name="working_artists" msgid="8678357432732156580">"Artistas..."</string>
     <string name="working_albums" msgid="8713273699401457426">"Álbumes..."</string>
     <string name="working_songs" msgid="2201491972050410684">"Canciones..."</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index c66be17..bdf13e0 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"Repitiendo todas las canciones..."</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"Utilizar como tono del teléfono"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"Utilizar como tono"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"Se ha establecido \"%s\" como tono del teléfono."</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"Se ha establecido \"<xliff:g id="NAME">%s</xliff:g>\" como tono del teléfono."</string>
     <string name="play_selection" msgid="2854921021814550018">"Reproducir"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"Añadir a lista"</string>
     <string name="queue" msgid="2937629819482787704">"Lista de reproducción actual"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"Nueva lista de reproducción <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"Se ha añadido una canción a la lista de reproducción."</item>
-    <item quantity="other" msgid="7675242021325355213">"Se han añadido %d canciones a la lista de reproducción."</item>
+    <item quantity="other" msgid="7662771987109627255">"Se han añadido <xliff:g id="NUMBER">%d</xliff:g> canciones a la lista de reproducción."</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"La lista de reproducción seleccionada está vacía."</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"Guardar"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"Cancelar"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"Eliminar de lista de reproducción"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"Conectando con <xliff:g id="HOST">%s</xliff:g>..."</string>
-    <string name="mediasearch" msgid="9170843953524689876">"Buscar %s con:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"Buscar <xliff:g id="TERM">%s</xliff:g> con:"</string>
     <string name="working_artists" msgid="8678357432732156580">"Artistas…"</string>
     <string name="working_albums" msgid="8713273699401457426">"Álbumes…"</string>
     <string name="working_songs" msgid="2201491972050410684">"Canciones…"</string>
diff --git a/res/values-fr-keyshidden/strings.xml b/res/values-fr-keyshidden/strings.xml
index e05edd6..1de900a 100644
--- a/res/values-fr-keyshidden/strings.xml
+++ b/res/values-fr-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"Ouvrez le clavier afin de saisir un nom pour votre nouvelle playlist ou sélectionnez Enregistrer pour la nommer \"%s\"."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"Ouvrez le clavier afin d\'attribuer un nom à la nouvelle playlist ou sélectionnez \"Enregistrer\" pour la nommer \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"Ouvrez le clavier pour renommer la playlist \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"Ouvrez le clavier pour saisir un nouveau nom pour la playlist \"<xliff:g id="PLAYLIST">%s</xliff:g>\" ou sélectionnez Enregistrer pour la nommer \"%s\"."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"Ouvrez le clavier pour attribuer un nouveau nom à la playlist \"<xliff:g id="PLAYLIST">%1$s</xliff:g>\" ou sélectionnez \"Enregistrer\" pour la nommer \"<xliff:g id="NAME">%2$s</xliff:g>\"."</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 418d932..03dd64c 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"Lecture en boucle de toutes les chansons"</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"Utiliser comme sonnerie"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"Définir comme sonnerie"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"\"%s\" a été défini comme sonnerie."</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"\"<xliff:g id="NAME">%s</xliff:g>\" a été défini comme sonnerie."</string>
     <string name="play_selection" msgid="2854921021814550018">"Lire"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"Ajouter à la playlist"</string>
     <string name="queue" msgid="2937629819482787704">"Playlist actuelle"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"Nouvelle playlist <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"1 chanson a été ajoutée à la playlist."</item>
-    <item quantity="other" msgid="7675242021325355213">"%d chansons ont été ajoutées à la playlist."</item>
+    <item quantity="other" msgid="7662771987109627255">"<xliff:g id="NUMBER">%d</xliff:g> chansons ont été ajoutées à la playlist."</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"La playlist sélectionnée est vide."</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"Enregistrer"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"Annuler"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"Supprimer de la playlist"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"Connexion à <xliff:g id="HOST">%s</xliff:g>"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"Rechercher %s à l\'aide de :"</string>
+    <string name="mediasearch" msgid="959222971261132292">"Rechercher <xliff:g id="TERM">%s</xliff:g> à l\'aide de :"</string>
     <string name="working_artists" msgid="8678357432732156580">"Artistes…"</string>
     <string name="working_albums" msgid="8713273699401457426">"Albums…"</string>
     <string name="working_songs" msgid="2201491972050410684">"Chansons…"</string>
diff --git a/res/values-it-keyshidden/strings.xml b/res/values-it-keyshidden/strings.xml
index fd3ee8f..3a14544 100644
--- a/res/values-it-keyshidden/strings.xml
+++ b/res/values-it-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"Apri la tastiera per assegnare un nome alla nuova playlist o seleziona Salva per denominarla \"%s\"."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"Apri la tastiera per assegnare un nome alla nuova playlist o seleziona Salva per denominarla \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"Apri la tastiera per assegnare un nuovo nome alla playlist \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"Apri la tastiera per assegnare un nuovo nome alla playlist \"<xliff:g id="PLAYLIST">%s</xliff:g>\" o seleziona Salva per denominarla \"%s\"."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"Apri la tastiera per assegnare un nuovo nome alla playlist \"<xliff:g id="PLAYLIST">%1$s</xliff:g>\" o seleziona Salva per denominarla \"<xliff:g id="NAME">%2$s</xliff:g>\"."</string>
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 74ed5c8..61a6113 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"Ripetizione di tutti i brani."</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"Usa come suoneria"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"Usa come suoneria"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"\"%s\" impostato come suoneria."</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"\"<xliff:g id="NAME">%s</xliff:g>\" impostato come suoneria del telefono."</string>
     <string name="play_selection" msgid="2854921021814550018">"Riprod."</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"Aggiungi a playlist"</string>
     <string name="queue" msgid="2937629819482787704">"Playlist corrente"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"Nuova playlist <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"1 brano aggiunto alla playlist."</item>
-    <item quantity="other" msgid="7675242021325355213">"%d brani aggiunti alla playlist."</item>
+    <item quantity="other" msgid="7662771987109627255">"<xliff:g id="NUMBER">%d</xliff:g> brani aggiunti alla playlist."</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"La playlist selezionata è vuota."</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"Salva"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"Annulla"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"Rimuovi da playlist"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"Connessione a <xliff:g id="HOST">%s</xliff:g>"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"Cerca %s con:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"Cerca <xliff:g id="TERM">%s</xliff:g> con:"</string>
     <string name="working_artists" msgid="8678357432732156580">"Artisti…"</string>
     <string name="working_albums" msgid="8713273699401457426">"Album…"</string>
     <string name="working_songs" msgid="2201491972050410684">"Brani…"</string>
diff --git a/res/values-ja-keyshidden/strings.xml b/res/values-ja-keyshidden/strings.xml
index 33f3687..f255125 100644
--- a/res/values-ja-keyshidden/strings.xml
+++ b/res/values-ja-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"キーボードを表示して新しいプレイリストに名前を付けるか、[保存]を選択して「%s」という名前で保存します。"</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"キーボードを表示して新しいプレイリストに名前を付けるか、[保存]を選択して「<xliff:g id="PLAYLIST">%s</xliff:g>」という名前で保存します。"</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"キーボードを表示して「<xliff:g id="PLAYLIST">%s</xliff:g>」に新しい名前を付けます。"</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"キーボードを表示して「<xliff:g id="PLAYLIST">%s</xliff:g>」に新しい名前を付けるか、[保存]を選択して「%s」という名前で保存します。"</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"キーボードを表示して「<xliff:g id="PLAYLIST">%1$s</xliff:g>」に新しい名前を付けるか、[保存]を選択して「<xliff:g id="NAME">%2$s</xliff:g>」という名前で保存します。"</string>
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index b5b1150..6de809d 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"全曲繰り返しで再生します。"</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"着信音に設定"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"着信音に設定"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"「%s」を着信音として設定しました。"</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"「<xliff:g id="NAME">%s</xliff:g>」を着信音に設定しました。"</string>
     <string name="play_selection" msgid="2854921021814550018">"再生"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"プレイリストに追加"</string>
     <string name="queue" msgid="2937629819482787704">"現在のプレイリスト"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"新規プレイリスト<xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"プレイリストに1曲追加しました。"</item>
-    <item quantity="other" msgid="7675242021325355213">"プレイリストに%d曲追加しました。"</item>
+    <item quantity="other" msgid="7662771987109627255">"プレイリストに<xliff:g id="NUMBER">%d</xliff:g>曲が追加されました。"</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"選択したプレイリストは空です。"</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"保存"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"キャンセル"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"プレイリストから削除"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"<xliff:g id="HOST">%s</xliff:g>に接続中"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"%sの検索:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"<xliff:g id="TERM">%s</xliff:g>の検索:"</string>
     <string name="working_artists" msgid="8678357432732156580">"アーティスト..."</string>
     <string name="working_albums" msgid="8713273699401457426">"アルバム..."</string>
     <string name="working_songs" msgid="2201491972050410684">"曲..."</string>
diff --git a/res/values-keyshidden/strings.xml b/res/values-keyshidden/strings.xml
index b086fd0..bf01724 100644
--- a/res/values-keyshidden/strings.xml
+++ b/res/values-keyshidden/strings.xml
@@ -19,11 +19,11 @@
 
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- Prompt in dialog when creating a playlist and the keyboard is closed. -->
-    <string name="create_playlist_create_text_prompt">Open the keyboard to give your new Playlist a name, or select Save to name it \"%s\".</string>
+    <string name="create_playlist_create_text_prompt">Open the keyboard to give your new Playlist a name, or select Save to name it \"<xliff:g id="playlist" example="Favorite Songs">%s</xliff:g>\".</string>
 
     <!-- Prompt in dialog when renaming a playlist, and the entered name is the same as the old one. -->
     <string name="rename_playlist_same_prompt">Open the keyboard to give playlist \"<xliff:g id="playlist">%s</xliff:g>\" a new name.</string>
     <!-- Prompt in dialog when renaming a playlist, and the entered name is different from the old one. -->
-    <string name="rename_playlist_diff_prompt">Open the keyboard to give playlist \"<xliff:g id="playlist">%s</xliff:g>\" a new name, or select Save to name it \"%s\".</string>
+    <string name="rename_playlist_diff_prompt">Open the keyboard to give playlist \"<xliff:g id="playlist">%1$s</xliff:g>\" a new name, or select Save to name it \"<xliff:g id="name" example="Favorite Songs">%2$s</xliff:g>\".</string>
 </resources>
 
diff --git a/res/values-ko-keyshidden/strings.xml b/res/values-ko-keyshidden/strings.xml
index 4549564..83334ce 100644
--- a/res/values-ko-keyshidden/strings.xml
+++ b/res/values-ko-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"키보드를 사용하여 새 재생 목록에 이름을 지정하거나 \'저장\'을 선택하여 \'%s\'(이)라고 지정합니다."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"키보드를 사용하여 새 재생 목록에 이름을 지정하거나 \'저장\'을 선택하여 \'<xliff:g id="PLAYLIST">%s</xliff:g>\'(이)라고 지정합니다."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"키보드를 사용하여 재생 목록 \'<xliff:g id="PLAYLIST">%s</xliff:g>\'에 새 이름을 지정합니다."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"키보드를 사용하여 재생 목록 \'<xliff:g id="PLAYLIST">%s</xliff:g>\'에 새 이름을 지정하거나 \'저장\'을 선택하여 \'%s\'(이)라고 지정합니다."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"키보드를 사용하여 재생 목록 \'<xliff:g id="PLAYLIST">%1$s</xliff:g>\'에 새 이름을 지정하거나 \'저장\'을 선택하여 \'<xliff:g id="NAME">%2$s</xliff:g>\'(이)라고 지정합니다."</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 5a97001..4509352 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"모든 노래를 반복합니다."</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"휴대전화 벨소리로 사용"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"벨소리로 사용"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"\'%s\'이(가) 휴대전화 벨소리로 설정되었습니다."</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"\'<xliff:g id="NAME">%s</xliff:g>\'이(가) 휴대전화 벨소리로 설정되었습니다."</string>
     <string name="play_selection" msgid="2854921021814550018">"재생"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"재생 목록에 추가"</string>
     <string name="queue" msgid="2937629819482787704">"현재 재생 목록"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"새 재생 목록 <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"재생 목록에 노래 1곡이 추가되었습니다."</item>
-    <item quantity="other" msgid="7675242021325355213">"노래 %d곡이 재생 목록에 추가되었습니다."</item>
+    <item quantity="other" msgid="7662771987109627255">"노래 <xliff:g id="NUMBER">%d</xliff:g>곡이 재생 목록에 추가되었습니다."</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"선택한 재생 목록이 비어 있습니다."</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"저장"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"취소"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"재생 목록에서 삭제"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"<xliff:g id="HOST">%s</xliff:g>에 연결 중"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"다음을 사용하여 %s 검색:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"다음을 사용하여 <xliff:g id="TERM">%s</xliff:g> 검색:"</string>
     <string name="working_artists" msgid="8678357432732156580">"아티스트..."</string>
     <string name="working_albums" msgid="8713273699401457426">"앨범..."</string>
     <string name="working_songs" msgid="2201491972050410684">"노래..."</string>
diff --git a/res/values-nb-keyshidden/strings.xml b/res/values-nb-keyshidden/strings.xml
index 0e8ab9d..554da75 100644
--- a/res/values-nb-keyshidden/strings.xml
+++ b/res/values-nb-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"Åpne tastaturet for å gi den nye spillelisten et navn, eller velg Lagre for å gi den navnet «%s»."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"Åpne tastaturet for å gi den nye spillelisten et navn, eller velg Lagre for å gi den navnet «<xliff:g id="PLAYLIST">%s</xliff:g>»."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"Åpne tastaturet for å gi spillelisten «<xliff:g id="PLAYLIST">%s</xliff:g>» et nytt navn."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"Åpne tastaturet for å gi spillelisten «<xliff:g id="PLAYLIST">%s</xliff:g>» et nytt navn, eller velg Lagre for å gi den navnet «%s»."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"Åpne tastaturet for å gi spillelisten «<xliff:g id="PLAYLIST">%1$s</xliff:g>» et nytt navn, eller velg Lagre for å gi den navnet «<xliff:g id="NAME">%2$s</xliff:g>»."</string>
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 8664bac..46c9e6f 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"Gjentar alle sanger."</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"Bruk som telefonringetone"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"Bruk som ringetone"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"«%s» valgt som telefonringetone."</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"«<xliff:g id="NAME">%s</xliff:g>» valgt som telefonringetone."</string>
     <string name="play_selection" msgid="2854921021814550018">"Spill"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"Legg til spillelisten"</string>
     <string name="queue" msgid="2937629819482787704">"Gjeldende spilleliste"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"Ny spilleliste <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"1 sang ble lagt til spillelisten."</item>
-    <item quantity="other" msgid="7675242021325355213">"%d sanger ble lagt til spillelisten."</item>
+    <item quantity="other" msgid="7662771987109627255">"<xliff:g id="NUMBER">%d</xliff:g> sanger ble lagt til i spillelisten."</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"Den valgte spillelisten er tom."</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"Lagre"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"Avbryt"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"Fjern fra spilleliste"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"Kobler til <xliff:g id="HOST">%s</xliff:g>"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"Søk etter %s ved hjelp av:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"Søk etter <xliff:g id="TERM">%s</xliff:g> ved hjelp av:"</string>
     <string name="working_artists" msgid="8678357432732156580">"Artister…"</string>
     <string name="working_albums" msgid="8713273699401457426">"Album…"</string>
     <string name="working_songs" msgid="2201491972050410684">"Sanger…"</string>
diff --git a/res/values-nl-keyshidden/strings.xml b/res/values-nl-keyshidden/strings.xml
index e37301c..71b8c95 100644
--- a/res/values-nl-keyshidden/strings.xml
+++ b/res/values-nl-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"Open het toetsenbord om uw nieuwe afspeellijst een naam te geven of selecteer \'Opslaan\' om deze de naam \'%s\' te geven."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"Open het toetsenbord om uw nieuwe afspeellijst een naam te geven of selecteer \'Opslaan\' om deze de naam \'<xliff:g id="PLAYLIST">%s</xliff:g>\' te geven."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"Open het toetsenbord om afspeellijst \'<xliff:g id="PLAYLIST">%s</xliff:g>\' een nieuwe naam te geven."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"Open het toetsenbord om afspeellijst \'<xliff:g id="PLAYLIST">%s</xliff:g>\' een nieuwe naam te geven of selecteer \'Opslaan\' om deze de naam \'%s\' te geven."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"Open het toetsenbord om de afspeellijst \'<xliff:g id="PLAYLIST">%1$s</xliff:g>\' een nieuwe naam te geven of selecteer \'Opslaan\' om deze de naam \'<xliff:g id="NAME">%2$s</xliff:g>\' te geven."</string>
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 14d0037..7a89cfe 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"Alle nummers worden herhaald."</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"Gebruiken als beltoon van telefoon"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"Gebruiken als beltoon"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"%s\' ingesteld als beltoon van telefoon."</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"\'<xliff:g id="NAME">%s</xliff:g>\' is ingesteld als de beltoon van de telefoon."</string>
     <string name="play_selection" msgid="2854921021814550018">"Afspelen"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"Toev. aan afspeellijst"</string>
     <string name="queue" msgid="2937629819482787704">"Huidige afspeellijst"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"Nieuwe afspeellijst <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"1 nummer toegevoegd aan afspeellijst."</item>
-    <item quantity="other" msgid="7675242021325355213">"%d nummers toegevoegd aan afspeellijst."</item>
+    <item quantity="other" msgid="7662771987109627255">"<xliff:g id="NUMBER">%d</xliff:g> nummers toegevoegd aan afspeellijst."</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"Geselecteerde afspeellijst is leeg."</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"Opslaan"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"Annuleren"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"Verwijderen uit afspeellijst"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"Verbinding maken met <xliff:g id="HOST">%s</xliff:g>"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"Zoeken naar %s via:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"Zoeken naar \'<xliff:g id="TERM">%s</xliff:g>\' via:"</string>
     <string name="working_artists" msgid="8678357432732156580">"Artiesten…"</string>
     <string name="working_albums" msgid="8713273699401457426">"Albums…"</string>
     <string name="working_songs" msgid="2201491972050410684">"Nummers…"</string>
diff --git a/res/values-pl-keyshidden/strings.xml b/res/values-pl-keyshidden/strings.xml
index 592f652..eff1a88 100644
--- a/res/values-pl-keyshidden/strings.xml
+++ b/res/values-pl-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"Otwórz klawiaturę, aby nazwać nową playlistę lub wybierz polecenie Zapisz, aby nazwać ją „%s”."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"Otwórz klawiaturę, aby nadać nazwę nowej liście odtwarzania, lub wybierz przycisk Zapisz, aby nadać jej nazwę „<xliff:g id="PLAYLIST">%s</xliff:g>”."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"Otwórz klawiaturę, aby nadać nową nazwę playliście „<xliff:g id="PLAYLIST">%s</xliff:g>”."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"Otwórz klawiaturę, aby nadać playliście „<xliff:g id="PLAYLIST">%s</xliff:g>” nową nazwę lub wybierz polecenie Zapisz, aby nazwać ją „%s”."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"Otwórz klawiaturę, aby nadać nową nazwę liście odtwarzania „<xliff:g id="PLAYLIST">%1$s</xliff:g>”, lub wybierz przycisk Zapisz, aby nadać jej nazwę „<xliff:g id="NAME">%2$s</xliff:g>”."</string>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 2cf44bc..b61e561 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"Powtarzanie wszystkich utworów."</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"Ustaw jako dzwonek telefonu"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"Ustaw jako dzwonek"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"„%s” ustawiono jako dzwonek telefonu."</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"Utwór „<xliff:g id="NAME">%s</xliff:g>” został ustawiony jako dzwonek telefonu."</string>
     <string name="play_selection" msgid="2854921021814550018">"Odtwórz"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"Dodaj do playlisty"</string>
     <string name="queue" msgid="2937629819482787704">"Bieżąca playlista"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"Nowa playlista <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"Dodano 1 utwór do playlisty."</item>
-    <item quantity="other" msgid="7675242021325355213">"Utworów dodanych do playlisty: %d."</item>
+    <item quantity="other" msgid="7662771987109627255">"Liczba utworów dodanych do listy odtwarzania: <xliff:g id="NUMBER">%d</xliff:g>."</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"Wybrana playlista jest pusta."</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"Zapisz"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"Anuluj"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"Usuń z playlisty"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"Łączenie z: <xliff:g id="HOST">%s</xliff:g>"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"Wyszukaj %s z wykorzystaniem:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"Wyszukaj hasło <xliff:g id="TERM">%s</xliff:g> za pomocą:"</string>
     <string name="working_artists" msgid="8678357432732156580">"Wykonawcy…"</string>
     <string name="working_albums" msgid="8713273699401457426">"Albumy…"</string>
     <string name="working_songs" msgid="2201491972050410684">"Utwory…"</string>
diff --git a/res/values-pt-keyshidden/strings.xml b/res/values-pt-keyshidden/strings.xml
index 5f31f91..51d4756 100644
--- a/res/values-pt-keyshidden/strings.xml
+++ b/res/values-pt-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"Abra o teclado para dar um nome à sua nova Lista de reprodução ou selecione Salvar para nomeá-la como \"%s\"."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"Abra o teclado para dar um nome à sua nova Lista de reprodução ou selecione Salvar para nomeá-la como \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"Abra o teclado para dar um novo nome à lista de reprodução \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"Abra o teclado para dar um novo nome à lista de reprodução \"<xliff:g id="PLAYLIST">%s</xliff:g>\" ou selecione Salvar para nomeá-la como \"%s\"."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"Abra o teclado para dar um novo nome à lista de reprodução \"<xliff:g id="PLAYLIST">%1$s</xliff:g>\" ou selecione Salvar para nomeá-la como \"<xliff:g id="NAME">%2$s</xliff:g>\"."</string>
 </resources>
diff --git a/res/values-pt-rPT-keyshidden/strings.xml b/res/values-pt-rPT-keyshidden/strings.xml
index 1caebdc..7c9cfc1 100644
--- a/res/values-pt-rPT-keyshidden/strings.xml
+++ b/res/values-pt-rPT-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"Abra o teclado para dar um nome à nova lista de reprodução ou seleccione Guardar para a guardar com o nome \"%s\"."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"Abra o teclado para dar um nome à nova lista de reprodução ou seleccione Guardar para a guardar com o nome \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"Abra o teclado para dar um novo nome à lista de reprodução \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"Abra o teclado para dar um novo nome à lista de reprodução \"<xliff:g id="PLAYLIST">%s</xliff:g>\" ou seleccione Guardar para a guardar com o nome \"%s\"."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"Abra o teclado para dar um novo nome à lista de reprodução \"<xliff:g id="PLAYLIST">%1$s</xliff:g>\" ou seleccione Guardar para a guardar com o nome \"<xliff:g id="NAME">%2$s</xliff:g>\"."</string>
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 4f896c7..58cbc64 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"A repetir todas as músicas."</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"Utilizar como toque do telefone"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"Utilizar como toque"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"\"%s\" definida como toque do telefone."</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"\"<xliff:g id="NAME">%s</xliff:g>\" definida como toque do telefone."</string>
     <string name="play_selection" msgid="2854921021814550018">"Reproduzir"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"Adicionar à lista de reprodução"</string>
     <string name="queue" msgid="2937629819482787704">"Lista de reprodução actual"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"Nova lista de reprodução <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"Uma música adicionada à lista de reprodução."</item>
-    <item quantity="other" msgid="7675242021325355213">"%d músicas adicionadas à lista de reprodução."</item>
+    <item quantity="other" msgid="7662771987109627255">"Foram adicionadas <xliff:g id="NUMBER">%d</xliff:g> músicas à lista de reprodução."</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"A lista de reprodução seleccionada está vazia."</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"Guardar"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"Cancelar"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"Remover da lista de reprodução"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"A ligar a <xliff:g id="HOST">%s</xliff:g>"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"Procurar %s utilizando:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"Pesquisar <xliff:g id="TERM">%s</xliff:g> utilizando:"</string>
     <string name="working_artists" msgid="8678357432732156580">"Artistas..."</string>
     <string name="working_albums" msgid="8713273699401457426">"Álbuns..."</string>
     <string name="working_songs" msgid="2201491972050410684">"Músicas..."</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index f4bacce..886886c 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"Repetindo todas as músicas."</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"Usar como toque do telefone"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"Usar como toque"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"\"%s\" definido como toque do telefone."</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"\"<xliff:g id="NAME">%s</xliff:g>\" definido como toque do telefone."</string>
     <string name="play_selection" msgid="2854921021814550018">"Reproduzir"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"Adicionar à lista de reprodução"</string>
     <string name="queue" msgid="2937629819482787704">"Lista de reprodução atual"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"Nova lista de reprodução <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"1 música adicionada à lista de reprodução."</item>
-    <item quantity="other" msgid="7675242021325355213">"%d músicas adicionadas à lista de reprodução."</item>
+    <item quantity="other" msgid="7662771987109627255">"<xliff:g id="NUMBER">%d</xliff:g> músicas adicionadas à lista de reprodução."</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"A lista de reprodução selecionada está vazia."</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"Salvar"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"Cancelar"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"Remover da lista de reprodução"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"Conectando-se a <xliff:g id="HOST">%s</xliff:g>"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"Pesquisar %s usando:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"Pesquisar <xliff:g id="TERM">%s</xliff:g> usando:"</string>
     <string name="working_artists" msgid="8678357432732156580">"Artistas…"</string>
     <string name="working_albums" msgid="8713273699401457426">"Álbuns..."</string>
     <string name="working_songs" msgid="2201491972050410684">"Músicas…"</string>
diff --git a/res/values-ru-keyshidden/strings.xml b/res/values-ru-keyshidden/strings.xml
index 9e99582..ce2b17f 100644
--- a/res/values-ru-keyshidden/strings.xml
+++ b/res/values-ru-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"Откройте клавиатуру, чтобы ввести название для нового плейлиста, или нажмите \"Сохранить\", чтобы сохранить плейлист под названием \"%s\"."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"Откройте клавиатуру, чтобы ввести название для нового плейлиста, или нажмите \"Сохранить\", чтобы сохранить плейлист под названием \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"Откройте клавиатуру, чтобы ввести новое название для плейлиста \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"Откройте клавиатуру, чтобы ввести другое название для плейлиста \"<xliff:g id="PLAYLIST">%s</xliff:g>\" или нажмите \"Сохранить\", чтобы сохранить плейлист под названием \"%s\"."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"Откройте клавиатуру, чтобы ввести другое название для плейлиста \"<xliff:g id="PLAYLIST">%1$s</xliff:g>\", или нажмите \"Сохранить\", чтобы сохранить плейлист под названием \"<xliff:g id="NAME">%2$s</xliff:g>\"."</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index ac611c3..90f60ef 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"Повтор всех композиций."</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"Сделать мелодией звонка"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"Сделать мелодией звонка"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"Композиция \"%s\" установлена в качестве мелодии звонка."</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"Композиция \"<xliff:g id="NAME">%s</xliff:g>\" установлена в качестве мелодии звонка."</string>
     <string name="play_selection" msgid="2854921021814550018">"Воспроизвести"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"Добавить в плейлист"</string>
     <string name="queue" msgid="2937629819482787704">"Текущий плейлист"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"Новый плейлист <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"1 композиция добавлена в плейлист."</item>
-    <item quantity="other" msgid="7675242021325355213">"Добавлено композиций в плейлист: %d."</item>
+    <item quantity="other" msgid="7662771987109627255">"Композиций, добавленных в плейлист: <xliff:g id="NUMBER">%d</xliff:g>"</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"Выбранный плейлист пуст."</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"Сохранить"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"Отмена"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"Удалить из плейлиста"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"Подключение к <xliff:g id="HOST">%s</xliff:g>"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"Поиск %s с помощью:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"Искать \"<xliff:g id="TERM">%s</xliff:g>\", используя"</string>
     <string name="working_artists" msgid="8678357432732156580">"Исполнители..."</string>
     <string name="working_albums" msgid="8713273699401457426">"Альбомы…"</string>
     <string name="working_songs" msgid="2201491972050410684">"Композиции..."</string>
diff --git a/res/values-sv-keyshidden/strings.xml b/res/values-sv-keyshidden/strings.xml
index e37062d..89274b6 100644
--- a/res/values-sv-keyshidden/strings.xml
+++ b/res/values-sv-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"Öppna tangentbordet om du vill ange ett namn på spellistan. Om du väljer Spara får den namnet %s."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"Öppna tangentbordet om du vill ange ett namn på spellistan. Om du väljer Spara får den namnet \"<xliff:g id="PLAYLIST">%s</xliff:g>\"."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"Öppna tangentbordet om du vill ange ett namn på spellistan <xliff:g id="PLAYLIST">%s</xliff:g>."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"Öppna tangentbordet om du vill ange ett nytt namn på spellistan <xliff:g id="PLAYLIST">%s</xliff:g>. Om du väljer Spara får den namnet %s."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"Öppna tangentbordet om du vill ange ett nytt namn på spellistan <xliff:g id="PLAYLIST">%1$s</xliff:g>. Om du väljer Spara får den namnet \"<xliff:g id="NAME">%2$s</xliff:g>\"."</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 15e63b7..5c81ea0 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"Upprepa alla låtar."</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"Använd som ringsignal"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"Använd som ringsignal"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"\"%s\" vald som ringsignal."</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"\"<xliff:g id="NAME">%s</xliff:g>\" vald som ringsignal."</string>
     <string name="play_selection" msgid="2854921021814550018">"Spela"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"Lägg till i spellista"</string>
     <string name="queue" msgid="2937629819482787704">"Aktuell spellista"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"Ny spellista <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"1 låt har lagts till i spellistan."</item>
-    <item quantity="other" msgid="7675242021325355213">"%d låtar har lagts till i spellistan."</item>
+    <item quantity="other" msgid="7662771987109627255">"<xliff:g id="NUMBER">%d</xliff:g> låtar har lagts till i spellistan."</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"Den valda spellistan är tom."</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"Spara"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"Avbryt"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"Ta bort från spellista"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"Ansluter till <xliff:g id="HOST">%s</xliff:g>"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"Sök efter %s med:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"Sök efter <xliff:g id="TERM">%s</xliff:g> med:"</string>
     <string name="working_artists" msgid="8678357432732156580">"Artister…"</string>
     <string name="working_albums" msgid="8713273699401457426">"Album…"</string>
     <string name="working_songs" msgid="2201491972050410684">"Låtar…"</string>
diff --git a/res/values-tr-keyshidden/strings.xml b/res/values-tr-keyshidden/strings.xml
index b4ac9e5..d455441 100644
--- a/res/values-tr-keyshidden/strings.xml
+++ b/res/values-tr-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"Yeni şarkı listenize bir ad vermek için tuş takımını açın veya \"%s\" olarak adlandırmak üzere Kaydet\'i seçin."</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"Yeni Şarkı Listenize bir ad vermek için klavyenizi açın veya \"<xliff:g id="PLAYLIST">%s</xliff:g>\" olarak adlandırmak üzere Kaydet\'i seçin."</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"\"<xliff:g id="PLAYLIST">%s</xliff:g>\" şarkı listesine yeni bir ad vermek için klavyeyi açın."</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"\"<xliff:g id="PLAYLIST">%s</xliff:g>\" şarkı listesine yeni bir ad vermek için klavyeyi açın veya \"%s\" olarak adlandırmak üzere Kaydet\'i seçin."</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"\"<xliff:g id="PLAYLIST">%1$s</xliff:g>\" şarkı listesine yeni bir ad vermek için klavyeyi açın veya <xliff:g id="NAME">%2$s</xliff:g> olarak adlandırmak üzere Kaydet\'i seçin."</string>
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 4a090fd..f8d41f4 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"Tüm şarkılar tekrarlanıyor."</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"Telefon zil sesi olarak kullan"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"Zil sesi olarak kullan"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"\"%s\" telefon zil sesi olarak ayarlanmış."</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"\"<xliff:g id="NAME">%s</xliff:g>\" telefon zil sesi olarak ayarlanmış."</string>
     <string name="play_selection" msgid="2854921021814550018">"Yürüt"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"Şarkı listesine ekle"</string>
     <string name="queue" msgid="2937629819482787704">"Geçerli şarkı listesi"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"Yeni şarkı listesi <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"Şarkı listesine 1 şarkı eklendi."</item>
-    <item quantity="other" msgid="7675242021325355213">"Şarkı listesine %d şarkı eklendi."</item>
+    <item quantity="other" msgid="7662771987109627255">"Şarkı listesine <xliff:g id="NUMBER">%d</xliff:g> şarkı eklendi."</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"Seçilen şarkı listesi boş."</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"Kaydet"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"İptal"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"Şarkı listesinden kaldır"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"Şuraya bağlanılıyor: <xliff:g id="HOST">%s</xliff:g>"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"Şunu kullanarak %s için arama yap:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"Şunu kullanarak <xliff:g id="TERM">%s</xliff:g> için arama yapın:"</string>
     <string name="working_artists" msgid="8678357432732156580">"Sanatçılar..."</string>
     <string name="working_albums" msgid="8713273699401457426">"Albümler..."</string>
     <string name="working_songs" msgid="2201491972050410684">"Şarkılar..."</string>
diff --git a/res/values-zh-rCN-keyshidden/strings.xml b/res/values-zh-rCN-keyshidden/strings.xml
index 531f405..d40f4ff 100644
--- a/res/values-zh-rCN-keyshidden/strings.xml
+++ b/res/values-zh-rCN-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"打开键盘可为新的播放列表命名,或选择“保存”将其命名为“%s”。"</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"打开键盘为新的播放列表命名,或选择“保存”将其命名为“<xliff:g id="PLAYLIST">%s</xliff:g>”。"</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"打开键盘可为播放列表“<xliff:g id="PLAYLIST">%s</xliff:g>”重命名。"</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"打开键盘可为播放列表“<xliff:g id="PLAYLIST">%s</xliff:g>”重命名,或者选择“保存”将其命名为“%s”。"</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"打开键盘为播放列表“<xliff:g id="PLAYLIST">%1$s</xliff:g>”重命名,或者选择“保存”将其命名为“<xliff:g id="NAME">%2$s</xliff:g>”。"</string>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 85c0cdb..a6814bc 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"重复播放所有歌曲。"</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"用作手机铃声"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"用作铃声"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"已将“%s”设置为手机铃声。"</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"已将“<xliff:g id="NAME">%s</xliff:g>”设置为手机铃声。"</string>
     <string name="play_selection" msgid="2854921021814550018">"播放"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"添加到播放列表"</string>
     <string name="queue" msgid="2937629819482787704">"当前播放列表"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"新建播放列表 <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"已将 1 首歌曲添加到播放列表。"</item>
-    <item quantity="other" msgid="7675242021325355213">"%d 首歌曲已添加到播放列表。"</item>
+    <item quantity="other" msgid="7662771987109627255">"<xliff:g id="NUMBER">%d</xliff:g> 首歌曲已添加到播放列表。"</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"选定的播放列表为空。"</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"保存"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"取消"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"从播放列表中删除"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"正在连接 <xliff:g id="HOST">%s</xliff:g>"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"搜索%s所用的工具:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"使用以下工具搜索“<xliff:g id="TERM">%s</xliff:g>”:"</string>
     <string name="working_artists" msgid="8678357432732156580">"艺术家..."</string>
     <string name="working_albums" msgid="8713273699401457426">"专辑..."</string>
     <string name="working_songs" msgid="2201491972050410684">"歌曲..."</string>
diff --git a/res/values-zh-rTW-keyshidden/strings.xml b/res/values-zh-rTW-keyshidden/strings.xml
index dc0e0cc..224ce0a 100644
--- a/res/values-zh-rTW-keyshidden/strings.xml
+++ b/res/values-zh-rTW-keyshidden/strings.xml
@@ -15,7 +15,7 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="create_playlist_create_text_prompt" msgid="6653146846093237201">"開啟鍵盤為新 [播放清單] 命名,或選取 [儲存] 將之命名為「%s」。"</string>
+    <string name="create_playlist_create_text_prompt" msgid="2379436619128383935">"開啟鍵盤來為播放清單輸入新名稱,或選取 [儲存] 將其命名為「<xliff:g id="PLAYLIST">%s</xliff:g>」。"</string>
     <string name="rename_playlist_same_prompt" msgid="7777541452078260899">"開啟鍵盤以重新命名「<xliff:g id="PLAYLIST">%s</xliff:g>」播放清單。"</string>
-    <string name="rename_playlist_diff_prompt" msgid="6930730254920388535">"開啟鍵盤以重新命名「<xliff:g id="PLAYLIST">%s</xliff:g>」播放清單,或選取 [儲存] 將之命名為「%s」。"</string>
+    <string name="rename_playlist_diff_prompt" msgid="900422624897120958">"開啟鍵盤來為播放清單「<xliff:g id="PLAYLIST">%1$s</xliff:g>」輸入新名稱,或選取 [儲存] 將其命名為「<xliff:g id="NAME">%2$s</xliff:g>」。"</string>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 3e0e4b3..2b009fa 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -82,7 +82,7 @@
     <string name="repeat_all_notif" msgid="6443293055987316642">"重複播放所有樂曲。"</string>
     <string name="ringtone_menu" msgid="2737472190159134599">"設成來電鈴聲"</string>
     <string name="ringtone_menu_short" msgid="3367622038867238133">"設成鈴聲"</string>
-    <string name="ringtone_set" msgid="4352073372504803255">"已將「%s」設為來電鈴聲。"</string>
+    <string name="ringtone_set" msgid="5325818347613843130">"已將「<xliff:g id="NAME">%s</xliff:g>」設為手機鈴聲。"</string>
     <string name="play_selection" msgid="2854921021814550018">"播放"</string>
     <string name="add_to_playlist" msgid="7110273488645072783">"新增至播放清單"</string>
     <string name="queue" msgid="2937629819482787704">"目前播放清單"</string>
@@ -90,7 +90,7 @@
     <string name="new_playlist_name_template" msgid="905710296728900597">"新播放清單 <xliff:g id="NUMBER">%d</xliff:g>"</string>
   <plurals name="NNNtrackstoplaylist">
     <item quantity="one" msgid="422388042993582235">"已將 1 首樂曲加入播放清單。"</item>
-    <item quantity="other" msgid="7675242021325355213">"%d 首樂曲已新增至播放清單。"</item>
+    <item quantity="other" msgid="7662771987109627255">"已將 <xliff:g id="NUMBER">%d</xliff:g> 首樂曲新增至播放清單。"</item>
   </plurals>
     <string name="emptyplaylist" msgid="6711555673997896344">"您選取的播放清單是空的。"</string>
     <string name="create_playlist_create_text" msgid="8149755205483279143">"儲存"</string>
@@ -125,7 +125,7 @@
     <string name="cancel" msgid="886559484711947520">"取消"</string>
     <string name="remove_from_playlist" msgid="2548577514849026354">"從播放清單移除"</string>
     <string name="streamloadingtext" msgid="3367150884806639224">"連線到 <xliff:g id="HOST">%s</xliff:g>"</string>
-    <string name="mediasearch" msgid="9170843953524689876">"搜尋 %s,使用:"</string>
+    <string name="mediasearch" msgid="959222971261132292">"透過以下工具,搜尋與「<xliff:g id="TERM">%s</xliff:g>」相符的結果:"</string>
     <string name="working_artists" msgid="8678357432732156580">"演出者..."</string>
     <string name="working_albums" msgid="8713273699401457426">"專輯..."</string>
     <string name="working_songs" msgid="2201491972050410684">"樂曲..."</string>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 9a7806a..07a5839 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -16,6 +16,5 @@
 
 <resources>
     <color name="appwidget_text">#ff000000</color>
-    <color name="appwidget_shadow">#ffffffff</color>
 </resources>
 
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index bcb0d64..c1c15b3 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -4,9 +4,9 @@
      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.
@@ -15,8 +15,10 @@
 -->
 
 <resources>
-    <!-- Size of widget album art cutout -->
-    <dimen name="appwidget_cutout">198dip</dimen>
+    <!-- height of a normal list item in edit playlist mode -->
+    <dimen name="normal_height">64dip</dimen>
+    <!-- height of an expanded list item in edit playlist mode -->
+    <dimen name="expanded_height">128dip</dimen>
 
     <dimen name="appwidget_width">311dip</dimen>
     <dimen name="appwidget_height">80dip</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c51e37b..75f2496 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -49,8 +49,10 @@
     5 - second%60
     -->
     <skip/>
-    <!-- Do not translate. Duration format. -->
-    <string name="durationformat"><xliff:g id="format">%2$d:%5$02d</xliff:g></string>
+    <!-- Do not translate. Duration format for duration < 1 hour -->
+    <string translatable="false" name="durationformatshort"><xliff:g id="format">%2$d:%5$02d</xliff:g></string>
+    <!-- Do not translate. Duration format for duration >= 1 hour -->
+    <string translatable="false" name="durationformatlong"><xliff:g id="format">%1$d:%3$02d:%5$02d</xliff:g></string>
 
     <!-- Menu item that takes the user back to the top level screen of the music player -->
     <string name="goto_start">Library</string>
@@ -171,7 +173,7 @@
     <!-- Menu item -->
     <string name="ringtone_menu_short">Use as ringtone</string>
     <!-- Toast after setting a song as phone ringtone -->
-    <string name="ringtone_set">\"%s\" set as phone ringtone.</string>
+    <string name="ringtone_set">\"<xliff:g id="name" example="Alarm Bell">%s</xliff:g>\" set as phone ringtone.</string>
     <!-- Context menu item -->
     <string name="play_selection">Play</string>
     <!-- Context menu item -->
@@ -187,7 +189,7 @@
         <!-- message shown when one song was added -->
         <item quantity="one">1 song added to playlist.</item>
         <!-- message shown when zero or more than one song was added -->
-        <item quantity="other">%d songs added to playlist.</item>
+        <item quantity="other"><xliff:g id="number" example="27">%d</xliff:g> songs added to playlist.</item>
     </plurals>
     <!-- Toast after selecting an empty playlist -->
     <string name="emptyplaylist">Selected playlist is empty.</string>
@@ -255,7 +257,7 @@
     <string name="streamloadingtext">Connecting to <xliff:g id="host">%s</xliff:g></string>
 
     <!-- title of contextual music search menu -->
-    <string name="mediasearch">Search for %s using:</string>
+    <string name="mediasearch">Search for <xliff:g id="term" example="Beethoven">%s</xliff:g> using:</string>
 
     <!-- Shown in the title bar while the list of artists is being retrieved in the background -->
     <string name="working_artists">Artists\u2026</string>
diff --git a/src/com/android/music/AlbumBrowserActivity.java b/src/com/android/music/AlbumBrowserActivity.java
index 6f326a0..49a3893 100644
--- a/src/com/android/music/AlbumBrowserActivity.java
+++ b/src/com/android/music/AlbumBrowserActivity.java
@@ -37,6 +37,7 @@
 import android.os.Handler;
 import android.os.Message;
 import android.provider.MediaStore;
+import android.util.Log;
 import android.view.ContextMenu;
 import android.view.Menu;
 import android.view.MenuItem;
@@ -64,6 +65,8 @@
     private String mCurrentAlbumId;
     private String mCurrentAlbumName;
     private String mCurrentArtistNameForAlbum;
+    boolean mIsUnknownArtist;
+    boolean mIsUnknownAlbum;
     private AlbumListAdapter mAdapter;
     private boolean mAdapterSent;
     private final static int SEARCH = CHILD_MENU_BASE;
@@ -191,7 +194,9 @@
     private Handler mReScanHandler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
-            getAlbumCursor(mAdapter.getQueryHandler(), null);
+            if (mAdapter != null) {
+                getAlbumCursor(mAdapter.getQueryHandler(), null);
+            }
         }
     };
 
@@ -204,6 +209,9 @@
 
     public void init(Cursor c) {
 
+        if (mAdapter == null) {
+            return;
+        }
         mAdapter.changeCursor(c); // also sets mAlbumCursor
 
         if (mAlbumCursor == null) {
@@ -221,7 +229,8 @@
         CharSequence fancyName = "";
         if (mAlbumCursor != null && mAlbumCursor.getCount() > 0) {
             mAlbumCursor.moveToFirst();
-            fancyName = mAlbumCursor.getString(3);
+            fancyName = mAlbumCursor.getString(
+                    mAlbumCursor.getColumnIndex(MediaStore.Audio.Albums.ARTIST));
             if (fancyName == null || fancyName.equals(MediaFile.UNKNOWN_STRING))
                 fancyName = getText(R.string.unknown_artist_name);
         }
@@ -231,14 +240,13 @@
         else
             setTitle(R.string.albums_title);
     }
-    
+
     @Override
     public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfoIn) {
         menu.add(0, PLAY_SELECTION, 0, R.string.play_selection);
         SubMenu sub = menu.addSubMenu(0, ADD_TO_PLAYLIST, 0, R.string.add_to_playlist);
         MusicUtils.makePlaylistMenu(this, sub);
         menu.add(0, DELETE_ITEM, 0, R.string.delete_item);
-        menu.add(0, SEARCH, 0, R.string.search_title);
 
         AdapterContextMenuInfo mi = (AdapterContextMenuInfo) menuInfoIn;
         mAlbumCursor.moveToPosition(mi.position);
@@ -246,11 +254,18 @@
         mCurrentAlbumName = mAlbumCursor.getString(mAlbumCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM));
         mCurrentArtistNameForAlbum = mAlbumCursor.getString(
                 mAlbumCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ARTIST));
-        if (mCurrentAlbumName == null || mCurrentAlbumName.equals(MediaFile.UNKNOWN_STRING)) {
+        mIsUnknownArtist = mCurrentArtistNameForAlbum == null ||
+                mCurrentArtistNameForAlbum.equals(MediaFile.UNKNOWN_STRING);
+        mIsUnknownAlbum = mCurrentAlbumName == null ||
+                mCurrentAlbumName.equals(MediaFile.UNKNOWN_STRING);
+        if (mIsUnknownAlbum) {
             menu.setHeaderTitle(getString(R.string.unknown_album_name));
         } else {
             menu.setHeaderTitle(mCurrentAlbumName);
         }
+        if (!mIsUnknownAlbum || !mIsUnknownArtist) {
+            menu.add(0, SEARCH, 0, R.string.search_title);
+        }
     }
 
     @Override
@@ -258,13 +273,13 @@
         switch (item.getItemId()) {
             case PLAY_SELECTION: {
                 // play the selected album
-                int [] list = MusicUtils.getSongListForAlbum(this, Integer.parseInt(mCurrentAlbumId));
+                long [] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
                 MusicUtils.playAll(this, list, 0);
                 return true;
             }
 
             case QUEUE: {
-                int [] list = MusicUtils.getSongListForAlbum(this, Integer.parseInt(mCurrentAlbumId));
+                long [] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
                 MusicUtils.addToCurrentPlaylist(this, list);
                 return true;
             }
@@ -277,18 +292,18 @@
             }
 
             case PLAYLIST_SELECTED: {
-                int [] list = MusicUtils.getSongListForAlbum(this, Integer.parseInt(mCurrentAlbumId));
-                int playlist = item.getIntent().getIntExtra("playlist", 0);
+                long [] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
+                long playlist = item.getIntent().getLongExtra("playlist", 0);
                 MusicUtils.addToPlaylist(this, list, playlist);
                 return true;
             }
             case DELETE_ITEM: {
-                int [] list = MusicUtils.getSongListForAlbum(this, Integer.parseInt(mCurrentAlbumId));
+                long [] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
                 String f = getString(R.string.delete_album_desc); 
                 String desc = String.format(f, mCurrentAlbumName);
                 Bundle b = new Bundle();
                 b.putString("description", desc);
-                b.putIntArray("items", list);
+                b.putLongArray("items", list);
                 Intent intent = new Intent();
                 intent.setClass(this, DeleteItems.class);
                 intent.putExtras(b);
@@ -305,16 +320,25 @@
 
     void doSearch() {
         CharSequence title = null;
-        String query = null;
+        String query = "";
         
         Intent i = new Intent();
         i.setAction(MediaStore.INTENT_ACTION_MEDIA_SEARCH);
         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         
-        title = mCurrentAlbumName;
-        query = mCurrentArtistNameForAlbum + " " + mCurrentAlbumName;
-        i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistNameForAlbum);
-        i.putExtra(MediaStore.EXTRA_MEDIA_ALBUM, mCurrentAlbumName);
+        title = "";
+        if (!mIsUnknownAlbum) {
+            query = mCurrentAlbumName;
+            i.putExtra(MediaStore.EXTRA_MEDIA_ALBUM, mCurrentAlbumName);
+            title = mCurrentAlbumName;
+        }
+        if(!mIsUnknownArtist) {
+            query = query + " " + mCurrentArtistNameForAlbum;
+            i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistNameForAlbum);
+            title = title + " " + mCurrentArtistNameForAlbum;
+        }
+        // Since we hide the 'search' menu item when both album and artist are
+        // unknown, the query and title strings will have at least one of those.
         i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE);
         title = getString(R.string.mediasearch, title);
         i.putExtra(SearchManager.QUERY, query);
@@ -337,8 +361,8 @@
                 if (resultCode == RESULT_OK) {
                     Uri uri = intent.getData();
                     if (uri != null) {
-                        int [] list = MusicUtils.getSongListForAlbum(this, Integer.parseInt(mCurrentAlbumId));
-                        MusicUtils.addToPlaylist(this, list, Integer.parseInt(uri.getLastPathSegment()));
+                        long [] list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
+                        MusicUtils.addToPlaylist(this, list, Long.parseLong(uri.getLastPathSegment()));
                     }
                 }
                 break;
@@ -509,7 +533,7 @@
             mNowPlayingOverlay = r.getDrawable(R.drawable.indicator_ic_mp_playing_list);
 
             Bitmap b = BitmapFactory.decodeResource(r, R.drawable.albumart_mp_unknown_list);
-            mDefaultAlbumIcon = new BitmapDrawable(b);
+            mDefaultAlbumIcon = new BitmapDrawable(context.getResources(), b);
             // no filter or dither, it's a lot faster and we can't tell the difference
             mDefaultAlbumIcon.setFilterBitmap(false);
             mDefaultAlbumIcon.setDither(false);
@@ -578,16 +602,15 @@
             // We don't actually need the path to the thumbnail file,
             // we just use it to see if there is album art or not
             String art = cursor.getString(mAlbumArtIndex);
+            long aid = cursor.getLong(0);
             if (unknown || art == null || art.length() == 0) {
                 iv.setImageDrawable(null);
             } else {
-                int artIndex = cursor.getInt(0);
-                Drawable d = MusicUtils.getCachedArtwork(context, artIndex, mDefaultAlbumIcon);
+                Drawable d = MusicUtils.getCachedArtwork(context, aid, mDefaultAlbumIcon);
                 iv.setImageDrawable(d);
             }
             
-            int currentalbumid = MusicUtils.getCurrentAlbumId();
-            int aid = cursor.getInt(0);
+            long currentalbumid = MusicUtils.getCurrentAlbumId();
             iv = vh.play_indicator;
             if (currentalbumid == aid) {
                 iv.setImageDrawable(mNowPlayingOverlay);
diff --git a/src/com/android/music/ArtistAlbumBrowserActivity.java b/src/com/android/music/ArtistAlbumBrowserActivity.java
index 0932f12..9aa42b4 100644
--- a/src/com/android/music/ArtistAlbumBrowserActivity.java
+++ b/src/com/android/music/ArtistAlbumBrowserActivity.java
@@ -68,6 +68,8 @@
     private String mCurrentAlbumId;
     private String mCurrentAlbumName;
     private String mCurrentArtistNameForAlbum;
+    boolean mIsUnknownArtist;
+    boolean mIsUnknownAlbum;
     private ArtistAlbumListAdapter mAdapter;
     private boolean mAdapterSent;
     private final static int SEARCH = CHILD_MENU_BASE;
@@ -164,6 +166,7 @@
         setListAdapter(null);
         mAdapter = null;
         unregisterReceiver(mScanListener);
+        setListAdapter(null);
         super.onDestroy();
     }
     
@@ -199,7 +202,9 @@
     private Handler mReScanHandler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
-            getArtistCursor(mAdapter.getQueryHandler(), null);
+            if (mAdapter != null) {
+                getArtistCursor(mAdapter.getQueryHandler(), null);
+            }
         }
     };
 
@@ -212,6 +217,9 @@
     
     public void init(Cursor c) {
 
+        if (mAdapter == null) {
+            return;
+        }
         mAdapter.changeCursor(c); // also sets mArtistCursor
 
         if (mArtistCursor == null) {
@@ -301,7 +309,6 @@
         SubMenu sub = menu.addSubMenu(0, ADD_TO_PLAYLIST, 0, R.string.add_to_playlist);
         MusicUtils.makePlaylistMenu(this, sub);
         menu.add(0, DELETE_ITEM, 0, R.string.delete_item);
-        menu.add(0, SEARCH, 0, R.string.search_title);
         
         ExpandableListContextMenuInfo mi = (ExpandableListContextMenuInfo) menuInfoIn;
         
@@ -319,10 +326,14 @@
             mCurrentArtistId = mArtistCursor.getString(mArtistCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID));
             mCurrentArtistName = mArtistCursor.getString(mArtistCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST));
             mCurrentAlbumId = null;
-            if (mCurrentArtistName == null || mCurrentArtistName.equals(MediaFile.UNKNOWN_STRING)) {
+            mIsUnknownArtist = mCurrentArtistName == null ||
+                    mCurrentArtistName.equals(MediaFile.UNKNOWN_STRING);
+            mIsUnknownAlbum = true;
+            if (mIsUnknownArtist) {
                 menu.setHeaderTitle(getString(R.string.unknown_artist_name));
             } else {
                 menu.setHeaderTitle(mCurrentArtistName);
+                menu.add(0, SEARCH, 0, R.string.search_title);
             }
             return;
         } else if (itemtype == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
@@ -340,11 +351,18 @@
             mArtistCursor.moveToPosition(gpos);
             mCurrentArtistNameForAlbum = mArtistCursor.getString(
                     mArtistCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists.ARTIST));
-            if (mCurrentAlbumName == null || mCurrentAlbumName.equals(MediaFile.UNKNOWN_STRING)) {
+            mIsUnknownArtist = mCurrentArtistNameForAlbum == null ||
+                    mCurrentArtistNameForAlbum.equals(MediaFile.UNKNOWN_STRING);
+            mIsUnknownAlbum = mCurrentAlbumName == null ||
+                    mCurrentAlbumName.equals(MediaFile.UNKNOWN_STRING);
+            if (mIsUnknownAlbum) {
                 menu.setHeaderTitle(getString(R.string.unknown_album_name));
             } else {
                 menu.setHeaderTitle(mCurrentAlbumName);
             }
+            if (!mIsUnknownAlbum || !mIsUnknownArtist) {
+                menu.add(0, SEARCH, 0, R.string.search_title);
+            }
         }
     }
 
@@ -353,20 +371,20 @@
         switch (item.getItemId()) {
             case PLAY_SELECTION: {
                 // play everything by the selected artist
-                int [] list =
+                long [] list =
                     mCurrentArtistId != null ?
-                    MusicUtils.getSongListForArtist(this, Integer.parseInt(mCurrentArtistId))
-                    : MusicUtils.getSongListForAlbum(this, Integer.parseInt(mCurrentAlbumId));
+                    MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId))
+                    : MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
                         
                 MusicUtils.playAll(this, list, 0);
                 return true;
             }
 
             case QUEUE: {
-                int [] list =
+                long [] list =
                     mCurrentArtistId != null ?
-                    MusicUtils.getSongListForArtist(this, Integer.parseInt(mCurrentArtistId))
-                    : MusicUtils.getSongListForAlbum(this, Integer.parseInt(mCurrentAlbumId));
+                    MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId))
+                    : MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
                 MusicUtils.addToCurrentPlaylist(this, list);
                 return true;
             }
@@ -379,30 +397,30 @@
             }
 
             case PLAYLIST_SELECTED: {
-                int [] list =
+                long [] list =
                     mCurrentArtistId != null ?
-                    MusicUtils.getSongListForArtist(this, Integer.parseInt(mCurrentArtistId))
-                    : MusicUtils.getSongListForAlbum(this, Integer.parseInt(mCurrentAlbumId));
-                int playlist = item.getIntent().getIntExtra("playlist", 0);
+                    MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId))
+                    : MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
+                long playlist = item.getIntent().getLongExtra("playlist", 0);
                 MusicUtils.addToPlaylist(this, list, playlist);
                 return true;
             }
             
             case DELETE_ITEM: {
-                int [] list;
+                long [] list;
                 String desc;
                 if (mCurrentArtistId != null) {
-                    list = MusicUtils.getSongListForArtist(this, Integer.parseInt(mCurrentArtistId));
+                    list = MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId));
                     String f = getString(R.string.delete_artist_desc);
                     desc = String.format(f, mCurrentArtistName);
                 } else {
-                    list = MusicUtils.getSongListForAlbum(this, Integer.parseInt(mCurrentAlbumId));
+                    list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
                     String f = getString(R.string.delete_album_desc); 
                     desc = String.format(f, mCurrentAlbumName);
                 }
                 Bundle b = new Bundle();
                 b.putString("description", desc);
-                b.putIntArray("items", list);
+                b.putLongArray("items", list);
                 Intent intent = new Intent();
                 intent.setClass(this, DeleteItems.class);
                 intent.putExtras(b);
@@ -431,8 +449,14 @@
             i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistName);
             i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE);
         } else {
-            title = mCurrentAlbumName;
-            query = mCurrentArtistNameForAlbum + " " + mCurrentAlbumName;
+            if (mIsUnknownAlbum) {
+                title = query = mCurrentArtistNameForAlbum;
+            } else {
+                title = query = mCurrentAlbumName;
+                if (!mIsUnknownArtist) {
+                    query = query + " " + mCurrentArtistNameForAlbum;
+                }
+            }
             i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistNameForAlbum);
             i.putExtra(MediaStore.EXTRA_MEDIA_ALBUM, mCurrentAlbumName);
             i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE);
@@ -458,13 +482,13 @@
                 if (resultCode == RESULT_OK) {
                     Uri uri = intent.getData();
                     if (uri != null) {
-                        int [] list = null;
+                        long [] list = null;
                         if (mCurrentArtistId != null) {
-                            list = MusicUtils.getSongListForArtist(this, Integer.parseInt(mCurrentArtistId));
+                            list = MusicUtils.getSongListForArtist(this, Long.parseLong(mCurrentArtistId));
                         } else if (mCurrentAlbumId != null) {
-                            list = MusicUtils.getSongListForAlbum(this, Integer.parseInt(mCurrentAlbumId));
+                            list = MusicUtils.getSongListForAlbum(this, Long.parseLong(mCurrentAlbumId));
                         }
-                        MusicUtils.addToPlaylist(this, list, Integer.parseInt(uri.getLastPathSegment()));
+                        MusicUtils.addToPlaylist(this, list, Long.parseLong(uri.getLastPathSegment()));
                     }
                 }
                 break;
@@ -649,8 +673,8 @@
             
             vh.line2.setText(songs_albums);
             
-            int currentartistid = MusicUtils.getCurrentArtistId();
-            int artistid = cursor.getInt(mGroupArtistIdIdx);
+            long currentartistid = MusicUtils.getCurrentArtistId();
+            long artistid = cursor.getLong(mGroupArtistIdIdx);
             if (currentartistid == artistid && !isexpanded) {
                 vh.play_indicator.setImageDrawable(mNowPlayingOverlay);
             } else {
@@ -706,13 +730,13 @@
                 iv.setBackgroundDrawable(mDefaultAlbumIcon);
                 iv.setImageDrawable(null);
             } else {
-                int artIndex = cursor.getInt(0);
+                long artIndex = cursor.getLong(0);
                 Drawable d = MusicUtils.getCachedArtwork(context, artIndex, mDefaultAlbumIcon);
                 iv.setImageDrawable(d);
             }
 
-            int currentalbumid = MusicUtils.getCurrentAlbumId();
-            int aid = cursor.getInt(0);
+            long currentalbumid = MusicUtils.getCurrentAlbumId();
+            long aid = cursor.getLong(0);
             iv = vh.play_indicator;
             if (currentalbumid == aid) {
                 iv.setImageDrawable(mNowPlayingOverlay);
@@ -725,7 +749,7 @@
         @Override
         protected Cursor getChildrenCursor(Cursor groupCursor) {
             
-            int id = groupCursor.getInt(groupCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID));
+            long id = groupCursor.getLong(groupCursor.getColumnIndexOrThrow(MediaStore.Audio.Artists._ID));
             
             String[] cols = new String[] {
                     MediaStore.Audio.Albums._ID,
diff --git a/src/com/android/music/DeleteItems.java b/src/com/android/music/DeleteItems.java
index 15e681f..6cb2527 100644
--- a/src/com/android/music/DeleteItems.java
+++ b/src/com/android/music/DeleteItems.java
@@ -40,7 +40,7 @@
 {
     private TextView mPrompt;
     private Button mButton;
-    private int [] mItemList;
+    private long [] mItemList;
 
     @Override
     public void onCreate(Bundle icicle) {
@@ -64,7 +64,7 @@
 
         Bundle b = getIntent().getExtras();
         String desc = b.getString("description");
-        mItemList = b.getIntArray("items");
+        mItemList = b.getLongArray("items");
         
         mPrompt.setText(desc);
     }
diff --git a/src/com/android/music/IMediaPlaybackService.aidl b/src/com/android/music/IMediaPlaybackService.aidl
index 1d27057..be48247 100644
--- a/src/com/android/music/IMediaPlaybackService.aidl
+++ b/src/com/android/music/IMediaPlaybackService.aidl
@@ -23,7 +23,7 @@
 {
     void openFile(String path, boolean oneShot);
     void openFileAsync(String path);
-    void open(in int [] list, int position);
+    void open(in long [] list, int position);
     int getQueuePosition();
     boolean isPlaying();
     void stop();
@@ -36,19 +36,19 @@
     long seek(long pos);
     String getTrackName();
     String getAlbumName();
-    int getAlbumId();
+    long getAlbumId();
     String getArtistName();
-    int getArtistId();
-    void enqueue(in int [] list, int action);
-    int [] getQueue();
+    long getArtistId();
+    void enqueue(in long [] list, int action);
+    long [] getQueue();
     void moveQueueItem(int from, int to);
     void setQueuePosition(int index);
     String getPath();
-    int getAudioId();
+    long getAudioId();
     void setShuffleMode(int shufflemode);
     int getShuffleMode();
     int removeTracks(int first, int last);
-    int removeTrack(int id);
+    int removeTrack(long id);
     void setRepeatMode(int repeatmode);
     int getRepeatMode();
     int getMediaMountedCount();
diff --git a/src/com/android/music/MediaButtonIntentReceiver.java b/src/com/android/music/MediaButtonIntentReceiver.java
index 5840721..7c82e17 100644
--- a/src/com/android/music/MediaButtonIntentReceiver.java
+++ b/src/com/android/music/MediaButtonIntentReceiver.java
@@ -17,7 +17,6 @@
 package com.android.music;
 
 import android.bluetooth.BluetoothA2dp;
-import android.bluetooth.BluetoothError;
 import android.content.Context;
 import android.content.Intent;
 import android.content.BroadcastReceiver;
diff --git a/src/com/android/music/MediaPlaybackActivity.java b/src/com/android/music/MediaPlaybackActivity.java
index 8f47a40..8688fbb 100644
--- a/src/com/android/music/MediaPlaybackActivity.java
+++ b/src/com/android/music/MediaPlaybackActivity.java
@@ -22,6 +22,7 @@
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.ContentResolver;
+import android.content.ContentUris;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -29,6 +30,7 @@
 import android.content.ServiceConnection;
 import android.content.res.Configuration;
 import android.content.res.Resources;
+import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.media.AudioManager;
 import android.media.MediaFile;
@@ -68,7 +70,7 @@
     
     private boolean mOneShot = false;
     private boolean mSeeking = false;
-    private boolean mDeviceHasNoDpad;
+    private boolean mDeviceHasDpad;
     private long mStartSeekPos = 0;
     private long mLastSeekEventTime;
     private IMediaPlaybackService mService = null;
@@ -131,7 +133,7 @@
         mNextButton.setRepeatListener(mFfwdListener, 260);
         seekmethod = 1;
 
-        mDeviceHasNoDpad = (getResources().getConfiguration().navigation != 
+        mDeviceHasDpad = (getResources().getConfiguration().navigation ==
             Configuration.NAVIGATION_DPAD);
         
         mQueueButton = (ImageButton) findViewById(R.id.curplaylist);
@@ -269,15 +271,43 @@
         String artist;
         String album;
         String song;
+        long audioid;
         
         try {
             artist = mService.getArtistName();
             album = mService.getAlbumName();
             song = mService.getTrackName();
+            audioid = mService.getAudioId();
         } catch (RemoteException ex) {
             return true;
         }
-        
+
+        if (MediaFile.UNKNOWN_STRING.equals(album) &&
+                MediaFile.UNKNOWN_STRING.equals(artist) &&
+                song != null &&
+                song.startsWith("recording")) {
+            // not music
+            return false;
+        }
+
+        if (audioid < 0) {
+            return false;
+        }
+
+        Cursor c = MusicUtils.query(this,
+                ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, audioid),
+                new String[] {MediaStore.Audio.Media.IS_MUSIC}, null, null, null);
+        boolean ismusic = true;
+        if (c != null) {
+            if (c.moveToFirst()) {
+                ismusic = c.getInt(0) != 0;
+            }
+            c.close();
+        }
+        if (!ismusic) {
+            return false;
+        }
+
         boolean knownartist =
             (artist != null) && !MediaFile.UNKNOWN_STRING.equals(artist);
 
@@ -566,21 +596,21 @@
                 }
 
                 case PLAYLIST_SELECTED: {
-                    int [] list = new int[1];
+                    long [] list = new long[1];
                     list[0] = MusicUtils.getCurrentAudioId();
-                    int playlist = item.getIntent().getIntExtra("playlist", 0);
+                    long playlist = item.getIntent().getLongExtra("playlist", 0);
                     MusicUtils.addToPlaylist(this, list, playlist);
                     return true;
                 }
                 
                 case DELETE_ITEM: {
                     if (mService != null) {
-                        int [] list = new int[1];
+                        long [] list = new long[1];
                         list[0] = MusicUtils.getCurrentAudioId();
                         Bundle b = new Bundle();
                         b.putString("description", getString(R.string.delete_song_desc,
                                 mService.getTrackName()));
-                        b.putIntArray("items", list);
+                        b.putLongArray("items", list);
                         intent = new Intent();
                         intent.setClass(this, DeleteItems.class);
                         intent.putExtras(b);
@@ -603,7 +633,7 @@
             case NEW_PLAYLIST:
                 Uri uri = intent.getData();
                 if (uri != null) {
-                    int [] list = new int[1];
+                    long [] list = new long[1];
                     list[0] = MusicUtils.getCurrentAudioId();
                     int playlist = Integer.parseInt(uri.getLastPathSegment());
                     MusicUtils.addToPlaylist(this, list, playlist);
@@ -712,7 +742,7 @@
             switch(keyCode)
             {
                 case KeyEvent.KEYCODE_DPAD_LEFT:
-                    if (mDeviceHasNoDpad) {
+                    if (!useDpadMusicControl()) {
                         break;
                     }
                     if (mService != null) {
@@ -733,7 +763,7 @@
                     mPosOverride = -1;
                     return true;
                 case KeyEvent.KEYCODE_DPAD_RIGHT:
-                    if (mDeviceHasNoDpad) {
+                    if (!useDpadMusicControl()) {
                         break;
                     }
                     if (mService != null) {
@@ -755,6 +785,15 @@
         return super.onKeyUp(keyCode, event);
     }
 
+    private boolean useDpadMusicControl() {
+        if (mDeviceHasDpad && (mPrevButton.isFocused() ||
+                mNextButton.isFocused() ||
+                mPauseButton.isFocused())) {
+            return true;
+        }
+        return false;
+    }
+
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event)
     {
@@ -791,7 +830,7 @@
                 return true;
 
             case KeyEvent.KEYCODE_DPAD_LEFT:
-                if (mDeviceHasNoDpad) {
+                if (!useDpadMusicControl()) {
                     break;
                 }
                 if (!mPrevButton.hasFocus()) {
@@ -800,7 +839,7 @@
                 scanBackward(repcnt, event.getEventTime() - event.getDownTime());
                 return true;
             case KeyEvent.KEYCODE_DPAD_RIGHT:
-                if (mDeviceHasNoDpad) {
+                if (!useDpadMusicControl()) {
                     break;
                 }
                 if (!mNextButton.hasFocus()) {
@@ -1209,6 +1248,15 @@
         }
     };
 
+    private static class AlbumSongIdWrapper {
+        public long albumid;
+        public long songid;
+        AlbumSongIdWrapper(long aid, long sid) {
+            albumid = aid;
+            songid = sid;
+        }
+    }
+    
     private void updateTrackInfo() {
         if (mService == null) {
             return;
@@ -1220,13 +1268,16 @@
                 return;
             }
             
-            if (mService.getAudioId() < 0 && path.toLowerCase().startsWith("http://")) {
+            long songid = mService.getAudioId(); 
+            if (songid < 0 && path.toLowerCase().startsWith("http://")) {
+                // Once we can get album art and meta data from MediaPlayer, we
+                // can show that info again when streaming.
                 ((View) mArtistName.getParent()).setVisibility(View.INVISIBLE);
                 ((View) mAlbumName.getParent()).setVisibility(View.INVISIBLE);
                 mAlbum.setVisibility(View.GONE);
                 mTrackName.setText(path);
                 mAlbumArtHandler.removeMessages(GET_ALBUM_ART);
-                mAlbumArtHandler.obtainMessage(GET_ALBUM_ART, -1, 0).sendToTarget();
+                mAlbumArtHandler.obtainMessage(GET_ALBUM_ART, new AlbumSongIdWrapper(-1, -1)).sendToTarget();
             } else {
                 ((View) mArtistName.getParent()).setVisibility(View.VISIBLE);
                 ((View) mAlbumName.getParent()).setVisibility(View.VISIBLE);
@@ -1236,7 +1287,7 @@
                 }
                 mArtistName.setText(artistName);
                 String albumName = mService.getAlbumName();
-                int albumid = mService.getAlbumId();
+                long albumid = mService.getAlbumId();
                 if (MediaFile.UNKNOWN_STRING.equals(albumName)) {
                     albumName = getString(R.string.unknown_album_name);
                     albumid = -1;
@@ -1244,7 +1295,7 @@
                 mAlbumName.setText(albumName);
                 mTrackName.setText(mService.getTrackName());
                 mAlbumArtHandler.removeMessages(GET_ALBUM_ART);
-                mAlbumArtHandler.obtainMessage(GET_ALBUM_ART, albumid, 0).sendToTarget();
+                mAlbumArtHandler.obtainMessage(GET_ALBUM_ART, new AlbumSongIdWrapper(albumid, songid)).sendToTarget();
                 mAlbum.setVisibility(View.VISIBLE);
             }
             mDuration = mService.duration();
@@ -1255,22 +1306,24 @@
     }
     
     public class AlbumArtHandler extends Handler {
-        private int mAlbumId = -1;
+        private long mAlbumId = -1;
         
         public AlbumArtHandler(Looper looper) {
             super(looper);
         }
+        @Override
         public void handleMessage(Message msg)
         {
-            int albumid = msg.arg1;
+            long albumid = ((AlbumSongIdWrapper) msg.obj).albumid;
+            long songid = ((AlbumSongIdWrapper) msg.obj).songid;
             if (msg.what == GET_ALBUM_ART && (mAlbumId != albumid || albumid < 0)) {
                 // while decoding the new image, show the default album art
                 Message numsg = mHandler.obtainMessage(ALBUM_ART_DECODED, null);
                 mHandler.removeMessages(ALBUM_ART_DECODED);
                 mHandler.sendMessageDelayed(numsg, 300);
-                Bitmap bm = MusicUtils.getArtwork(MediaPlaybackActivity.this, albumid);
+                Bitmap bm = MusicUtils.getArtwork(MediaPlaybackActivity.this, songid, albumid);
                 if (bm == null) {
-                    bm = MusicUtils.getArtwork(MediaPlaybackActivity.this, -1);
+                    bm = MusicUtils.getArtwork(MediaPlaybackActivity.this, songid, -1);
                     albumid = -1;
                 }
                 if (bm != null) {
diff --git a/src/com/android/music/MediaPlaybackService.java b/src/com/android/music/MediaPlaybackService.java
index 23ca124..f92bc6d 100644
--- a/src/com/android/music/MediaPlaybackService.java
+++ b/src/com/android/music/MediaPlaybackService.java
@@ -17,7 +17,6 @@
 package com.android.music;
 
 import android.app.Notification;
-import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.app.Service;
 import android.appwidget.AppWidgetManager;
@@ -101,16 +100,16 @@
     private static final int RELEASE_WAKELOCK = 2;
     private static final int SERVER_DIED = 3;
     private static final int FADEIN = 4;
-    private static final int MAX_HISTORY_SIZE = 10;
+    private static final int MAX_HISTORY_SIZE = 100;
     
     private MultiPlayer mPlayer;
     private String mFileToPlay;
     private int mShuffleMode = SHUFFLE_NONE;
     private int mRepeatMode = REPEAT_NONE;
     private int mMediaMountedCount = 0;
-    private int [] mAutoShuffleList = null;
+    private long [] mAutoShuffleList = null;
     private boolean mOneShot;
-    private int [] mPlayList = null;
+    private long [] mPlayList = null;
     private int mPlayListLen = 0;
     private Vector<Integer> mHistory = new Vector<Integer>(MAX_HISTORY_SIZE);
     private Cursor mCursor;
@@ -278,10 +277,6 @@
         mPlayer = new MultiPlayer();
         mPlayer.setHandler(mMediaplayerHandler);
 
-        // Clear leftover notification in case this service previously got killed while playing
-        NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
-        nm.cancel(PLAYBACKSERVICE_STATUS);
-        
         reloadQueue();
         
         IntentFilter commandFilter = new IntentFilter();
@@ -359,12 +354,12 @@
             // on the phone)
             int len = mPlayListLen;
             for (int i = 0; i < len; i++) {
-                int n = mPlayList[i];
+                long n = mPlayList[i];
                 if (n == 0) {
                     q.append("0;");
                 } else {
                     while (n != 0) {
-                        int digit = n & 0xf;
+                        int digit = (int)(n & 0xf);
                         n >>= 4;
                         q.append(hexdigits[digit]);
                     }
@@ -374,6 +369,25 @@
             //Log.i("@@@@ service", "created queue string in " + (System.currentTimeMillis() - start) + " ms");
             ed.putString("queue", q.toString());
             ed.putInt("cardid", mCardId);
+            if (mShuffleMode != SHUFFLE_NONE) {
+                // In shuffle mode we need to save the history too
+                len = mHistory.size();
+                q.setLength(0);
+                for (int i = 0; i < len; i++) {
+                    int n = mHistory.get(i);
+                    if (n == 0) {
+                        q.append("0;");
+                    } else {
+                        while (n != 0) {
+                            int digit = (n & 0xf);
+                            n >>= 4;
+                            q.append(hexdigits[digit]);
+                        }
+                        q.append(";");
+                    }
+                }
+                ed.putString("history", q.toString());
+            }
         }
         ed.putInt("curpos", mPlayPos);
         if (mPlayer.isInitialized()) {
@@ -442,18 +456,18 @@
             // To deal with this, try querying for the current file, and if
             // that fails, wait a while and try again. If that too fails,
             // assume there is a problem and don't restore the state.
-            Cursor c = MusicUtils.query(this,
+            Cursor crsr = MusicUtils.query(this,
                         MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                         new String [] {"_id"}, "_id=" + mPlayList[mPlayPos] , null, null);
-            if (c == null || c.getCount() == 0) {
+            if (crsr == null || crsr.getCount() == 0) {
                 // wait a bit and try again
                 SystemClock.sleep(3000);
-                c = getContentResolver().query(
+                crsr = getContentResolver().query(
                         MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                         mCursorCols, "_id=" + mPlayList[mPlayPos] , null, null);
             }
-            if (c != null) {
-                c.close();
+            if (crsr != null) {
+                crsr.close();
             }
 
             // Make sure we don't auto-skip to the next song, since that
@@ -489,6 +503,41 @@
             if (shufmode != SHUFFLE_AUTO && shufmode != SHUFFLE_NORMAL) {
                 shufmode = SHUFFLE_NONE;
             }
+            if (shufmode != SHUFFLE_NONE) {
+                // in shuffle mode we need to restore the history too
+                q = mPreferences.getString("history", "");
+                qlen = q != null ? q.length() : 0;
+                if (qlen > 1) {
+                    plen = 0;
+                    n = 0;
+                    shift = 0;
+                    mHistory.clear();
+                    for (int i = 0; i < qlen; i++) {
+                        char c = q.charAt(i);
+                        if (c == ';') {
+                            if (n >= mPlayListLen) {
+                                // bogus history data
+                                mHistory.clear();
+                                break;
+                            }
+                            mHistory.add(n);
+                            n = 0;
+                            shift = 0;
+                        } else {
+                            if (c >= '0' && c <= '9') {
+                                n += ((c - '0') << shift);
+                            } else if (c >= 'a' && c <= 'f') {
+                                n += ((10 + c - 'a') << shift);
+                            } else {
+                                // bogus history data
+                                mHistory.clear();
+                                break;
+                            }
+                            shift += 4;
+                        }
+                    }
+                }
+            }
             if (shufmode == SHUFFLE_AUTO) {
                 if (! makeAutoShuffleList()) {
                     shufmode = SHUFFLE_NONE;
@@ -512,28 +561,30 @@
     }
 
     @Override
-    public void onStart(Intent intent, int startId) {
+    public int onStartCommand(Intent intent, int flags, int startId) {
         mServiceStartId = startId;
         mDelayedStopHandler.removeCallbacksAndMessages(null);
-        
-        String action = intent.getAction();
-        String cmd = intent.getStringExtra("command");
-        
-        if (CMDNEXT.equals(cmd) || NEXT_ACTION.equals(action)) {
-            next(true);
-        } else if (CMDPREVIOUS.equals(cmd) || PREVIOUS_ACTION.equals(action)) {
-            prev();
-        } else if (CMDTOGGLEPAUSE.equals(cmd) || TOGGLEPAUSE_ACTION.equals(action)) {
-            if (isPlaying()) {
+
+        if (intent != null) {
+            String action = intent.getAction();
+            String cmd = intent.getStringExtra("command");
+
+            if (CMDNEXT.equals(cmd) || NEXT_ACTION.equals(action)) {
+                next(true);
+            } else if (CMDPREVIOUS.equals(cmd) || PREVIOUS_ACTION.equals(action)) {
+                prev();
+            } else if (CMDTOGGLEPAUSE.equals(cmd) || TOGGLEPAUSE_ACTION.equals(action)) {
+                if (isPlaying()) {
+                    pause();
+                } else {
+                    play();
+                }
+            } else if (CMDPAUSE.equals(cmd) || PAUSE_ACTION.equals(action)) {
                 pause();
-            } else {
-                play();
+            } else if (CMDSTOP.equals(cmd)) {
+                pause();
+                seek(0);
             }
-        } else if (CMDPAUSE.equals(cmd) || PAUSE_ACTION.equals(action)) {
-            pause();
-        } else if (CMDSTOP.equals(cmd)) {
-            pause();
-            seek(0);
         }
         
         // make sure the service will shut down on its own if it was
@@ -541,6 +592,7 @@
         mDelayedStopHandler.removeCallbacksAndMessages(null);
         Message msg = mDelayedStopHandler.obtainMessage();
         mDelayedStopHandler.sendMessageDelayed(msg, IDLE_DELAY);
+        return START_STICKY;
     }
     
     @Override
@@ -654,7 +706,7 @@
     private void notifyChange(String what) {
         
         Intent i = new Intent(what);
-        i.putExtra("id", Integer.valueOf(getAudioId()));
+        i.putExtra("id", Long.valueOf(getAudioId()));
         i.putExtra("artist", getArtistName());
         i.putExtra("album",getAlbumName());
         i.putExtra("track", getTrackName());
@@ -675,7 +727,7 @@
             // reallocate at 2x requested size so we don't
             // need to grow and copy the array for every
             // insert
-            int [] newlist = new int[size * 2];
+            long [] newlist = new long[size * 2];
             int len = mPlayList != null ? mPlayList.length : mPlayListLen;
             for (int i = 0; i < len; i++) {
                 newlist[i] = mPlayList[i];
@@ -687,7 +739,7 @@
     }
     
     // insert the list of songs at the specified position in the playlist
-    private void addToPlayList(int [] list, int position) {
+    private void addToPlayList(long [] list, int position) {
         int addlen = list.length;
         if (position < 0) { // overwrite
             mPlayListLen = 0;
@@ -720,7 +772,7 @@
      * @param list The list of tracks to append.
      * @param action NOW, NEXT or LAST
      */
-    public void enqueue(int [] list, int action) {
+    public void enqueue(long [] list, int action) {
         synchronized(this) {
             if (action == NEXT && mPlayPos + 1 < mPlayListLen) {
                 addToPlayList(list, mPlayPos + 1);
@@ -753,12 +805,12 @@
      * specified position is 0.
      * @param list The new list of tracks.
      */
-    public void open(int [] list, int position) {
+    public void open(long [] list, int position) {
         synchronized (this) {
             if (mShuffleMode == SHUFFLE_AUTO) {
                 mShuffleMode = SHUFFLE_NORMAL;
             }
-            int oldId = getAudioId();
+            long oldId = getAudioId();
             int listlength = list.length;
             boolean newlist = true;
             if (mPlayListLen == listlength) {
@@ -805,7 +857,7 @@
                 index2 = mPlayListLen - 1;
             }
             if (index1 < index2) {
-                int tmp = mPlayList[index1];
+                long tmp = mPlayList[index1];
                 for (int i = index1; i < index2; i++) {
                     mPlayList[i] = mPlayList[i+1];
                 }
@@ -816,7 +868,7 @@
                         mPlayPos--;
                 }
             } else if (index2 < index1) {
-                int tmp = mPlayList[index1];
+                long tmp = mPlayList[index1];
                 for (int i = index1; i > index2; i--) {
                     mPlayList[i] = mPlayList[i-1];
                 }
@@ -835,10 +887,10 @@
      * Returns the current play list
      * @return An array of integers containing the IDs of the tracks in the play list
      */
-    public int [] getQueue() {
+    public long [] getQueue() {
         synchronized (this) {
             int len = mPlayListLen;
-            int [] list = new int[len];
+            long [] list = new long[len];
             for (int i = 0; i < len; i++) {
                 list[i] = mPlayList[i];
             }
@@ -941,7 +993,7 @@
                             mCursor.moveToNext();
                             ensurePlayListCapacity(1);
                             mPlayListLen = 1;
-                            mPlayList[0] = mCursor.getInt(IDCOLIDX);
+                            mPlayList[0] = mCursor.getLong(IDCOLIDX);
                             mPlayPos = 0;
                         }
                     }
@@ -983,11 +1035,7 @@
             }
 
             mPlayer.start();
-            setForeground(true);
 
-            NotificationManager nm = (NotificationManager)
-            getSystemService(Context.NOTIFICATION_SERVICE);
-    
             RemoteViews views = new RemoteViews(getPackageName(), R.layout.statusbar);
             views.setImageViewResource(R.id.icon, R.drawable.stat_notify_musicplayer);
             if (getAudioId() < 0) {
@@ -1016,7 +1064,7 @@
             status.icon = R.drawable.stat_notify_musicplayer;
             status.contentIntent = PendingIntent.getActivity(this, 0,
                     new Intent("com.android.music.PLAYBACK_VIEWER"), 0);
-            nm.notify(PLAYBACKSERVICE_STATUS, status);
+            startForeground(PLAYBACKSERVICE_STATUS, status);
             if (!mIsSupposedToBePlaying) {
                 notifyChange(PLAYSTATE_CHANGED);
             }
@@ -1040,8 +1088,9 @@
         }
         if (remove_status_icon) {
             gotoIdleState();
+        } else {
+            stopForeground(false);
         }
-        setForeground(false);
         if (remove_status_icon) {
             mIsSupposedToBePlaying = false;
         }
@@ -1062,7 +1111,6 @@
             if (isPlaying()) {
                 mPlayer.pause();
                 gotoIdleState();
-                setForeground(false);
                 mIsSupposedToBePlaying = false;
                 notifyChange(PLAYSTATE_CHANGED);
                 saveBookmarkIfNeeded();
@@ -1233,12 +1281,10 @@
     }
     
     private void gotoIdleState() {
-        NotificationManager nm =
-            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
-        nm.cancel(PLAYBACKSERVICE_STATUS);
         mDelayedStopHandler.removeCallbacksAndMessages(null);
         Message msg = mDelayedStopHandler.obtainMessage();
         mDelayedStopHandler.sendMessageDelayed(msg, IDLE_DELAY);
+        stopForeground(true);
     }
     
     private void saveBookmarkIfNeeded() {
@@ -1283,7 +1329,7 @@
         for (int i = 0; i < to_add; i++) {
             // pick something at random from the list
             int idx = mRand.nextInt(mAutoShuffleList.length);
-            Integer which = mAutoShuffleList[idx];
+            long which = mAutoShuffleList[idx];
             ensurePlayListCapacity(mPlayListLen + 1);
             mPlayList[mPlayListLen++] = which;
             notify = true;
@@ -1320,10 +1366,10 @@
                 return false;
             }
             int len = c.getCount();
-            int[] list = new int[len];
+            long [] list = new long[len];
             for (int i = 0; i < len; i++) {
                 c.moveToNext();
-                list[i] = c.getInt(0);
+                list[i] = c.getLong(0);
             }
             mAutoShuffleList = list;
             return true;
@@ -1397,7 +1443,7 @@
      * @param id The id to be removed
      * @return how many instances of the track were removed
      */
-    public int removeTrack(int id) {
+    public int removeTrack(long id) {
         int numremoved = 0;
         synchronized (this) {
             for (int i = 0; i < mPlayListLen; i++) {
@@ -1466,7 +1512,7 @@
      * Returns the rowid of the currently playing file, or -1 if
      * no file is currently playing.
      */
-    public int getAudioId() {
+    public long getAudioId() {
         synchronized (this) {
             if (mPlayPos >= 0 && mPlayer.isInitialized()) {
                 return mPlayList[mPlayPos];
@@ -1508,12 +1554,12 @@
         }
     }
     
-    public int getArtistId() {
+    public long getArtistId() {
         synchronized (this) {
             if (mCursor == null) {
                 return -1;
             }
-            return mCursor.getInt(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST_ID));
+            return mCursor.getLong(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST_ID));
         }
     }
 
@@ -1526,12 +1572,12 @@
         }
     }
 
-    public int getAlbumId() {
+    public long getAlbumId() {
         synchronized (this) {
             if (mCursor == null) {
                 return -1;
             }
-            return mCursor.getInt(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));
+            return mCursor.getLong(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));
         }
     }
 
@@ -1764,7 +1810,7 @@
         {
             mService.get().open(path, oneShot);
         }
-        public void open(int [] list, int position) {
+        public void open(long [] list, int position) {
             mService.get().open(list, position);
         }
         public int getQueuePosition() {
@@ -1797,19 +1843,19 @@
         public String getAlbumName() {
             return mService.get().getAlbumName();
         }
-        public int getAlbumId() {
+        public long getAlbumId() {
             return mService.get().getAlbumId();
         }
         public String getArtistName() {
             return mService.get().getArtistName();
         }
-        public int getArtistId() {
+        public long getArtistId() {
             return mService.get().getArtistId();
         }
-        public void enqueue(int [] list , int action) {
+        public void enqueue(long [] list , int action) {
             mService.get().enqueue(list, action);
         }
-        public int [] getQueue() {
+        public long [] getQueue() {
             return mService.get().getQueue();
         }
         public void moveQueueItem(int from, int to) {
@@ -1818,7 +1864,7 @@
         public String getPath() {
             return mService.get().getPath();
         }
-        public int getAudioId() {
+        public long getAudioId() {
             return mService.get().getAudioId();
         }
         public long position() {
@@ -1839,7 +1885,7 @@
         public int removeTracks(int first, int last) {
             return mService.get().removeTracks(first, last);
         }
-        public int removeTrack(int id) {
+        public int removeTrack(long id) {
             return mService.get().removeTrack(id);
         }
         public void setRepeatMode(int repeatmode) {
diff --git a/src/com/android/music/MusicPicker.java b/src/com/android/music/MusicPicker.java
index 9eed155..103ee0b 100644
--- a/src/com/android/music/MusicPicker.java
+++ b/src/com/android/music/MusicPicker.java
@@ -237,7 +237,7 @@
             if (secs == 0) {
                 vh.duration.setText("");
             } else {
-                vh.duration.setText(makeTimeString(context, secs));
+                vh.duration.setText(MusicUtils.makeTimeString(context, secs));
             }
             
             final StringBuilder builder = mBuilder;
@@ -401,24 +401,6 @@
         }
     }
 
-    public static String makeTimeString(Context context, long secs) {
-        String durationformat = context.getString(R.string.durationformat);
-        
-        /* Provide multiple arguments so the format can be changed easily
-         * by modifying the xml.
-         */
-        sFormatBuilder.setLength(0);
-
-        final Object[] timeArgs = sTimeArgs;
-        timeArgs[0] = secs / 3600;
-        timeArgs[1] = secs / 60;
-        timeArgs[2] = (secs / 60) % 60;
-        timeArgs[3] = secs;
-        timeArgs[4] = secs % 60;
-
-        return sFormatter.format(durationformat, timeArgs).toString();
-    }
-    
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle icicle) {
diff --git a/src/com/android/music/MusicUtils.java b/src/com/android/music/MusicUtils.java
index ea20794..cdc7251 100644
--- a/src/com/android/music/MusicUtils.java
+++ b/src/com/android/music/MusicUtils.java
@@ -16,21 +16,7 @@
 
 package com.android.music;
 
-import java.io.File;
-import java.io.FileDescriptor;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Arrays;
-import java.util.Formatter;
-import java.util.HashMap;
-import java.util.Locale;
-
 import android.app.Activity;
-import android.app.ExpandableListActivity;
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.ContentUris;
@@ -49,14 +35,13 @@
 import android.graphics.PixelFormat;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
-import android.media.MediaFile;
-import android.media.MediaScanner;
 import android.net.Uri;
-import android.os.RemoteException;
 import android.os.Environment;
 import android.os.ParcelFileDescriptor;
+import android.os.RemoteException;
 import android.provider.MediaStore;
 import android.provider.Settings;
+import android.text.TextUtils;
 import android.util.Log;
 import android.view.SubMenu;
 import android.view.View;
@@ -64,6 +49,16 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.Formatter;
+import java.util.HashMap;
+import java.util.Locale;
+
 public class MusicUtils {
 
     private static final String TAG = "MusicUtils";
@@ -195,7 +190,7 @@
         }
     }
     
-    public static int getCurrentAlbumId() {
+    public static long getCurrentAlbumId() {
         if (sService != null) {
             try {
                 return sService.getAlbumId();
@@ -205,7 +200,7 @@
         return -1;
     }
 
-    public static int getCurrentArtistId() {
+    public static long getCurrentArtistId() {
         if (MusicUtils.sService != null) {
             try {
                 return sService.getArtistId();
@@ -215,7 +210,7 @@
         return -1;
     }
 
-    public static int getCurrentAudioId() {
+    public static long getCurrentAudioId() {
         if (MusicUtils.sService != null) {
             try {
                 return sService.getAudioId();
@@ -250,14 +245,14 @@
         return false;
     }
 
-    private final static int [] sEmptyList = new int[0];
+    private final static long [] sEmptyList = new long[0];
     
-    public static int [] getSongListForCursor(Cursor cursor) {
+    public static long [] getSongListForCursor(Cursor cursor) {
         if (cursor == null) {
             return sEmptyList;
         }
         int len = cursor.getCount();
-        int [] list = new int[len];
+        long [] list = new long[len];
         cursor.moveToFirst();
         int colidx = -1;
         try {
@@ -266,13 +261,13 @@
             colidx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID);
         }
         for (int i = 0; i < len; i++) {
-            list[i] = cursor.getInt(colidx);
+            list[i] = cursor.getLong(colidx);
             cursor.moveToNext();
         }
         return list;
     }
 
-    public static int [] getSongListForArtist(Context context, int id) {
+    public static long [] getSongListForArtist(Context context, long id) {
         final String[] ccols = new String[] { MediaStore.Audio.Media._ID };
         String where = MediaStore.Audio.Media.ARTIST_ID + "=" + id + " AND " + 
         MediaStore.Audio.Media.IS_MUSIC + "=1";
@@ -281,14 +276,14 @@
                 MediaStore.Audio.Media.ALBUM_KEY + ","  + MediaStore.Audio.Media.TRACK);
         
         if (cursor != null) {
-            int [] list = getSongListForCursor(cursor);
+            long [] list = getSongListForCursor(cursor);
             cursor.close();
             return list;
         }
         return sEmptyList;
     }
 
-    public static int [] getSongListForAlbum(Context context, int id) {
+    public static long [] getSongListForAlbum(Context context, long id) {
         final String[] ccols = new String[] { MediaStore.Audio.Media._ID };
         String where = MediaStore.Audio.Media.ALBUM_ID + "=" + id + " AND " + 
                 MediaStore.Audio.Media.IS_MUSIC + "=1";
@@ -296,20 +291,20 @@
                 ccols, where, null, MediaStore.Audio.Media.TRACK);
 
         if (cursor != null) {
-            int [] list = getSongListForCursor(cursor);
+            long [] list = getSongListForCursor(cursor);
             cursor.close();
             return list;
         }
         return sEmptyList;
     }
 
-    public static int [] getSongListForPlaylist(Context context, long plid) {
+    public static long [] getSongListForPlaylist(Context context, long plid) {
         final String[] ccols = new String[] { MediaStore.Audio.Playlists.Members.AUDIO_ID };
         Cursor cursor = query(context, MediaStore.Audio.Playlists.Members.getContentUri("external", plid),
                 ccols, null, null, MediaStore.Audio.Playlists.Members.DEFAULT_SORT_ORDER);
         
         if (cursor != null) {
-            int [] list = getSongListForCursor(cursor);
+            long [] list = getSongListForCursor(cursor);
             cursor.close();
             return list;
         }
@@ -317,13 +312,13 @@
     }
     
     public static void playPlaylist(Context context, long plid) {
-        int [] list = getSongListForPlaylist(context, plid);
+        long [] list = getSongListForPlaylist(context, plid);
         if (list != null) {
             playAll(context, list, -1, false);
         }
     }
 
-    public static int [] getAllSongs(Context context) {
+    public static long [] getAllSongs(Context context) {
         Cursor c = query(context, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                 new String[] {MediaStore.Audio.Media._ID}, MediaStore.Audio.Media.IS_MUSIC + "=1",
                 null, null);
@@ -332,10 +327,10 @@
                 return null;
             }
             int len = c.getCount();
-            int[] list = new int[len];
+            long [] list = new long[len];
             for (int i = 0; i < len; i++) {
                 c.moveToNext();
-                list[i] = c.getInt(0);
+                list[i] = c.getLong(0);
             }
 
             return list;
@@ -377,7 +372,7 @@
                 cur.moveToFirst();
                 while (! cur.isAfterLast()) {
                     Intent intent = new Intent();
-                    intent.putExtra("playlist", cur.getInt(0));
+                    intent.putExtra("playlist", cur.getLong(0));
 //                    if (cur.getInt(0) == mLastPlaylistSelected) {
 //                        sub.add(0, MusicBaseActivity.PLAYLIST_SELECTED, cur.getString(1)).setIntent(intent);
 //                    } else {
@@ -399,7 +394,7 @@
         return;
     }
     
-    public static void deleteTracks(Context context, int [] list) {
+    public static void deleteTracks(Context context, long [] list) {
         
         String [] cols = new String [] { MediaStore.Audio.Media._ID, 
                 MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.ALBUM_ID };
@@ -423,10 +418,10 @@
                 c.moveToFirst();
                 while (! c.isAfterLast()) {
                     // remove from current playlist
-                    int id = c.getInt(0);
+                    long id = c.getLong(0);
                     sService.removeTrack(id);
                     // remove from album art cache
-                    int artIndex = c.getInt(2);
+                    long artIndex = c.getLong(2);
                     synchronized(sArtCache) {
                         sArtCache.remove(artIndex);
                     }
@@ -466,7 +461,7 @@
         context.getContentResolver().notifyChange(Uri.parse("content://media"), null);
     }
     
-    public static void addToCurrentPlaylist(Context context, int [] list) {
+    public static void addToCurrentPlaylist(Context context, long [] list) {
         if (sService == null) {
             return;
         }
@@ -479,7 +474,7 @@
         }
     }
     
-    public static void addToPlaylist(Context context, int [] ids, long playlistid) {
+    public static void addToPlaylist(Context context, long [] ids, long playlistid) {
         if (ids == null) {
             // this shouldn't happen (the menuitems shouldn't be visible
             // unless the selected item represents something playable
@@ -513,18 +508,25 @@
     }
 
     public static Cursor query(Context context, Uri uri, String[] projection,
-            String selection, String[] selectionArgs, String sortOrder) {
+            String selection, String[] selectionArgs, String sortOrder, int limit) {
         try {
             ContentResolver resolver = context.getContentResolver();
             if (resolver == null) {
                 return null;
             }
+            if (limit > 0) {
+                uri = uri.buildUpon().appendQueryParameter("limit", "" + limit).build();
+            }
             return resolver.query(uri, projection, selection, selectionArgs, sortOrder);
          } catch (UnsupportedOperationException ex) {
             return null;
         }
         
     }
+    public static Cursor query(Context context, Uri uri, String[] projection,
+            String selection, String[] selectionArgs, String sortOrder) {
+        return query(context, uri, projection, selection, selectionArgs, sortOrder, 0);
+    }
     
     public static boolean isMediaScannerScanning(Context context) {
         boolean result = false;
@@ -559,6 +561,8 @@
         }
     }
     
+    private static String mLastSdStatus;
+
     public static void displayDatabaseError(Activity a) {
         String status = Environment.getExternalStorageState();
         int title = R.string.sdcard_error_title;
@@ -580,7 +584,8 @@
             Intent intent = new Intent();
             intent.setClass(a, ScanningProgress.class);
             a.startActivityForResult(intent, Defs.SCAN_DONE);
-        } else {
+        } else if (!TextUtils.equals(mLastSdStatus, status)) {
+            mLastSdStatus = status;
             Log.d(TAG, "sd card: " + status);
         }
 
@@ -632,7 +637,8 @@
     private static final Object[] sTimeArgs = new Object[5];
 
     public static String makeTimeString(Context context, long secs) {
-        String durationformat = context.getString(R.string.durationformat);
+        String durationformat = context.getString(
+                secs < 3600 ? R.string.durationformatshort : R.string.durationformatlong);
         
         /* Provide multiple arguments so the format can be changed easily
          * by modifying the xml.
@@ -661,17 +667,17 @@
         playAll(context, cursor, position, false);
     }
     
-    public static void playAll(Context context, int [] list, int position) {
+    public static void playAll(Context context, long [] list, int position) {
         playAll(context, list, position, false);
     }
     
     private static void playAll(Context context, Cursor cursor, int position, boolean force_shuffle) {
     
-        int [] list = getSongListForCursor(cursor);
+        long [] list = getSongListForCursor(cursor);
         playAll(context, list, position, force_shuffle);
     }
     
-    private static void playAll(Context context, int [] list, int position, boolean force_shuffle) {
+    private static void playAll(Context context, long [] list, int position, boolean force_shuffle) {
         if (list.length == 0 || sService == null) {
             Log.d("MusicUtils", "attempt to play empty song list");
             // Don't try to play empty playlists. Nothing good will come of it.
@@ -683,13 +689,13 @@
             if (force_shuffle) {
                 sService.setShuffleMode(MediaPlaybackService.SHUFFLE_NORMAL);
             }
-            int curid = sService.getAudioId();
+            long curid = sService.getAudioId();
             int curpos = sService.getQueuePosition();
             if (position != -1 && curpos == position && curid == list[position]) {
                 // The selected file is the file that's currently playing;
                 // figure out if we need to restart with a new playlist,
                 // or just launch the playback activity.
-                int [] playlist = sService.getQueue();
+                long [] playlist = sService.getQueue();
                 if (Arrays.equals(list, playlist)) {
                     // we don't need to set a new list, but we should resume playback if needed
                     sService.play();
@@ -740,12 +746,11 @@
     }
     
     private static int sArtId = -2;
-    private static byte [] mCachedArt;
     private static Bitmap mCachedBit = null;
     private static final BitmapFactory.Options sBitmapOptionsCache = new BitmapFactory.Options();
     private static final BitmapFactory.Options sBitmapOptions = new BitmapFactory.Options();
     private static final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
-    private static final HashMap<Integer, Drawable> sArtCache = new HashMap<Integer, Drawable>();
+    private static final HashMap<Long, Drawable> sArtCache = new HashMap<Long, Drawable>();
     private static int sArtCacheId = -1;
     
     static {
@@ -777,7 +782,7 @@
         }
     }
     
-    public static Drawable getCachedArtwork(Context context, int artIndex, BitmapDrawable defaultArtwork) {
+    public static Drawable getCachedArtwork(Context context, long artIndex, BitmapDrawable defaultArtwork) {
         Drawable d = null;
         synchronized(sArtCache) {
             d = sArtCache.get(artIndex);
@@ -807,7 +812,7 @@
     // Get album art for specified album. This method will not try to
     // fall back to getting artwork directly from the file, nor will
     // it attempt to repair the database.
-    private static Bitmap getArtworkQuick(Context context, int album_id, int w, int h) {
+    private static Bitmap getArtworkQuick(Context context, long album_id, int w, int h) {
         // NOTE: There is in fact a 1 pixel border on the right side in the ImageView
         // used to display this drawable. Take it into account now, so we don't have to
         // scale later.
@@ -865,27 +870,18 @@
     /** Get album art for specified album. You should not pass in the album id
      * for the "unknown" album here (use -1 instead)
      */
-    public static Bitmap getArtwork(Context context, int album_id) {
-        return getArtwork(context, album_id, true);
-    }
-    
-    /** Get album art for specified album. You should not pass in the album id
-     * for the "unknown" album here (use -1 instead)
-     */
-    public static Bitmap getArtwork(Context context, int album_id, boolean allowDefault) {
+    public static Bitmap getArtwork(Context context, long song_id, long album_id) {
 
         if (album_id < 0) {
             // This is something that is not in the database, so get the album art directly
             // from the file.
-            Bitmap bm = getArtworkFromFile(context, null, -1);
-            if (bm != null) {
-                return bm;
+            if (song_id >= 0) {
+                Bitmap bm = getArtworkFromFile(context, song_id, -1);
+                if (bm != null) {
+                    return bm;
+                }
             }
-            if (allowDefault) {
-                return getDefaultArtwork(context);
-            } else {
-                return null;
-            }
+            return getDefaultArtwork(context);
         }
 
         ContentResolver res = context.getContentResolver();
@@ -898,61 +894,16 @@
             } catch (FileNotFoundException ex) {
                 // The album art thumbnail does not actually exist. Maybe the user deleted it, or
                 // maybe it never existed to begin with.
-                Bitmap bm = getArtworkFromFile(context, null, album_id);
+                Bitmap bm = getArtworkFromFile(context, song_id, album_id);
                 if (bm != null) {
                     if (bm.getConfig() == null) {
                         bm = bm.copy(Bitmap.Config.RGB_565, false);
                         if (bm == null) {
-                            if (allowDefault) {
-                                return getDefaultArtwork(context);
-                            } else {
-                                return null;
-                            }
+                            return getDefaultArtwork(context);
                         }
                     }
-                    // Put the newly found artwork in the database.
-                    // Note that this shouldn't be done for the "unknown" album,
-                    // but if this method is called correctly, that won't happen.
-                    
-                    // first write it somewhere
-                    String file = Environment.getExternalStorageDirectory()
-                        + "/albumthumbs/" + String.valueOf(System.currentTimeMillis());
-                    if (ensureFileExists(file)) {
-                        try {
-                            OutputStream outstream = new FileOutputStream(file);
-                            boolean success = bm.compress(Bitmap.CompressFormat.JPEG, 75, outstream);
-                            outstream.close();
-                            if (success) {
-                                ContentValues values = new ContentValues();
-                                values.put("album_id", album_id);
-                                values.put("_data", file);
-                                Uri newuri = res.insert(sArtworkUri, values);
-                                if (newuri == null) {
-                                    // Failed to insert in to the database. The most likely
-                                    // cause of this is that the item already existed in the
-                                    // database, and the most likely cause of that is that
-                                    // the album was scanned before, but the user deleted the
-                                    // album art from the sd card.
-                                    // We can ignore that case here, since the media provider
-                                    // will regenerate the album art for those entries when
-                                    // it detects this.
-                                    success = false;
-                                }
-                            }
-                            if (!success) {
-                                File f = new File(file);
-                                f.delete();
-                            }
-                        } catch (FileNotFoundException e) {
-                            Log.e(TAG, "error creating file", e);
-                        } catch (IOException e) {
-                            Log.e(TAG, "error creating file", e);
-                        }
-                    }
-                } else if (allowDefault) {
-                    bm = getDefaultArtwork(context);
                 } else {
-                    bm = null;
+                    bm = getDefaultArtwork(context);
                 }
                 return bm;
             } finally {
@@ -967,168 +918,39 @@
         
         return null;
     }
-
-    // copied from MediaProvider
-    private static boolean ensureFileExists(String path) {
-        File file = new File(path);
-        if (file.exists()) {
-            return true;
-        } else {
-            // we will not attempt to create the first directory in the path
-            // (for example, do not create /sdcard if the SD card is not mounted)
-            int secondSlash = path.indexOf('/', 1);
-            if (secondSlash < 1) return false;
-            String directoryPath = path.substring(0, secondSlash);
-            File directory = new File(directoryPath);
-            if (!directory.exists())
-                return false;
-            file.getParentFile().mkdirs();
-            try {
-                return file.createNewFile();
-            } catch(IOException ioe) {
-                Log.d(TAG, "File creation failed for " + path);
-            }
-            return false;
-        }
-    }
     
     // get album art for specified file
     private static final String sExternalMediaUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI.toString();
-    private static Bitmap getArtworkFromFile(Context context, Uri uri, int albumid) {
+    private static Bitmap getArtworkFromFile(Context context, long songid, long albumid) {
         Bitmap bm = null;
         byte [] art = null;
         String path = null;
 
-        if (sArtId == albumid) {
-            //Log.i("@@@@@@ ", "reusing cached data", new Exception());
-            if (mCachedBit != null) {
-                return mCachedBit;
-            }
-            art = mCachedArt;
-        } else {
-            // try reading embedded artwork
-            if (uri == null) {
-                try {
-                    int curalbum = sService.getAlbumId();
-                    if (curalbum == albumid || albumid < 0) {
-                        path = sService.getPath();
-                        if (path != null) {
-                            uri = Uri.parse(path);
-                        }
-                    }
-                } catch (RemoteException ex) {
-                    return null;
-                } catch (NullPointerException ex) {
-                    return null;
-                }
-            }
-            if (uri == null) {
-                if (albumid >= 0) {
-                    Cursor c = query(context,MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
-                            new String[] { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.ALBUM },
-                            MediaStore.Audio.Media.ALBUM_ID + "=?", new String [] {String.valueOf(albumid)},
-                            null);
-                    if (c != null) {
-                        if (c.moveToFirst()) {
-                            int trackid = c.getInt(0);
-                            uri = ContentUris.withAppendedId(
-                                    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, trackid);
-                            if (MediaFile.UNKNOWN_STRING.equals(c.getString(1))) {
-                                albumid = -1;
-                            }
-                        }
-                        c.close();
-                    }
-                }
-            }
-            if (uri != null) {
-                MediaScanner scanner = new MediaScanner(context);
-                ParcelFileDescriptor pfd = null;
-                try {
-                    pfd = context.getContentResolver().openFileDescriptor(uri, "r");
-                    if (pfd != null) {
-                        FileDescriptor fd = pfd.getFileDescriptor();
-                        art = scanner.extractAlbumArt(fd);
-                    }
-                } catch (IOException ex) {
-                } catch (SecurityException ex) {
-                } finally {
-                    try {
-                        if (pfd != null) {
-                            pfd.close();
-                        }
-                    } catch (IOException ex) {
-                    }
-                }
-            }
+        if (albumid < 0 && songid < 0) {
+            throw new IllegalArgumentException("Must specify an album or a song id");
         }
-        // if no embedded art exists, look for AlbumArt.jpg in same directory as the media file
-        if (art == null && path != null) {
-            if (path.startsWith(sExternalMediaUri)) {
-                // get the real path
-                Cursor c = query(context,Uri.parse(path),
-                        new String[] { MediaStore.Audio.Media.DATA},
-                        null, null, null);
-                if (c != null) {
-                    c.moveToFirst();
-                    if (!c.isAfterLast()) {
-                        path = c.getString(0);
-                    }
-                    c.close();
+
+        try {
+            if (albumid < 0) {
+                Uri uri = Uri.parse("content://media/external/audio/media/" + songid + "/albumart");
+                ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");
+                if (pfd != null) {
+                    FileDescriptor fd = pfd.getFileDescriptor();
+                    bm = BitmapFactory.decodeFileDescriptor(fd);
+                }
+            } else {
+                Uri uri = ContentUris.withAppendedId(sArtworkUri, albumid);
+                ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");
+                if (pfd != null) {
+                    FileDescriptor fd = pfd.getFileDescriptor();
+                    bm = BitmapFactory.decodeFileDescriptor(fd);
                 }
             }
-            int lastSlash = path.lastIndexOf('/');
-            if (lastSlash > 0) {
-                String artPath = path.substring(0, lastSlash + 1) + "AlbumArt.jpg";
-                File file = new File(artPath);
-                if (file.exists()) {
-                    art = new byte[(int)file.length()];
-                    FileInputStream stream = null;
-                    try {
-                        stream = new FileInputStream(file);
-                        stream.read(art);
-                    } catch (IOException ex) {
-                        art = null;
-                    } finally {
-                        try {
-                            if (stream != null) {
-                                stream.close();
-                            }
-                        } catch (IOException ex) {
-                        }
-                    }
-                } else {
-                    // TODO: try getting album art from the web
-                }
-            }
+        } catch (FileNotFoundException ex) {
+            //
         }
-        
-        if (art != null) {
-            try {
-                // get the size of the bitmap
-                BitmapFactory.Options opts = new BitmapFactory.Options();
-                opts.inJustDecodeBounds = true;
-                opts.inSampleSize = 1;
-                BitmapFactory.decodeByteArray(art, 0, art.length, opts);
-                
-                // request a reasonably sized output image
-                // TODO: don't hardcode the size
-                while (opts.outHeight > 320 || opts.outWidth > 320) {
-                    opts.outHeight /= 2;
-                    opts.outWidth /= 2;
-                    opts.inSampleSize *= 2;
-                }
-                
-                // get the image for real now
-                opts.inJustDecodeBounds = false;
-                bm = BitmapFactory.decodeByteArray(art, 0, art.length, opts);
-                if (albumid != -1) {
-                    sArtId = albumid;
-                }
-                mCachedArt = art;
-                mCachedBit = bm;
-            } catch (Exception e) {
-            }
+        if (bm != null) {
+            mCachedBit = bm;
         }
         return bm;
     }
diff --git a/src/com/android/music/PlaylistBrowserActivity.java b/src/com/android/music/PlaylistBrowserActivity.java
index df2b138..ccdb529 100644
--- a/src/com/android/music/PlaylistBrowserActivity.java
+++ b/src/com/android/music/PlaylistBrowserActivity.java
@@ -100,7 +100,7 @@
                     } else if (id == PODCASTS_PLAYLIST) {
                         playPodcasts();
                     } else if (id == ALL_SONGS_PLAYLIST) {
-                        int [] list = MusicUtils.getAllSongs(PlaylistBrowserActivity.this);
+                        long [] list = MusicUtils.getAllSongs(PlaylistBrowserActivity.this);
                         if (list != null) {
                             MusicUtils.playAll(PlaylistBrowserActivity.this, list, 0);
                         }
@@ -204,12 +204,18 @@
     };
     
     private Handler mReScanHandler = new Handler() {
+        @Override
         public void handleMessage(Message msg) {
-            getPlaylistCursor(mAdapter.getQueryHandler(), null);
+            if (mAdapter != null) {
+                getPlaylistCursor(mAdapter.getQueryHandler(), null);
+            }
         }
     };
     public void init(Cursor cursor) {
 
+        if (mAdapter == null) {
+            return;
+        }
         mAdapter.changeCursor(cursor);
 
         if (mPlaylistCursor == null) {
@@ -331,7 +337,7 @@
             case SCAN_DONE:
                 if (resultCode == RESULT_CANCELED) {
                     finish();
-                } else {
+                } else if (mAdapter != null) {
                     getPlaylistCursor(mAdapter.getQueryHandler(), null);
                 }
                 break;
@@ -389,10 +395,10 @@
         }
         try {
             int len = cursor.getCount();
-            int [] list = new int[len];
+            long [] list = new long[len];
             for (int i = 0; i < len; i++) {
                 cursor.moveToNext();
-                list[i] = cursor.getInt(0);
+                list[i] = cursor.getLong(0);
             }
             MusicUtils.playAll(this, list, 0);
         } catch (SQLiteException ex) {
@@ -414,10 +420,10 @@
         }
         try {
             int len = cursor.getCount();
-            int [] list = new int[len];
+            long [] list = new long[len];
             for (int i = 0; i < len; i++) {
                 cursor.moveToNext();
-                list[i] = cursor.getInt(0);
+                list[i] = cursor.getLong(0);
             }
             MusicUtils.playAll(this, list, 0);
         } catch (SQLiteException ex) {
diff --git a/src/com/android/music/QueryBrowserActivity.java b/src/com/android/music/QueryBrowserActivity.java
index b0e8dac..14d4952 100644
--- a/src/com/android/music/QueryBrowserActivity.java
+++ b/src/com/android/music/QueryBrowserActivity.java
@@ -92,15 +92,16 @@
         registerReceiver(mScanListener, f);
         
         Intent intent = getIntent();
+        String action = intent != null ? intent.getAction() : null;
         
-        if (intent.getAction().equals(Intent.ACTION_VIEW)) {
+        if (Intent.ACTION_VIEW.equals(action)) {
             // this is something we got from the search bar
             Uri uri = intent.getData();
             String path = uri.toString();
             if (path.startsWith("content://media/external/audio/media/")) {
                 // This is a specific file
                 String id = uri.getLastPathSegment();
-                int [] list = new int[] { Integer.valueOf(id) };
+                long [] list = new long[] { Long.valueOf(id) };
                 MusicUtils.playAll(this, list, 0);
                 finish();
                 return;
@@ -122,7 +123,30 @@
                 return;
             }
         }
+
         mFilterString = intent.getStringExtra(SearchManager.QUERY);
+        if (MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action)) {
+            String focus = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS);
+            String artist = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST);
+            String album = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM);
+            String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE);
+            if (focus != null) {
+                if (focus.startsWith("audio/") && title != null) {
+                    mFilterString = title;
+                } else if (focus.equals(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE)) {
+                    if (album != null) {
+                        mFilterString = album;
+                        if (artist != null) {
+                            mFilterString = mFilterString + " " + artist;
+                        }
+                    }
+                } else if (focus.equals(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE)) {
+                    if (artist != null) {
+                        mFilterString = artist;
+                    }
+                }
+            }
+        }
 
         setContentView(R.layout.query_activity);
         mTrackList = getListView();
@@ -203,7 +227,9 @@
     private Handler mReScanHandler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
-            getQueryCursor(mAdapter.getQueryHandler(), null);
+            if (mAdapter != null) {
+                getQueryCursor(mAdapter.getQueryHandler(), null);
+            }
             // if the query results in a null cursor, onQueryComplete() will
             // call init(), which will post a delayed message to this handler
             // in order to try again.
@@ -224,7 +250,10 @@
     }
     
     public void init(Cursor c) {
-        
+
+        if (mAdapter == null) {
+            return;
+        }
         mAdapter.changeCursor(c);
 
         if (mQueryCursor == null) {
@@ -250,16 +279,18 @@
         
         if ("artist".equals(selectedType)) {
             Intent intent = new Intent(Intent.ACTION_PICK);
+            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
             intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/album");
             intent.putExtra("artist", Long.valueOf(id).toString());
             startActivity(intent);
         } else if ("album".equals(selectedType)) {
             Intent intent = new Intent(Intent.ACTION_PICK);
+            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
             intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/track");
             intent.putExtra("album", Long.valueOf(id).toString());
             startActivity(intent);
         } else if (position >= 0 && id >= 0){
-            int [] list = new int[] { (int) id };
+            long [] list = new long[] { id };
             MusicUtils.playAll(this, list, 0);
         } else {
             Log.e("QueryBrowser", "invalid position/id: " + position + "/" + id);
diff --git a/src/com/android/music/RepeatingImageButton.java b/src/com/android/music/RepeatingImageButton.java
index 08c951c..b4e7733 100644
--- a/src/com/android/music/RepeatingImageButton.java
+++ b/src/com/android/music/RepeatingImageButton.java
@@ -82,6 +82,19 @@
     }
 
     @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        switch (keyCode) {
+            case KeyEvent.KEYCODE_DPAD_CENTER:
+            case KeyEvent.KEYCODE_ENTER:
+                // need to call super to make long press work, but return
+                // true so that the application doesn't get the down event.
+                super.onKeyDown(keyCode, event);
+                return true;
+        }
+        return super.onKeyDown(keyCode, event);
+    }
+
+    @Override
     public boolean onKeyUp(int keyCode, KeyEvent event) {
         switch (keyCode) {
         case KeyEvent.KEYCODE_DPAD_CENTER:
diff --git a/src/com/android/music/TouchInterceptor.java b/src/com/android/music/TouchInterceptor.java
index 4276b7b..6c22e72 100644
--- a/src/com/android/music/TouchInterceptor.java
+++ b/src/com/android/music/TouchInterceptor.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.PixelFormat;
 import android.graphics.Rect;
@@ -32,12 +33,11 @@
 import android.view.GestureDetector.SimpleOnGestureListener;
 import android.widget.AdapterView;
 import android.widget.ImageView;
-import android.widget.ListAdapter;
 import android.widget.ListView;
 
 public class TouchInterceptor extends ListView {
     
-    private View mDragView;
+    private ImageView mDragView;
     private WindowManager mWindowManager;
     private WindowManager.LayoutParams mWindowParams;
     private int mDragPos;      // which item is being dragged
@@ -57,12 +57,17 @@
     private Rect mTempRect = new Rect();
     private Bitmap mDragBitmap;
     private final int mTouchSlop;
+    private int mItemHeightNormal;
+    private int mItemHeightExpanded;
 
     public TouchInterceptor(Context context, AttributeSet attrs) {
         super(context, attrs);
         SharedPreferences pref = context.getSharedPreferences("Music", 3);
         mRemoveMode = pref.getInt("deletemode", -1);
         mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
+        Resources res = getResources();
+        mItemHeightNormal = res.getDimensionPixelSize(R.dimen.normal_height);
+        mItemHeightExpanded = res.getDimensionPixelSize(R.dimen.expanded_height);
     }
     
     @Override
@@ -107,7 +112,8 @@
                     View dragger = item.findViewById(R.id.icon);
                     Rect r = mTempRect;
                     dragger.getDrawingRect(r);
-                    if (x < r.right) {
+                    // The dragger icon itself is quite small, so pretend the touch area is bigger
+                    if (x < r.right * 2) {
                         item.setDrawingCacheEnabled(true);
                         // Create a copy of the drawing cache so that it does not get recycled
                         // by the framework when the list tries to clean up memory
@@ -189,7 +195,7 @@
                 }
             }
             ViewGroup.LayoutParams params = v.getLayoutParams();
-            params.height = 64;
+            params.height = mItemHeightNormal;
             v.setLayoutParams(params);
             v.setVisibility(View.VISIBLE);
         }
@@ -220,7 +226,7 @@
             if (vv == null) {
                 break;
             }
-            int height = 64;
+            int height = mItemHeightNormal;
             int visibility = View.VISIBLE;
             if (vv.equals(first)) {
                 // processing the item that is being dragged
@@ -233,7 +239,7 @@
                 }
             } else if (i == childnum) {
                 if (mDragPos < getCount() - 1) {
-                    height = 128;
+                    height = mItemHeightExpanded;
                 }
             }
             ViewGroup.LayoutParams params = vv.getLayoutParams();
@@ -313,6 +319,8 @@
     }
     
     private void startDragging(Bitmap bm, int y) {
+        stopDragging();
+
         mWindowParams = new WindowManager.LayoutParams();
         mWindowParams.gravity = Gravity.TOP;
         mWindowParams.x = 0;
@@ -331,10 +339,6 @@
         int backGroundColor = mContext.getResources().getColor(R.color.dragndrop_background);
         v.setBackgroundColor(backGroundColor);
         v.setImageBitmap(bm);
-
-        if (mDragBitmap != null) {
-            mDragBitmap.recycle();
-        }
         mDragBitmap = bm;
 
         mWindowManager = (WindowManager)mContext.getSystemService("window");
@@ -356,9 +360,12 @@
     }
     
     private void stopDragging() {
-        WindowManager wm = (WindowManager)mContext.getSystemService("window");
-        wm.removeView(mDragView);
-        mDragView = null;
+        if (mDragView != null) {
+            WindowManager wm = (WindowManager)mContext.getSystemService("window");
+            wm.removeView(mDragView);
+            mDragView.setImageDrawable(null);
+            mDragView = null;
+        }
         if (mDragBitmap != null) {
             mDragBitmap.recycle();
             mDragBitmap = null;
diff --git a/src/com/android/music/TrackBrowserActivity.java b/src/com/android/music/TrackBrowserActivity.java
index 14764ff..078b17c 100644
--- a/src/com/android/music/TrackBrowserActivity.java
+++ b/src/com/android/music/TrackBrowserActivity.java
@@ -144,7 +144,8 @@
                 MediaStore.Audio.Media.ARTIST_ID,
                 MediaStore.Audio.Media.DURATION,
                 MediaStore.Audio.Playlists.Members.PLAY_ORDER,
-                MediaStore.Audio.Playlists.Members.AUDIO_ID
+                MediaStore.Audio.Playlists.Members.AUDIO_ID,
+                MediaStore.Audio.Media.IS_MUSIC
         };
 
         setContentView(R.layout.media_picker_activity);
@@ -189,7 +190,7 @@
                     !(mPlaylist.equals("podcasts") || mPlaylist.equals("recentlyadded")));
             setListAdapter(mAdapter);
             setTitle(R.string.working_songs);
-            getTrackCursor(mAdapter.getQueryHandler(), null);
+            getTrackCursor(mAdapter.getQueryHandler(), null, true);
         } else {
             mTrackCursor = mAdapter.getCursor();
             // If mTrackCursor is null, this can be because it doesn't have
@@ -202,7 +203,7 @@
                 init(mTrackCursor);
             } else {
                 setTitle(R.string.working_songs);
-                getTrackCursor(mAdapter.getQueryHandler(), null);
+                getTrackCursor(mAdapter.getQueryHandler(), null, true);
             }
         }
     }
@@ -296,7 +297,9 @@
     private Handler mReScanHandler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
-            getTrackCursor(mAdapter.getQueryHandler(), null);
+            if (mAdapter != null) {
+                getTrackCursor(mAdapter.getQueryHandler(), null, true);
+            }
             // if the query results in a null cursor, onQueryComplete() will
             // call init(), which will post a delayed message to this handler
             // in order to try again.
@@ -318,6 +321,9 @@
     
     public void init(Cursor newCursor) {
 
+        if (mAdapter == null) {
+            return;
+        }
         mAdapter.changeCursor(newCursor); // also sets mTrackCursor
         
         if (mTrackCursor == null) {
@@ -467,7 +473,7 @@
                 if (from < to) {
                     // move the item to somewhere later in the list
                     mTrackCursor.moveToPosition(to);
-                    int toidx = mTrackCursor.getInt(colidx);
+                    long toidx = mTrackCursor.getLong(colidx);
                     mTrackCursor.moveToPosition(from);
                     values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, toidx);
                     wherearg[0] = mTrackCursor.getString(0);
@@ -481,7 +487,7 @@
                 } else if (from > to) {
                     // move the item to somewhere earlier in the list
                     mTrackCursor.moveToPosition(to);
-                    int toidx = mTrackCursor.getInt(colidx);
+                    long toidx = mTrackCursor.getLong(colidx);
                     mTrackCursor.moveToPosition(from);
                     values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, toidx);
                     wherearg[0] = mTrackCursor.getString(0);
@@ -563,6 +569,33 @@
         }
     };
 
+    // Cursor should be positioned on the entry to be checked
+    // Returns false if the entry matches the naming pattern used for recordings,
+    // or if it is marked as not music in the database.
+    private boolean isMusic(Cursor c) {
+        int titleidx = c.getColumnIndex(MediaStore.Audio.Media.TITLE);
+        int albumidx = c.getColumnIndex(MediaStore.Audio.Media.ALBUM);
+        int artistidx = c.getColumnIndex(MediaStore.Audio.Media.ARTIST);
+
+        String title = c.getString(titleidx);
+        String album = c.getString(albumidx);
+        String artist = c.getString(artistidx);
+        if (MediaFile.UNKNOWN_STRING.equals(album) &&
+                MediaFile.UNKNOWN_STRING.equals(artist) &&
+                title != null &&
+                title.startsWith("recording")) {
+            // not music
+            return false;
+        }
+
+        int ismusic_idx = c.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC);
+        boolean ismusic = true;
+        if (ismusic_idx >= 0) {
+            ismusic = mTrackCursor.getInt(ismusic_idx) != 0;
+        }
+        return ismusic;
+    }
+
     @Override
     public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfoIn) {
         menu.add(0, PLAY_SELECTION, 0, R.string.play_selection);
@@ -573,17 +606,20 @@
         }
         menu.add(0, USE_AS_RINGTONE, 0, R.string.ringtone_menu);
         menu.add(0, DELETE_ITEM, 0, R.string.delete_item);
-        menu.add(0, SEARCH, 0, R.string.search_title);
         AdapterContextMenuInfo mi = (AdapterContextMenuInfo) menuInfoIn;
         mSelectedPosition =  mi.position;
         mTrackCursor.moveToPosition(mSelectedPosition);
         try {
             int id_idx = mTrackCursor.getColumnIndexOrThrow(
                     MediaStore.Audio.Playlists.Members.AUDIO_ID);
-            mSelectedId = mTrackCursor.getInt(id_idx);
+            mSelectedId = mTrackCursor.getLong(id_idx);
         } catch (IllegalArgumentException ex) {
             mSelectedId = mi.id;
         }
+        // only add the 'search' menu if the selected item is music
+        if (isMusic(mTrackCursor)) {
+            menu.add(0, SEARCH, 0, R.string.search_title);
+        }
         mCurrentAlbumName = mTrackCursor.getString(mTrackCursor.getColumnIndexOrThrow(
                 MediaStore.Audio.Media.ALBUM));
         mCurrentArtistNameForAlbum = mTrackCursor.getString(mTrackCursor.getColumnIndexOrThrow(
@@ -604,7 +640,7 @@
             }
 
             case QUEUE: {
-                int [] list = new int[] { (int) mSelectedId };
+                long [] list = new long[] { mSelectedId };
                 MusicUtils.addToCurrentPlaylist(this, list);
                 return true;
             }
@@ -617,8 +653,8 @@
             }
 
             case PLAYLIST_SELECTED: {
-                int [] list = new int[] { (int) mSelectedId };
-                int playlist = item.getIntent().getIntExtra("playlist", 0);
+                long [] list = new long[] { mSelectedId };
+                long playlist = item.getIntent().getLongExtra("playlist", 0);
                 MusicUtils.addToPlaylist(this, list, playlist);
                 return true;
             }
@@ -629,13 +665,13 @@
                 return true;
 
             case DELETE_ITEM: {
-                int [] list = new int[1];
+                long [] list = new long[1];
                 list[0] = (int) mSelectedId;
                 Bundle b = new Bundle();
                 String f = getString(R.string.delete_song_desc); 
                 String desc = String.format(f, mCurrentTrackName);
                 b.putString("description", desc);
-                b.putIntArray("items", list);
+                b.putLongArray("items", list);
                 Intent intent = new Intent();
                 intent.setClass(this, DeleteItems.class);
                 intent.putExtras(b);
@@ -662,10 +698,16 @@
         i.setAction(MediaStore.INTENT_ACTION_MEDIA_SEARCH);
         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         
-        title = mCurrentAlbumName;
-        query = mCurrentArtistNameForAlbum + " " + mCurrentAlbumName;
-        i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistNameForAlbum);
-        i.putExtra(MediaStore.EXTRA_MEDIA_ALBUM, mCurrentAlbumName);
+        title = mCurrentTrackName;
+        if (MediaFile.UNKNOWN_STRING.equals(mCurrentArtistNameForAlbum)) {
+            query = mCurrentTrackName;
+        } else {
+            query = mCurrentArtistNameForAlbum + " " + mCurrentTrackName;
+            i.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, mCurrentArtistNameForAlbum);
+        }
+        if (MediaFile.UNKNOWN_STRING.equals(mCurrentAlbumName)) {
+            i.putExtra(MediaStore.EXTRA_MEDIA_ALBUM, mCurrentAlbumName);
+        }
         i.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, "audio/*");
         title = getString(R.string.mediasearch, title);
         i.putExtra(SearchManager.QUERY, query);
@@ -874,7 +916,7 @@
                 if (resultCode == RESULT_CANCELED) {
                     finish();
                 } else {
-                    getTrackCursor(mAdapter.getQueryHandler(), null);
+                    getTrackCursor(mAdapter.getQueryHandler(), null, true);
                 }
                 break;
                 
@@ -882,7 +924,7 @@
                 if (resultCode == RESULT_OK) {
                     Uri uri = intent.getData();
                     if (uri != null) {
-                        int [] list = new int[] { (int) mSelectedId };
+                        long [] list = new long[] { mSelectedId };
                         MusicUtils.addToPlaylist(this, list, Integer.valueOf(uri.getLastPathSegment()));
                     }
                 }
@@ -892,7 +934,7 @@
                 if (resultCode == RESULT_OK) {
                     Uri uri = intent.getData();
                     if (uri != null) {
-                        int [] list = MusicUtils.getSongListForCursor(mTrackCursor);
+                        long [] list = MusicUtils.getSongListForCursor(mTrackCursor);
                         int plid = Integer.parseInt(uri.getLastPathSegment());
                         MusicUtils.addToPlaylist(this, list, plid);
                     }
@@ -901,12 +943,18 @@
         }
     }
     
-    private Cursor getTrackCursor(AsyncQueryHandler async, String filter) {
+    private Cursor getTrackCursor(TrackListAdapter.TrackQueryHandler queryhandler, String filter,
+            boolean async) {
+
+        if (queryhandler == null) {
+            throw new IllegalArgumentException();
+        }
+
         Cursor ret = null;
         mSortOrder = MediaStore.Audio.Media.TITLE_KEY;
         StringBuilder where = new StringBuilder();
         where.append(MediaStore.Audio.Media.TITLE + " != ''");
-        
+
         // Add in the filtering constraints
         String [] keywords = null;
         if (filter != null) {
@@ -926,17 +974,9 @@
         
         if (mGenre != null) {
             mSortOrder = MediaStore.Audio.Genres.Members.DEFAULT_SORT_ORDER;
-            if (async != null) {
-                async.startQuery(0, null,
-                        MediaStore.Audio.Genres.Members.getContentUri("external",
-                        Integer.valueOf(mGenre)),
-                        mCursorCols, where.toString(), keywords, mSortOrder);
-                ret = null;
-            } else {
-                ret = MusicUtils.query(this,
-                        MediaStore.Audio.Genres.Members.getContentUri("external", Integer.valueOf(mGenre)),
-                        mCursorCols, where.toString(), keywords, mSortOrder);
-            }
+            ret = queryhandler.doQuery(MediaStore.Audio.Genres.Members.getContentUri("external",
+                    Integer.valueOf(mGenre)),
+                    mCursorCols, where.toString(), keywords, mSortOrder, async);
         } else if (mPlaylist != null) {
             if (mPlaylist.equals("nowplaying")) {
                 if (MusicUtils.sService != null) {
@@ -949,43 +989,22 @@
                 }
             } else if (mPlaylist.equals("podcasts")) {
                 where.append(" AND " + MediaStore.Audio.Media.IS_PODCAST + "=1");
-                if (async != null) {
-                    async.startQuery(0, null,
-                            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, mCursorCols,
-                            where.toString(), keywords, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
-                    ret = null;
-                 } else {
-                    ret = MusicUtils.query(this,
-                            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, mCursorCols,
-                            where.toString(), keywords, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
-                }
+                ret = queryhandler.doQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                        mCursorCols, where.toString(), keywords,
+                        MediaStore.Audio.Media.DEFAULT_SORT_ORDER, async);
             } else if (mPlaylist.equals("recentlyadded")) {
                 // do a query for all songs added in the last X weeks
                 int X = MusicUtils.getIntPref(this, "numweeks", 2) * (3600 * 24 * 7);
                 where.append(" AND " + MediaStore.MediaColumns.DATE_ADDED + ">");
                 where.append(System.currentTimeMillis() / 1000 - X);
-                if (async != null) {
-                    async.startQuery(0, null,
-                            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, mCursorCols,
-                            where.toString(), keywords, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
-                    ret = null;
-                 } else {
-                    ret = MusicUtils.query(this,
-                            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, mCursorCols,
-                            where.toString(), keywords, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
-                }
+                ret = queryhandler.doQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                        mCursorCols, where.toString(), keywords,
+                        MediaStore.Audio.Media.DEFAULT_SORT_ORDER, async);
             } else {
                 mSortOrder = MediaStore.Audio.Playlists.Members.DEFAULT_SORT_ORDER;
-                if (async != null) {
-                    async.startQuery(0, null,
-                            MediaStore.Audio.Playlists.Members.getContentUri("external", Long.valueOf(mPlaylist)),
-                            mPlaylistMemberCols, where.toString(), keywords, mSortOrder);
-                    ret = null;
-                } else {
-                    ret = MusicUtils.query(this,
-                            MediaStore.Audio.Playlists.Members.getContentUri("external", Long.valueOf(mPlaylist)),
-                            mPlaylistMemberCols, where.toString(), keywords, mSortOrder);
-                }
+                ret = queryhandler.doQuery(MediaStore.Audio.Playlists.Members.getContentUri("external",
+                        Long.valueOf(mPlaylist)), mPlaylistMemberCols,
+                        where.toString(), keywords, mSortOrder, async);
             }
         } else {
             if (mAlbumId != null) {
@@ -996,20 +1015,13 @@
                 where.append(" AND " + MediaStore.Audio.Media.ARTIST_ID + "=" + mArtistId);
             }
             where.append(" AND " + MediaStore.Audio.Media.IS_MUSIC + "=1");
-            if (async != null) {
-                async.startQuery(0, null,
-                        MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
-                        mCursorCols, where.toString() , keywords, mSortOrder);
-                ret = null;
-            } else {
-                ret = MusicUtils.query(this, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
-                        mCursorCols, where.toString() , keywords, mSortOrder);
-            }
+            ret = queryhandler.doQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
+                    mCursorCols, where.toString() , keywords, mSortOrder, async);
         }
         
         // This special case is for the "nowplaying" cursor, which cannot be handled
         // asynchronously using AsyncQueryHandler, so we do some extra initialization here.
-        if (ret != null && async != null) {
+        if (ret != null && async) {
             init(ret);
             setTitle();
         }
@@ -1029,7 +1041,7 @@
             try {
                 mNowPlaying = mService.getQueue();
             } catch (RemoteException ex) {
-                mNowPlaying = new int[0];
+                mNowPlaying = new long[0];
             }
             mSize = mNowPlaying.length;
             if (mSize == 0) {
@@ -1056,11 +1068,11 @@
             }
             
             int size = mCurrentPlaylistCursor.getCount();
-            mCursorIdxs = new int[size];
+            mCursorIdxs = new long[size];
             mCurrentPlaylistCursor.moveToFirst();
             int colidx = mCurrentPlaylistCursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID);
             for (int i = 0; i < size; i++) {
-                mCursorIdxs[i] = mCurrentPlaylistCursor.getInt(colidx);
+                mCursorIdxs[i] = mCurrentPlaylistCursor.getLong(colidx);
                 mCurrentPlaylistCursor.moveToNext();
             }
             mCurrentPlaylistCursor.moveToFirst();
@@ -1073,7 +1085,7 @@
             try {
                 int removed = 0;
                 for (int i = mNowPlaying.length - 1; i >= 0; i--) {
-                    int trackid = mNowPlaying[i];
+                    long trackid = mNowPlaying[i];
                     int crsridx = Arrays.binarySearch(mCursorIdxs, trackid);
                     if (crsridx < 0) {
                         //Log.i("@@@@@", "item no longer exists in db: " + trackid);
@@ -1089,7 +1101,7 @@
                     }
                 }
             } catch (RemoteException ex) {
-                mNowPlaying = new int[0];
+                mNowPlaying = new long[0];
             }
         }
 
@@ -1113,7 +1125,7 @@
             // in queue-order, so we need to figure out where in the cursor we
             // should be.
            
-            int newid = mNowPlaying[newPosition];
+            long newid = mNowPlaying[newPosition];
             int crsridx = Arrays.binarySearch(mCursorIdxs, newid);
             mCurrentPlaylistCursor.moveToPosition(crsridx);
             mCurPos = newPosition;
@@ -1240,8 +1252,8 @@
         private String [] mCols;
         private Cursor mCurrentPlaylistCursor;     // updated in onMove
         private int mSize;          // size of the queue
-        private int[] mNowPlaying;
-        private int[] mCursorIdxs;
+        private long[] mNowPlaying;
+        private long[] mCursorIdxs;
         private int mCurPos;
         private IMediaPlaybackService mService;
     }
@@ -1262,7 +1274,7 @@
         private AlphabetIndexer mIndexer;
         
         private TrackBrowserActivity mActivity = null;
-        private AsyncQueryHandler mQueryHandler;
+        private TrackQueryHandler mQueryHandler;
         private String mConstraint = null;
         private boolean mConstraintIsValid = false;
         
@@ -1275,15 +1287,50 @@
             char [] buffer2;
         }
 
-        class QueryHandler extends AsyncQueryHandler {
-            QueryHandler(ContentResolver res) {
+        class TrackQueryHandler extends AsyncQueryHandler {
+
+            class QueryArgs {
+                public Uri uri;
+                public String [] projection;
+                public String selection;
+                public String [] selectionArgs;
+                public String orderBy;
+            }
+
+            TrackQueryHandler(ContentResolver res) {
                 super(res);
             }
             
+            public Cursor doQuery(Uri uri, String[] projection,
+                    String selection, String[] selectionArgs,
+                    String orderBy, boolean async) {
+                if (async) {
+                    // Get 100 results first, which is enough to allow the user to start scrolling,
+                    // while still being very fast.
+                    Uri limituri = uri.buildUpon().appendQueryParameter("limit", "100").build();
+                    QueryArgs args = new QueryArgs();
+                    args.uri = uri;
+                    args.projection = projection;
+                    args.selection = selection;
+                    args.selectionArgs = selectionArgs;
+                    args.orderBy = orderBy;
+
+                    startQuery(0, args, limituri, projection, selection, selectionArgs, orderBy);
+                    return null;
+                }
+                return MusicUtils.query(mActivity,
+                        uri, projection, selection, selectionArgs, orderBy);
+            }
+
             @Override
             protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
                 //Log.i("@@@", "query complete: " + cursor.getCount() + "   " + mActivity);
                 mActivity.init(cursor);
+                if (token == 0 && cookie != null && cursor != null && cursor.getCount() >= 100) {
+                    QueryArgs args = (QueryArgs) cookie;
+                    startQuery(1, null, args.uri, args.projection, args.selection,
+                            args.selectionArgs, args.orderBy);
+                }
             }
         }
         
@@ -1298,14 +1345,14 @@
             mUnknownArtist = context.getString(R.string.unknown_artist_name);
             mUnknownAlbum = context.getString(R.string.unknown_album_name);
             
-            mQueryHandler = new QueryHandler(context.getContentResolver());
+            mQueryHandler = new TrackQueryHandler(context.getContentResolver());
         }
         
         public void setActivity(TrackBrowserActivity newactivity) {
             mActivity = newactivity;
         }
         
-        public AsyncQueryHandler getQueryHandler() {
+        public TrackQueryHandler getQueryHandler() {
             return mQueryHandler;
         }
         
@@ -1386,7 +1433,7 @@
             vh.line2.setText(vh.buffer2, 0, len);
 
             ImageView iv = vh.play_indicator;
-            int id = -1;
+            long id = -1;
             if (MusicUtils.sService != null) {
                 // TODO: IPC call on each bind??
                 try {
@@ -1411,7 +1458,7 @@
             // playlist mode (except when you're viewing the "current playlist",
             // which is not really a playlist)
             if ( (mIsNowPlaying && cursor.getPosition() == id) ||
-                 (!mIsNowPlaying && !mDisableNowPlayingIndicator && cursor.getInt(mAudioIdIdx) == id)) {
+                 (!mIsNowPlaying && !mDisableNowPlayingIndicator && cursor.getLong(mAudioIdIdx) == id)) {
                 iv.setImageResource(R.drawable.indicator_ic_mp_playing_list);
                 iv.setVisibility(View.VISIBLE);
             } else {
@@ -1436,7 +1483,7 @@
                     (s != null && s.equals(mConstraint)))) {
                 return getCursor();
             }
-            Cursor c = mActivity.getTrackCursor(null, s);
+            Cursor c = mActivity.getTrackCursor(mQueryHandler, s, false);
             mConstraint = s;
             mConstraintIsValid = true;
             return c;
diff --git a/tests/src/com/android/music/MusicPlayerFunctionalTestRunner.java b/tests/src/com/android/music/MusicPlayerFunctionalTestRunner.java
index 7801bf1..bacb7e2 100644
--- a/tests/src/com/android/music/MusicPlayerFunctionalTestRunner.java
+++ b/tests/src/com/android/music/MusicPlayerFunctionalTestRunner.java
@@ -43,6 +43,7 @@
         TestSuite suite = new InstrumentationTestSuite(this);  
         suite.addTestSuite(TestSongs.class);
         suite.addTestSuite(TestPlaylist.class);
+        suite.addTestSuite(MusicPlayerStability.class);
         return suite;
     }
 
diff --git a/tests/src/com/android/music/MusicPlayerStability.java b/tests/src/com/android/music/MusicPlayerStability.java
new file mode 100644
index 0000000..5654adb
--- /dev/null
+++ b/tests/src/com/android/music/MusicPlayerStability.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2009 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.tests;
+
+import android.app.Instrumentation;
+import com.android.music.TrackBrowserActivity;
+import android.view.KeyEvent;
+import android.widget.ListView;
+
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.suitebuilder.annotation.LargeTest;
+
+/**
+ * Junit / Instrumentation test case for the Music Player
+ */
+
+public class MusicPlayerStability extends ActivityInstrumentationTestCase2 <TrackBrowserActivity>{
+    private static String TAG = "musicplayerstability";
+    private static int PLAY_TIME = 30000;
+    private ListView mTrackList;
+
+    public MusicPlayerStability() {
+        super("com.android.music",TrackBrowserActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        getActivity();
+        super.setUp();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    /**
+     * Test case 1: This test case is for the power and general stability
+     * measurment. We don't need to do the validation. This test case simply
+     * play the mp3 for 30 seconds then stop.
+     * The sdcard should have the target mp3 files.
+     */
+    @LargeTest
+    public void testPlay30sMP3() throws Exception {
+        // Launch the songs list. Pick the fisrt song and play
+        try {
+            Instrumentation inst = getInstrumentation();
+            inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
+            mTrackList = getActivity().getListView();
+            int viewCount = mTrackList.getSelectedItemPosition();
+            //Make sure there is at least one song in the sdcard
+            if (viewCount != -1) {
+                inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER);
+            } else {
+                assertTrue("testPlayMP3", false);
+            }
+            Thread.sleep(PLAY_TIME);
+        } catch (Exception e) {
+            assertTrue("testPlayMP3", false);
+        }
+    }
+
+    @LargeTest
+    public void testLaunchMusicPlayer() throws Exception {
+        // Launch music player and sleep for 30 seconds to capture
+        // the music player power usage base line.
+        try {
+            Thread.sleep(PLAY_TIME);
+        } catch (Exception e) {
+            assertTrue("MusicPlayer Do Nothing", false);
+        }
+        assertTrue("MusicPlayer Do Nothing", true);
+    }
+}