Add Genre support, add random songs

This commit is contained in:
Joshua Bahnsen 2013-04-20 14:58:59 -07:00
parent ef8bf089c4
commit 38cafc4025
21 changed files with 1193 additions and 552 deletions

View File

@ -2,8 +2,8 @@
<manifest xmlns:a="http://schemas.android.com/apk/res/android"
package="com.thejoshwa.ultrasonic.androidapp"
a:installLocation="auto"
a:versionCode="6"
a:versionName="1.0.0.30" >
a:versionCode="7"
a:versionName="1.0.1.1" >
<uses-permission a:name="android.permission.INTERNET" />
<uses-permission a:name="android.permission.READ_PHONE_STATE" />
@ -78,6 +78,10 @@
a:configChanges="orientation|keyboardHidden"
a:label="@string/equalizer.label"
a:launchMode="singleTask" />
<activity
a:name=".activity.SelectGenreActivity"
a:configChanges="orientation|keyboardHidden"
a:launchMode="standard" />
<activity
a:name=".activity.VoiceQueryReceiverActivity"
a:launchMode="singleTask" >

View File

@ -129,20 +129,20 @@ public final class R {
public static final int unknown_album_large=0x7f02004d;
}
public static final class id {
public static final int album=0x7f0d0050;
public static final int album=0x7f0d0055;
public static final int album_artist=0x7f0d0002;
public static final int album_coverart=0x7f0d0000;
public static final int album_menu_pin=0x7f0d008d;
public static final int album_menu_play_last=0x7f0d008c;
public static final int album_menu_play_now=0x7f0d008b;
public static final int album_menu_pin=0x7f0d0095;
public static final int album_menu_play_last=0x7f0d0094;
public static final int album_menu_play_now=0x7f0d0093;
public static final int album_star=0x7f0d0003;
public static final int album_title=0x7f0d0001;
public static final int appwidget_coverart=0x7f0d0004;
public static final int appwidget_top=0x7f0d0006;
public static final int artist=0x7f0d0008;
public static final int artist_menu_pin=0x7f0d0090;
public static final int artist_menu_play_last=0x7f0d008f;
public static final int artist_menu_play_now=0x7f0d008e;
public static final int artist_menu_pin=0x7f0d0098;
public static final int artist_menu_play_last=0x7f0d0097;
public static final int artist_menu_play_now=0x7f0d0096;
public static final int button_bar=0x7f0d000c;
public static final int button_bar_home=0x7f0d000d;
public static final int button_bar_music=0x7f0d000e;
@ -154,7 +154,7 @@ public final class R {
public static final int control_next=0x7f0d000b;
public static final int control_play=0x7f0d000a;
public static final int control_previous=0x7f0d0009;
public static final int control_stop=0x7f0d0051;
public static final int control_stop=0x7f0d0056;
public static final int download_album=0x7f0d0028;
public static final int download_album_art_image=0x7f0d0022;
public static final int download_album_art_layout=0x7f0d0021;
@ -163,8 +163,8 @@ public final class R {
public static final int download_control_layout=0x7f0d0014;
public static final int download_duration=0x7f0d0026;
public static final int download_empty=0x7f0d0029;
public static final int download_equalizer=0x7f0d0080;
public static final int download_jukebox=0x7f0d0082;
public static final int download_equalizer=0x7f0d0088;
public static final int download_jukebox=0x7f0d008a;
public static final int download_list=0x7f0d002a;
public static final int download_next=0x7f0d001a;
public static final int download_pause=0x7f0d0017;
@ -180,7 +180,7 @@ public final class R {
public static final int download_status=0x7f0d001e;
public static final int download_stop=0x7f0d0018;
public static final int download_toggle_list=0x7f0d001d;
public static final int download_visualizer=0x7f0d0081;
public static final int download_visualizer=0x7f0d0089;
public static final int download_visualizer_view_layout=0x7f0d0023;
public static final int equalizer_bar=0x7f0d0031;
public static final int equalizer_frequency=0x7f0d002f;
@ -200,84 +200,92 @@ public final class R {
public static final int lyrics_title=0x7f0d003a;
public static final int main_select_server_1=0x7f0d003f;
public static final int main_select_server_2=0x7f0d0040;
public static final int main_albums=0x7f0d0043;
public static final int main_albums_alphaByArtist=0x7f0d004b;
public static final int main_albums_alphaByName=0x7f0d004a;
public static final int main_albums_frequent=0x7f0d0046;
public static final int main_albums_highest=0x7f0d0047;
public static final int main_albums_newest=0x7f0d0044;
public static final int main_albums_random=0x7f0d0048;
public static final int main_albums_recent=0x7f0d0045;
public static final int main_albums_starred=0x7f0d0049;
public static final int main_albums=0x7f0d0048;
public static final int main_albums_alphaByArtist=0x7f0d0050;
public static final int main_albums_alphaByName=0x7f0d004f;
public static final int main_albums_button=0x7f0d0043;
public static final int main_albums_frequent=0x7f0d004b;
public static final int main_albums_highest=0x7f0d004c;
public static final int main_albums_newest=0x7f0d0049;
public static final int main_albums_random=0x7f0d004d;
public static final int main_albums_recent=0x7f0d004a;
public static final int main_albums_starred=0x7f0d004e;
public static final int main_artists_button=0x7f0d0042;
public static final int main_dummy=0x7f0d003d;
public static final int main_genres_button=0x7f0d0044;
public static final int main_list=0x7f0d003c;
public static final int main_music=0x7f0d0041;
public static final int main_select_server=0x7f0d003e;
public static final int main_shuffle=0x7f0d007f;
public static final int main_songs=0x7f0d0041;
public static final int main_songs_starred=0x7f0d0042;
public static final int menu_exit=0x7f0d007e;
public static final int menu_help=0x7f0d007d;
public static final int menu_lyrics=0x7f0d0087;
public static final int menu_refresh=0x7f0d0091;
public static final int menu_remove=0x7f0d0088;
public static final int menu_remove_all=0x7f0d0084;
public static final int menu_save_playlist=0x7f0d0083;
public static final int menu_screen_on_off=0x7f0d0085;
public static final int menu_settings=0x7f0d007c;
public static final int menu_show_album=0x7f0d0086;
public static final int menu_shuffle=0x7f0d0089;
public static final int notification_image=0x7f0d004d;
public static final int play_video_contents=0x7f0d0052;
public static final int progress_message=0x7f0d0053;
public static final int save_playlist_name=0x7f0d0055;
public static final int save_playlist_root=0x7f0d0054;
public static final int search_albums=0x7f0d0059;
public static final int search_artists=0x7f0d0058;
public static final int search_list=0x7f0d0056;
public static final int search_more_albums=0x7f0d005c;
public static final int search_more_artists=0x7f0d005b;
public static final int search_more_songs=0x7f0d005d;
public static final int search_search=0x7f0d0057;
public static final int search_songs=0x7f0d005a;
public static final int select_album_art=0x7f0d0067;
public static final int select_album_artist=0x7f0d0069;
public static final int select_album_delete=0x7f0d0065;
public static final int select_album_duration=0x7f0d006c;
public static final int select_album_empty=0x7f0d005e;
public static final int select_album_entries=0x7f0d005f;
public static final int select_album_genre=0x7f0d006a;
public static final int select_album_more=0x7f0d0066;
public static final int select_album_pin=0x7f0d0063;
public static final int select_album_play_all=0x7f0d008a;
public static final int select_album_play_last=0x7f0d0062;
public static final int select_album_play_now=0x7f0d0061;
public static final int select_album_select=0x7f0d0060;
public static final int select_album_song_count=0x7f0d006b;
public static final int select_album_title=0x7f0d0068;
public static final int select_album_unpin=0x7f0d0064;
public static final int select_artist_folder=0x7f0d006e;
public static final int select_artist_folder_1=0x7f0d006f;
public static final int select_artist_folder_2=0x7f0d0070;
public static final int select_artist_list=0x7f0d006d;
public static final int select_playlist_empty=0x7f0d0071;
public static final int select_playlist_list=0x7f0d0072;
public static final int song_artist=0x7f0d0077;
public static final int song_check=0x7f0d0073;
public static final int song_duration=0x7f0d0078;
public static final int song_menu_play_last=0x7f0d0094;
public static final int song_menu_play_next=0x7f0d0093;
public static final int song_menu_play_now=0x7f0d0092;
public static final int song_star=0x7f0d0079;
public static final int song_status=0x7f0d0076;
public static final int song_title=0x7f0d0075;
public static final int song_track=0x7f0d0074;
public static final int status_icon=0x7f0d004e;
public static final int statusbar=0x7f0d004c;
public static final int tab_progress=0x7f0d007a;
public static final int tab_progress_message=0x7f0d007b;
public static final int main_shuffle=0x7f0d0087;
public static final int main_songs=0x7f0d0045;
public static final int main_songs_button=0x7f0d0046;
public static final int main_songs_starred=0x7f0d0047;
public static final int menu_exit=0x7f0d0086;
public static final int menu_help=0x7f0d0085;
public static final int menu_lyrics=0x7f0d008f;
public static final int menu_refresh=0x7f0d0099;
public static final int menu_remove=0x7f0d0090;
public static final int menu_remove_all=0x7f0d008c;
public static final int menu_save_playlist=0x7f0d008b;
public static final int menu_screen_on_off=0x7f0d008d;
public static final int menu_settings=0x7f0d0084;
public static final int menu_show_album=0x7f0d008e;
public static final int menu_shuffle=0x7f0d0091;
public static final int notification_image=0x7f0d0052;
public static final int play_video_contents=0x7f0d0057;
public static final int progress_message=0x7f0d0058;
public static final int save_playlist_name=0x7f0d005a;
public static final int save_playlist_root=0x7f0d0059;
public static final int search_albums=0x7f0d005e;
public static final int search_artists=0x7f0d005d;
public static final int search_list=0x7f0d005b;
public static final int search_more_albums=0x7f0d0061;
public static final int search_more_artists=0x7f0d0060;
public static final int search_more_songs=0x7f0d0062;
public static final int search_search=0x7f0d005c;
public static final int search_songs=0x7f0d005f;
public static final int select_album_art=0x7f0d006c;
public static final int select_album_artist=0x7f0d006e;
public static final int select_album_delete=0x7f0d006a;
public static final int select_album_duration=0x7f0d0071;
public static final int select_album_empty=0x7f0d0063;
public static final int select_album_entries=0x7f0d0064;
public static final int select_album_genre=0x7f0d006f;
public static final int select_album_more=0x7f0d006b;
public static final int select_album_pin=0x7f0d0068;
public static final int select_album_play_all=0x7f0d0092;
public static final int select_album_play_last=0x7f0d0067;
public static final int select_album_play_now=0x7f0d0066;
public static final int select_album_select=0x7f0d0065;
public static final int select_album_song_count=0x7f0d0070;
public static final int select_album_title=0x7f0d006d;
public static final int select_album_unpin=0x7f0d0069;
public static final int select_artist_empty=0x7f0d0072;
public static final int select_artist_folder=0x7f0d0074;
public static final int select_artist_folder_1=0x7f0d0075;
public static final int select_artist_folder_2=0x7f0d0076;
public static final int select_artist_list=0x7f0d0073;
public static final int select_genre_empty=0x7f0d0077;
public static final int select_genre_list=0x7f0d0078;
public static final int select_playlist_empty=0x7f0d0079;
public static final int select_playlist_list=0x7f0d007a;
public static final int song_artist=0x7f0d007f;
public static final int song_check=0x7f0d007b;
public static final int song_duration=0x7f0d0080;
public static final int song_menu_play_last=0x7f0d009c;
public static final int song_menu_play_next=0x7f0d009b;
public static final int song_menu_play_now=0x7f0d009a;
public static final int song_star=0x7f0d0081;
public static final int song_status=0x7f0d007e;
public static final int song_title=0x7f0d007d;
public static final int song_track=0x7f0d007c;
public static final int status_icon=0x7f0d0053;
public static final int statusbar=0x7f0d0051;
public static final int tab_progress=0x7f0d0082;
public static final int tab_progress_message=0x7f0d0083;
public static final int title=0x7f0d0007;
public static final int toast_layout_root=0x7f0d0036;
public static final int trackname=0x7f0d004f;
public static final int trackname=0x7f0d0054;
}
public static final class integer {
public static final int config_activityDefaultDur=0x7f080001;
@ -311,9 +319,10 @@ public final class R {
public static final int select_album_header=0x7f030018;
public static final int select_artist=0x7f030019;
public static final int select_artist_header=0x7f03001a;
public static final int select_playlist=0x7f03001b;
public static final int song_list_item=0x7f03001c;
public static final int tab_progress=0x7f03001d;
public static final int select_genre=0x7f03001b;
public static final int select_playlist=0x7f03001c;
public static final int song_list_item=0x7f03001d;
public static final int tab_progress=0x7f03001e;
}
public static final class menu {
public static final int common=0x7f0c0000;
@ -333,12 +342,12 @@ public final class R {
public static final int select_album_n_songs_downloading=0x7f0a0001;
}
public static final class string {
public static final int background_task_loading=0x7f0900ef;
public static final int background_task_network_error=0x7f0900f1;
public static final int background_task_no_network=0x7f0900f0;
public static final int background_task_not_found=0x7f0900f2;
public static final int background_task_parse_error=0x7f0900f3;
public static final int background_task_wait=0x7f0900ee;
public static final int background_task_loading=0x7f0900f8;
public static final int background_task_network_error=0x7f0900fa;
public static final int background_task_no_network=0x7f0900f9;
public static final int background_task_not_found=0x7f0900fb;
public static final int background_task_parse_error=0x7f0900fc;
public static final int background_task_wait=0x7f0900f7;
public static final int button_bar_browse=0x7f09000d;
public static final int button_bar_home=0x7f09000c;
public static final int button_bar_now_playing=0x7f090010;
@ -356,248 +365,257 @@ public final class R {
public static final int common_save=0x7f090002;
public static final int common_unpin=0x7f090008;
public static final int common_various_artists=0x7f09000a;
public static final int download_empty=0x7f09004a;
public static final int download_jukebox_not_authorized=0x7f090069;
public static final int download_jukebox_off=0x7f090065;
public static final int download_jukebox_offline=0x7f090068;
public static final int download_jukebox_on=0x7f090064;
public static final int download_jukebox_server_too_old=0x7f090067;
public static final int download_jukebox_volume=0x7f090066;
public static final int download_menu_equalizer=0x7f090056;
public static final int download_menu_jukebox=0x7f090058;
public static final int download_menu_lyrics=0x7f09004f;
public static final int download_menu_remove=0x7f090050;
public static final int download_menu_remove_all=0x7f090051;
public static final int download_menu_save=0x7f090055;
public static final int download_menu_screen_off=0x7f090053;
public static final int download_menu_screen_on=0x7f090052;
public static final int download_menu_show_album=0x7f09004e;
public static final int download_menu_shuffle=0x7f090054;
public static final int download_menu_shuffle_notification=0x7f090059;
public static final int download_menu_visualizer=0x7f090057;
public static final int download_playerstate_buffering=0x7f09004c;
public static final int download_playerstate_downloading=0x7f09004b;
public static final int download_playerstate_playing_shuffle=0x7f09004d;
public static final int download_playlist_done=0x7f09005d;
public static final int download_playlist_error=0x7f09005e;
public static final int download_playlist_name=0x7f09005b;
public static final int download_playlist_saving=0x7f09005c;
public static final int download_playlist_title=0x7f09005a;
public static final int download_repeat_all=0x7f090060;
public static final int download_repeat_off=0x7f09005f;
public static final int download_repeat_single=0x7f090061;
public static final int download_visualizer_off=0x7f090063;
public static final int download_visualizer_on=0x7f090062;
public static final int equalizer_enabled=0x7f090100;
public static final int equalizer_label=0x7f0900ff;
public static final int equalizer_preset=0x7f090101;
public static final int error_label=0x7f09006d;
public static final int help_back=0x7f090029;
public static final int help_close=0x7f09002a;
public static final int help_label=0x7f090027;
public static final int help_loading=0x7f09002c;
public static final int help_title=0x7f090028;
public static final int help_url=0x7f09002b;
public static final int lyrics_nomatch=0x7f09006c;
public static final int main_albums_alphaByArtist=0x7f09001f;
public static final int main_albums_alphaByName=0x7f09001e;
public static final int main_albums_frequent=0x7f09001a;
public static final int main_albums_highest=0x7f09001b;
public static final int main_albums_newest=0x7f090018;
public static final int main_albums_random=0x7f09001c;
public static final int main_albums_recent=0x7f090019;
public static final int main_albums_starred=0x7f09001d;
public static final int main_albums_title=0x7f090017;
public static final int main_offline=0x7f090015;
public static final int download_empty=0x7f090053;
public static final int download_jukebox_not_authorized=0x7f090072;
public static final int download_jukebox_off=0x7f09006e;
public static final int download_jukebox_offline=0x7f090071;
public static final int download_jukebox_on=0x7f09006d;
public static final int download_jukebox_server_too_old=0x7f090070;
public static final int download_jukebox_volume=0x7f09006f;
public static final int download_menu_equalizer=0x7f09005f;
public static final int download_menu_jukebox=0x7f090061;
public static final int download_menu_lyrics=0x7f090058;
public static final int download_menu_remove=0x7f090059;
public static final int download_menu_remove_all=0x7f09005a;
public static final int download_menu_save=0x7f09005e;
public static final int download_menu_screen_off=0x7f09005c;
public static final int download_menu_screen_on=0x7f09005b;
public static final int download_menu_show_album=0x7f090057;
public static final int download_menu_shuffle=0x7f09005d;
public static final int download_menu_shuffle_notification=0x7f090062;
public static final int download_menu_visualizer=0x7f090060;
public static final int download_playerstate_buffering=0x7f090055;
public static final int download_playerstate_downloading=0x7f090054;
public static final int download_playerstate_playing_shuffle=0x7f090056;
public static final int download_playlist_done=0x7f090066;
public static final int download_playlist_error=0x7f090067;
public static final int download_playlist_name=0x7f090064;
public static final int download_playlist_saving=0x7f090065;
public static final int download_playlist_title=0x7f090063;
public static final int download_repeat_all=0x7f090069;
public static final int download_repeat_off=0x7f090068;
public static final int download_repeat_single=0x7f09006a;
public static final int download_visualizer_off=0x7f09006c;
public static final int download_visualizer_on=0x7f09006b;
public static final int equalizer_enabled=0x7f090109;
public static final int equalizer_label=0x7f090108;
public static final int equalizer_preset=0x7f09010a;
public static final int error_label=0x7f090076;
public static final int help_back=0x7f090030;
public static final int help_close=0x7f090031;
public static final int help_label=0x7f09002e;
public static final int help_loading=0x7f090033;
public static final int help_title=0x7f09002f;
public static final int help_url=0x7f090032;
public static final int lyrics_nomatch=0x7f090075;
public static final int main_albums_alphaByArtist=0x7f090023;
public static final int main_albums_alphaByName=0x7f090022;
public static final int main_albums_frequent=0x7f09001e;
public static final int main_albums_highest=0x7f09001f;
public static final int main_albums_newest=0x7f09001c;
public static final int main_albums_random=0x7f090020;
public static final int main_albums_recent=0x7f09001d;
public static final int main_albums_starred=0x7f090021;
public static final int main_albums_title=0x7f09001b;
public static final int main_artists_title=0x7f090019;
public static final int main_genres_title=0x7f09001a;
public static final int main_music=0x7f090028;
public static final int main_offline=0x7f090017;
public static final int main_select_all_genres=0x7f090015;
public static final int main_select_genre=0x7f090014;
public static final int main_select_server=0x7f090013;
public static final int main_settings=0x7f090016;
public static final int main_shuffle=0x7f090014;
public static final int main_songs_starred=0x7f090021;
public static final int main_songs_title=0x7f090020;
public static final int main_settings=0x7f090018;
public static final int main_shuffle=0x7f090016;
public static final int main_songs_genre=0x7f090027;
public static final int main_songs_random=0x7f090026;
public static final int main_songs_starred=0x7f090025;
public static final int main_songs_title=0x7f090024;
public static final int main_welcome_text=0x7f090012;
public static final int main_welcome_title=0x7f090011;
public static final int menu_exit=0x7f090022;
public static final int menu_help=0x7f090024;
public static final int menu_search=0x7f090025;
public static final int menu_settings=0x7f090023;
public static final int music_library_label=0x7f090038;
public static final int music_library_label_offline=0x7f090039;
public static final int music_service_retry=0x7f0900ed;
public static final int parser_artist_count=0x7f0900fb;
public static final int parser_not_authenticated=0x7f0900f9;
public static final int parser_not_authorized=0x7f0900fa;
public static final int parser_reading=0x7f0900f5;
public static final int parser_reading_done=0x7f0900f6;
public static final int parser_upgrade_client=0x7f0900f7;
public static final int parser_upgrade_server=0x7f0900f8;
public static final int play_video_loading=0x7f09002d;
public static final int play_video_noplugin=0x7f09002e;
public static final int playlist_label=0x7f090026;
public static final int progress_wait=0x7f090037;
public static final int search_albums=0x7f090034;
public static final int search_artists=0x7f090033;
public static final int search_label=0x7f09002f;
public static final int search_more=0x7f090036;
public static final int search_no_match=0x7f090032;
public static final int search_search=0x7f090031;
public static final int search_songs=0x7f090035;
public static final int search_title=0x7f090030;
public static final int select_album_donate_dialog_0_trial_days_left=0x7f090048;
public static final int select_album_donate_dialog_later=0x7f090047;
public static final int select_album_donate_dialog_message=0x7f090045;
public static final int select_album_donate_dialog_now=0x7f090046;
public static final int select_album_empty=0x7f09003a;
public static final int select_album_more=0x7f09003e;
public static final int select_album_n_selected=0x7f09003c;
public static final int select_album_n_unselected=0x7f09003d;
public static final int select_album_no_network=0x7f090043;
public static final int select_album_no_sdcard=0x7f090042;
public static final int select_album_not_licensed=0x7f090044;
public static final int select_album_offline=0x7f09003f;
public static final int select_album_play_all=0x7f090041;
public static final int select_album_searching=0x7f090040;
public static final int select_album_select=0x7f09003b;
public static final int select_artist_all_folders=0x7f0900fe;
public static final int select_artist_folder=0x7f0900fd;
public static final int select_artist_refresh=0x7f0900fc;
public static final int select_playlist_empty=0x7f090049;
public static final int service_connecting=0x7f0900f4;
public static final int settings_appearance_title=0x7f090083;
public static final int settings_buffer_length=0x7f0900be;
public static final int settings_buffer_length_1=0x7f0900c0;
public static final int settings_buffer_length_10=0x7f0900c4;
public static final int settings_buffer_length_12=0x7f0900c5;
public static final int settings_buffer_length_15=0x7f0900c6;
public static final int settings_buffer_length_2=0x7f0900c1;
public static final int settings_buffer_length_20=0x7f0900c7;
public static final int settings_buffer_length_30=0x7f0900c8;
public static final int settings_buffer_length_5=0x7f0900c2;
public static final int settings_buffer_length_8=0x7f0900c3;
public static final int settings_cache_location=0x7f09007b;
public static final int settings_cache_location_error=0x7f09007c;
public static final int settings_cache_size=0x7f09007a;
public static final int settings_cache_size_100=0x7f0900a5;
public static final int settings_cache_size_1000=0x7f0900a8;
public static final int settings_cache_size_10000=0x7f0900ab;
public static final int settings_cache_size_200=0x7f0900a6;
public static final int settings_cache_size_2000=0x7f0900a9;
public static final int settings_cache_size_20000=0x7f0900ac;
public static final int settings_cache_size_500=0x7f0900a7;
public static final int settings_cache_size_5000=0x7f0900aa;
public static final int settings_cache_size_unlimited=0x7f0900ad;
public static final int settings_cache_title=0x7f090078;
public static final int settings_clear_search_history=0x7f0900ae;
public static final int settings_connection_failure=0x7f090080;
public static final int settings_default_albums=0x7f0900eb;
public static final int settings_default_artists=0x7f0900ea;
public static final int settings_default_songs=0x7f0900ec;
public static final int settings_display_bitrate=0x7f090099;
public static final int settings_display_bitrate_summary=0x7f09009a;
public static final int settings_hide_media_summary=0x7f0900b8;
public static final int settings_hide_media_title=0x7f0900b7;
public static final int settings_hide_media_toast=0x7f0900b9;
public static final int settings_invalid_url=0x7f090081;
public static final int settings_invalid_username=0x7f090082;
public static final int settings_max_albums=0x7f0900d9;
public static final int settings_max_artists=0x7f0900e8;
public static final int settings_max_bitrate_112=0x7f090090;
public static final int settings_max_bitrate_128=0x7f090091;
public static final int settings_max_bitrate_160=0x7f090092;
public static final int settings_max_bitrate_192=0x7f090093;
public static final int settings_max_bitrate_256=0x7f090094;
public static final int settings_max_bitrate_32=0x7f09008c;
public static final int settings_max_bitrate_320=0x7f090095;
public static final int settings_max_bitrate_64=0x7f09008d;
public static final int settings_max_bitrate_80=0x7f09008e;
public static final int settings_max_bitrate_96=0x7f09008f;
public static final int settings_max_bitrate_mobile=0x7f09008b;
public static final int settings_max_bitrate_unlimited=0x7f090096;
public static final int settings_max_bitrate_wifi=0x7f09008a;
public static final int settings_max_songs=0x7f0900e9;
public static final int settings_media_button_summary=0x7f0900bb;
public static final int settings_media_button_title=0x7f0900ba;
public static final int settings_network_timeout=0x7f0900bf;
public static final int settings_network_timeout_105000=0x7f0900cf;
public static final int settings_network_timeout_120000=0x7f0900d0;
public static final int settings_network_timeout_15000=0x7f0900c9;
public static final int settings_network_timeout_30000=0x7f0900ca;
public static final int settings_network_timeout_45000=0x7f0900cb;
public static final int settings_network_timeout_60000=0x7f0900cc;
public static final int settings_network_timeout_75000=0x7f0900cd;
public static final int settings_network_timeout_90000=0x7f0900ce;
public static final int settings_network_title=0x7f090089;
public static final int settings_other_title=0x7f0900b0;
public static final int settings_playback_control_title=0x7f0900b2;
public static final int settings_preload=0x7f090079;
public static final int settings_preload_1=0x7f09009f;
public static final int settings_preload_10=0x7f0900a3;
public static final int settings_preload_2=0x7f0900a0;
public static final int settings_preload_3=0x7f0900a1;
public static final int settings_preload_5=0x7f0900a2;
public static final int settings_preload_unlimited=0x7f0900a4;
public static final int settings_screen_lit_summary=0x7f0900bd;
public static final int settings_screen_lit_title=0x7f0900bc;
public static final int settings_scrobble_summary=0x7f0900b4;
public static final int settings_scrobble_title=0x7f0900b3;
public static final int settings_search_1=0x7f0900da;
public static final int settings_search_10=0x7f0900dd;
public static final int settings_search_100=0x7f0900e5;
public static final int settings_search_15=0x7f0900de;
public static final int settings_search_20=0x7f0900df;
public static final int settings_search_25=0x7f0900e0;
public static final int settings_search_250=0x7f0900e6;
public static final int settings_search_3=0x7f0900db;
public static final int settings_search_30=0x7f0900e1;
public static final int settings_search_40=0x7f0900e2;
public static final int settings_search_5=0x7f0900dc;
public static final int settings_search_50=0x7f0900e3;
public static final int settings_search_500=0x7f0900e7;
public static final int settings_search_75=0x7f0900e4;
public static final int settings_search_history_cleared=0x7f0900af;
public static final int settings_search_title=0x7f0900b1;
public static final int settings_server_address=0x7f090075;
public static final int settings_server_name=0x7f090074;
public static final int settings_server_password=0x7f090077;
public static final int settings_server_scaling_summary=0x7f0900b6;
public static final int settings_server_scaling_title=0x7f0900b5;
public static final int settings_server_unused1=0x7f090071;
public static final int settings_server_unused2=0x7f090072;
public static final int settings_server_unused3=0x7f090073;
public static final int settings_server_username=0x7f090076;
public static final int settings_servers_title=0x7f090070;
public static final int settings_show_lockscreen_controls=0x7f0900d5;
public static final int settings_show_lockscreen_controls_summary=0x7f0900d6;
public static final int settings_show_notification=0x7f0900d1;
public static final int settings_show_notification_always=0x7f0900d3;
public static final int settings_show_notification_always_summary=0x7f0900d4;
public static final int settings_show_notification_summary=0x7f0900d2;
public static final int settings_show_track_number=0x7f09009d;
public static final int settings_show_track_number_summary=0x7f09009e;
public static final int settings_test_connection_title=0x7f09006f;
public static final int settings_testing_connection=0x7f09007d;
public static final int settings_testing_ok=0x7f09007e;
public static final int settings_testing_unlicensed=0x7f09007f;
public static final int settings_theme_dark=0x7f090088;
public static final int settings_theme_fullscreen=0x7f090085;
public static final int settings_theme_fullscreenlight=0x7f090086;
public static final int settings_theme_light=0x7f090087;
public static final int settings_theme_title=0x7f090084;
public static final int settings_title=0x7f09006e;
public static final int settings_use_folder_for_album_artist=0x7f09009b;
public static final int settings_use_folder_for_album_artist_summary=0x7f09009c;
public static final int settings_use_stream_proxy=0x7f0900d7;
public static final int settings_use_stream_proxy_summary=0x7f0900d8;
public static final int settings_wifi_required_summary=0x7f090098;
public static final int settings_wifi_required_title=0x7f090097;
public static final int song_details_all=0x7f09006a;
public static final int song_details_kbps=0x7f09006b;
public static final int util_bytes_format_byte=0x7f090108;
public static final int util_bytes_format_gigabyte=0x7f090105;
public static final int util_bytes_format_kilobyte=0x7f090107;
public static final int util_bytes_format_megabyte=0x7f090106;
public static final int widget_initial_text=0x7f090102;
public static final int widget_sdcard_busy=0x7f090103;
public static final int widget_sdcard_missing=0x7f090104;
public static final int menu_exit=0x7f090029;
public static final int menu_help=0x7f09002b;
public static final int menu_search=0x7f09002c;
public static final int menu_settings=0x7f09002a;
public static final int music_library_label=0x7f09003f;
public static final int music_library_label_offline=0x7f090040;
public static final int music_service_retry=0x7f0900f6;
public static final int parser_artist_count=0x7f090104;
public static final int parser_not_authenticated=0x7f090102;
public static final int parser_not_authorized=0x7f090103;
public static final int parser_reading=0x7f0900fe;
public static final int parser_reading_done=0x7f0900ff;
public static final int parser_upgrade_client=0x7f090100;
public static final int parser_upgrade_server=0x7f090101;
public static final int play_video_loading=0x7f090034;
public static final int play_video_noplugin=0x7f090035;
public static final int playlist_label=0x7f09002d;
public static final int progress_wait=0x7f09003e;
public static final int search_albums=0x7f09003b;
public static final int search_artists=0x7f09003a;
public static final int search_label=0x7f090036;
public static final int search_more=0x7f09003d;
public static final int search_no_match=0x7f090039;
public static final int search_search=0x7f090038;
public static final int search_songs=0x7f09003c;
public static final int search_title=0x7f090037;
public static final int select_album_donate_dialog_0_trial_days_left=0x7f09004f;
public static final int select_album_donate_dialog_later=0x7f09004e;
public static final int select_album_donate_dialog_message=0x7f09004c;
public static final int select_album_donate_dialog_now=0x7f09004d;
public static final int select_album_empty=0x7f090041;
public static final int select_album_more=0x7f090045;
public static final int select_album_n_selected=0x7f090043;
public static final int select_album_n_unselected=0x7f090044;
public static final int select_album_no_network=0x7f09004a;
public static final int select_album_no_sdcard=0x7f090049;
public static final int select_album_not_licensed=0x7f09004b;
public static final int select_album_offline=0x7f090046;
public static final int select_album_play_all=0x7f090048;
public static final int select_album_searching=0x7f090047;
public static final int select_album_select=0x7f090042;
public static final int select_artist_all_folders=0x7f090107;
public static final int select_artist_empty=0x7f090050;
public static final int select_artist_folder=0x7f090106;
public static final int select_artist_refresh=0x7f090105;
public static final int select_genre_empty=0x7f090051;
public static final int select_playlist_empty=0x7f090052;
public static final int service_connecting=0x7f0900fd;
public static final int settings_appearance_title=0x7f09008c;
public static final int settings_buffer_length=0x7f0900c7;
public static final int settings_buffer_length_1=0x7f0900c9;
public static final int settings_buffer_length_10=0x7f0900cd;
public static final int settings_buffer_length_12=0x7f0900ce;
public static final int settings_buffer_length_15=0x7f0900cf;
public static final int settings_buffer_length_2=0x7f0900ca;
public static final int settings_buffer_length_20=0x7f0900d0;
public static final int settings_buffer_length_30=0x7f0900d1;
public static final int settings_buffer_length_5=0x7f0900cb;
public static final int settings_buffer_length_8=0x7f0900cc;
public static final int settings_cache_location=0x7f090084;
public static final int settings_cache_location_error=0x7f090085;
public static final int settings_cache_size=0x7f090083;
public static final int settings_cache_size_100=0x7f0900ae;
public static final int settings_cache_size_1000=0x7f0900b1;
public static final int settings_cache_size_10000=0x7f0900b4;
public static final int settings_cache_size_200=0x7f0900af;
public static final int settings_cache_size_2000=0x7f0900b2;
public static final int settings_cache_size_20000=0x7f0900b5;
public static final int settings_cache_size_500=0x7f0900b0;
public static final int settings_cache_size_5000=0x7f0900b3;
public static final int settings_cache_size_unlimited=0x7f0900b6;
public static final int settings_cache_title=0x7f090081;
public static final int settings_clear_search_history=0x7f0900b7;
public static final int settings_connection_failure=0x7f090089;
public static final int settings_default_albums=0x7f0900f4;
public static final int settings_default_artists=0x7f0900f3;
public static final int settings_default_songs=0x7f0900f5;
public static final int settings_display_bitrate=0x7f0900a2;
public static final int settings_display_bitrate_summary=0x7f0900a3;
public static final int settings_hide_media_summary=0x7f0900c1;
public static final int settings_hide_media_title=0x7f0900c0;
public static final int settings_hide_media_toast=0x7f0900c2;
public static final int settings_invalid_url=0x7f09008a;
public static final int settings_invalid_username=0x7f09008b;
public static final int settings_max_albums=0x7f0900e2;
public static final int settings_max_artists=0x7f0900f1;
public static final int settings_max_bitrate_112=0x7f090099;
public static final int settings_max_bitrate_128=0x7f09009a;
public static final int settings_max_bitrate_160=0x7f09009b;
public static final int settings_max_bitrate_192=0x7f09009c;
public static final int settings_max_bitrate_256=0x7f09009d;
public static final int settings_max_bitrate_32=0x7f090095;
public static final int settings_max_bitrate_320=0x7f09009e;
public static final int settings_max_bitrate_64=0x7f090096;
public static final int settings_max_bitrate_80=0x7f090097;
public static final int settings_max_bitrate_96=0x7f090098;
public static final int settings_max_bitrate_mobile=0x7f090094;
public static final int settings_max_bitrate_unlimited=0x7f09009f;
public static final int settings_max_bitrate_wifi=0x7f090093;
public static final int settings_max_songs=0x7f0900f2;
public static final int settings_media_button_summary=0x7f0900c4;
public static final int settings_media_button_title=0x7f0900c3;
public static final int settings_network_timeout=0x7f0900c8;
public static final int settings_network_timeout_105000=0x7f0900d8;
public static final int settings_network_timeout_120000=0x7f0900d9;
public static final int settings_network_timeout_15000=0x7f0900d2;
public static final int settings_network_timeout_30000=0x7f0900d3;
public static final int settings_network_timeout_45000=0x7f0900d4;
public static final int settings_network_timeout_60000=0x7f0900d5;
public static final int settings_network_timeout_75000=0x7f0900d6;
public static final int settings_network_timeout_90000=0x7f0900d7;
public static final int settings_network_title=0x7f090092;
public static final int settings_other_title=0x7f0900b9;
public static final int settings_playback_control_title=0x7f0900bb;
public static final int settings_preload=0x7f090082;
public static final int settings_preload_1=0x7f0900a8;
public static final int settings_preload_10=0x7f0900ac;
public static final int settings_preload_2=0x7f0900a9;
public static final int settings_preload_3=0x7f0900aa;
public static final int settings_preload_5=0x7f0900ab;
public static final int settings_preload_unlimited=0x7f0900ad;
public static final int settings_screen_lit_summary=0x7f0900c6;
public static final int settings_screen_lit_title=0x7f0900c5;
public static final int settings_scrobble_summary=0x7f0900bd;
public static final int settings_scrobble_title=0x7f0900bc;
public static final int settings_search_1=0x7f0900e3;
public static final int settings_search_10=0x7f0900e6;
public static final int settings_search_100=0x7f0900ee;
public static final int settings_search_15=0x7f0900e7;
public static final int settings_search_20=0x7f0900e8;
public static final int settings_search_25=0x7f0900e9;
public static final int settings_search_250=0x7f0900ef;
public static final int settings_search_3=0x7f0900e4;
public static final int settings_search_30=0x7f0900ea;
public static final int settings_search_40=0x7f0900eb;
public static final int settings_search_5=0x7f0900e5;
public static final int settings_search_50=0x7f0900ec;
public static final int settings_search_500=0x7f0900f0;
public static final int settings_search_75=0x7f0900ed;
public static final int settings_search_history_cleared=0x7f0900b8;
public static final int settings_search_title=0x7f0900ba;
public static final int settings_server_address=0x7f09007e;
public static final int settings_server_name=0x7f09007d;
public static final int settings_server_password=0x7f090080;
public static final int settings_server_scaling_summary=0x7f0900bf;
public static final int settings_server_scaling_title=0x7f0900be;
public static final int settings_server_unused1=0x7f09007a;
public static final int settings_server_unused2=0x7f09007b;
public static final int settings_server_unused3=0x7f09007c;
public static final int settings_server_username=0x7f09007f;
public static final int settings_servers_title=0x7f090079;
public static final int settings_show_lockscreen_controls=0x7f0900de;
public static final int settings_show_lockscreen_controls_summary=0x7f0900df;
public static final int settings_show_notification=0x7f0900da;
public static final int settings_show_notification_always=0x7f0900dc;
public static final int settings_show_notification_always_summary=0x7f0900dd;
public static final int settings_show_notification_summary=0x7f0900db;
public static final int settings_show_track_number=0x7f0900a6;
public static final int settings_show_track_number_summary=0x7f0900a7;
public static final int settings_test_connection_title=0x7f090078;
public static final int settings_testing_connection=0x7f090086;
public static final int settings_testing_ok=0x7f090087;
public static final int settings_testing_unlicensed=0x7f090088;
public static final int settings_theme_dark=0x7f090091;
public static final int settings_theme_fullscreen=0x7f09008e;
public static final int settings_theme_fullscreenlight=0x7f09008f;
public static final int settings_theme_light=0x7f090090;
public static final int settings_theme_title=0x7f09008d;
public static final int settings_title=0x7f090077;
public static final int settings_use_folder_for_album_artist=0x7f0900a4;
public static final int settings_use_folder_for_album_artist_summary=0x7f0900a5;
public static final int settings_use_stream_proxy=0x7f0900e0;
public static final int settings_use_stream_proxy_summary=0x7f0900e1;
public static final int settings_wifi_required_summary=0x7f0900a1;
public static final int settings_wifi_required_title=0x7f0900a0;
public static final int song_details_all=0x7f090073;
public static final int song_details_kbps=0x7f090074;
public static final int util_bytes_format_byte=0x7f090111;
public static final int util_bytes_format_gigabyte=0x7f09010e;
public static final int util_bytes_format_kilobyte=0x7f090110;
public static final int util_bytes_format_megabyte=0x7f09010f;
public static final int widget_initial_text=0x7f09010b;
public static final int widget_sdcard_busy=0x7f09010c;
public static final int widget_sdcard_missing=0x7f09010d;
}
public static final class style {
public static final int Dark=0x7f0b0000;

View File

@ -1,87 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
a:orientation="vertical" a:layout_width="fill_parent" a:layout_height="fill_parent">
<LinearLayout a:id="@+id/main_select_server"
a:orientation="horizontal" a:paddingTop="2dip" a:paddingBottom="2dip"
a:paddingLeft="6dp" a:layout_width="fill_parent" a:layout_height="wrap_content"
a:minHeight="?android:attr/listPreferredItemHeight">
<ImageView a:layout_width="wrap_content" a:layout_height="wrap_content"
a:layout_gravity="center_vertical" a:src="@drawable/ic_menu_select_artist_folder" />
<LinearLayout a:orientation="vertical" a:layout_width="wrap_content"
a:layout_height="fill_parent">
<TextView a:id="@+id/main.select_server_1" a:text="@string/main.select_server"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:layout_marginLeft="10dip" a:layout_marginTop="6dip"
a:textAppearance="?android:attr/textAppearanceLarge" />
<TextView a:id="@+id/main.select_server_2" a:layout_width="fill_parent"
a:layout_height="wrap_content" a:layout_marginLeft="10dip"
a:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
</LinearLayout>
<TextView a:id="@+id/main_songs" a:text="@string/main.songs_title"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceSmall" a:textColor="@color/cyan"
a:gravity="center_vertical" a:paddingLeft="6dp" a:textAllCaps="true"
a:textStyle="bold" />
<TextView a:id="@+id/main_songs_starred" a:text="@string/main.songs_starred"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical"
a:paddingLeft="6dip" a:paddingRight="6dip" a:minHeight="40dip" />
<TextView a:id="@+id/main_albums" a:text="@string/main.albums_title"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceSmall" a:textColor="@color/cyan"
a:gravity="center_vertical" a:paddingLeft="6dp" a:textAllCaps="true"
a:textStyle="bold" />
<TextView a:id="@+id/main_albums_newest" a:text="@string/main.albums_newest"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical"
a:paddingLeft="6dip" a:paddingRight="6dip" a:minHeight="40dip" />
<TextView a:id="@+id/main_albums_recent" a:text="@string/main.albums_recent"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical"
a:paddingLeft="6dip" a:paddingRight="6dip" a:minHeight="40dip" />
<TextView a:id="@+id/main_albums_frequent" a:text="@string/main.albums_frequent"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical"
a:paddingLeft="6dip" a:paddingRight="6dip" a:minHeight="40dip" />
<TextView a:id="@+id/main_albums_highest" a:text="@string/main.albums_highest"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical"
a:paddingLeft="6dip" a:paddingRight="6dip" a:minHeight="40dip" />
<TextView a:id="@+id/main_albums_random" a:text="@string/main.albums_random"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical"
a:paddingLeft="6dip" a:paddingRight="6dip" a:minHeight="40dip" />
<TextView a:id="@+id/main_albums_starred" a:layout_width="fill_parent"
a:layout_height="wrap_content" a:gravity="center_vertical"
a:minHeight="40dip" a:paddingLeft="6dip" a:paddingRight="6dip"
a:text="@string/main.albums_starred" a:textAppearance="?android:attr/textAppearanceMedium" />
<TextView a:id="@+id/main_albums_alphaByName" a:layout_width="fill_parent"
a:layout_height="wrap_content" a:gravity="center_vertical"
a:minHeight="40dip" a:paddingLeft="6dip" a:paddingRight="6dip"
a:text="@string/main.albums_alphaByName" a:textAppearance="?android:attr/textAppearanceMedium" />
<TextView a:id="@+id/main_albums_alphaByArtist" a:layout_width="fill_parent"
a:layout_height="wrap_content" a:gravity="center_vertical"
a:minHeight="40dip" a:paddingLeft="6dip" a:paddingRight="6dip"
a:text="@string/main.albums_alphaByArtist" a:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
a:orientation="vertical" a:layout_width="fill_parent" a:layout_height="fill_parent">
<LinearLayout a:id="@+id/main_select_server"
a:orientation="horizontal" a:paddingTop="2dip" a:paddingBottom="2dip"
a:paddingLeft="6dp" a:layout_width="fill_parent" a:layout_height="wrap_content"
a:minHeight="?android:attr/listPreferredItemHeight">
<ImageView a:layout_width="wrap_content" a:layout_height="wrap_content"
a:layout_gravity="center_vertical" a:src="@drawable/ic_menu_select_artist_folder" />
<LinearLayout a:orientation="vertical" a:layout_width="wrap_content"
a:layout_height="fill_parent">
<TextView a:id="@+id/main.select_server_1" a:text="@string/main.select_server"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:layout_marginLeft="10dip" a:layout_marginTop="6dip"
a:textAppearance="?android:attr/textAppearanceLarge" />
<TextView a:id="@+id/main.select_server_2" a:layout_width="fill_parent"
a:layout_height="wrap_content" a:layout_marginLeft="10dip"
a:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
</LinearLayout>
<TextView a:id="@+id/main_music" a:text="@string/main.music"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceSmall" a:textColor="@color/cyan"
a:gravity="center_vertical" a:paddingLeft="6dp" a:textAllCaps="true"
a:textStyle="bold" />
<TextView a:id="@+id/main_artists_button" a:text="@string/main.artists_title"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical"
a:paddingLeft="6dip" a:paddingRight="6dip" a:minHeight="40dip" />
<TextView a:id="@+id/main_albums_button" a:text="@string/main.albums_title"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical"
a:paddingLeft="6dip" a:paddingRight="6dip" a:minHeight="40dip" />
<TextView a:id="@+id/main_genres_button" a:text="@string/main.genres_title"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical"
a:paddingLeft="6dip" a:paddingRight="6dip" a:minHeight="40dip" />
<TextView a:id="@+id/main_songs" a:text="@string/main.songs_title"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceSmall" a:textColor="@color/cyan"
a:gravity="center_vertical" a:paddingLeft="6dp" a:textAllCaps="true"
a:textStyle="bold" />
<TextView a:id="@+id/main_songs_button" a:text="@string/main.songs_random"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical"
a:paddingLeft="6dip" a:paddingRight="6dip" a:minHeight="40dip" />
<TextView a:id="@+id/main_songs_starred" a:text="@string/main.songs_starred"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical"
a:paddingLeft="6dip" a:paddingRight="6dip" a:minHeight="40dip" />
<TextView a:id="@+id/main_albums" a:text="@string/main.albums_title"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceSmall" a:textColor="@color/cyan"
a:gravity="center_vertical" a:paddingLeft="6dp" a:textAllCaps="true"
a:textStyle="bold" />
<TextView a:id="@+id/main_albums_newest" a:text="@string/main.albums_newest"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical"
a:paddingLeft="6dip" a:paddingRight="6dip" a:minHeight="40dip" />
<TextView a:id="@+id/main_albums_recent" a:text="@string/main.albums_recent"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical"
a:paddingLeft="6dip" a:paddingRight="6dip" a:minHeight="40dip" />
<TextView a:id="@+id/main_albums_frequent" a:text="@string/main.albums_frequent"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical"
a:paddingLeft="6dip" a:paddingRight="6dip" a:minHeight="40dip" />
<TextView a:id="@+id/main_albums_highest" a:text="@string/main.albums_highest"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical"
a:paddingLeft="6dip" a:paddingRight="6dip" a:minHeight="40dip" />
<TextView a:id="@+id/main_albums_random" a:text="@string/main.albums_random"
a:layout_width="fill_parent" a:layout_height="wrap_content"
a:textAppearance="?android:attr/textAppearanceMedium" a:gravity="center_vertical"
a:paddingLeft="6dip" a:paddingRight="6dip" a:minHeight="40dip" />
<TextView a:id="@+id/main_albums_starred" a:layout_width="fill_parent"
a:layout_height="wrap_content" a:gravity="center_vertical"
a:minHeight="40dip" a:paddingLeft="6dip" a:paddingRight="6dip"
a:text="@string/main.albums_starred" a:textAppearance="?android:attr/textAppearanceMedium" />
<TextView a:id="@+id/main_albums_alphaByName" a:layout_width="fill_parent"
a:layout_height="wrap_content" a:gravity="center_vertical"
a:minHeight="40dip" a:paddingLeft="6dip" a:paddingRight="6dip"
a:text="@string/main.albums_alphaByName" a:textAppearance="?android:attr/textAppearanceMedium" />
<TextView a:id="@+id/main_albums_alphaByArtist" a:layout_width="fill_parent"
a:layout_height="wrap_content" a:gravity="center_vertical"
a:minHeight="40dip" a:paddingLeft="6dip" a:paddingRight="6dip"
a:text="@string/main.albums_alphaByArtist" a:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>

View File

@ -35,7 +35,7 @@
a:text="@string/select_album.select"
a:textAppearance="?android:attr/textAppearanceSmall"
a:visibility="gone"
a:layout_marginLeft="6dp"
a:layout_marginLeft="3dp"
a:layout_marginRight="3dp"
a:layout_weight="1"
a:layout_width="0dp"
@ -56,7 +56,7 @@
a:textAppearance="?android:attr/textAppearanceSmall"
a:visibility="gone"
a:layout_marginLeft="3dp"
a:layout_marginRight="6dp"
a:layout_marginRight="3dp"
a:layout_weight="1"
a:layout_width="0dp"
a:layout_height="fill_parent"/>

View File

@ -1,48 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
a:orientation="horizontal"
a:background="@android:color/transparent"
a:paddingTop="6dp"
a:paddingBottom="0dp"
a:layout_width="fill_parent"
a:layout_height="wrap_content">
<Button a:id="@+id/select_album_pin"
a:text="@string/common.pin"
a:textAppearance="?android:attr/textAppearanceSmall"
a:layout_marginLeft="6dp"
a:layout_marginRight="3dp"
a:layout_weight="1"
a:layout_width="0dp"
a:layout_height="fill_parent"/>
<Button a:id="@+id/select_album_unpin"
a:text="@string/common.unpin"
a:textAppearance="?android:attr/textAppearanceSmall"
a:layout_marginLeft="3dp"
a:layout_marginRight="3dp"
a:layout_weight="1"
a:layout_width="0dp"
a:layout_height="fill_parent"/>
<Button a:id="@+id/select_album_delete"
a:text="@string/common.delete"
a:textAppearance="?android:attr/textAppearanceSmall"
a:layout_marginLeft="3dp"
a:layout_marginRight="6dp"
a:layout_weight="1"
a:layout_width="0dp"
a:layout_height="fill_parent"/>
<Button a:id="@+id/select_album_more"
a:text="@string/select_album.more"
a:textAppearance="?android:attr/textAppearanceSmall"
a:visibility="gone"
a:layout_marginLeft="6dp"
a:layout_marginRight="6dp"
a:layout_weight="1"
a:layout_width="0dp"
a:layout_height="fill_parent"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
a:orientation="horizontal"
a:background="@android:color/transparent"
a:paddingTop="6dp"
a:paddingBottom="0dp"
a:layout_width="fill_parent"
a:layout_height="wrap_content">
<Button a:id="@+id/select_album_pin"
a:text="@string/common.pin"
a:textAppearance="?android:attr/textAppearanceSmall"
a:layout_marginLeft="3dp"
a:layout_marginRight="3dp"
a:layout_weight="1"
a:layout_width="0dp"
a:layout_height="fill_parent"/>
<Button a:id="@+id/select_album_unpin"
a:text="@string/common.unpin"
a:textAppearance="?android:attr/textAppearanceSmall"
a:layout_marginLeft="3dp"
a:layout_marginRight="3dp"
a:layout_weight="1"
a:layout_width="0dp"
a:layout_height="fill_parent"/>
<Button a:id="@+id/select_album_delete"
a:text="@string/common.delete"
a:textAppearance="?android:attr/textAppearanceSmall"
a:layout_marginLeft="3dp"
a:layout_marginRight="3dp"
a:layout_weight="1"
a:layout_width="0dp"
a:layout_height="fill_parent"/>
<Button a:id="@+id/select_album_more"
a:text="@string/select_album.more"
a:textAppearance="?android:attr/textAppearanceSmall"
a:visibility="gone"
a:layout_marginLeft="3dp"
a:layout_marginRight="3dp"
a:layout_weight="1"
a:layout_width="0dp"
a:layout_height="fill_parent"/>
</LinearLayout>

View File

@ -1,19 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
a:orientation="vertical"
a:layout_width="fill_parent"
a:layout_height="fill_parent">
<include layout="@layout/tab_progress"/>
<ListView a:id="@+id/select_artist_list"
a:textFilterEnabled="true"
a:fastScrollEnabled="true"
a:layout_width="fill_parent"
a:layout_height="0dip"
a:layout_weight="1.0"/>
<include layout="@layout/button_bar"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
a:orientation="vertical"
a:layout_width="fill_parent"
a:layout_height="fill_parent">
<include layout="@layout/tab_progress"/>
<TextView
a:id="@+id/select_artist_empty"
a:text="@string/select_artist.empty"
a:visibility="gone"
a:layout_width="fill_parent"
a:layout_height="wrap_content"
a:padding="10dip"/>
<ListView a:id="@+id/select_artist_list"
a:textFilterEnabled="true"
a:fastScrollEnabled="true"
a:layout_width="fill_parent"
a:layout_height="0dip"
a:layout_weight="1.0"/>
<include layout="@layout/button_bar"/>
</LinearLayout>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
a:orientation="vertical"
a:layout_width="fill_parent"
a:layout_height="fill_parent">
<include layout="@layout/tab_progress"/>
<TextView
a:id="@+id/select_genre_empty"
a:text="@string/select_genre.empty"
a:visibility="gone"
a:layout_width="fill_parent"
a:layout_height="wrap_content"
a:padding="10dip"/>
<ListView a:id="@+id/select_genre_list"
a:textFilterEnabled="true"
a:fastScrollEnabled="true"
a:layout_width="fill_parent"
a:layout_height="0dip"
a:layout_weight="1.0"/>
<include layout="@layout/button_bar"/>
</LinearLayout>

View File

@ -20,20 +20,27 @@
<string name="main.welcome_title">Welcome!</string>
<string name="main.welcome_text">Welcome to UltraSonic! The app is currently not configured. After you\'ve set up your personal server (available from <b>subsonic.org</b>), please go to <b>Settings</b> and change the configuration to connect to it.</string>
<string name="main.select_server">Select Server</string>
<string name="main.select_genre">Select Genre</string>
<string name="main.select_all_genres">All Genres</string>
<string name="main.shuffle">Shuffle Play</string>
<string name="main.offline">Offline</string>
<string name="main.settings">Settings</string>
<string name="main.artists_title">Artists</string>
<string name="main.genres_title">Genres</string>
<string name="main.albums_title">Albums</string>
<string name="main.albums_newest">Recently Added</string>
<string name="main.albums_recent">Recently Played</string>
<string name="main.albums_frequent">Most Played</string>
<string name="main.albums_highest">Top Rated</string>
<string name="main.albums_random">Random</string>
<string name="main.albums_starred">Starred Albums</string>
<string name="main.albums_starred">Starred</string>
<string name="main.albums_alphaByName">By Name</string>
<string name="main.albums_alphaByArtist">By Artist</string>
<string name="main.songs_title">Songs</string>
<string name="main.songs_starred">Starred Songs</string>
<string name="main.songs_starred">Starred</string>
<string name="main.songs_random">Random</string>
<string name="main.songs_genre">By Genre</string>
<string name="main.music">Music</string>
<string name="menu.exit">Exit</string>
<string name="menu.settings">Settings</string>
<string name="menu.help">Help</string>
@ -73,6 +80,8 @@
<string name="select_album.donate_dialog_now">Now</string>
<string name="select_album.donate_dialog_later">Later</string>
<string name="select_album.donate_dialog_0_trial_days_left">Trial period is over</string>
<string name="select_artist.empty">No artists found</string>
<string name="select_genre.empty">No genres found</string>
<string name="select_playlist.empty">No saved playlists on server</string>
<string name="download.empty">Playlist is empty</string>
<string name="download.playerstate_downloading">Downloading - %s</string>
@ -251,10 +260,10 @@
<string name="parser.upgrade_server">Incompatible versions. Please upgrade Subsonic server.</string>
<string name="parser.not_authenticated">Wrong username or password.</string>
<string name="parser.not_authorized">Not authorized. Check user permissions in Subsonic server.</string>
<string name="parser.artist_count">Got %d artists.</string>
<string name="parser.artist_count">Got %d Artists.</string>
<string name="select_artist.refresh">Refresh</string>
<string name="select_artist.folder">Select folder</string>
<string name="select_artist.all_folders">All folders</string>
<string name="select_artist.folder">Select Folder</string>
<string name="select_artist.all_folders">All Folders</string>
<string name="equalizer.label">Equalizer</string>
<string name="equalizer.enabled">Enabled</string>
<string name="equalizer.preset">Select preset</string>

View File

@ -20,7 +20,6 @@
package com.thejoshwa.ultrasonic.androidapp.activity;
import java.util.Arrays;
import com.thejoshwa.ultrasonic.androidapp.R;
import com.thejoshwa.ultrasonic.androidapp.service.DownloadService;
import com.thejoshwa.ultrasonic.androidapp.service.DownloadServiceImpl;
@ -28,6 +27,7 @@ import com.thejoshwa.ultrasonic.androidapp.util.Constants;
import com.thejoshwa.ultrasonic.androidapp.util.MergeAdapter;
import com.thejoshwa.ultrasonic.androidapp.util.Util;
import com.thejoshwa.ultrasonic.androidapp.util.FileUtil;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
@ -53,7 +53,7 @@ public class MainActivity extends SubsonicTabActivity {
private String theme;
private static boolean infoDialogDisplayed;
/**
* Called when the activity is first created.
*/
@ -74,8 +74,16 @@ public class MainActivity extends SubsonicTabActivity {
final View serverButton = buttons.findViewById(R.id.main_select_server);
final TextView serverTextView = (TextView) serverButton.findViewById(R.id.main_select_server_2);
final View albumsTitle = buttons.findViewById(R.id.main_albums);
final View musicTitle = buttons.findViewById(R.id.main_music);
final View artistsButton = buttons.findViewById(R.id.main_artists_button);
final View albumsButton = buttons.findViewById(R.id.main_albums_button);
final View genresButton = buttons.findViewById(R.id.main_genres_button);
final View songsTitle = buttons.findViewById(R.id.main_songs);
final View randomSongsButton = buttons.findViewById(R.id.main_songs_button);
final View songsStarredButton = buttons.findViewById(R.id.main_songs_starred);
final View albumsTitle = buttons.findViewById(R.id.main_albums);
final View albumsNewestButton = buttons.findViewById(R.id.main_albums_newest);
final View albumsRandomButton = buttons.findViewById(R.id.main_albums_random);
final View albumsHighestButton = buttons.findViewById(R.id.main_albums_highest);
@ -84,8 +92,7 @@ public class MainActivity extends SubsonicTabActivity {
final View albumsFrequentButton = buttons.findViewById(R.id.main_albums_frequent);
final View albumsAlphaByNameButton = buttons.findViewById(R.id.main_albums_alphaByName);
final View albumsAlphaByArtistButton = buttons.findViewById(R.id.main_albums_alphaByArtist);
final View songsStarredButton = buttons.findViewById(R.id.main_songs_starred);
final View dummyView = findViewById(R.id.main_dummy);
int instance = Util.getActiveServer(this);
@ -99,8 +106,10 @@ public class MainActivity extends SubsonicTabActivity {
adapter.addViews(Arrays.asList(serverButton), true);
if (!Util.isOffline(this)) {
adapter.addView(musicTitle, false);
adapter.addViews(Arrays.asList(artistsButton, albumsButton, genresButton), true);
adapter.addView(songsTitle, false);
adapter.addViews(Arrays.asList(songsStarredButton), true);
adapter.addViews(Arrays.asList(randomSongsButton, songsStarredButton), true);
adapter.addView(albumsTitle, false);
adapter.addViews(Arrays.asList(albumsNewestButton, albumsRecentButton, albumsFrequentButton, albumsHighestButton, albumsRandomButton, albumsStarredButton, albumsAlphaByNameButton, albumsAlphaByArtistButton), true);
}
@ -114,23 +123,31 @@ public class MainActivity extends SubsonicTabActivity {
if (view == serverButton) {
dummyView.showContextMenu();
} else if (view == albumsNewestButton) {
showAlbumList("newest");
showAlbumList("newest", R.string.main_albums_newest);
} else if (view == albumsRandomButton) {
showAlbumList("random");
showAlbumList("random", R.string.main_albums_random);
} else if (view == albumsHighestButton) {
showAlbumList("highest");
showAlbumList("highest", R.string.main_albums_highest);
} else if (view == albumsRecentButton) {
showAlbumList("recent");
showAlbumList("recent", R.string.main_albums_recent);
} else if (view == albumsFrequentButton) {
showAlbumList("frequent");
showAlbumList("frequent", R.string.main_albums_frequent);
} else if (view == albumsStarredButton) {
showAlbumList("starred");
showAlbumList("starred", R.string.main_albums_starred);
} else if (view == albumsAlphaByNameButton) {
showAlbumList("alphabeticalByName");
showAlbumList("alphabeticalByName", R.string.main_albums_alphaByName);
} else if (view == albumsAlphaByArtistButton) {
showAlbumList("alphabeticalByArtist");
showAlbumList("alphabeticalByArtist", R.string.main_albums_alphaByArtist);
} else if (view == songsStarredButton) {
showStarredSongs();
} else if (view == artistsButton) {
showArtists();
} else if (view == albumsButton) {
showAlbumList("alphabeticalByName", R.string.main_albums_title);
} else if (view == randomSongsButton) {
showRandomSongs();
} else if (view == genresButton) {
showGenres();
}
}
});
@ -283,9 +300,10 @@ public class MainActivity extends SubsonicTabActivity {
}
}
private void showAlbumList(String type) {
private void showAlbumList(String type, int title) {
Intent intent = new Intent(this, SelectAlbumActivity.class);
intent.putExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TYPE, type);
intent.putExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TITLE, title);
intent.putExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, Util.getMaxAlbums(this));
intent.putExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_OFFSET, 0);
Util.startActivityWithoutTransition(this, intent);
@ -296,4 +314,24 @@ public class MainActivity extends SubsonicTabActivity {
intent.putExtra(Constants.INTENT_EXTRA_NAME_STARRED, 1);
Util.startActivityWithoutTransition(this, intent);
}
private void showRandomSongs() {
Intent intent = new Intent(this, SelectAlbumActivity.class);
intent.putExtra(Constants.INTENT_EXTRA_NAME_RANDOM, 1);
intent.putExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, Util.getMaxSongs(this));
Util.startActivityWithoutTransition(this, intent);
}
private void showArtists() {
Intent intent = new Intent(this, SelectArtistActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TITLE, "Artists");
Util.startActivityWithoutTransition(this, intent);
}
private void showGenres() {
Intent intent = new Intent(this, SelectGenreActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Util.startActivityWithoutTransition(this, intent);
}
}

View File

@ -168,16 +168,23 @@ public class SelectAlbumActivity extends SubsonicTabActivity {
String playlistId = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_PLAYLIST_ID);
String playlistName = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_PLAYLIST_NAME);
String albumListType = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TYPE);
String genreName = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_GENRE_NAME);
int albumListTitle = getIntent().getIntExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TITLE, 0);
int getStarredTracks = getIntent().getIntExtra(Constants.INTENT_EXTRA_NAME_STARRED, 0);
int getRandomTracks = getIntent().getIntExtra(Constants.INTENT_EXTRA_NAME_RANDOM, 0);
int albumListSize = getIntent().getIntExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, 0);
int albumListOffset = getIntent().getIntExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_OFFSET, 0);
if (playlistId != null) {
getPlaylist(playlistId, playlistName);
} else if (albumListType != null) {
getAlbumList(albumListType, albumListSize, albumListOffset);
getAlbumList(albumListType, albumListTitle, albumListSize, albumListOffset);
} else if (genreName != null) {
getSongsForGenre(genreName, albumListSize, albumListOffset);
} else if (getStarredTracks != 0) {
getStarred();
} else if (getRandomTracks != 0) {
getRandom(albumListSize);
} else {
getMusicDirectory(id, name);
}
@ -328,6 +335,44 @@ public class SelectAlbumActivity extends SubsonicTabActivity {
}.execute();
}
private void getSongsForGenre(final String genre, final int count, final int offset) {
setTitle(genre);
new LoadTask() {
@Override
protected MusicDirectory load(MusicService service) throws Exception {
return service.getSongsByGenre(genre, count, offset, SelectAlbumActivity.this, this);
}
@Override
protected void done(Pair<MusicDirectory, Boolean> result) {
// Hide more button when results are less than album list size
if (result.getFirst().getChildren().size() < getIntent().getIntExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, 0)) {
moreButton.setVisibility(View.GONE);
} else {
moreButton.setVisibility(View.VISIBLE);
}
moreButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(SelectAlbumActivity.this, SelectAlbumActivity.class);
String genre = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_GENRE_NAME);
int size = getIntent().getIntExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, 0);
int offset = getIntent().getIntExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_OFFSET, 0) + size;
intent.putExtra(Constants.INTENT_EXTRA_NAME_GENRE_NAME, genre);
intent.putExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, size);
intent.putExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_OFFSET, offset);
Util.startActivityWithoutTransition(SelectAlbumActivity.this, intent);
}
});
super.done(result);
}
}.execute();
}
private void getStarred() {
setTitle(R.string.main_songs_starred);
@ -338,6 +383,17 @@ public class SelectAlbumActivity extends SubsonicTabActivity {
}
}.execute();
}
private void getRandom(final int size) {
setTitle(R.string.main_songs_random);
new LoadTask() {
@Override
protected MusicDirectory load(MusicService service) throws Exception {
return service.getRandomSongs(size, SelectAlbumActivity.this, this);
}
}.execute();
}
private void getPlaylist(final String playlistId, String playlistName) {
setTitle(playlistName);
@ -350,26 +406,10 @@ public class SelectAlbumActivity extends SubsonicTabActivity {
}.execute();
}
private void getAlbumList(final String albumListType, final int size, final int offset) {
private void getAlbumList(final String albumListType, final int albumListTitle, final int size, final int offset) {
showHeader = false;
if ("newest".equals(albumListType)) {
setTitle(R.string.main_albums_newest);
} else if ("random".equals(albumListType)) {
setTitle(R.string.main_albums_random);
} else if ("highest".equals(albumListType)) {
setTitle(R.string.main_albums_highest);
} else if ("recent".equals(albumListType)) {
setTitle(R.string.main_albums_recent);
} else if ("frequent".equals(albumListType)) {
setTitle(R.string.main_albums_frequent);
} else if ("starred".equals(albumListType)) {
setTitle(R.string.main_albums_starred);
} else if ("alphabeticalByName".equals(albumListType)) {
setTitle(R.string.main_albums_alphaByName);
} else if ("alphabeticalByArtist".equals(albumListType)) {
setTitle(R.string.main_albums_alphaByArtist);
}
setTitle(albumListTitle);
new LoadTask() {
@Override

View File

@ -75,7 +75,12 @@ public class SelectArtistActivity extends SubsonicTabActivity implements Adapter
registerForContextMenu(artistList);
setTitle(Util.isOffline(this) ? R.string.music_library_label_offline : R.string.music_library_label);
String title = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TITLE);
if (title == null) {
setTitle(Util.isOffline(this) ? R.string.music_library_label_offline : R.string.music_library_label);
} else {
setTitle(title);
}
musicFolders = null;
load();
@ -94,6 +99,8 @@ public class SelectArtistActivity extends SubsonicTabActivity implements Adapter
private void refresh() {
finish();
Intent intent = getIntent();
String title = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TITLE);
intent.putExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TITLE, title);
intent.putExtra(Constants.INTENT_EXTRA_NAME_REFRESH, true);
Util.startActivityWithoutTransition(this, intent);
}

View File

@ -0,0 +1,161 @@
/*
This file is part of Subsonic.
Subsonic is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Subsonic is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
Copyright 2009 (C) Sindre Mehus
*/
package com.thejoshwa.ultrasonic.androidapp.activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import com.thejoshwa.ultrasonic.androidapp.R;
import com.thejoshwa.ultrasonic.androidapp.domain.Genre;
import com.thejoshwa.ultrasonic.androidapp.service.MusicService;
import com.thejoshwa.ultrasonic.androidapp.service.MusicServiceFactory;
import com.thejoshwa.ultrasonic.androidapp.util.BackgroundTask;
import com.thejoshwa.ultrasonic.androidapp.util.Constants;
import com.thejoshwa.ultrasonic.androidapp.util.GenreAdapter;
import com.thejoshwa.ultrasonic.androidapp.util.TabActivityBackgroundTask;
import com.thejoshwa.ultrasonic.androidapp.util.Util;
import java.util.ArrayList;
import java.util.List;
public class SelectGenreActivity extends SubsonicTabActivity implements AdapterView.OnItemClickListener {
private static final String TAG = SelectGenreActivity.class.getSimpleName();
private ListView genreList;
private View emptyView;
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.select_genre);
genreList = (ListView) findViewById(R.id.select_genre_list);
genreList.setOnItemClickListener(this);
genreList.setOnTouchListener(gestureListener);
emptyView = findViewById(R.id.select_genre_empty);
registerForContextMenu(genreList);
setTitle(R.string.main_genres_title);
load();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
inflater.inflate(R.menu.select_common, menu);
super.onCreateOptionsMenu(menu);
return true;
}
private void refresh() {
finish();
Intent intent = getIntent();
intent.putExtra(Constants.INTENT_EXTRA_NAME_REFRESH, true);
Util.startActivityWithoutTransition(this, intent);
}
private void load() {
BackgroundTask<List<Genre>> task = new TabActivityBackgroundTask<List<Genre>>(this) {
@Override
protected List<Genre> doInBackground() throws Throwable {
MusicService musicService = MusicServiceFactory.getMusicService(SelectGenreActivity.this);
List<Genre> genres = new ArrayList<Genre>();
try {
genres = musicService.getGenres(SelectGenreActivity.this, this);
} catch (Exception x) {
Log.e(TAG, "Failed to load genres", x);
}
return genres;
}
@Override
protected void done(List<Genre> result) {
emptyView.setVisibility(result == null || result.isEmpty() ? View.VISIBLE : View.GONE);
if (result != null) {
genreList.setAdapter(new GenreAdapter(SelectGenreActivity.this, result));
}
}
};
task.execute();
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Genre genre = (Genre) parent.getItemAtPosition(position);
Intent intent = new Intent(this, SelectAlbumActivity.class);
intent.putExtra(Constants.INTENT_EXTRA_NAME_GENRE_NAME, genre.getName());
intent.putExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, Util.getMaxSongs(this));
intent.putExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_OFFSET, 0);
Util.startActivityWithoutTransition(this, intent);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_refresh:
refresh();
return true;
case R.id.main_shuffle:
Intent intent = new Intent(this, DownloadActivity.class);
intent.putExtra(Constants.INTENT_EXTRA_NAME_SHUFFLE, true);
Util.startActivityWithoutTransition(this, intent);
return true;
case R.id.menu_exit:
Intent intent1 = new Intent(this, MainActivity.class);
intent1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent1.putExtra(Constants.INTENT_EXTRA_NAME_EXIT, true);
Util.startActivityWithoutTransition(this, intent1);
return true;
case R.id.menu_settings:
startActivity(new Intent(this, SettingsActivity.class));
return true;
case R.id.menu_help:
startActivity(new Intent(this, HelpActivity.class));
return true;
}
return false;
}
}

View File

@ -445,7 +445,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener{
Intent intent = new Intent(SubsonicTabActivity.this, DownloadActivity.class);
SubsonicTabActivity.this.startActivity(intent);
}
else if (name.equalsIgnoreCase("SelectArtistActivity") || name.equalsIgnoreCase("SelectAlbumActivity"))
else if (name.equalsIgnoreCase("SelectArtistActivity") || name.equalsIgnoreCase("SelectAlbumActivity") || name.equalsIgnoreCase("SelectGenreActivity"))
{
Intent intent = new Intent(SubsonicTabActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
@ -478,7 +478,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener{
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
SubsonicTabActivity.this.startActivity(intent);
}
if (name.equalsIgnoreCase("SelectArtistActivity") || name.equalsIgnoreCase("SelectAlbumActivity"))
if (name.equalsIgnoreCase("SelectArtistActivity") || name.equalsIgnoreCase("SelectAlbumActivity") || name.equalsIgnoreCase("SelectGenreActivity"))
{
Intent intent = new Intent(SubsonicTabActivity.this, SearchActivity.class);
intent.putExtra(Constants.INTENT_EXTRA_REQUEST_SEARCH, true);

View File

@ -0,0 +1,33 @@
package com.thejoshwa.ultrasonic.androidapp.domain;
import java.io.Serializable;
public class Genre implements Serializable {
/**
*
*/
private static final long serialVersionUID = -3943025175219134028L;
private String name;
private String index;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIndex() {
return index;
}
public void setIndex(String index) {
this.index = index;
}
@Override
public String toString() {
return name;
}
}

View File

@ -25,6 +25,8 @@ import org.apache.http.HttpResponse;
import android.content.Context;
import android.graphics.Bitmap;
import com.thejoshwa.ultrasonic.androidapp.domain.Genre;
import com.thejoshwa.ultrasonic.androidapp.domain.Indexes;
import com.thejoshwa.ultrasonic.androidapp.domain.JukeboxStatus;
import com.thejoshwa.ultrasonic.androidapp.domain.Lyrics;
@ -54,6 +56,7 @@ public class CachedMusicService implements MusicService {
private final TimeLimitedCache<Indexes> cachedIndexes = new TimeLimitedCache<Indexes>(60 * 60, TimeUnit.SECONDS);
private final TimeLimitedCache<List<Playlist>> cachedPlaylists = new TimeLimitedCache<List<Playlist>>(60, TimeUnit.SECONDS);
private final TimeLimitedCache<List<MusicFolder>> cachedMusicFolders = new TimeLimitedCache<List<MusicFolder>>(10 * 3600, TimeUnit.SECONDS);
private final TimeLimitedCache<List<Genre>> cachedGenres = new TimeLimitedCache<List<Genre>>(10 * 3600, TimeUnit.SECONDS);
private String restUrl;
public CachedMusicService(MusicService musicService) {
@ -247,4 +250,20 @@ public class CachedMusicService implements MusicService {
public void unstar(String id, Context context, ProgressListener progressListener) throws Exception {
musicService.unstar(id, context, progressListener);
}
@Override
public List<Genre> getGenres(Context context, ProgressListener progressListener) throws Exception {
checkSettingsChanged(context);
List<Genre> result = cachedGenres.get();
if (result == null) {
result = musicService.getGenres(context, progressListener);
cachedGenres.set(result);
}
return result;
}
@Override
public MusicDirectory getSongsByGenre(String genre, int count, int offset, Context context, ProgressListener progressListener) throws Exception {
return musicService.getSongsByGenre(genre, count, offset, context, progressListener);
}
}

View File

@ -1102,27 +1102,26 @@ public class DownloadServiceImpl extends Service implements DownloadService {
private final File partialFile;
public BufferTask(DownloadFile downloadFile, int position) {
this.downloadFile = downloadFile;
this.position = position;
partialFile = downloadFile.getPartialFile();
this.downloadFile = downloadFile;
this.position = position;
partialFile = downloadFile.getPartialFile();
int bufferLength = downloadFile.getBufferLength();
int bufferLength = downloadFile.getBufferLength();
// Calculate roughly how many bytes buffer length corresponds to.
int bitRate = downloadFile.getBitRate();
long byteCount = Math.max(100000, bitRate * 1024 / 8 * bufferLength);
// Calculate roughly how many bytes buffer length corresponds to.
int bitRate = downloadFile.getBitRate();
long byteCount = Math.max(100000, bitRate * 1024 / 8 * bufferLength);
// Find out how large the file should grow before resuming playback.
if (position == 0) {
expectedFileSize = byteCount;
} else {
expectedFileSize = partialFile.length() + byteCount;
}
// Find out how large the file should grow before resuming playback.
if (position == 0) {
expectedFileSize = byteCount;
} else {
expectedFileSize = partialFile.length() + byteCount;
}
}
@Override
public void execute() {
if (!downloadFile.isOffline() && !getIsCompleteFileAvailable(downloadFile)) {
if (!getIsCompleteFileAvailable(downloadFile)) {
setPlayerState(DOWNLOADING);
while (!bufferComplete()) {
@ -1131,6 +1130,7 @@ public class DownloadServiceImpl extends Service implements DownloadService {
return;
}
}
}
doPlay(downloadFile, position, true);
@ -1148,18 +1148,18 @@ public class DownloadServiceImpl extends Service implements DownloadService {
}
private boolean bufferComplete() {
if (!downloadFile.isOffline() && getIsCompleteFileAvailable(downloadFile)) {
if (!getIsCompleteFileAvailable(downloadFile)) {
long size = partialFile.length();
if (size >= expectedFileSize) {
Log.i(TAG, "Buffering complete: " + partialFile + " (" + size + "/" + expectedFileSize + ")");
Log.i(TAG, "Buffering complete: " + partialFile + " ("
+ size + "/" + expectedFileSize + ")");
return true;
}
Log.i(TAG, "Buffering incomplete: " + partialFile + " (" + size + "/" + expectedFileSize + ")");
Log.i(TAG, "Buffering incomplete: " + partialFile + " (" + size
+ "/" + expectedFileSize + ")");
return false;
} else {
Log.i(TAG, "Buffering complete: " + partialFile);
return true;
}
}

View File

@ -24,6 +24,8 @@ import org.apache.http.HttpResponse;
import android.content.Context;
import android.graphics.Bitmap;
import com.thejoshwa.ultrasonic.androidapp.domain.Genre;
import com.thejoshwa.ultrasonic.androidapp.domain.Indexes;
import com.thejoshwa.ultrasonic.androidapp.domain.JukeboxStatus;
import com.thejoshwa.ultrasonic.androidapp.domain.Lyrics;
@ -47,6 +49,8 @@ public interface MusicService {
List<MusicFolder> getMusicFolders(Context context, ProgressListener progressListener) throws Exception;
List<Genre> getGenres(Context context, ProgressListener progressListener) throws Exception;
void star(String id, Context context, ProgressListener progressListener) throws Exception;
void unstar(String id, Context context, ProgressListener progressListener) throws Exception;
@ -71,6 +75,8 @@ public interface MusicService {
MusicDirectory getRandomSongs(int size, Context context, ProgressListener progressListener) throws Exception;
MusicDirectory getSongsByGenre(String genre, int count, int offset, Context context, ProgressListener progressListener) throws Exception;
SearchResult getStarred(Context context, ProgressListener progressListener) throws Exception;
Bitmap getCoverArt(Context context, MusicDirectory.Entry entry, int size, boolean saveToFile, ProgressListener progressListener) throws Exception;

View File

@ -36,6 +36,7 @@ import android.graphics.BitmapFactory;
import android.media.MediaMetadataRetriever;
import android.util.Log;
import com.thejoshwa.ultrasonic.androidapp.domain.Artist;
import com.thejoshwa.ultrasonic.androidapp.domain.Genre;
import com.thejoshwa.ultrasonic.androidapp.domain.Indexes;
import com.thejoshwa.ultrasonic.androidapp.domain.JukeboxStatus;
import com.thejoshwa.ultrasonic.androidapp.domain.Lyrics;
@ -371,6 +372,16 @@ public class OfflineMusicService extends RESTMusicService {
return result;
}
@Override
public MusicDirectory getSongsByGenre(String genre, int count, int offset, Context context, ProgressListener progressListener) throws Exception {
throw new OfflineException("Getting Songs By Genre not available in offline mode");
}
@Override
public List<Genre> getGenres(Context context, ProgressListener progressListener) throws Exception {
throw new OfflineException("Getting Genres not available in offline mode");
}
private void listFilesRecursively(File parent, List<File> children) {
for (File file : FileUtil.listMusicFiles(parent)) {

View File

@ -70,6 +70,7 @@ import android.net.NetworkInfo;
import android.util.Log;
import android.util.Xml;
import com.thejoshwa.ultrasonic.androidapp.R;
import com.thejoshwa.ultrasonic.androidapp.domain.Genre;
import com.thejoshwa.ultrasonic.androidapp.domain.Indexes;
import com.thejoshwa.ultrasonic.androidapp.domain.JukeboxStatus;
import com.thejoshwa.ultrasonic.androidapp.domain.Lyrics;
@ -82,6 +83,7 @@ import com.thejoshwa.ultrasonic.androidapp.domain.ServerInfo;
import com.thejoshwa.ultrasonic.androidapp.domain.Version;
import com.thejoshwa.ultrasonic.androidapp.service.parser.AlbumListParser;
import com.thejoshwa.ultrasonic.androidapp.service.parser.ErrorParser;
import com.thejoshwa.ultrasonic.androidapp.service.parser.GenreParser;
import com.thejoshwa.ultrasonic.androidapp.service.parser.IndexesParser;
import com.thejoshwa.ultrasonic.androidapp.service.parser.JukeboxStatusParser;
import com.thejoshwa.ultrasonic.androidapp.service.parser.LicenseParser;
@ -797,4 +799,40 @@ public class RESTMusicService implements MusicService {
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
return networkInfo == null ? -1 : networkInfo.getType();
}
@Override
public List<Genre> getGenres(Context context, ProgressListener progressListener) throws Exception {
checkServerVersion(context, "1.9", "Genres not supported.");
Reader reader = getReader(context, progressListener, "getGenres", null);
try {
return new GenreParser(context).parse(reader, progressListener);
} finally {
Util.close(reader);
}
}
@Override
public MusicDirectory getSongsByGenre(String genre, int count, int offset, Context context, ProgressListener progressListener) throws Exception {
checkServerVersion(context, "1.9", "Genres not supported.");
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setSoTimeout(params, SOCKET_READ_TIMEOUT_GET_RANDOM_SONGS);
List<String> parameterNames = new ArrayList<String>();
List<Object> parameterValues = new ArrayList<Object>();
parameterNames.add("genre");
parameterValues.add(genre);
parameterNames.add("count");
parameterValues.add(count);
parameterNames.add("offset");
parameterValues.add(offset);
Reader reader = getReader(context, progressListener, "getSongsByGenre", params, parameterNames, parameterValues);
try {
return new RandomSongsParser(context).parse(reader, progressListener);
} finally {
Util.close(reader);
}
}
}

View File

@ -0,0 +1,119 @@
/*
This file is part of Subsonic.
Subsonic is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Subsonic is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
Copyright 2010 (C) Sindre Mehus
*/
package com.thejoshwa.ultrasonic.androidapp.service.parser;
import android.content.Context;
import android.util.Log;
import com.thejoshwa.ultrasonic.androidapp.R;
import com.thejoshwa.ultrasonic.androidapp.domain.Genre;
import com.thejoshwa.ultrasonic.androidapp.util.ProgressListener;
import org.xmlpull.v1.XmlPullParser;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.List;
/**
* @author Joshua Bahnsen
*/
public class GenreParser extends AbstractParser {
private static final String TAG = GenreParser.class.getSimpleName();
public GenreParser(Context context) {
super(context);
}
public List<Genre> parse(Reader reader, ProgressListener progressListener) throws Exception {
updateProgress(progressListener, R.string.parser_reading);
List<Genre> result = new ArrayList<Genre>();
StringReader sr = null;
try {
BufferedReader br = new BufferedReader(reader);
String xml = null;
String line = null;
while ((line = br.readLine()) != null) {
if (xml == null) {
xml = line;
} else {
xml += line;
}
}
br.close();
// Replace unescaped ampersand
xml = xml.replaceAll("&(?!amp;|lt;|gt;|#37;)", "&amp;");
// Replace unescaped percent symbol
// No replacements for <> at this time
xml = xml.replaceAll("%", "&#37;");
sr = new StringReader(xml);
} catch (IOException ioe) {
Log.e(TAG, "Error parsing Genre XML", ioe);
}
if (sr == null) {
Log.w(TAG, "Unable to parse Genre XML, returning empty list");
return result;
}
init(sr);
Genre genre = null;
int eventType;
do {
eventType = nextParseEvent();
if (eventType == XmlPullParser.START_TAG) {
String name = getElementName();
if ("genre".equals(name)) {
genre = new Genre();
} else if ("error".equals(name)) {
handleError();
} else {
genre = null;
}
} else if (eventType == XmlPullParser.TEXT) {
if (genre != null) {
String value = getText();
if (genre != null) {
genre.setName(value);
genre.setIndex(value.substring(0, 1));
result.add(genre);
genre = null;
}
}
}
} while (eventType != XmlPullParser.END_DOCUMENT);
validate();
updateProgress(progressListener, R.string.parser_reading_done);
return result;
}
}

View File

@ -0,0 +1,77 @@
/*
This file is part of Subsonic.
Subsonic is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Subsonic is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
Copyright 2010 (C) Sindre Mehus
*/
package com.thejoshwa.ultrasonic.androidapp.util;
import com.thejoshwa.ultrasonic.androidapp.domain.Genre;
import com.thejoshwa.ultrasonic.androidapp.R;
import android.widget.ArrayAdapter;
import android.widget.SectionIndexer;
import android.content.Context;
import java.util.List;
import java.util.Set;
import java.util.LinkedHashSet;
import java.util.ArrayList;
/**
* @author Sindre Mehus
*/
public class GenreAdapter extends ArrayAdapter<Genre> implements SectionIndexer {
// Both arrays are indexed by section ID.
private final Object[] sections;
private final Integer[] positions;
public GenreAdapter(Context context, List<Genre> genres) {
super(context, R.layout.artist_list_item, genres);
Set<String> sectionSet = new LinkedHashSet<String>(30);
List<Integer> positionList = new ArrayList<Integer>(30);
for (int i = 0; i < genres.size(); i++) {
Genre genre = genres.get(i);
String index = genre.getIndex();
if (!sectionSet.contains(index)) {
sectionSet.add(index);
positionList.add(i);
}
}
sections = sectionSet.toArray(new Object[sectionSet.size()]);
positions = positionList.toArray(new Integer[positionList.size()]);
}
@Override
public Object[] getSections() {
return sections;
}
@Override
public int getPositionForSection(int section) {
return positions[section];
}
@Override
public int getSectionForPosition(int pos) {
for (int i = 0; i < sections.length - 1; i++) {
if (pos < positions[i + 1]) {
return i;
}
}
return sections.length - 1;
}
}