Bookmarks and disc sort

Added bookmarks
Added Jukebox by default server option
Added option to clear playlist and completion of playlist playback
Added option to sort by disc and track
Moved remove all and save playlist to a new row of buttons
Moved download status text to ActionBar subtitle
Added opaque background for visualizer
This commit is contained in:
Joshua Bahnsen 2013-05-29 01:21:09 -07:00
parent ecb660f766
commit 5483cf16dc
50 changed files with 2601 additions and 1739 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="24"
a:versionName="1.1.0.20" >
a:versionCode="26"
a:versionName="1.1.0.22" >
<uses-permission a:name="android.permission.INTERNET" />
<uses-permission a:name="android.permission.READ_PHONE_STATE" />
@ -55,6 +55,9 @@
a:configChanges="orientation|keyboardHidden"
a:label="@string/playlist.label"
a:launchMode="standard" />
<activity
a:name=".activity.BookmarkActivity"
a:configChanges="orientation|keyboardHidden" />
<activity
a:name=".activity.ChatActivity"
a:configChanges="orientation|keyboardHidden" />

View File

@ -44,14 +44,14 @@ public final class R {
public static final class drawable {
public static final int default_ptr_flip = 0x7f02000e;
public static final int default_ptr_rotate = 0x7f02000f;
public static final int indicator_arrow = 0x7f02004a;
public static final int indicator_bg_bottom = 0x7f02004b;
public static final int indicator_bg_top = 0x7f02004c;
public static final int indicator_arrow = 0x7f02004c;
public static final int indicator_bg_bottom = 0x7f02004d;
public static final int indicator_bg_top = 0x7f02004e;
}
public static final class id {
public static final int both = 0x7f060003;
public static final int disabled = 0x7f060000;
public static final int fl_inner = 0x7f06008a;
public static final int fl_inner = 0x7f06008e;
public static final int flip = 0x7f060008;
public static final int gridview = 0x7f060009;
public static final int manualOnly = 0x7f060004;
@ -59,17 +59,17 @@ public final class R {
public static final int pullFromEnd = 0x7f060002;
public static final int pullFromStart = 0x7f060001;
public static final int pullUpFromBottom = 0x7f060006;
public static final int pull_to_refresh_image = 0x7f06008b;
public static final int pull_to_refresh_progress = 0x7f06008c;
public static final int pull_to_refresh_sub_text = 0x7f06008e;
public static final int pull_to_refresh_text = 0x7f06008d;
public static final int pull_to_refresh_image = 0x7f06008f;
public static final int pull_to_refresh_progress = 0x7f060090;
public static final int pull_to_refresh_sub_text = 0x7f060092;
public static final int pull_to_refresh_text = 0x7f060091;
public static final int rotate = 0x7f060007;
public static final int scrollview = 0x7f06000b;
public static final int webview = 0x7f06000a;
}
public static final class layout {
public static final int pull_to_refresh_header_horizontal = 0x7f03001f;
public static final int pull_to_refresh_header_vertical = 0x7f030020;
public static final int pull_to_refresh_header_horizontal = 0x7f030020;
public static final int pull_to_refresh_header_vertical = 0x7f030021;
}
public static final class string {
public static final int pull_to_refresh_from_bottom_pull_label = 0x7f080003;

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -16,33 +16,32 @@
a:layout_height="fill_parent"
a:layout_alignParentRight="true" >
<LinearLayout
a:id="@+id/linearLayout2"
a:layout_width="wrap_content"
a:layout_height="wrap_content"
a:layout_alignParentTop="true"
a:layout_centerHorizontal="true"
a:orientation="vertical"
a:paddingBottom="8dip"
a:paddingTop="8dip" >
<include layout="@layout/download_buttons" />
</LinearLayout>
<LinearLayout
a:id="@+id/linearLayout1"
a:layout_width="wrap_content"
a:layout_height="wrap_content"
a:layout_alignParentBottom="true"
a:layout_alignParentLeft="true"
a:orientation="horizontal"
a:paddingBottom="12dip"
a:paddingTop="12dip" >
<include layout="@layout/media_buttons" />
a:orientation="vertical"
a:paddingBottom="8dip"
a:paddingTop="8dip" >
<include layout="@layout/media_buttons" />
</LinearLayout>
<TextView
a:id="@+id/download_status"
a:layout_width="wrap_content"
a:layout_height="wrap_content"
a:layout_centerHorizontal="true"
a:layout_alignParentBottom="true"
a:layout_marginBottom="8dip"
a:ellipsize="end"
a:gravity="center_horizontal"
a:singleLine="true"
a:textAppearance="?android:attr/textAppearanceSmall" />
</RelativeLayout>
<com.thejoshwa.ultrasonic.androidapp.util.MyViewFlipper
@ -73,6 +72,7 @@
a:layout_gravity="bottom|center_horizontal"
a:layout_marginLeft="60dip"
a:layout_marginRight="60dip"
a:background="@color/translucent"
a:orientation="vertical" />
</FrameLayout>

View File

@ -4,6 +4,8 @@
a:layout_height="fill_parent"
a:orientation="vertical" >
<include layout="@layout/download_buttons" />
<com.thejoshwa.ultrasonic.androidapp.util.MyViewFlipper
a:id="@+id/download_playlist_flipper"
a:layout_width="fill_parent"
@ -26,22 +28,13 @@
a:layout_centerHorizontal="true"
a:scaleType="fitCenter" />
<TextView
a:id="@+id/download_status"
a:layout_width="wrap_content"
a:layout_height="wrap_content"
a:layout_alignParentBottom="true"
a:layout_centerHorizontal="true"
a:ellipsize="end"
a:singleLine="true"
a:textAppearance="?android:attr/textAppearanceSmall" />
<LinearLayout
a:id="@+id/download_visualizer_view_layout"
a:layout_width="fill_parent"
a:layout_height="60dip"
a:layout_alignParentBottom="true"
a:layout_gravity="center_horizontal"
a:background="@color/translucent"
a:layout_marginLeft="80dip"
a:layout_marginRight="80dip"
a:orientation="vertical" />

View File

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
a:layout_width="fill_parent"
a:layout_height="wrap_content"
a:orientation="horizontal"
a:paddingBottom="8dip"
a:paddingTop="8dip" >
<ImageButton
a:id="@+id/download_toggle_list"
a:layout_width="0dip"
a:layout_height="wrap_content"
a:layout_weight="1"
a:background="@color/transparent"
a:src="?attr/media_toggle" />
<ImageButton
a:id="@+id/download_bookmark"
a:layout_width="0dip"
a:layout_height="wrap_content"
a:layout_weight="1"
a:background="@color/transparent"
a:src="?attr/bookmark" />
<ImageButton
a:id="@+id/download_remove_all"
a:layout_width="0dip"
a:layout_height="wrap_content"
a:layout_weight="1"
a:background="@color/transparent"
a:src="?attr/remove_all" />
<ImageButton
a:id="@+id/download_save_playlist"
a:layout_width="0dip"
a:layout_height="wrap_content"
a:layout_weight="1"
a:background="@color/transparent"
a:src="?attr/save" />
<ImageButton
a:id="@+id/download_star"
a:layout_width="0dip"
a:layout_height="wrap_content"
a:layout_weight="1"
a:background="@color/transparent"
a:src="?attr/star_hollow" />
</LinearLayout>

View File

@ -3,16 +3,8 @@
a:orientation="horizontal"
a:layout_width="fill_parent"
a:layout_height="wrap_content"
a:paddingBottom="12dip"
a:paddingTop="12dip" >
<ImageView
a:id="@+id/download_toggle_list"
a:layout_width="0dip"
a:layout_height="wrap_content"
a:layout_weight="1"
a:focusable="true"
a:src="?attr/media_toggle" />
a:paddingBottom="8dip"
a:paddingTop="8dip" >
<ImageView
a:id="@+id/download_shuffle"
@ -70,12 +62,4 @@
a:focusable="true"
a:src="?attr/media_repeat_off" />
<ImageView
a:id="@+id/download_star"
a:layout_width="0dip"
a:layout_height="wrap_content"
a:layout_weight="1"
a:focusable="true"
a:src="?attr/star_hollow" />
</LinearLayout>

View File

@ -48,6 +48,14 @@
android:drawableLeft="?attr/playlists"
android:text="@string/button_bar.playlists" />
<TextView
android:id="@+id/menu_bookmarks"
style="@style/MenuDrawer.Widget.Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="?attr/bookmark"
android:text="@string/button_bar.bookmarks" />
<TextView
android:id="@+id/menu_chat"
style="@style/MenuDrawer.Widget.Title"

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
a:layout_width="0dip"
a:layout_height="wrap_content"
a:layout_gravity="center_vertical"
a:layout_weight="1"
a:orientation="vertical" >
<LinearLayout
a:layout_width="fill_parent"
a:layout_height="wrap_content"
a:layout_gravity="center_vertical"
a:orientation="horizontal" >
<TextView
a:id="@+id/song_track"
a:layout_width="wrap_content"
a:layout_height="wrap_content"
a:layout_gravity="left|center_vertical"
a:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
a:id="@+id/song_title"
a:layout_width="0dip"
a:layout_height="wrap_content"
a:layout_gravity="left|center_vertical"
a:layout_weight="1"
a:drawablePadding="6dip"
a:ellipsize="marquee"
a:paddingLeft="4dip"
a:paddingRight="6dip"
a:singleLine="true"
a:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
a:id="@+id/song_status"
a:layout_width="wrap_content"
a:layout_height="wrap_content"
a:layout_gravity="right|center_vertical"
a:drawablePadding="1dip"
a:paddingRight="6dip" />
</LinearLayout>
<LinearLayout
a:layout_width="fill_parent"
a:layout_height="wrap_content"
a:layout_gravity="center_vertical"
a:orientation="horizontal" >
<TextView
a:id="@+id/song_artist"
a:layout_width="0dip"
a:layout_height="wrap_content"
a:layout_gravity="left|center_vertical"
a:layout_weight="1"
a:ellipsize="middle"
a:paddingLeft="4dip"
a:singleLine="true"
a:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
a:id="@+id/song_duration"
a:layout_width="wrap_content"
a:layout_height="wrap_content"
a:layout_gravity="right|center_vertical"
a:paddingLeft="3dip"
a:paddingRight="9dip"
a:singleLine="true"
a:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
</LinearLayout>

View File

@ -13,76 +13,7 @@
a:gravity="center_vertical"
a:paddingLeft="1dip" />
<LinearLayout
a:layout_width="0dip"
a:layout_height="wrap_content"
a:layout_gravity="center_vertical"
a:layout_weight="1"
a:orientation="vertical" >
<LinearLayout
a:layout_width="fill_parent"
a:layout_height="wrap_content"
a:layout_gravity="center_vertical"
a:orientation="horizontal" >
<TextView
a:id="@+id/song_track"
a:layout_width="wrap_content"
a:layout_height="wrap_content"
a:layout_gravity="left|center_vertical"
a:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
a:id="@+id/song_title"
a:layout_width="0dip"
a:layout_height="wrap_content"
a:layout_gravity="left|center_vertical"
a:layout_weight="1"
a:drawablePadding="6dip"
a:ellipsize="marquee"
a:paddingLeft="4dip"
a:paddingRight="6dip"
a:singleLine="true"
a:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
a:id="@+id/song_status"
a:layout_width="wrap_content"
a:layout_height="wrap_content"
a:layout_gravity="right|center_vertical"
a:drawablePadding="1dip"
a:paddingRight="6dip" />
</LinearLayout>
<LinearLayout
a:layout_width="fill_parent"
a:layout_height="wrap_content"
a:layout_gravity="center_vertical"
a:orientation="horizontal" >
<TextView
a:id="@+id/song_artist"
a:layout_width="0dip"
a:layout_height="wrap_content"
a:layout_gravity="left|center_vertical"
a:layout_weight="1"
a:ellipsize="middle"
a:paddingLeft="4dip"
a:singleLine="true"
a:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
a:id="@+id/song_duration"
a:layout_width="wrap_content"
a:layout_height="wrap_content"
a:layout_gravity="right|center_vertical"
a:paddingLeft="3dip"
a:paddingRight="9dip"
a:singleLine="true"
a:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
</LinearLayout>
<include layout="@layout/song_details" />
<ImageView
a:id="@+id/song_star"

View File

@ -12,15 +12,7 @@
<item
a:id="@+id/download_jukebox"
a:showAsAction="ifRoom|withText"
a:title="@string/download.menu_jukebox"/>
<item
a:id="@+id/menu_save_playlist"
a:icon="?attr/save"
a:title="@string/download.menu_save"/>
<item
a:id="@+id/menu_remove_all"
a:icon="?attr/remove_all"
a:title="@string/download.menu_remove_all"/>
a:title="@string/download.menu_jukebox_on"/>
<item
a:id="@+id/menu_screen_on_off"
a:icon="?attr/screen_on_off"

View File

@ -10,14 +10,8 @@
<item
a:id="@+id/menu_remove"
a:title="@string/download.menu_remove"/>
<item
a:id="@+id/menu_remove_all"
a:title="@string/download.menu_remove_all"/>
<item
a:id="@+id/menu_shuffle"
a:title="@string/download.menu_shuffle"/>
<item
a:id="@+id/menu_save_playlist"
a:title="@string/download.menu_save"/>
</menu>

View File

@ -1,289 +1,344 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="common.appname">UltraSonic</string>
<string name="common.ok">OK</string>
<string name="common.save">Enregistrer</string>
<string name="common.cancel">Annuler</string>
<string name="common.play_now">Jouer maintenant</string>
<string name="common.play_next">Jouer à la suite</string>
<string name="common.play_last">Jouer en dernier</string>
<string name="common.pin">Épingler</string>
<string name="common.unpin">Détacher</string>
<string name="common.delete">Supprimer</string>
<string name="common.various_artists">Artistes divers</string>
<string name="common.multiple_genres">Genres multiples</string>
<string name="button_bar.home">Accueil Ultrasonic</string>
<string name="background_task.loading">Chargement&#8230;</string>
<string name="background_task.network_error">Une erreur réseau est survenue. Veuillez vérifier l\'adresse du serveur ou réessayer plus tard.</string>
<string name="background_task.no_network">Cette application requiert un accès au réseau. Veuillez activer le Wi-Fi ou le réseau mobile.</string>
<string name="background_task.not_found">Ressources introuvables. Veuillez vérifier l\'adresse du serveur.</string>
<string name="background_task.parse_error">Réponse incorrecte. Veuillez vérifier l\'adresse du serveur.</string>
<string name="background_task.wait">Veuillez patienter&#8230;</string>
<string name="button_bar.bookmarks">Bookmarks</string>
<string name="button_bar.browse">Bibliothèque musicale</string>
<string name="button_bar.search">Recherche</string>
<string name="button_bar.playlists">Playlists</string>
<string name="button_bar.now_playing">Lecture en cours</string>
<string name="button_bar.chat">Clavardage</string>
<string name="main.welcome_title">Bienvenue!</string>
<string name="main.welcome_text">Bienvenue dans UltraSonic ! L\'application n\'est pas configurée. Après avoir configuré votre serveur personnel (disponible à partir de <b>subsonic.org</b>), veuillez accéder aux <b>Paramètres</b> et modifier la configuration pour vous y connecter.</string>
<string name="main.select_server">Sélectionner un serveur</string>
<string name="main.select_genre">Sélectionner le genre</string>
<string name="main.select_all_genres">Tous les genres</string>
<string name="main.shuffle">Lecture aléatoire</string>
<string name="main.offline">Hors-ligne</string>
<string name="main.settings">Paramètres</string>
<string name="main.artists_title">Artistes</string>
<string name="main.genres_title">Genres</string>
<string name="main.albums_title">Albums</string>
<string name="main.albums_newest">Plus récents</string>
<string name="main.albums_recent">Récemment écoutés</string>
<string name="main.albums_frequent">Récemment écoutés</string>
<string name="main.albums_highest">Mieux notés</string>
<string name="main.albums_random">Aléatoire</string>
<string name="main.albums_starred">Favoris</string>
<string name="main.albums_alphaByName">Alphabétique par nom</string>
<string name="main.albums_alphaByArtist">Alphabétique par artiste</string>
<string name="main.songs_title">Titres</string>
<string name="main.songs_starred">Favoris</string>
<string name="main.songs_random">Aléatoire</string>
<string name="main.songs_genre">Genre</string>
<string name="main.music">Musique</string>
<string name="menu.exit">Quitter</string>
<string name="menu.settings">Paramètres</string>
<string name="menu.help">Aide</string>
<string name="menu.about">À propos</string>
<string name="menu.search">Recherche</string>
<string name="menu.navigation">Navigation</string>
<string name="menu.common">Général</string>
<string name="playlist.label">Playlists</string>
<string name="help.label">Aide</string>
<string name="help.title">Bienvenue dans UltraSonic !</string>
<string name="help.back">Retour</string>
<string name="help.close">Fermer</string>
<string name="help.url">file:///android_asset/html/en/index.html</string>
<string name="help.loading">Chargement&#8230;</string>
<string name="play_video.loading">Chargement de la vidéo&#8230;</string>
<string name="play_video.noplugin">Veuillez installer Adobe Flash Player à partir du Google Play Store.</string>
<string name="search.label">Recherche</string>
<string name="search.title">Recherche</string>
<string name="search.search">Cliquer pour rechercher</string>
<string name="search.no_match">Aucun résultat, veuillez essayer à nouveau</string>
<string name="search.artists">Artistes</string>
<string name="search.albums">Albums</string>
<string name="search.songs">Titres</string>
<string name="search.more">Afficher plus</string>
<string name="progress.wait">Veuillez patienter&#8230;</string>
<string name="music_library.label">Bibliothèque musicale</string>
<string name="music_library.label_offline">Musique hors-ligne</string>
<string name="select_album.empty">Aucun titre trouvé</string>
<string name="select_album.select">Tout sélectionner</string>
<string name="select_album.n_selected">%d Pistes sélectionnées.</string>
<string name="select_album.n_unselected">%d Pistes non sélectionnés.</string>
<string name="select_album.more">Plus</string>
<string name="select_album.offline">Hors-ligne</string>
<string name="select_album.searching">Recherche en cours&#8230;</string>
<string name="select_album.play_all">Tout jouer</string>
<string name="select_album.no_sdcard">Erreur: Aucune carte SD disponible.</string>
<string name="select_album.no_network">Avis: Aucun réseau disponible.</string>
<string name="select_album.not_licensed">Serveur sans licence. %d jours d\'essai restant.</string>
<string name="select_album.donate_dialog_message">Obtenez des téléchargements illimités en faisant un don pour Subsonic.</string>
<string name="select_album.donate_dialog_now">Maintenant</string>
<string name="select_album.donate_dialog_later">Plus tard</string>
<string name="select_album.donate_dialog_0_trial_days_left">La période d\'essai est terminée</string>
<string name="select_artist.empty">Aucun artistes trouvés</string>
<string name="select_genre.empty">Aucun genres trouvés</string>
<string name="select_playlist.empty">Aucune playlist sur le serveur</string>
<string name="button_bar.home">Accueil Ultrasonic</string>
<string name="button_bar.now_playing">Lecture en cours</string>
<string name="button_bar.playlists">Playlists</string>
<string name="button_bar.search">Recherche</string>
<string name="chat.send_a_message">Envoyer un message</string>
<string name="common.appname">UltraSonic</string>
<string name="common.cancel">Annuler</string>
<string name="common.comment">Comment</string>
<string name="common.confirm">Confirm</string>
<string name="common.delete">Supprimer</string>
<string name="common.download">Download</string>
<string name="common.info">Details</string>
<string name="common.multiple_genres">Genres multiples</string>
<string name="common.name">Name</string>
<string name="common.ok">OK</string>
<string name="common.pin">Épingler</string>
<string name="common.play_last">Jouer en dernier</string>
<string name="common.play_next">Jouer à la suite</string>
<string name="common.play_now">Jouer maintenant</string>
<string name="common.play_shuffled">Play Shuffled</string>
<string name="common.public">Public</string>
<string name="common.save">Enregistrer</string>
<string name="common.show_artist">Show Artist</string>
<string name="common.unpin">Détacher</string>
<string name="common.various_artists">Artistes divers</string>
<string name="delete_playlist">Do you want to delete %1$s</string>
<string name="download.bookmark_removed" formatted="false">Bookmark removed.</string>
<string name="download.bookmark_set_at_position" formatted="false">Bookmark set at %s.</string>
<string name="download.empty">Playlist vide</string>
<string name="download.playerstate_downloading">Téléchargement - %s</string>
<string name="download.playerstate_buffering">Mise en mémoire</string>
<string name="download.playerstate_playing_shuffle">En jeu aléatoire</string>
<string name="download.menu_show_album">Afficher l\'album</string>
<string name="download.jukebox_not_authorized">La télécommande n\'est pas autorisée. Veuillez activer le mode jukebox dans <b>Utilisateurs &gt; Paramètres</b> à partir de votre serveur Subsonic.</string>
<string name="download.jukebox_off">Télécommande désactivée. La musique est jouée sur le téléphone.</string>
<string name="download.jukebox_offline">La télécommande n\'est pas disponible en mode déconnecté.</string>
<string name="download.jukebox_on">Télécommande activée. La musique est jouée sur le serveur</string>
<string name="download.jukebox_server_too_old">La télécommande n\'est pas pris en charge. Mise à jour du serveur Subsonic requise.</string>
<string name="download.jukebox_volume">Volume de la télécommande</string>
<string name="download.menu_equalizer">Égaliseur</string>
<string name="download.menu_jukebox_off">Jukebox Off</string>
<string name="download.menu_jukebox_on">Jukebox On</string>
<string name="download.menu_lyrics">Paroles</string>
<string name="download.menu_remove">Retirer le morceau</string>
<string name="download.menu_remove_all">Tout retirer</string>
<string name="download.menu_screen_on">Sur l\'écran</string>
<string name="download.menu_screen_off">Désactiver l\'écran</string>
<string name="download.menu_shuffle">Mélanger</string>
<string name="download.menu_save">Enregistrer la playlist</string>
<string name="download.menu_equalizer">Égaliseur</string>
<string name="download.menu_visualizer">Visualiseur</string>
<string name="download.menu_jukebox">Jukebox</string>
<string name="download.menu_screen_off">Désactiver l\'écran</string>
<string name="download.menu_screen_on">Sur l\'écran</string>
<string name="download.menu_show_album">Afficher l\'album</string>
<string name="download.menu_shuffle">Mélanger</string>
<string name="download.menu_shuffle_notification">Playlist mélangée</string>
<string name="download.playlist_title">Enregistrer la playlist</string>
<string name="download.playlist_name">Saisissez le nom de la playlist :</string>
<string name="download.playlist_saving">Enregistrement de la playlist \"%s\"&#8230;</string>
<string name="download.menu_visualizer">Visualiseur</string>
<string name="download.playerstate_buffering">Mise en mémoire</string>
<string name="download.playerstate_downloading">Téléchargement - %s</string>
<string name="download.playerstate_playing_shuffle">En jeu aléatoire</string>
<string name="download.playlist_done">Playlist enregistrée avec succès !</string>
<string name="download.playlist_error">Échec de l\'enregistrement de la playlist, veuillez réessayer plus tard.</string>
<string name="download.repeat_off">Répétition désactivée</string>
<string name="download.playlist_name">Saisissez le nom de la playlist :</string>
<string name="download.playlist_saving">Enregistrement de la playlist \"%s\"&#8230;</string>
<string name="download.playlist_title">Enregistrer la playlist</string>
<string name="download.repeat_all">Tout répéter</string>
<string name="download.repeat_off">Répétition désactivée</string>
<string name="download.repeat_single">Répéter le morceau</string>
<string name="download.visualizer_on">Visualiseur activé</string>
<string name="download.visualizer_off">Visualiseur désactivé</string>
<string name="download.jukebox_on">Télécommande activée. La musique est jouée sur le serveur</string>
<string name="download.jukebox_off">Télécommande désactivée. La musique est jouée sur le téléphone.</string>
<string name="download.jukebox_volume">Volume de la télécommande</string>
<string name="download.jukebox_server_too_old">La télécommande n\'est pas pris en charge. Mise à jour du serveur Subsonic requise.</string>
<string name="download.jukebox_offline">La télécommande n\'est pas disponible en mode déconnecté.</string>
<string name="download.jukebox_not_authorized">La télécommande n\'est pas autorisée. Veuillez activer le mode jukebox dans <b>Utilisateurs &gt; Paramètres</b> à partir de votre serveur Subsonic.</string>
<string name="song_details.all">%1$s%2$s</string>
<string name="song_details.kbps">%d Kb/s</string>
<string name="lyrics.nomatch">Aucune parole trouvée</string>
<string name="download.visualizer_on">Visualiseur activé</string>
<string name="equalizer.enabled">Activé</string>
<string name="equalizer.label">Égaliseur</string>
<string name="equalizer.preset">Sélection prédéfinie</string>
<string name="error.label">Erreur</string>
<string name="settings.title">Paramètres d\'UltraSonic</string>
<string name="settings.test_connection_title">Tester la connexion</string>
<string name="settings.servers_title">Serveurs</string>
<string name="settings.server_unused1">Inutilisé 1</string>
<string name="settings.server_unused2">Inutilisé 2</string>
<string name="settings.server_unused3">Inutilisé 3</string>
<string name="settings.server_name">Nom</string>
<string name="settings.server_address">Adresse du serveur</string>
<string name="settings.server_username">Nom d\'utilisateur</string>
<string name="settings.server_password">Mot de passe</string>
<string name="settings.chat_refresh">Intervalle de clavardage</string>
<string name="settings.cache_title">Cache des musiques</string>
<string name="settings.preload">Titres à pré-charger</string>
<string name="settings.cache_size">Taille du cache</string>
<string name="help.back">Retour</string>
<string name="help.close">Fermer</string>
<string name="help.label">Aide</string>
<string name="help.loading">Chargement&#8230;</string>
<string name="help.title">Bienvenue dans UltraSonic !</string>
<string name="help.url">file:///android_asset/html/en/index.html</string>
<string name="jukebox.is_default">Jukebox By Default</string>
<string name="lyrics.nomatch">Aucune parole trouvée</string>
<string name="main.albums_alphaByArtist">Alphabétique par artiste</string>
<string name="main.albums_alphaByName">Alphabétique par nom</string>
<string name="main.albums_frequent">Récemment écoutés</string>
<string name="main.albums_highest">Mieux notés</string>
<string name="main.albums_newest">Plus récents</string>
<string name="main.albums_random">Aléatoire</string>
<string name="main.albums_recent">Récemment écoutés</string>
<string name="main.albums_starred">Favoris</string>
<string name="main.albums_title">Albums</string>
<string name="main.artists_title">Artistes</string>
<string name="main.genres_title">Genres</string>
<string name="main.music">Musique</string>
<string name="main.offline">Hors-ligne</string>
<string name="main.select_all_genres">Tous les genres</string>
<string name="main.select_genre">Sélectionner le genre</string>
<string name="main.select_server">Sélectionner un serveur</string>
<string name="main.settings">Paramètres</string>
<string name="main.shuffle">Lecture aléatoire</string>
<string name="main.songs_genre">Genre</string>
<string name="main.songs_random">Aléatoire</string>
<string name="main.songs_starred">Favoris</string>
<string name="main.songs_title">Titres</string>
<string name="main.welcome_text">Bienvenue dans UltraSonic ! L\'application n\'est pas configurée. Après avoir configuré votre serveur personnel (disponible à partir de <b>subsonic.org</b>), veuillez accéder aux <b>Paramètres</b> et modifier la configuration pour vous y connecter.</string>
<string name="main.welcome_title">Bienvenue!</string>
<string name="menu.about">À propos</string>
<string name="menu.add_playlist">Add To Playlist</string>
<string name="menu.common">Général</string>
<string name="menu.deleted_playlist">Deleted playlist %s</string>
<string name="menu.deleted_playlist_error">Failed to delete playlist %s</string>
<string name="menu.exit">Quitter</string>
<string name="menu.help">Aide</string>
<string name="menu.navigation">Navigation</string>
<string name="menu.remove_playlist">Remove From Playlist</string>
<string name="menu.search">Recherche</string>
<string name="menu.settings">Paramètres</string>
<string name="music_library.label">Bibliothèque musicale</string>
<string name="music_library.label_offline">Musique hors-ligne</string>
<string name="music_service.retry">Une erreur de réseau s\'est produite. Essai %1$d de %2$d.</string>
<string name="parser.artist_count">%d artistes récupérés.</string>
<string name="parser.not_authenticated">Mauvais nom d\'usager ou mot de passe.</string>
<string name="parser.not_authorized">Non autorisé. Vérifiez les permissions de l\'utilisateur dans le serveur Subsonic.</string>
<string name="parser.reading">Lecture du serveur.</string>
<string name="parser.reading_done">Lecture du serveur. Terminé!</string>
<string name="parser.upgrade_client">Versions incompatible. Veuillez mette à jour l\'application Android UltraSonic.</string>
<string name="parser.upgrade_server">Versions incompatible. Veuillez mette à jour le serveur Subsonic.</string>
<string name="play_video.loading">Chargement de la vidéo&#8230;</string>
<string name="play_video.noplugin">Veuillez installer Adobe Flash Player à partir du Google Play Store.</string>
<string name="playlist.label">Playlists</string>
<string name="playlist.update_info">Update Information</string>
<string name="playlist.updated_info">Updated playlist information for %s</string>
<string name="playlist.updated_info_error">Failed to update playlist information for %s</string>
<string name="playlist_error">Failed to grab list of playlists</string>
<string name="progress.wait">Veuillez patienter&#8230;</string>
<string name="removed_playlist">Removed %1$s songs from \"%2$s\"</string>
<string name="search.albums">Albums</string>
<string name="search.artists">Artistes</string>
<string name="search.label">Recherche</string>
<string name="search.more">Afficher plus</string>
<string name="search.no_match">Aucun résultat, veuillez essayer à nouveau</string>
<string name="search.search">Cliquer pour rechercher</string>
<string name="search.songs">Titres</string>
<string name="search.title">Recherche</string>
<string name="select_album.donate_dialog_0_trial_days_left">La période d\'essai est terminée</string>
<string name="select_album.donate_dialog_later">Plus tard</string>
<string name="select_album.donate_dialog_message">Obtenez des téléchargements illimités en faisant un don pour Subsonic.</string>
<string name="select_album.donate_dialog_now">Maintenant</string>
<string name="select_album.empty">Aucun titre trouvé</string>
<string name="select_album.more">Plus</string>
<string name="select_album.n_selected">%d Pistes sélectionnées.</string>
<string name="select_album.n_unselected">%d Pistes non sélectionnés.</string>
<string name="select_album.no_network">Avis: Aucun réseau disponible.</string>
<string name="select_album.no_sdcard">Erreur: Aucune carte SD disponible.</string>
<string name="select_album.not_licensed">Serveur sans licence. %d jours d\'essai restant.</string>
<string name="select_album.offline">Hors-ligne</string>
<string name="select_album.play_all">Tout jouer</string>
<string name="select_album.searching">Recherche en cours&#8230;</string>
<string name="select_album.select">Tout sélectionner</string>
<string name="select_artist.all_folders">Tous les dossiers</string>
<string name="select_artist.empty">Aucun artistes trouvés</string>
<string name="select_artist.folder">Sélectionner le dossier</string>
<string name="select_artist.refresh">Rafraîchir</string>
<string name="select_genre.empty">Aucun genres trouvés</string>
<string name="select_playlist.empty">Aucune playlist sur le serveur</string>
<string name="service.connecting">Contact du serveur, veuillez patienter.</string>
<string name="settings.appearance_title">Apparence</string>
<string name="settings.buffer_length">Longueur de la mémoire tampon</string>
<string name="settings.buffer_length_0">Désactivé</string>
<string name="settings.buffer_length_1">1 seconde</string>
<string name="settings.buffer_length_10">10 secondes</string>
<string name="settings.buffer_length_12">12 secondes</string>
<string name="settings.buffer_length_120">2 minute</string>
<string name="settings.buffer_length_15">15 secondes</string>
<string name="settings.buffer_length_2">2 secondes</string>
<string name="settings.buffer_length_20">20 secondes</string>
<string name="settings.buffer_length_30">30 secondes</string>
<string name="settings.buffer_length_5">5 secondes</string>
<string name="settings.buffer_length_60">1 minute</string>
<string name="settings.buffer_length_8">8 secondes</string>
<string name="settings.cache_location">Emplacement du cache</string>
<string name="settings.cache_location_error">Emplacement du cache invalide. Utilisation par défaut.</string>
<string name="settings.testing_connection">Connexion en cours de test&#8230;</string>
<string name="settings.testing_ok">Connexion correcte</string>
<string name="settings.testing_unlicensed">Connection correcte. Serveur sans licence.</string>
<string name="settings.cache_size">Taille du cache</string>
<string name="settings.cache_size_100">100 Mo</string>
<string name="settings.cache_size_1000">1 Go</string>
<string name="settings.cache_size_10000">10 Go</string>
<string name="settings.cache_size_200">200 Mo</string>
<string name="settings.cache_size_2000">2 Go</string>
<string name="settings.cache_size_20000">20 Go</string>
<string name="settings.cache_size_500">500 Mo</string>
<string name="settings.cache_size_5000">5 Go</string>
<string name="settings.cache_size_unlimited">Illimité</string>
<string name="settings.cache_title">Cache des musiques</string>
<string name="settings.chat_refresh">Intervalle de clavardage</string>
<string name="settings.clear_bookmark">Clear Bookmark</string>
<string name="settings.clear_bookmark_summary">Clear bookmark upon completion of playback of a song</string>
<string name="settings.clear_playlist">Clear Playlist</string>
<string name="settings.clear_playlist_summary">Clear the playlist upon completion of playback of all songs</string>
<string name="settings.clear_search_history">Effacer l\'historique des recherches</string>
<string name="settings.connection_failure">Connection échouée</string>
<string name="settings.default_albums">Albums par défaut</string>
<string name="settings.default_artists">Artistes par défaut</string>
<string name="settings.default_songs">Musiques par défaut</string>
<string name="settings.directory_cache_time">Directory Cache Time</string>
<string name="settings.directory_cache_time_0">Disabled</string>
<string name="settings.directory_cache_time_1">1 minute</string>
<string name="settings.directory_cache_time_10">10 minutes</string>
<string name="settings.directory_cache_time_2">2 minutes</string>
<string name="settings.directory_cache_time_30">30 minutes</string>
<string name="settings.directory_cache_time_5">5 minutes</string>
<string name="settings.directory_cache_time_60">1 hour</string>
<string name="settings.disc_sort">Sort Songs By Disc</string>
<string name="settings.disc_sort_summary">Sort song list by disc number and track number</string>
<string name="settings.display_bitrate">Afficher bitrate et suffixe du fichier</string>
<string name="settings.display_bitrate_summary">Ajouter le nom d\'artiste, bitrate et suffixe du fichier</string>
<string name="settings.download_transition">Show Downloads On Play</string>
<string name="settings.download_transition_summary">Transition to download activity when starting playback</string>
<string name="settings.gapless_playback">Gapless Playback</string>
<string name="settings.gapless_playback_summary">Enable gapless playback</string>
<string name="settings.hide_media_summary">Masquer les fichiers musicaux et les couvertures d\'album aux autres applis (Gallerie, Musique, etc.)</string>
<string name="settings.hide_media_title">Masquer aux autres</string>
<string name="settings.hide_media_toast">Prendra effet la prochaine fois qu\'Android recensera les médias disponibles sur l\'appareil.</string>
<string name="settings.increment_time">Skip Interval</string>
<string name="settings.invalid_url">Veuillez spécifier un URL valide.</string>
<string name="settings.invalid_username">Veuillez spécifier un nom d\'utilisateur valide (sans espace à la fin).</string>
<string name="settings.appearance_title">Apparence</string>
<string name="settings.theme_title">Thème</string>
<string name="settings.theme_light">Clair</string>
<string name="settings.theme_dark">Sombre</string>
<string name="settings.network_title">Réseau</string>
<string name="settings.max_bitrate_wifi">Débit maximal - Wi-Fi</string>
<string name="settings.max_bitrate_mobile">Débit maximal - Mobile</string>
<string name="settings.max_bitrate_32">32 Kb/s</string>
<string name="settings.max_bitrate_64">64 Kb/s</string>
<string name="settings.max_bitrate_80">80 Kb/s</string>
<string name="settings.max_bitrate_96">96 Kb/s</string>
<string name="settings.max_albums">Albums maximum</string>
<string name="settings.max_artists">Artistes maximum</string>
<string name="settings.max_bitrate_112">112 Kb/s</string>
<string name="settings.max_bitrate_128">128 Kb/s</string>
<string name="settings.max_bitrate_160">160 Kb/s</string>
<string name="settings.max_bitrate_192">192 Kb/s</string>
<string name="settings.max_bitrate_256">256 Kb/s</string>
<string name="settings.max_bitrate_32">32 Kb/s</string>
<string name="settings.max_bitrate_320">320 Kb/s</string>
<string name="settings.max_bitrate_64">64 Kb/s</string>
<string name="settings.max_bitrate_80">80 Kb/s</string>
<string name="settings.max_bitrate_96">96 Kb/s</string>
<string name="settings.max_bitrate_mobile">Débit maximal - Mobile</string>
<string name="settings.max_bitrate_unlimited">Illimité</string>
<string name="settings.wifi_required_title">Wi-Fi en streaming uniquement</string>
<string name="settings.wifi_required_summary">Lire uniquement les flux médias si connecté au réseau Wi-Fi</string>
<string name="settings.display_bitrate">Afficher bitrate et suffixe du fichier</string>
<string name="settings.display_bitrate_summary">Ajouter le nom d\'artiste, bitrate et suffixe du fichier</string>
<string name="settings.use_folder_for_album_artist">Utilisez des dossiers pour les noms d\'artistes</string>
<string name="settings.use_folder_for_album_artist_summary">Dossier de niveau supérieur devient le nom de l\'artiste de l\'album</string>
<string name="settings.show_track_number">Afficher le numéro du titre</string>
<string name="settings.show_track_number_summary">Inclure son numero lors de l\'affichage d\'un titre</string>
<string name="settings.preload_1">1 morceau</string>
<string name="settings.preload_2">2 morceaux</string>
<string name="settings.preload_3">3 morceaux</string>
<string name="settings.preload_5">5 morceaux</string>
<string name="settings.preload_10">10 morceaux</string>
<string name="settings.preload_unlimited">Illimité</string>
<string name="settings.cache_size_100">100 Mo</string>
<string name="settings.cache_size_200">200 Mo</string>
<string name="settings.cache_size_500">500 Mo</string>
<string name="settings.cache_size_1000">1 Go</string>
<string name="settings.cache_size_2000">2 Go</string>
<string name="settings.cache_size_5000">5 Go</string>
<string name="settings.cache_size_10000">10 Go</string>
<string name="settings.cache_size_20000">20 Go</string>
<string name="settings.cache_size_unlimited">Illimité</string>
<string name="settings.clear_search_history">Effacer l\'historique des recherches</string>
<string name="settings.search_history_cleared">Historique des recherches effacé</string>
<string name="settings.other_title">Autres paramètres</string>
<string name="settings.search_title">Paramètres de recherche</string>
<string name="settings.playback_control_title">Paramètres de contrôle de lecture</string>
<string name="settings.scrobble_title">Scrobble pour Last.fm</string>
<string name="settings.scrobble_summary">N\'oubliez pas de définir votre nom d\'utilisateur et mot de passe Last.fm sur le serveur Subsonic</string>
<string name="settings.server_scaling_title">Album serveur mis à l\'échelle de la cover</string>
<string name="settings.server_scaling_summary">Télécharger des images redimensionnées à partir du serveur au lieu des tailles de bases (bande passante réduite)</string>
<string name="settings.hide_media_title">Masquer aux autres</string>
<string name="settings.hide_media_summary">Masquer les fichiers musicaux et les couvertures d\'album aux autres applis (Gallerie, Musique, etc.)</string>
<string name="settings.hide_media_toast">Prendra effet la prochaine fois qu\'Android recensera les médias disponibles sur l\'appareil.</string>
<string name="settings.media_button_title">Boutons média</string>
<string name="settings.max_bitrate_wifi">Débit maximal - Wi-Fi</string>
<string name="settings.max_songs">Titres maximum</string>
<string name="settings.media_button_summary">Répondre au boutons média de l\'appareil, du casque et du Bluetooth</string>
<string name="settings.screen_lit_title">Garder écran allumé</string>
<string name="settings.screen_lit_summary">Garder l\'écran allumé pendant le téléchargement permet d\'améliorer la vitesse de téléchargement.</string>
<string name="settings.buffer_length">Longueur de la mémoire tampon</string>
<string name="settings.media_button_title">Boutons média</string>
<string name="settings.network_timeout">Délai d\'attente de connexion</string>
<string name="settings.buffer_length_0">Désactivé</string>
<string name="settings.buffer_length_1">1 seconde</string>
<string name="settings.buffer_length_2">2 secondes</string>
<string name="settings.buffer_length_5">5 secondes</string>
<string name="settings.buffer_length_8">8 secondes</string>
<string name="settings.buffer_length_10">10 secondes</string>
<string name="settings.buffer_length_12">12 secondes</string>
<string name="settings.buffer_length_15">15 secondes</string>
<string name="settings.buffer_length_20">20 secondes</string>
<string name="settings.buffer_length_30">30 secondes</string>
<string name="settings.buffer_length_60">60 secondes</string>
<string name="settings.network_timeout_105000">105 secondes</string>
<string name="settings.network_timeout_120000">120 secondes</string>
<string name="settings.network_timeout_15000">15 secondes</string>
<string name="settings.network_timeout_30000">30 secondes</string>
<string name="settings.network_timeout_45000">45 secondes</string>
<string name="settings.network_timeout_60000">60 secondes</string>
<string name="settings.network_timeout_75000">75 secondes</string>
<string name="settings.network_timeout_90000">90 secondes</string>
<string name="settings.network_timeout_105000">105 secondes</string>
<string name="settings.network_timeout_120000">120 secondes</string>
<string name="settings.show_notification">Notifications</string>
<string name="settings.show_notification_summary">Afficher la notification d\'un nouveau titre en lecture dans la barre d\'état</string>
<string name="settings.show_notification_always">Toujours afficher les notifications</string>
<string name="settings.show_notification_always_summary">Toujours afficher la notification d\'un nouveau titre en lecture dans la barre d\'état</string>
<string name="settings.show_lockscreen_controls">Contrôles sur l\'écran de verrouillage</string>
<string name="settings.show_lockscreen_controls_summary">Afficher les contrôles de lecture sur l\'écran de verrouillage</string>
<string name="settings.use_stream_proxy">Utiliser un proxy</string>
<string name="settings.use_stream_proxy_summary">Support de lecture de flux à travers un proxy (peut provoquer des fritures)</string>
<string name="settings.show_now_playing">Montrer lecture en cours</string>
<string name="settings.show_now_playing_summary">Afficher les pistes en cours de lecture dans les autres activités d\'Ultrasonic</string>
<string name="settings.max_albums">Albums maximum</string>
<string name="settings.network_title">Réseau</string>
<string name="settings.other_title">Autres paramètres</string>
<string name="settings.playback_control_title">Paramètres de contrôle de lecture</string>
<string name="settings.preload">Titres à pré-charger</string>
<string name="settings.preload_1">1 morceau</string>
<string name="settings.preload_10">10 morceaux</string>
<string name="settings.preload_2">2 morceaux</string>
<string name="settings.preload_3">3 morceaux</string>
<string name="settings.preload_5">5 morceaux</string>
<string name="settings.preload_unlimited">Illimité</string>
<string name="settings.screen_lit_summary">Garder l\'écran allumé pendant le téléchargement permet d\'améliorer la vitesse de téléchargement.</string>
<string name="settings.screen_lit_title">Garder écran allumé</string>
<string name="settings.scrobble_summary">N\'oubliez pas de définir votre nom d\'utilisateur et mot de passe Last.fm sur le serveur Subsonic</string>
<string name="settings.scrobble_title">Scrobble pour Last.fm</string>
<string name="settings.search_1">1</string>
<string name="settings.search_3">3</string>
<string name="settings.search_5">5</string>
<string name="settings.search_10">10</string>
<string name="settings.search_100">100</string>
<string name="settings.search_15">15</string>
<string name="settings.search_20">20</string>
<string name="settings.search_25">25</string>
<string name="settings.search_250">250</string>
<string name="settings.search_3">3</string>
<string name="settings.search_30">30</string>
<string name="settings.search_40">40</string>
<string name="settings.search_5">5</string>
<string name="settings.search_50">50</string>
<string name="settings.search_75">75</string>
<string name="settings.search_100">100</string>
<string name="settings.search_250">250</string>
<string name="settings.search_500">500</string>
<string name="settings.max_artists">Artistes maximum</string>
<string name="settings.max_songs">Titres maximum</string>
<string name="settings.default_artists">Artistes par défaut</string>
<string name="settings.default_albums">Albums par défaut</string>
<string name="settings.default_songs">Musiques par défaut</string>
<string name="music_service.retry">Une erreur de réseau s\'est produite. Essai %1$d de %2$d.</string>
<string name="background_task.wait">Veuillez patienter&#8230;</string>
<string name="background_task.loading">Chargement&#8230;</string>
<string name="background_task.no_network">Cette application requiert un accès au réseau. Veuillez activer le Wi-Fi ou le réseau mobile.</string>
<string name="background_task.network_error">Une erreur réseau est survenue. Veuillez vérifier l\'adresse du serveur ou réessayer plus tard.</string>
<string name="background_task.not_found">Ressources introuvables. Veuillez vérifier l\'adresse du serveur.</string>
<string name="background_task.parse_error">Réponse incorrecte. Veuillez vérifier l\'adresse du serveur.</string>
<string name="service.connecting">Contact du serveur, veuillez patienter.</string>
<string name="parser.reading">Lecture du serveur.</string>
<string name="parser.reading_done">Lecture du serveur. Terminé!</string>
<string name="parser.upgrade_client">Versions incompatible. Veuillez mette à jour l\'application Android UltraSonic.</string>
<string name="parser.upgrade_server">Versions incompatible. Veuillez mette à jour le serveur Subsonic.</string>
<string name="parser.not_authenticated">Mauvais nom d\'usager ou mot de passe.</string>
<string name="parser.not_authorized">Non autorisé. Vérifiez les permissions de l\'utilisateur dans le serveur Subsonic.</string>
<string name="parser.artist_count">%d artistes récupérés.</string>
<string name="select_artist.refresh">Rafraîchir</string>
<string name="select_artist.folder">Sélectionner le dossier</string>
<string name="select_artist.all_folders">Tous les dossiers</string>
<string name="equalizer.label">Égaliseur</string>
<string name="equalizer.enabled">Activé</string>
<string name="equalizer.preset">Sélection prédéfinie</string>
<string name="widget.initial_text">Touchez pour sélectionner un titre</string>
<string name="widget.sdcard_busy">Carte SD non disponible</string>
<string name="widget.sdcard_missing">Aucune carte SD</string>
<string name="util.bytes_format.gigabyte">0.00 Go</string>
<string name="util.bytes_format.megabyte">0.00 Mo</string>
<string name="util.bytes_format.kilobyte">0 Ko</string>
<string name="settings.search_75">75</string>
<string name="settings.search_history_cleared">Historique des recherches effacé</string>
<string name="settings.search_title">Paramètres de recherche</string>
<string name="settings.server_add_server">Add Server</string>
<string name="settings.server_address">Adresse du serveur</string>
<string name="settings.server_name">Nom</string>
<string name="settings.server_number">Number Of Servers</string>
<string name="settings.server_password">Mot de passe</string>
<string name="settings.server_remove_server">Remove Server</string>
<string name="settings.server_scaling_summary">Télécharger des images redimensionnées à partir du serveur au lieu des tailles de bases (bande passante réduite)</string>
<string name="settings.server_scaling_title">Album serveur mis à l\'échelle de la cover</string>
<string name="settings.server_unused">Unused</string>
<string name="settings.server_unused1">Inutilisé 1</string>
<string name="settings.server_unused2">Inutilisé 2</string>
<string name="settings.server_unused3">Inutilisé 3</string>
<string name="settings.server_username">Nom d\'utilisateur</string>
<string name="settings.servers_title">Serveurs</string>
<string name="settings.show_lockscreen_controls">Contrôles sur l\'écran de verrouillage</string>
<string name="settings.show_lockscreen_controls_summary">Afficher les contrôles de lecture sur l\'écran de verrouillage</string>
<string name="settings.show_notification">Notifications</string>
<string name="settings.show_notification_always">Toujours afficher les notifications</string>
<string name="settings.show_notification_always_summary">Toujours afficher la notification d\'un nouveau titre en lecture dans la barre d\'état</string>
<string name="settings.show_notification_summary">Afficher la notification d\'un nouveau titre en lecture dans la barre d\'état</string>
<string name="settings.show_now_playing">Montrer lecture en cours</string>
<string name="settings.show_now_playing_summary">Afficher les pistes en cours de lecture dans les autres activités d\'Ultrasonic</string>
<string name="settings.show_track_number">Afficher le numéro du titre</string>
<string name="settings.show_track_number_summary">Inclure son numero lors de l\'affichage d\'un titre</string>
<string name="settings.test_connection_title">Tester la connexion</string>
<string name="settings.testing_connection">Connexion en cours de test&#8230;</string>
<string name="settings.testing_ok">Connexion correcte</string>
<string name="settings.testing_unlicensed">Connection correcte. Serveur sans licence.</string>
<string name="settings.theme_dark">Sombre</string>
<string name="settings.theme_light">Clair</string>
<string name="settings.theme_title">Thème</string>
<string name="settings.title">Paramètres d\'UltraSonic</string>
<string name="settings.use_folder_for_album_artist">Utilisez des dossiers pour les noms d\'artistes</string>
<string name="settings.use_folder_for_album_artist_summary">Dossier de niveau supérieur devient le nom de l\'artiste de l\'album</string>
<string name="settings.use_id3">Browse Using ID3 Tags</string>
<string name="settings.use_id3_summary">Use ID3 tag methods instead of file system based methods</string>
<string name="settings.use_stream_proxy">Utiliser un proxy</string>
<string name="settings.use_stream_proxy_summary">Support de lecture de flux à travers un proxy (peut provoquer des fritures)</string>
<string name="settings.wifi_required_summary">Lire uniquement les flux médias si connecté au réseau Wi-Fi</string>
<string name="settings.wifi_required_title">Wi-Fi en streaming uniquement</string>
<string name="shuffle.endYear">End Year:</string>
<string name="shuffle.genre">Genre:</string>
<string name="shuffle.startYear">Start Year:</string>
<string name="song_details.all">%1$s%2$s</string>
<string name="song_details.kbps">%d Kb/s</string>
<string name="updated_playlist">Added %1$s songs to \"%2$s\"</string>
<string name="updated_playlist_error">Failed to update \"%s\", please try later.</string>
<string name="util.bytes_format.byte">0 o</string>
<string name="util.bytes_format.gigabyte">0.00 Go</string>
<string name="util.bytes_format.kilobyte">0 Ko</string>
<string name="util.bytes_format.megabyte">0.00 Mo</string>
<string name="util.no_time">-:--</string>
<string name="util.zero_time">0:00</string>
<string name="chat.send_a_message">Envoyer un message</string>
<string name="widget.initial_text">Touchez pour sélectionner un titre</string>
<string name="widget.sdcard_busy">Carte SD non disponible</string>
<string name="widget.sdcard_missing">Aucune carte SD</string>
<plurals name="select_album_n_songs">
<item quantity="zero">Aucun titre</item>
@ -294,6 +349,10 @@
<item quantity="one">Un titre sélectionnée pour être épinglé.</item>
<item quantity="other">%d titres sélectionnée pour être épinglé.</item>
</plurals>
<plurals name="select_album_n_songs_downloaded">
<item quantity="one">1 song selected to be downloaded.</item>
<item quantity="other">%d songs selected to be downloaded.</item>
</plurals>
<plurals name="select_album_n_songs_unpinned">
<item quantity="one">Un titre sélectionné pour être dégoupillé.</item>
<item quantity="other">%d titres sélectionnés pour être dégoupillé.</item>

View File

@ -1,322 +1,344 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="common.appname">UltraSonic</string>
<string name="common.ok">OK</string>
<string name="common.save">Mentés</string>
<string name="common.cancel">Mégse</string>
<string name="common.play_now">Lejátszás</string>
<string name="common.play_next">Lejátszás (Következőként)</string>
<string name="common.play_last">Lejátszás (Utolsóként)</string>
<string name="common.pin">Tárolás</string>
<string name="common.unpin">Visszavonás</string>
<string name="common.delete">Törlés</string>
<string name="common.various_artists">Különféle előadók</string>
<string name="common.multiple_genres">Többféle műfaj</string>
<string name="common.info">Részletek</string>
<string name="common.play_shuffled">Véletlen sorrendű lejátszás</string>
<string name="common.confirm">Jóváhagyás</string>
<string name="common.name">Név</string>
<string name="common.comment">Megjegyzés</string>
<string name="common.public">Nyilvános</string>
<string name="common.show_artist">Előadó megjelenítése</string>
<string name="button_bar.home">UltraSonic főoldal</string>
<string name="background_task.loading">Betöltés&#8230;</string>
<string name="background_task.network_error">Hálózati hiba történt! Kérjük, ellenőrizze a kiszolgáló címét vagy próbálja később!</string>
<string name="background_task.no_network">Az alkalmazás hálózati hozzáférést igényel. Kérjük, kapcsolja be a Wi-Fi-t vagy a mobilhálózatot!</string>
<string name="background_task.not_found">Az erőforrás nem található! Kérjük, ellenőrizze a kiszolgáló címét!</string>
<string name="background_task.parse_error">Értelmezhetetlen válasz! Kérjük, ellenőrizze a kiszolgáló címét!</string>
<string name="background_task.wait">Kérem várjon!&#8230;</string>
<string name="button_bar.bookmarks">Könyvjelzők</string>
<string name="button_bar.browse">Médiakönyvtár</string>
<string name="button_bar.search">Keresés</string>
<string name="button_bar.chat">Csevegés (Chat)</string>
<string name="button_bar.playlists">Lejátszási listák</string>
<string name="button_bar.home">UltraSonic főoldal</string>
<string name="button_bar.now_playing">Lejátszó</string>
<string name="main.welcome_title">Üdvözlet!</string>
<string name="main.welcome_text">Üdvözli az UltraSonic! Az alkalmazás még nincs beállítva. Miután konfigurálta saját kiszolgálóját (elérhető: <b>subsonic.org</b>), húzza jobbra a képernyőt, lépjen be a <b>Beállítások</b> menüpontba, és adja meg csatlakozási adatokat!</string>
<string name="main.select_server">Kiszolgáló kiválasztása</string>
<string name="main.select_genre">Műfaj kiválasztása</string>
<string name="main.select_all_genres">Összes műfaj</string>
<string name="main.shuffle">Véletlen sorrendű</string>
<string name="main.offline">Kapcsolat nélküli</string>
<string name="main.settings">Beállítások</string>
<string name="main.artists_title">Előadók</string>
<string name="main.genres_title">Műfajok</string>
<string name="main.albums_title">Albumok</string>
<string name="main.albums_newest">Utoljára hozzáadott</string>
<string name="main.albums_recent">Utoljára lejátszott</string>
<string name="main.albums_frequent">Legtöbbször lejátszott</string>
<string name="main.albums_highest">Legjobbra értékelt</string>
<string name="main.albums_random">Véletlenszerű</string>
<string name="main.albums_starred">Csillagozott</string>
<string name="main.albums_alphaByName">Albumnév szerint</string>
<string name="main.albums_alphaByArtist">Előadónév szerint</string>
<string name="main.songs_title">Dalok</string>
<string name="main.songs_starred">Csillagozott</string>
<string name="main.songs_random">Véletlenszerű</string>
<string name="main.songs_genre">Műfaj szerint</string>
<string name="main.music">Zenék</string>
<string name="menu.exit">Kilépés</string>
<string name="menu.settings">Beállítások</string>
<string name="menu.help">Súgó</string>
<string name="menu.about">Névjegy</string>
<string name="menu.search">Keresés</string>
<string name="menu.navigation">Navigáció</string>
<string name="menu.common">Általános</string>
<string name="menu.add_playlist">Hozzáadás a lejátszási listához</string>
<string name="menu.remove_playlist">Törlés a lejátszási listáról</string>
<string name="menu.deleted_playlist">Törölt lejátszási lista %s</string>
<string name="menu.deleted_playlist_error">Lejátszási lista törlése sikertelen %s</string>
<string name="playlist.label">Lejátszási listák</string>
<string name="playlist.update_info">Módosítás</string>
<string name="playlist.updated_info">Módosított lejátszási lista %s</string>
<string name="playlist.updated_info_error">Lejátszási lista módosítása sikertelen %s</string>
<string name="help.label">Súgó</string>
<string name="help.title">Üdvözli az UltraSonic!</string>
<string name="help.back">Vissza</string>
<string name="help.close">Bezár</string>
<string name="help.url">file:///android_asset/html/en/index.html</string>
<string name="help.loading">Betöltés&#8230;</string>
<string name="play_video.loading">Videó betöltése&#8230;</string>
<string name="play_video.noplugin">Kérjük, telepítse az Adobe Flash Player-t a Play Áruházból!</string>
<string name="search.label">Keresés</string>
<string name="search.title">Keresés</string>
<string name="search.search">Érintse meg a kereséshez</string>
<string name="search.no_match">Nincs találat, próbálja újra!</string>
<string name="search.artists">Előadók</string>
<string name="search.albums">Albumok</string>
<string name="search.songs">Dalok</string>
<string name="search.more">Továbbiak</string>
<string name="progress.wait">Kérem várjon!&#8230;</string>
<string name="music_library.label">Mediakönyvtár</string>
<string name="music_library.label_offline">Kapcsolat nélküli médiák</string>
<string name="select_album.empty">Nem található média!</string>
<string name="select_album.select">Összes kijelölése</string>
<string name="select_album.n_selected">%d dal kijelölve.</string>
<string name="select_album.n_unselected">%d dal visszavonva.</string>
<string name="select_album.more">Egyéb</string>
<string name="select_album.offline">Kapcsolat nélküli</string>
<string name="select_album.searching">Keresés&#8230;</string>
<string name="select_album.play_all">Összes lejátszása</string>
<string name="select_album.no_sdcard">Hiba: SD kártya nem áll rendelkezésre!</string>
<string name="select_album.no_network">Figyelem: Hálózat nem áll rendelkezésre!</string>
<string name="select_album.not_licensed">A kiszolgálónak nincs licence! %d próba nap van hátra!</string>
<string name="select_album.donate_dialog_message">Korlátlan letöltéshez juthat a Subsonic támogatásával.</string>
<string name="select_album.donate_dialog_now">Most</string>
<string name="select_album.donate_dialog_later">Később</string>
<string name="select_album.donate_dialog_0_trial_days_left">A próba időszak lejárt!</string>
<string name="select_artist.empty">Előadók nem találhatók!</string>
<string name="select_genre.empty">Műfajok nem találhatók!</string>
<string name="select_playlist.empty">Nincs mentett lejátszási lista a kiszolgálón.</string>
<string name="button_bar.playlists">Lejátszási listák</string>
<string name="button_bar.search">Keresés</string>
<string name="chat.send_a_message">Üzenet küldése</string>
<string name="common.appname">UltraSonic</string>
<string name="common.cancel">Mégse</string>
<string name="common.comment">Megjegyzés</string>
<string name="common.confirm">Jóváhagyás</string>
<string name="common.delete">Törlés</string>
<string name="common.download">Download</string>
<string name="common.info">Részletek</string>
<string name="common.multiple_genres">Többféle műfaj</string>
<string name="common.name">Név</string>
<string name="common.ok">OK</string>
<string name="common.pin">Tárolás</string>
<string name="common.play_last">Lejátszás (Utolsóként)</string>
<string name="common.play_next">Lejátszás (Következőként)</string>
<string name="common.play_now">Lejátszás</string>
<string name="common.play_shuffled">Véletlen sorrendű lejátszás</string>
<string name="common.public">Nyilvános</string>
<string name="common.save">Mentés</string>
<string name="common.show_artist">Előadó megjelenítése</string>
<string name="common.unpin">Visszavonás</string>
<string name="common.various_artists">Különféle előadók</string>
<string name="delete_playlist">Biztos, hogy törölni akarja? %1$s</string>
<string name="download.bookmark_removed" formatted="false">Könyvjelző eltávolítva.</string>
<string name="download.bookmark_set_at_position" formatted="false">Könyvjelző beállítva %s.</string>
<string name="download.empty">A lejátszási lista üres!</string>
<string name="download.playerstate_downloading">Letöltés - %s</string>
<string name="download.playerstate_buffering">Pufferelés</string>
<string name="download.playerstate_playing_shuffle">Véletlen sorrendű</string>
<string name="download.menu_show_album">Album megjelenítése</string>
<string name="download.jukebox_not_authorized">A távvezérlés nem áll rendelkezésre. Kérjük, engedélyezze a Jukebox módot a <b>Felhasználók &gt; Beállítások</b> menüpontban, az Ön Subsonic kiszolgálóján!</string>
<string name="download.jukebox_off">Távvezérlés kikapcsolása. A zenelejátszás a telefonon történik.</string>
<string name="download.jukebox_offline">A távvezérlés nem lehetséges kapcsolat nélküli módban!</string>
<string name="download.jukebox_on">Távvezérlés bekapcsolása. A zenelejátszás a kiszolgálón történik.</string>
<string name="download.jukebox_server_too_old">A távvezérlés nem támogatott. Kérjük, frissítse a Subsonic kiszolgálót!</string>
<string name="download.jukebox_volume">Távoli hangerő</string>
<string name="download.menu_equalizer">Equalizer</string>
<string name="download.menu_jukebox_off">Jukebox ki</string>
<string name="download.menu_jukebox_on">Jukebox be</string>
<string name="download.menu_lyrics">Dalszövegek</string>
<string name="download.menu_remove">Dal eltávolítása</string>
<string name="download.menu_remove_all">Összes eltávolítása</string>
<string name="download.menu_screen_on">Kijelző be</string>
<string name="download.menu_screen_off">Kijelző ki</string>
<string name="download.menu_shuffle">Véletlen sorrendű</string>
<string name="download.menu_save">Lejátszási lista mentése</string>
<string name="download.menu_equalizer">Equalizer</string>
<string name="download.menu_visualizer">Visualizer</string>
<string name="download.menu_jukebox">Jukebox</string>
<string name="download.menu_screen_off">Kijelző ki</string>
<string name="download.menu_screen_on">Kijelző be</string>
<string name="download.menu_show_album">Album megjelenítése</string>
<string name="download.menu_shuffle">Véletlen sorrendű</string>
<string name="download.menu_shuffle_notification">Véletlen sorrendű lejátszás</string>
<string name="download.playlist_title">Lejátszási lista mentése</string>
<string name="download.playlist_name">Lejátszási lista neve:</string>
<string name="download.playlist_saving">Lejátszási lista mentése \"%s\"&#8230;</string>
<string name="download.menu_visualizer">Visualizer</string>
<string name="download.playerstate_buffering">Pufferelés</string>
<string name="download.playerstate_downloading">Letöltés - %s</string>
<string name="download.playerstate_playing_shuffle">Véletlen sorrendű</string>
<string name="download.playlist_done">Lejátszási lista mentése sikeres.</string>
<string name="download.playlist_error">Lejátszási lista mentése sikertelen, próbálja később!</string>
<string name="download.repeat_off">Ismétlés ki</string>
<string name="download.playlist_name">Lejátszási lista neve:</string>
<string name="download.playlist_saving">Lejátszási lista mentése \"%s\"&#8230;</string>
<string name="download.playlist_title">Lejátszási lista mentése</string>
<string name="download.repeat_all">Összes ismétlése</string>
<string name="download.repeat_off">Ismétlés ki</string>
<string name="download.repeat_single">Dal ismétlése</string>
<string name="download.visualizer_on">Visualizer be</string>
<string name="download.visualizer_off">Visualizer ki</string>
<string name="download.jukebox_on">Távvezérlés bekapcsolása. A zenelejátszás a kiszolgálón történik.</string>
<string name="download.jukebox_off">Távvezérlés kikapcsolása. A zenelejátszás a telefonon történik.</string>
<string name="download.jukebox_volume">Távoli hangerő</string>
<string name="download.jukebox_server_too_old">A távvezérlés nem támogatott. Kérjük, frissítse a Subsonic kiszolgálót!</string>
<string name="download.jukebox_offline">A távvezérlés nem lehetséges kapcsolat nélküli módban!</string>
<string name="download.jukebox_not_authorized">A távvezérlés nem áll rendelkezésre. Kérjük, engedélyezze a Jukebox módot a <b>Felhasználók &gt; Beállítások</b> menüpontban, az Ön Subsonic kiszolgálóján!</string>
<string name="playlist_error">Nem sikerült elérni a lejátszási lista adatait!</string>
<string name="updated_playlist">%1$s dal hozzáadva: \"%2$s\"</string>
<string name="updated_playlist_error">Frissítés sikertelen: \"%s\", próbálja később!</string>
<string name="removed_playlist">%1$s eltávolítva: \"%2$s\"</string>
<string name="delete_playlist">Biztos, hogy törölni akarja? %1$s</string>
<string name="song_details.all">%1$s%2$s</string>
<string name="song_details.kbps">%d kbps</string>
<string name="lyrics.nomatch">Dalszöveg nem található!</string>
<string name="download.visualizer_on">Visualizer be</string>
<string name="equalizer.enabled">Engedélyezve</string>
<string name="equalizer.label">Equalizer</string>
<string name="equalizer.preset">Profil kiválasztása</string>
<string name="error.label">Hiba!</string>
<string name="settings.title">UltraSonic beállításai</string>
<string name="settings.test_connection_title">Kapcsolat tesztelése</string>
<string name="settings.servers_title">Kiszolgálók</string>
<string name="settings.server_unused">Kiszolgáló</string>
<string name="settings.server_unused1">Kiszolgáló 1</string>
<string name="settings.server_unused2">Kiszolgáló 2</string>
<string name="settings.server_unused3">Kiszolgáló 3</string>
<string name="settings.server_name">Név</string>
<string name="settings.server_add_server">Kiszolgáló hozzáadása</string>
<string name="settings.server_number">Kiszolgálók száma</string>
<string name="settings.server_remove_server">Kiszolgáló eltávolítása</string>
<string name="settings.server_address">Kiszolgáló címe</string>
<string name="settings.server_username">Felhasználónév</string>
<string name="settings.server_password">Jelszó</string>
<string name="settings.chat_refresh">Csevegés frissítési időköz</string>
<string name="settings.cache_title">Zene gyorsítótár</string>
<string name="settings.preload">Dalok előolvasása</string>
<string name="settings.cache_size">Gyorsítótár mérete</string>
<string name="help.back">Vissza</string>
<string name="help.close">Bezár</string>
<string name="help.label">Súgó</string>
<string name="help.loading">Betöltés&#8230;</string>
<string name="help.title">Üdvözli az UltraSonic!</string>
<string name="help.url">file:///android_asset/html/en/index.html</string>
<string name="jukebox.is_default">Jukebox alapértelmezettként</string>
<string name="lyrics.nomatch">Dalszöveg nem található!</string>
<string name="main.albums_alphaByArtist">Előadónév szerint</string>
<string name="main.albums_alphaByName">Albumnév szerint</string>
<string name="main.albums_frequent">Legtöbbször lejátszott</string>
<string name="main.albums_highest">Legjobbra értékelt</string>
<string name="main.albums_newest">Utoljára hozzáadott</string>
<string name="main.albums_random">Véletlenszerű</string>
<string name="main.albums_recent">Utoljára lejátszott</string>
<string name="main.albums_starred">Csillagozott</string>
<string name="main.albums_title">Albumok</string>
<string name="main.artists_title">Előadók</string>
<string name="main.genres_title">Műfajok</string>
<string name="main.music">Zenék</string>
<string name="main.offline">Kapcsolat nélküli</string>
<string name="main.select_all_genres">Összes műfaj</string>
<string name="main.select_genre">Műfaj kiválasztása</string>
<string name="main.select_server">Kiszolgáló kiválasztása</string>
<string name="main.settings">Beállítások</string>
<string name="main.shuffle">Véletlen sorrendű</string>
<string name="main.songs_genre">Műfaj szerint</string>
<string name="main.songs_random">Véletlenszerű</string>
<string name="main.songs_starred">Csillagozott</string>
<string name="main.songs_title">Dalok</string>
<string name="main.welcome_text">Üdvözli az UltraSonic! Az alkalmazás még nincs beállítva. Miután konfigurálta saját kiszolgálóját (elérhető: <b>subsonic.org</b>), húzza jobbra a képernyőt, lépjen be a <b>Beállítások</b> menüpontba, és adja meg csatlakozási adatokat!</string>
<string name="main.welcome_title">Üdvözlet!</string>
<string name="menu.about">Névjegy</string>
<string name="menu.add_playlist">Hozzáadás a lejátszási listához</string>
<string name="menu.common">Általános</string>
<string name="menu.deleted_playlist">Törölt lejátszási lista %s</string>
<string name="menu.deleted_playlist_error">Lejátszási lista törlése sikertelen %s</string>
<string name="menu.exit">Kilépés</string>
<string name="menu.help">Súgó</string>
<string name="menu.navigation">Navigáció</string>
<string name="menu.remove_playlist">Törlés a lejátszási listáról</string>
<string name="menu.search">Keresés</string>
<string name="menu.settings">Beállítások</string>
<string name="music_library.label">Mediakönyvtár</string>
<string name="music_library.label_offline">Kapcsolat nélküli médiák</string>
<string name="music_service.retry">Hálózati hiba történt! Újrapróbálkozás %1$d - %2$d.</string>
<string name="parser.artist_count">%d előadó található a médiakönyvtárban.</string>
<string name="parser.not_authenticated">Hibás felhasználónév vagy jelszó!</string>
<string name="parser.not_authorized">Nem engedélyezett! Ellenőrizze a felhasználó jogosultságait a Subsonic kiszolgálón!</string>
<string name="parser.reading">Olvasás a kiszolgálóról&#8230;</string>
<string name="parser.reading_done">Olvasás a kiszolgálóról&#8230; Kész!</string>
<string name="parser.upgrade_client">Nem kompatibilis verzió. Kérjük, frissítse az UltraSonic Android alkalmazást!</string>
<string name="parser.upgrade_server">Nem kompatibilis verzió. Kérjük, frissítse a Subsonic kiszolgálót!</string>
<string name="play_video.loading">Videó betöltése&#8230;</string>
<string name="play_video.noplugin">Kérjük, telepítse az Adobe Flash Player-t a Play Áruházból!</string>
<string name="playlist.label">Lejátszási listák</string>
<string name="playlist.update_info">Módosítás</string>
<string name="playlist.updated_info">Módosított lejátszási lista %s</string>
<string name="playlist.updated_info_error">Lejátszási lista módosítása sikertelen %s</string>
<string name="playlist_error">Nem sikerült elérni a lejátszási lista adatait!</string>
<string name="progress.wait">Kérem várjon!&#8230;</string>
<string name="removed_playlist">%1$s eltávolítva: \"%2$s\"</string>
<string name="search.albums">Albumok</string>
<string name="search.artists">Előadók</string>
<string name="search.label">Keresés</string>
<string name="search.more">Továbbiak</string>
<string name="search.no_match">Nincs találat, próbálja újra!</string>
<string name="search.search">Érintse meg a kereséshez</string>
<string name="search.songs">Dalok</string>
<string name="search.title">Keresés</string>
<string name="select_album.donate_dialog_0_trial_days_left">A próba időszak lejárt!</string>
<string name="select_album.donate_dialog_later">Később</string>
<string name="select_album.donate_dialog_message">Korlátlan letöltéshez juthat a Subsonic támogatásával.</string>
<string name="select_album.donate_dialog_now">Most</string>
<string name="select_album.empty">Nem található média!</string>
<string name="select_album.more">Egyéb</string>
<string name="select_album.n_selected">%d dal kijelölve.</string>
<string name="select_album.n_unselected">%d dal visszavonva.</string>
<string name="select_album.no_network">Figyelem: Hálózat nem áll rendelkezésre!</string>
<string name="select_album.no_sdcard">Hiba: SD kártya nem áll rendelkezésre!</string>
<string name="select_album.not_licensed">A kiszolgálónak nincs licence! %d próba nap van hátra!</string>
<string name="select_album.offline">Kapcsolat nélküli</string>
<string name="select_album.play_all">Összes lejátszása</string>
<string name="select_album.searching">Keresés&#8230;</string>
<string name="select_album.select">Összes kijelölése</string>
<string name="select_artist.all_folders">Összes mappa</string>
<string name="select_artist.empty">Előadók nem találhatók!</string>
<string name="select_artist.folder">Mappa kiválasztása</string>
<string name="select_artist.refresh">Frissítés</string>
<string name="select_genre.empty">Műfajok nem találhatók!</string>
<string name="select_playlist.empty">Nincs mentett lejátszási lista a kiszolgálón.</string>
<string name="service.connecting">Csatlakozás a kiszolgálóhoz, kérem várjon!</string>
<string name="settings.appearance_title">Megjelenítés</string>
<string name="settings.buffer_length">Pufferméret</string>
<string name="settings.buffer_length_0">Letiltva</string>
<string name="settings.buffer_length_1">1 másodperc</string>
<string name="settings.buffer_length_10">10 másodperc</string>
<string name="settings.buffer_length_12">12 másodperc</string>
<string name="settings.buffer_length_120">2 minutes</string>
<string name="settings.buffer_length_15">15 másodperc</string>
<string name="settings.buffer_length_2">2 másodperc</string>
<string name="settings.buffer_length_20">20 másodperc</string>
<string name="settings.buffer_length_30">30 másodperc</string>
<string name="settings.buffer_length_5">5 másodperc</string>
<string name="settings.buffer_length_60">60 másodperc</string>
<string name="settings.buffer_length_8">8 másodperc</string>
<string name="settings.cache_location">Gyorsítótár helye</string>
<string name="settings.cache_location_error">Hibás gyorsítótár hely! Az alapértelmezett használata.</string>
<string name="settings.testing_connection">Kapcsolat tesztelése&#8230;</string>
<string name="settings.testing_ok">Kapcsolat OK!</string>
<string name="settings.testing_unlicensed">Kapcsolat OK! A kiszolgálónak nincs licence!</string>
<string name="settings.cache_size">Gyorsítótár mérete</string>
<string name="settings.cache_size_100">100 MB</string>
<string name="settings.cache_size_1000">1 GB</string>
<string name="settings.cache_size_10000">10 GB</string>
<string name="settings.cache_size_200">200 MB</string>
<string name="settings.cache_size_2000">2 GB</string>
<string name="settings.cache_size_20000">20 GB</string>
<string name="settings.cache_size_500">500 MB</string>
<string name="settings.cache_size_5000">5 GB</string>
<string name="settings.cache_size_unlimited">Korlátlan</string>
<string name="settings.cache_title">Zene gyorsítótár</string>
<string name="settings.chat_refresh">Csevegés frissítési gyakorisága</string>
<string name="settings.clear_bookmark">Könyvjelző törlése</string>
<string name="settings.clear_bookmark_summary">Könyvjelző törlése a dal lejátszása után.</string>
<string name="settings.clear_playlist">Lejátszási lista törlése</string>
<string name="settings.clear_playlist_summary">Lejátszási lista törlése az összes dal lejátszása után.</string>
<string name="settings.clear_search_history">Keresési előzmények törlése</string>
<string name="settings.connection_failure">Csatlakozási hiba!</string>
<string name="settings.default_albums">Alapértelmezett albumok</string>
<string name="settings.default_artists">Alapértelmezett előadók</string>
<string name="settings.default_songs">Alapértelmezett dalok</string>
<string name="settings.directory_cache_time">Könyvtár gyorsítótárazási idő</string>
<string name="settings.directory_cache_time_0">Soha</string>
<string name="settings.directory_cache_time_1">1 perc</string>
<string name="settings.directory_cache_time_10">10 perc</string>
<string name="settings.directory_cache_time_2">2 perc</string>
<string name="settings.directory_cache_time_30">30 perc</string>
<string name="settings.directory_cache_time_5">5 perc</string>
<string name="settings.directory_cache_time_60">1 óra</string>
<string name="settings.disc_sort">Dalok rendezése albumok szerint</string>
<string name="settings.disc_sort_summary">Dalok rendezése albumsorszám és dalsorszám szerint.</string>
<string name="settings.display_bitrate">Bitráta és fájlkiterjesztés megjelenítése</string>
<string name="settings.display_bitrate_summary">Bitráta és fájlkiterjesztés megjelenítése az előadónév mellett.</string>
<string name="settings.download_transition">Letöltés megjelenítése</string>
<string name="settings.download_transition_summary">Letöltési aktivitás megjelenítése a lejátszás indításakor.</string>
<string name="settings.gapless_playback">Egybefüggő lejátszás</string>
<string name="settings.gapless_playback_summary">Kihagyás (dalszünet) nélküli egybefüggő lejátszás (Gapless).</string>
<string name="settings.hide_media_summary">Zenefájlok elrejtése egyéb alkalmazások elől.</string>
<string name="settings.hide_media_title">Elrejtés</string>
<string name="settings.hide_media_toast">A következő alkalomtól lép életbe, amikor az Android zenefájlokat keres a telefonon.</string>
<string name="settings.increment_time">Ugrás időintervalluma</string>
<string name="settings.invalid_url">Adjon meg egy érvényes URL-t!</string>
<string name="settings.invalid_username">Adjon meg egy érvényes felhasználónevet (szóközt nem tartalmazhat)!</string>
<string name="settings.appearance_title">Megjelenítés</string>
<string name="settings.theme_title">Téma</string>
<string name="settings.theme_light">Világos</string>
<string name="settings.theme_dark">Sötét</string>
<string name="settings.network_title">Hálózat</string>
<string name="settings.max_bitrate_wifi">Max. bitráta - Wi-Fi kapcsolat</string>
<string name="settings.max_bitrate_mobile">Max. bitráta - Mobil kapcsolat</string>
<string name="settings.max_bitrate_32">32 Kbps</string>
<string name="settings.max_bitrate_64">64 Kbps</string>
<string name="settings.max_bitrate_80">80 Kbps</string>
<string name="settings.max_bitrate_96">96 Kbps</string>
<string name="settings.max_albums">Max. albumok</string>
<string name="settings.max_artists">Max. előadók</string>
<string name="settings.max_bitrate_112">112 Kbps</string>
<string name="settings.max_bitrate_128">128 Kbps</string>
<string name="settings.max_bitrate_160">160 Kbps</string>
<string name="settings.max_bitrate_192">192 Kbps</string>
<string name="settings.max_bitrate_256">256 Kbps</string>
<string name="settings.max_bitrate_32">32 Kbps</string>
<string name="settings.max_bitrate_320">320 Kbps</string>
<string name="settings.max_bitrate_64">64 Kbps</string>
<string name="settings.max_bitrate_80">80 Kbps</string>
<string name="settings.max_bitrate_96">96 Kbps</string>
<string name="settings.max_bitrate_mobile">Max. bitráta - Mobil kapcsolat</string>
<string name="settings.max_bitrate_unlimited">Korlátlan</string>
<string name="settings.wifi_required_title">Csak Wi-Fi streaming</string>
<string name="settings.wifi_required_summary">Streaming, csak ha rendelkezésre áll Wi-Fi kapcsolat.</string>
<string name="settings.display_bitrate">Bitráta és fájlkiterjesztés megjelenítése</string>
<string name="settings.display_bitrate_summary">Bitráta és fájlkiterjesztés megjelenítése az előadónév mellett.</string>
<string name="settings.use_folder_for_album_artist">Mappanevek használata az előadók neveként</string>
<string name="settings.use_folder_for_album_artist_summary">Feltételezi, hogy a legfelső szintű mappa az elődó neve.</string>
<string name="settings.show_track_number">Sorszám megjelenítése</string>
<string name="settings.show_track_number_summary">Dalok sorszámának megjelenítése.</string>
<string name="settings.preload_1">1 dal</string>
<string name="settings.preload_2">2 dal</string>
<string name="settings.preload_3">3 dal</string>
<string name="settings.preload_5">5 dal</string>
<string name="settings.preload_10">10 dal</string>
<string name="settings.preload_unlimited">Korlátlan</string>
<string name="settings.cache_size_100">100 MB</string>
<string name="settings.cache_size_200">200 MB</string>
<string name="settings.cache_size_500">500 MB</string>
<string name="settings.cache_size_1000">1 GB</string>
<string name="settings.cache_size_2000">2 GB</string>
<string name="settings.cache_size_5000">5 GB</string>
<string name="settings.cache_size_10000">10 GB</string>
<string name="settings.cache_size_20000">20 GB</string>
<string name="settings.cache_size_unlimited">Korlátlan</string>
<string name="settings.clear_search_history">Keresési előzmények törlése</string>
<string name="settings.search_history_cleared">Keresési előzmények törölve.</string>
<string name="settings.other_title">Egyéb beállítások</string>
<string name="settings.search_title">Keresés beállításai</string>
<string name="settings.playback_control_title">Lejátszás-vezérlés beállításai</string>
<string name="settings.scrobble_title">Továbbítás Last.fm-re (Scrobbling)</string>
<string name="settings.scrobble_summary">A Last.fm felhasználónevet és jelszót be kell állítani a Subsonic kiszolgálón!</string>
<string name="settings.server_scaling_title">Albumborító átméretezés (Kiszolgáló-oldali)</string>
<string name="settings.server_scaling_summary">Teljes méretű helyett átméretezett képek letöltése a kiszolgálóról (sávszélesség-takarékos).</string>
<string name="settings.hide_media_title">Elrejtés</string>
<string name="settings.hide_media_summary">Zenefájlok elrejtése egyéb alkalmazások elől.</string>
<string name="settings.hide_media_toast">A következő alkalomtól lép életbe, amikor az Android zenefájlokat keres a telefonon.</string>
<string name="settings.media_button_title">Média vezérlőgombok</string>
<string name="settings.max_bitrate_wifi">Max. bitráta - Wi-Fi kapcsolat</string>
<string name="settings.max_songs">Max. dalok</string>
<string name="settings.media_button_summary">Telefon irányítása a bluetooth eszköz, vagy a fülhallgató vezérlőgombjaival.</string>
<string name="settings.screen_lit_title">Képernyő ébrentartása</string>
<string name="settings.screen_lit_summary">Képernyő ébrentartása a letöltési sebesség növelése érdekében.</string>
<string name="settings.buffer_length">Pufferméret</string>
<string name="settings.media_button_title">Média vezérlőgombok</string>
<string name="settings.network_timeout">Hálózati időtúllépés</string>
<string name="settings.buffer_length_0">Rokkant</string>
<string name="settings.buffer_length_1">1 másodperc</string>
<string name="settings.buffer_length_2">2 másodperc</string>
<string name="settings.buffer_length_5">5 másodperc</string>
<string name="settings.buffer_length_8">8 másodperc</string>
<string name="settings.buffer_length_10">10 másodperc</string>
<string name="settings.buffer_length_12">12 másodperc</string>
<string name="settings.buffer_length_15">15 másodperc</string>
<string name="settings.buffer_length_20">20 másodperc</string>
<string name="settings.buffer_length_30">30 másodperc</string>
<string name="settings.buffer_length_60">60 másodperc</string>
<string name="settings.network_timeout_105000">105 másodperc</string>
<string name="settings.network_timeout_120000">120 másodperc</string>
<string name="settings.network_timeout_15000">15 másodperc</string>
<string name="settings.network_timeout_30000">30 másodperc</string>
<string name="settings.network_timeout_45000">45 másodperc</string>
<string name="settings.network_timeout_60000">60 másodperc</string>
<string name="settings.network_timeout_75000">75 másodperc</string>
<string name="settings.network_timeout_90000">90 másodperc</string>
<string name="settings.network_timeout_105000">105 másodperc</string>
<string name="settings.network_timeout_120000">120 másodperc</string>
<string name="settings.show_notification">Értesítések megjelenítése</string>
<string name="settings.show_notification_summary">Lejátszás jelzése az értesítési sávon.</string>
<string name="settings.show_notification_always">Állandó kijelzés</string>
<string name="settings.show_notification_always_summary">Lejátszás jelzése az értesítési sávon, míg a lejátszási lista aktív.</string>
<string name="settings.show_lockscreen_controls">Képernyőzár kezelése</string>
<string name="settings.show_lockscreen_controls_summary">Lejátszó-kezelőpanel megjelenítése a képernyőzáron.</string>
<string name="settings.use_stream_proxy">Stream Proxy használata</string>
<string name="settings.use_stream_proxy_summary">Média lejátszása stream proxy-n keresztül (akadozások elkerülése érdekében).</string>
<string name="settings.download_transition">Letöltés megjelenítése</string>
<string name="settings.download_transition_summary">Letöltési aktivitás megjelenítése a lejátszás indításakor.</string>
<string name="settings.gapless_playback">Egybefüggő lejátszás</string>
<string name="settings.gapless_playback_summary">Kihagyás (dalszünet) nélküli egybefüggő lejátszás (Gapless).</string>
<string name="settings.show_now_playing">Lejátszó-kezelőpanel</string>
<string name="settings.show_now_playing_summary">Lejátszó-kezelőpanel megjelenítése minden oldalon.</string>
<string name="settings.max_albums">Max. albumok</string>
<string name="settings.network_title">Hálózat</string>
<string name="settings.other_title">Egyéb beállítások</string>
<string name="settings.playback_control_title">Lejátszás-vezérlés beállításai</string>
<string name="settings.preload">Dalok előolvasása</string>
<string name="settings.preload_1">1 dal</string>
<string name="settings.preload_10">10 dal</string>
<string name="settings.preload_2">2 dal</string>
<string name="settings.preload_3">3 dal</string>
<string name="settings.preload_5">5 dal</string>
<string name="settings.preload_unlimited">Korlátlan</string>
<string name="settings.screen_lit_summary">Képernyő ébrentartása a letöltési sebesség növelése érdekében.</string>
<string name="settings.screen_lit_title">Képernyő ébrentartása</string>
<string name="settings.scrobble_summary">A Last.fm felhasználónevet és jelszót be kell állítani a Subsonic kiszolgálón!</string>
<string name="settings.scrobble_title">Továbbítás Last.fm-re (Scrobbling)</string>
<string name="settings.search_1">1</string>
<string name="settings.search_3">3</string>
<string name="settings.search_5">5</string>
<string name="settings.search_10">10</string>
<string name="settings.search_100">100</string>
<string name="settings.search_15">15</string>
<string name="settings.search_20">20</string>
<string name="settings.search_25">25</string>
<string name="settings.search_250">250</string>
<string name="settings.search_3">3</string>
<string name="settings.search_30">30</string>
<string name="settings.search_40">40</string>
<string name="settings.search_5">5</string>
<string name="settings.search_50">50</string>
<string name="settings.search_75">75</string>
<string name="settings.search_100">100</string>
<string name="settings.search_250">250</string>
<string name="settings.search_500">500</string>
<string name="settings.max_artists">Max. előadók</string>
<string name="settings.max_songs">Max. dalok</string>
<string name="settings.default_artists">Alapértelmezett előadók</string>
<string name="settings.default_albums">Alapértelmezett albumok</string>
<string name="settings.default_songs">Alapértelmezett dalok</string>
<string name="settings.increment_time">Ugrás időintervalluma</string>
<string name="settings.search_75">75</string>
<string name="settings.search_history_cleared">Keresési előzmények törölve.</string>
<string name="settings.search_title">Keresés beállításai</string>
<string name="settings.server_add_server">Kiszolgáló hozzáadása</string>
<string name="settings.server_address">Kiszolgáló címe</string>
<string name="settings.server_name">Név</string>
<string name="settings.server_number">Kiszolgálók száma</string>
<string name="settings.server_password">Jelszó</string>
<string name="settings.server_remove_server">Kiszolgáló eltávolítása</string>
<string name="settings.server_scaling_summary">Teljes méretű helyett átméretezett képek letöltése a kiszolgálóról (sávszélesség-takarékos).</string>
<string name="settings.server_scaling_title">Albumborító átméretezés (Kiszolgáló-oldali)</string>
<string name="settings.server_unused">Kiszolgáló</string>
<string name="settings.server_unused1">Kiszolgáló 1</string>
<string name="settings.server_unused2">Kiszolgáló 2</string>
<string name="settings.server_unused3">Kiszolgáló 3</string>
<string name="settings.server_username">Felhasználónév</string>
<string name="settings.servers_title">Kiszolgálók</string>
<string name="settings.show_lockscreen_controls">Képernyőzár kezelése</string>
<string name="settings.show_lockscreen_controls_summary">Lejátszó-kezelőpanel megjelenítése a képernyőzáron.</string>
<string name="settings.show_notification">Értesítések megjelenítése</string>
<string name="settings.show_notification_always">Állandó kijelzés</string>
<string name="settings.show_notification_always_summary">Lejátszás jelzése az értesítési sávon, míg a lejátszási lista aktív.</string>
<string name="settings.show_notification_summary">Lejátszás jelzése az értesítési sávon.</string>
<string name="settings.show_now_playing">Lejátszó-kezelőpanel</string>
<string name="settings.show_now_playing_summary">Lejátszó-kezelőpanel megjelenítése minden oldalon.</string>
<string name="settings.show_track_number">Sorszám megjelenítése</string>
<string name="settings.show_track_number_summary">Dalok sorszámának megjelenítése.</string>
<string name="settings.test_connection_title">Kapcsolat tesztelése</string>
<string name="settings.testing_connection">Kapcsolat tesztelése&#8230;</string>
<string name="settings.testing_ok">Kapcsolat OK!</string>
<string name="settings.testing_unlicensed">Kapcsolat OK! A kiszolgálónak nincs licence!</string>
<string name="settings.theme_dark">Sötét</string>
<string name="settings.theme_light">Világos</string>
<string name="settings.theme_title">Téma</string>
<string name="settings.title">UltraSonic beállításai</string>
<string name="settings.use_folder_for_album_artist">Mappanevek használata az előadók neveként</string>
<string name="settings.use_folder_for_album_artist_summary">Feltételezi, hogy a legfelső szintű mappa az elődó neve.</string>
<string name="settings.use_id3">Böngészés ID3 Tag használatával</string>
<string name="settings.use_id3_summary">ID3 Tag módszer használata a fájlredszer alapú mód helyett.</string>
<string name="shuffle.startYear">Első év:</string>
<string name="shuffle.endYear">Utolsó év:</string>
<string name="shuffle.genre">Műfaj:</string>
<string name="music_service.retry">Hálózati hiba történt! Újrapróbálkozás %1$d - %2$d.</string>
<string name="background_task.wait">Kérem várjon!&#8230;</string>
<string name="background_task.loading">Betöltés...</string>
<string name="background_task.no_network">Az alkalmazás hálózati hozzáférést igényel. Kérjük, kapcsolja be a Wi-Fi-t vagy a mobilhálózatot!</string>
<string name="background_task.network_error">Hálózati hiba történt! Kérjük, ellenőrizze a kiszolgáló címét vagy próbálja később!</string>
<string name="background_task.not_found">Az erőforrás nem található! Kérjük, ellenőrizze a kiszolgáló címét!</string>
<string name="background_task.parse_error">Értelmezhetetlen válasz! Kérjük, ellenőrizze a kiszolgáló címét!</string>
<string name="service.connecting">Csatlakozás a kiszolgálóhoz, kérem várjon!</string>
<string name="parser.reading">Olvasás a kiszolgálóról...</string>
<string name="parser.reading_done">Olvasás a kiszolgálóról... Kész!</string>
<string name="parser.upgrade_client">Nem kompatibilis verzió. Kérjük, frissítse az UltraSonic Android alkalmazást!</string>
<string name="parser.upgrade_server">Nem kompatibilis verzió. Kérjük, frissítse a Subsonic kiszolgálót!</string>
<string name="parser.not_authenticated">Hibás felhasználónév vagy jelszó!</string>
<string name="parser.not_authorized">Nem engedélyezett! Ellenőrizze a felhasználó jogosultságait a Subsonic kiszolgálón!</string>
<string name="parser.artist_count">%d előadó található a médiakönyvtárban.</string>
<string name="select_artist.refresh">Frissítés</string>
<string name="select_artist.folder">Mappa kiválasztása</string>
<string name="select_artist.all_folders">Összes mappa</string>
<string name="equalizer.label">Equalizer</string>
<string name="equalizer.enabled">Engedélyezve</string>
<string name="equalizer.preset">Profil kiválasztása</string>
<string name="settings.use_stream_proxy">Stream Proxy használata</string>
<string name="settings.use_stream_proxy_summary">Média lejátszása stream proxy-n keresztül (akadozások elkerülése érdekében).</string>
<string name="settings.wifi_required_summary">Streaming, csak ha rendelkezésre áll Wi-Fi kapcsolat.</string>
<string name="settings.wifi_required_title">Csak Wi-Fi streaming</string>
<string name="shuffle.endYear">Utolsó év:</string>
<string name="shuffle.genre">Műfaj:</string>
<string name="shuffle.startYear">Első év:</string>
<string name="song_details.all">%1$s%2$s</string>
<string name="song_details.kbps">%d kbps</string>
<string name="updated_playlist">%1$s dal hozzáadva: \"%2$s\"</string>
<string name="updated_playlist_error">Frissítés sikertelen: \"%s\", próbálja később!</string>
<string name="util.bytes_format.byte">0 B</string>
<string name="util.bytes_format.gigabyte">0.00 GB</string>
<string name="util.bytes_format.kilobyte">0 KB</string>
<string name="util.bytes_format.megabyte">0.00 MB</string>
<string name="util.no_time">-:--</string>
<string name="util.zero_time">0:00</string>
<string name="widget.initial_text">Érintse meg a zene kiválasztásához</string>
<string name="widget.sdcard_busy">Az SD kártya nem elérhető!</string>
<string name="widget.sdcard_missing">Nincs SD kártya!</string>
<string name="util.bytes_format.gigabyte">0.00 GB</string>
<string name="util.bytes_format.megabyte">0.00 MB</string>
<string name="util.bytes_format.kilobyte">0 KB</string>
<string name="util.bytes_format.byte">0 B</string>
<string name="util.no_time">-:--</string>
<string name="util.zero_time">0:00</string>
<string name="chat.send_a_message">Üzenet küldése</string>
<plurals name="select_album_n_songs">
<item quantity="zero">Nincsenek dalok</item>
@ -327,6 +349,10 @@
<item quantity="one">1 dal kijelölve tárolásra.</item>
<item quantity="other">%d dal kijelölve tárolásra.</item>
</plurals>
<plurals name="select_album_n_songs_downloaded">
<item quantity="one">1 dal kijelölve letöltésre.</item>
<item quantity="other">%d dal kijelölve letöltésre.</item>
</plurals>
<plurals name="select_album_n_songs_unpinned">
<item quantity="one">1 dal tárolása visszavonva.</item>
<item quantity="other">%d dal tárolása visszavonva.</item>

View File

@ -16,5 +16,6 @@
<color name="ics_opaque">#8033b5e5</color>
<color name="md__transparent">#00000000</color>
<color name="opaque">#B0000000</color>
<color name="translucent">#80000000</color>
<color name="md__defaultBackground">#FF555555</color>
</resources>

View File

@ -1,343 +1,344 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="common.appname">UltraSonic</string>
<string name="common.ok">OK</string>
<string name="common.save">Save</string>
<string name="common.cancel">Cancel</string>
<string name="common.play_now">Play Now</string>
<string name="common.play_next">Play Next</string>
<string name="common.play_last">Play Last</string>
<string name="common.pin">Pin</string>
<string name="common.unpin">Unpin</string>
<string name="common.download">Download</string>
<string name="common.delete">Delete</string>
<string name="common.various_artists">Various Artists</string>
<string name="common.multiple_genres">Multiple Genres</string>
<string name="common.info">Details</string>
<string name="common.play_shuffled">Play Shuffled</string>
<string name="common.confirm">Confirm</string>
<string name="common.name">Name</string>
<string name="common.comment">Comment</string>
<string name="common.public">Public</string>
<string name="common.show_artist">Show Artist</string>
<string name="button_bar.home">UltraSonic Main</string>
<string name="background_task.loading">Loading&#8230;</string>
<string name="background_task.network_error">A network error occurred. Please check the server address or try again later.</string>
<string name="background_task.no_network">This program requires network access. Please turn on Wi-Fi or mobile network.</string>
<string name="background_task.not_found">Resource not found. Please check the server address.</string>
<string name="background_task.parse_error">Didn\'t understand the reply. Please check the server address.</string>
<string name="background_task.wait">Please wait&#8230;</string>
<string name="button_bar.bookmarks">Bookmarks</string>
<string name="button_bar.browse">Media Library</string>
<string name="button_bar.search">Search</string>
<string name="button_bar.chat">Chat</string>
<string name="button_bar.playlists">Playlists</string>
<string name="button_bar.home">UltraSonic Main</string>
<string name="button_bar.now_playing">Now Playing</string>
<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</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</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>
<string name="menu.about">About</string>
<string name="menu.search">Search</string>
<string name="menu.navigation">Navigation</string>
<string name="menu.common">Common</string>
<string name="menu.add_playlist">Add To Playlist</string>
<string name="menu.remove_playlist">Remove From Playlist</string>
<string name="menu.deleted_playlist">Deleted playlist %s</string>
<string name="menu.deleted_playlist_error">Failed to delete playlist %s</string>
<string name="playlist.label">Playlists</string>
<string name="playlist.update_info">Update Information</string>
<string name="playlist.updated_info">Updated playlist information for %s</string>
<string name="playlist.updated_info_error">Failed to update playlist information for %s</string>
<string name="help.label">Help</string>
<string name="help.title">Welcome to UltraSonic</string>
<string name="help.back">Back</string>
<string name="help.close">Close</string>
<string name="help.url">file:///android_asset/html/en/index.html</string>
<string name="help.loading">Loading&#8230;</string>
<string name="play_video.loading">Loading video&#8230;</string>
<string name="play_video.noplugin">Please install Adobe Flash Player from Android Market.</string>
<string name="search.label">Search</string>
<string name="search.title">Search</string>
<string name="search.search">Click to search</string>
<string name="search.no_match">No matches, please try again</string>
<string name="search.artists">Artists</string>
<string name="search.albums">Albums</string>
<string name="search.songs">Songs</string>
<string name="search.more">Show More</string>
<string name="progress.wait">Please wait&#8230;</string>
<string name="music_library.label">Media Library</string>
<string name="music_library.label_offline">Offline Media</string>
<string name="select_album.empty">No media found</string>
<string name="select_album.select">Select All</string>
<string name="select_album.n_selected">%d tracks selected.</string>
<string name="select_album.n_unselected">%d tracks unselected.</string>
<string name="select_album.more">More</string>
<string name="select_album.offline">Offline</string>
<string name="select_album.searching">Searching&#8230;</string>
<string name="select_album.play_all">Play All</string>
<string name="select_album.no_sdcard">Error: No SD card available.</string>
<string name="select_album.no_network">Warning: No network available.</string>
<string name="select_album.not_licensed">Server not licensed. %d trial days left.</string>
<string name="select_album.donate_dialog_message">Get unlimited downloads by donating to Subsonic.</string>
<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="button_bar.playlists">Playlists</string>
<string name="button_bar.search">Search</string>
<string name="chat.send_a_message">Send a message</string>
<string name="common.appname">UltraSonic</string>
<string name="common.cancel">Cancel</string>
<string name="common.comment">Comment</string>
<string name="common.confirm">Confirm</string>
<string name="common.delete">Delete</string>
<string name="common.download">Download</string>
<string name="common.info">Details</string>
<string name="common.multiple_genres">Multiple Genres</string>
<string name="common.name">Name</string>
<string name="common.ok">OK</string>
<string name="common.pin">Pin</string>
<string name="common.play_last">Play Last</string>
<string name="common.play_next">Play Next</string>
<string name="common.play_now">Play Now</string>
<string name="common.play_shuffled">Play Shuffled</string>
<string name="common.public">Public</string>
<string name="common.save">Save</string>
<string name="common.show_artist">Show Artist</string>
<string name="common.unpin">Unpin</string>
<string name="common.various_artists">Various Artists</string>
<string name="delete_playlist">Do you want to delete %1$s</string>
<string name="download.bookmark_removed" formatted="false">Bookmark removed.</string>
<string name="download.bookmark_set_at_position" formatted="false">Bookmark set at %s.</string>
<string name="download.empty">Playlist is empty</string>
<string name="download.playerstate_downloading">Downloading - %s</string>
<string name="download.playerstate_buffering">Buffering</string>
<string name="download.playerstate_playing_shuffle">Playing shuffle</string>
<string name="download.menu_show_album">Show Album</string>
<string name="download.jukebox_not_authorized">Remote control is not allowed. Please enable jukebox mode in <b>Users &gt; Settings</b> on your Subsonic server.</string>
<string name="download.jukebox_off">Turned off remote control. Music is played on phone.</string>
<string name="download.jukebox_offline">Remote control is not available in offline mode.</string>
<string name="download.jukebox_on">Turned on remote control. Music is played on server.</string>
<string name="download.jukebox_server_too_old">Remote control is not supported. Please upgrade your Subsonic server.</string>
<string name="download.jukebox_volume">Remote Volume</string>
<string name="download.menu_equalizer">Equalizer</string>
<string name="download.menu_jukebox_off">Jukebox Off</string>
<string name="download.menu_jukebox_on">Jukebox On</string>
<string name="download.menu_lyrics">Lyrics</string>
<string name="download.menu_remove">Remove Song</string>
<string name="download.menu_remove_all">Remove All</string>
<string name="download.menu_screen_on">Screen On</string>
<string name="download.menu_screen_off">Screen Off</string>
<string name="download.menu_shuffle">Shuffle</string>
<string name="download.menu_save">Save Playlist</string>
<string name="download.menu_equalizer">Equalizer</string>
<string name="download.menu_visualizer">Visualizer</string>
<string name="download.menu_jukebox">Jukebox</string>
<string name="download.menu_screen_off">Screen Off</string>
<string name="download.menu_screen_on">Screen On</string>
<string name="download.menu_show_album">Show Album</string>
<string name="download.menu_shuffle">Shuffle</string>
<string name="download.menu_shuffle_notification">Playlist was shuffled</string>
<string name="download.playlist_title">Save Playlist</string>
<string name="download.playlist_name">Enter the playlist name:</string>
<string name="download.playlist_saving">Saving playlist \"%s\"&#8230;</string>
<string name="download.menu_visualizer">Visualizer</string>
<string name="download.playerstate_buffering">Buffering</string>
<string name="download.playerstate_downloading">Downloading - %s</string>
<string name="download.playerstate_playing_shuffle">Playing shuffle</string>
<string name="download.playlist_done">Playlist was successfully saved.</string>
<string name="download.playlist_error">Failed to save playlist, please try later.</string>
<string name="download.repeat_off">Repeat Off</string>
<string name="download.playlist_name">Enter the playlist name:</string>
<string name="download.playlist_saving">Saving playlist \"%s\"&#8230;</string>
<string name="download.playlist_title">Save Playlist</string>
<string name="download.repeat_all">Repeat All</string>
<string name="download.repeat_off">Repeat Off</string>
<string name="download.repeat_single">Repeat Song</string>
<string name="download.visualizer_on">Turned on visualizer.</string>
<string name="download.visualizer_off">Turned off visualizer.</string>
<string name="download.jukebox_on">Turned on remote control. Music is played on server.</string>
<string name="download.jukebox_off">Turned off remote control. Music is played on phone.</string>
<string name="download.jukebox_volume">Remote Volume</string>
<string name="download.jukebox_server_too_old">Remote control is not supported. Please upgrade your Subsonic server.</string>
<string name="download.jukebox_offline">Remote control is not available in offline mode.</string>
<string name="download.jukebox_not_authorized">Remote control is not allowed. Please enable jukebox mode in <b>Users &gt; Settings</b> on your Subsonic server.</string>
<string name="playlist_error">Failed to grab list of playlists</string>
<string name="updated_playlist">Added %1$s songs to \"%2$s\"</string>
<string name="updated_playlist_error">Failed to update \"%s\", please try later.</string>
<string name="removed_playlist">Removed %1$s songs from \"%2$s\"</string>
<string name="delete_playlist">Do you want to delete %1$s</string>
<string name="song_details.all">%1$s%2$s</string>
<string name="song_details.kbps">%d kbps</string>
<string name="lyrics.nomatch">No lyrics found</string>
<string name="download.visualizer_on">Turned on visualizer.</string>
<string name="equalizer.enabled">Enabled</string>
<string name="equalizer.label">Equalizer</string>
<string name="equalizer.preset">Select Preset</string>
<string name="error.label">Error</string>
<string name="settings.title">UltraSonic Settings</string>
<string name="settings.test_connection_title">Test Connection</string>
<string name="settings.servers_title">Servers</string>
<string name="settings.server_unused">Unused</string>
<string name="settings.server_unused1">Unused 1</string>
<string name="settings.server_unused2">Unused 2</string>
<string name="settings.server_unused3">Unused 3</string>
<string name="settings.server_name">Name</string>
<string name="settings.server_add_server">Add Server</string>
<string name="settings.server_number">Number Of Servers</string>
<string name="settings.server_remove_server">Remove Server</string>
<string name="settings.server_address">Server Address</string>
<string name="settings.server_username">Username</string>
<string name="settings.server_password">Password</string>
<string name="settings.chat_refresh">Chat Refresh Interval</string>
<string name="settings.cache_title">Music Cache</string>
<string name="settings.preload">Songs To Preload</string>
<string name="settings.directory_cache_time">Directory Cache Time</string>
<string name="settings.cache_size">Cache Size</string>
<string name="help.back">Back</string>
<string name="help.close">Close</string>
<string name="help.label">Help</string>
<string name="help.loading">Loading&#8230;</string>
<string name="help.title">Welcome to UltraSonic</string>
<string name="help.url">file:///android_asset/html/en/index.html</string>
<string name="jukebox.is_default">Jukebox By Default</string>
<string name="lyrics.nomatch">No lyrics found</string>
<string name="main.albums_alphaByArtist">By Artist</string>
<string name="main.albums_alphaByName">By Name</string>
<string name="main.albums_frequent">Most Played</string>
<string name="main.albums_highest">Top Rated</string>
<string name="main.albums_newest">Recently Added</string>
<string name="main.albums_random">Random</string>
<string name="main.albums_recent">Recently Played</string>
<string name="main.albums_starred">Starred</string>
<string name="main.albums_title">Albums</string>
<string name="main.artists_title">Artists</string>
<string name="main.genres_title">Genres</string>
<string name="main.music">Music</string>
<string name="main.offline">Offline</string>
<string name="main.select_all_genres">All Genres</string>
<string name="main.select_genre">Select Genre</string>
<string name="main.select_server">Select Server</string>
<string name="main.settings">Settings</string>
<string name="main.shuffle">Shuffle Play</string>
<string name="main.songs_genre">By Genre</string>
<string name="main.songs_random">Random</string>
<string name="main.songs_starred">Starred</string>
<string name="main.songs_title">Songs</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.welcome_title">Welcome!</string>
<string name="menu.about">About</string>
<string name="menu.add_playlist">Add To Playlist</string>
<string name="menu.common">Common</string>
<string name="menu.deleted_playlist">Deleted playlist %s</string>
<string name="menu.deleted_playlist_error">Failed to delete playlist %s</string>
<string name="menu.exit">Exit</string>
<string name="menu.help">Help</string>
<string name="menu.navigation">Navigation</string>
<string name="menu.remove_playlist">Remove From Playlist</string>
<string name="menu.search">Search</string>
<string name="menu.settings">Settings</string>
<string name="music_library.label">Media Library</string>
<string name="music_library.label_offline">Offline Media</string>
<string name="music_service.retry">A network error occurred. Retrying %1$d of %2$d.</string>
<string name="parser.artist_count">Got %d Artists.</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.reading">Reading from server.</string>
<string name="parser.reading_done">Reading from server. Done!</string>
<string name="parser.upgrade_client">Incompatible versions. Please upgrade UltraSonic Android app.</string>
<string name="parser.upgrade_server">Incompatible versions. Please upgrade Subsonic server.</string>
<string name="play_video.loading">Loading video&#8230;</string>
<string name="play_video.noplugin">Please install Adobe Flash Player from Android Market.</string>
<string name="playlist.label">Playlists</string>
<string name="playlist.update_info">Update Information</string>
<string name="playlist.updated_info">Updated playlist information for %s</string>
<string name="playlist.updated_info_error">Failed to update playlist information for %s</string>
<string name="playlist_error">Failed to grab list of playlists</string>
<string name="progress.wait">Please wait&#8230;</string>
<string name="removed_playlist">Removed %1$s songs from \"%2$s\"</string>
<string name="search.albums">Albums</string>
<string name="search.artists">Artists</string>
<string name="search.label">Search</string>
<string name="search.more">Show More</string>
<string name="search.no_match">No matches, please try again</string>
<string name="search.search">Click to search</string>
<string name="search.songs">Songs</string>
<string name="search.title">Search</string>
<string name="select_album.donate_dialog_0_trial_days_left">Trial period is over</string>
<string name="select_album.donate_dialog_later">Later</string>
<string name="select_album.donate_dialog_message">Get unlimited downloads by donating to Subsonic.</string>
<string name="select_album.donate_dialog_now">Now</string>
<string name="select_album.empty">No media found</string>
<string name="select_album.more">More</string>
<string name="select_album.n_selected">%d tracks selected.</string>
<string name="select_album.n_unselected">%d tracks unselected.</string>
<string name="select_album.no_network">Warning: No network available.</string>
<string name="select_album.no_sdcard">Error: No SD card available.</string>
<string name="select_album.not_licensed">Server not licensed. %d trial days left.</string>
<string name="select_album.offline">Offline</string>
<string name="select_album.play_all">Play All</string>
<string name="select_album.searching">Searching&#8230;</string>
<string name="select_album.select">Select All</string>
<string name="select_artist.all_folders">All Folders</string>
<string name="select_artist.empty">No artists found</string>
<string name="select_artist.folder">Select Folder</string>
<string name="select_artist.refresh">Refresh</string>
<string name="select_genre.empty">No genres found</string>
<string name="select_playlist.empty">No saved playlists on server</string>
<string name="service.connecting">Contacting server, please wait.</string>
<string name="settings.appearance_title">Appearance</string>
<string name="settings.buffer_length">Buffer Length</string>
<string name="settings.buffer_length_0">Disabled</string>
<string name="settings.buffer_length_1">1 second</string>
<string name="settings.buffer_length_10">10 seconds</string>
<string name="settings.buffer_length_12">12 seconds</string>
<string name="settings.buffer_length_120">2 minutes</string>
<string name="settings.buffer_length_15">15 seconds</string>
<string name="settings.buffer_length_2">2 seconds</string>
<string name="settings.buffer_length_20">20 seconds</string>
<string name="settings.buffer_length_30">30 seconds</string>
<string name="settings.buffer_length_5">5 seconds</string>
<string name="settings.buffer_length_60">1 minute</string>
<string name="settings.buffer_length_8">8 seconds</string>
<string name="settings.cache_location">Cache Location</string>
<string name="settings.cache_location_error">Invalid cache location. Using default.</string>
<string name="settings.testing_connection">Testing connection&#8230;</string>
<string name="settings.testing_ok">Connection is OK</string>
<string name="settings.testing_unlicensed">Connection is OK. Server unlicensed.</string>
<string name="settings.cache_size">Cache Size</string>
<string name="settings.cache_size_100">100 MB</string>
<string name="settings.cache_size_1000">1 GB</string>
<string name="settings.cache_size_10000">10 GB</string>
<string name="settings.cache_size_200">200 MB</string>
<string name="settings.cache_size_2000">2 GB</string>
<string name="settings.cache_size_20000">20 GB</string>
<string name="settings.cache_size_500">500 MB</string>
<string name="settings.cache_size_5000">5 GB</string>
<string name="settings.cache_size_unlimited">Unlimited</string>
<string name="settings.cache_title">Music Cache</string>
<string name="settings.chat_refresh">Chat Refresh Interval</string>
<string name="settings.clear_bookmark">Clear Bookmark</string>
<string name="settings.clear_bookmark_summary">Clear bookmark upon completion of playback of a song</string>
<string name="settings.clear_playlist">Clear Playlist</string>
<string name="settings.clear_playlist_summary">Clear the playlist upon completion of playback of all songs</string>
<string name="settings.clear_search_history">Clear Search History</string>
<string name="settings.connection_failure">Connection failure.</string>
<string name="settings.default_albums">Default Albums</string>
<string name="settings.default_artists">Default Artists</string>
<string name="settings.default_songs">Default Songs</string>
<string name="settings.directory_cache_time">Directory Cache Time</string>
<string name="settings.directory_cache_time_0">Disabled</string>
<string name="settings.directory_cache_time_1">1 minute</string>
<string name="settings.directory_cache_time_10">10 minutes</string>
<string name="settings.directory_cache_time_2">2 minutes</string>
<string name="settings.directory_cache_time_30">30 minutes</string>
<string name="settings.directory_cache_time_5">5 minutes</string>
<string name="settings.directory_cache_time_60">1 hour</string>
<string name="settings.disc_sort">Sort Songs By Disc</string>
<string name="settings.disc_sort_summary">Sort song list by disc number and track number</string>
<string name="settings.display_bitrate">Display Bitrate And File Suffix</string>
<string name="settings.display_bitrate_summary">Append artist name with bitrate and file suffix</string>
<string name="settings.download_transition">Show Downloads On Play</string>
<string name="settings.download_transition_summary">Transition to download activity when starting playback</string>
<string name="settings.gapless_playback">Gapless Playback</string>
<string name="settings.gapless_playback_summary">Enable gapless playback</string>
<string name="settings.hide_media_summary">Hide music files from other apps.</string>
<string name="settings.hide_media_title">Hide From Other</string>
<string name="settings.hide_media_toast">Takes effect next time Android scans your phone for music.</string>
<string name="settings.increment_time">Skip Interval</string>
<string name="settings.invalid_url">Please specify a valid URL.</string>
<string name="settings.invalid_username">Please specify a valid username (no trailing spaces).</string>
<string name="settings.appearance_title">Appearance</string>
<string name="settings.theme_title">Theme</string>
<string name="settings.theme_light">Light</string>
<string name="settings.theme_dark">Dark</string>
<string name="settings.network_title">Network</string>
<string name="settings.max_bitrate_wifi">Max Bitrate - Wi-Fi</string>
<string name="settings.max_bitrate_mobile">Max Bitrate - Mobile</string>
<string name="settings.max_bitrate_32">32 Kbps</string>
<string name="settings.max_bitrate_64">64 Kbps</string>
<string name="settings.max_bitrate_80">80 Kbps</string>
<string name="settings.max_bitrate_96">96 Kbps</string>
<string name="settings.max_albums">Max Albums</string>
<string name="settings.max_artists">Max Artists</string>
<string name="settings.max_bitrate_112">112 Kbps</string>
<string name="settings.max_bitrate_128">128 Kbps</string>
<string name="settings.max_bitrate_160">160 Kbps</string>
<string name="settings.max_bitrate_192">192 Kbps</string>
<string name="settings.max_bitrate_256">256 Kbps</string>
<string name="settings.max_bitrate_32">32 Kbps</string>
<string name="settings.max_bitrate_320">320 Kbps</string>
<string name="settings.max_bitrate_64">64 Kbps</string>
<string name="settings.max_bitrate_80">80 Kbps</string>
<string name="settings.max_bitrate_96">96 Kbps</string>
<string name="settings.max_bitrate_mobile">Max Bitrate - Mobile</string>
<string name="settings.max_bitrate_unlimited">Unlimited</string>
<string name="settings.wifi_required_title">Wi-Fi Streaming Only</string>
<string name="settings.wifi_required_summary">Only stream media if connected to Wi-Fi</string>
<string name="settings.display_bitrate">Display Bitrate And File Suffix</string>
<string name="settings.display_bitrate_summary">Append artist name with bitrate and file suffix</string>
<string name="settings.use_folder_for_album_artist">Use Folders For Artist Name</string>
<string name="settings.use_folder_for_album_artist_summary">Assume top-level folder is the name of the album artist</string>
<string name="settings.show_track_number">Show Track Number</string>
<string name="settings.show_track_number_summary">Include track number when displaying a song</string>
<string name="settings.preload_1">1 song</string>
<string name="settings.preload_2">2 songs</string>
<string name="settings.preload_3">3 songs</string>
<string name="settings.preload_5">5 songs</string>
<string name="settings.preload_10">10 songs</string>
<string name="settings.preload_unlimited">Unlimited</string>
<string name="settings.cache_size_100">100 MB</string>
<string name="settings.cache_size_200">200 MB</string>
<string name="settings.cache_size_500">500 MB</string>
<string name="settings.cache_size_1000">1 GB</string>
<string name="settings.cache_size_2000">2 GB</string>
<string name="settings.cache_size_5000">5 GB</string>
<string name="settings.cache_size_10000">10 GB</string>
<string name="settings.cache_size_20000">20 GB</string>
<string name="settings.cache_size_unlimited">Unlimited</string>
<string name="settings.clear_search_history">Clear Search History</string>
<string name="settings.search_history_cleared">Search history cleared</string>
<string name="settings.other_title">Other Settings</string>
<string name="settings.search_title">Search Settings</string>
<string name="settings.playback_control_title">Playback Control Settings</string>
<string name="settings.scrobble_title">Scrobble To Last.fm</string>
<string name="settings.scrobble_summary">Remember to set up your Last.fm user and password on the Subsonic server</string>
<string name="settings.server_scaling_title">Server-Side Album Art Scaling</string>
<string name="settings.server_scaling_summary">Download scaled images from the server instead of full size (saves bandwidth)</string>
<string name="settings.hide_media_title">Hide From Other</string>
<string name="settings.hide_media_summary">Hide music files from other apps.</string>
<string name="settings.hide_media_toast">Takes effect next time Android scans your phone for music.</string>
<string name="settings.media_button_title">Media Buttons</string>
<string name="settings.max_bitrate_wifi">Max Bitrate - Wi-Fi</string>
<string name="settings.max_songs">Max Songs</string>
<string name="settings.media_button_summary">Respond to phone, headset and Bluetooth media buttons</string>
<string name="settings.screen_lit_title">Keep Screen On</string>
<string name="settings.screen_lit_summary">Keeping the screen on while downloading improves download speed.</string>
<string name="settings.buffer_length">Buffer Length</string>
<string name="settings.media_button_title">Media Buttons</string>
<string name="settings.network_timeout">Network Timeout</string>
<string name="settings.buffer_length_0">Disabled</string>
<string name="settings.buffer_length_1">1 second</string>
<string name="settings.buffer_length_2">2 seconds</string>
<string name="settings.buffer_length_5">5 seconds</string>
<string name="settings.buffer_length_8">8 seconds</string>
<string name="settings.buffer_length_10">10 seconds</string>
<string name="settings.buffer_length_12">12 seconds</string>
<string name="settings.buffer_length_15">15 seconds</string>
<string name="settings.buffer_length_20">20 seconds</string>
<string name="settings.buffer_length_30">30 seconds</string>
<string name="settings.buffer_length_60">1 minute</string>
<string name="settings.buffer_length_120">2 minutes</string>
<string name="settings.buffer_length_0">Disabled</string>
<string name="settings.directory_cache_time_0">Disabled</string>
<string name="settings.directory_cache_time_1">1 minute</string>
<string name="settings.directory_cache_time_2">2 minutes</string>
<string name="settings.directory_cache_time_5">5 minutes</string>
<string name="settings.directory_cache_time_10">10 minutes</string>
<string name="settings.directory_cache_time_30">30 minutes</string>
<string name="settings.directory_cache_time_60">1 hour</string>
<string name="settings.buffer_length_2">2 seconds</string>
<string name="settings.buffer_length_5">5 seconds</string>
<string name="settings.buffer_length_8">8 seconds</string>
<string name="settings.buffer_length_10">10 seconds</string>
<string name="settings.buffer_length_12">12 seconds</string>
<string name="settings.buffer_length_15">15 seconds</string>
<string name="settings.buffer_length_20">20 seconds</string>
<string name="settings.buffer_length_30">30 seconds</string>
<string name="settings.buffer_length_60">1 minute</string>
<string name="settings.buffer_length_120">2 minutes</string>
<string name="settings.network_timeout_105000">105 seconds</string>
<string name="settings.network_timeout_120000">120 seconds</string>
<string name="settings.network_timeout_15000">15 seconds</string>
<string name="settings.network_timeout_30000">30 seconds</string>
<string name="settings.network_timeout_45000">45 seconds</string>
<string name="settings.network_timeout_60000">60 seconds</string>
<string name="settings.network_timeout_75000">75 seconds</string>
<string name="settings.network_timeout_90000">90 seconds</string>
<string name="settings.network_timeout_105000">105 seconds</string>
<string name="settings.network_timeout_120000">120 seconds</string>
<string name="settings.show_notification">Show Notification</string>
<string name="settings.show_notification_summary">Show now playing notification in the status bar</string>
<string name="settings.show_notification_always">Always Show Notification</string>
<string name="settings.show_notification_always_summary">Always show now playing notification when playlist is populated</string>
<string name="settings.show_lockscreen_controls">Show Lock Screen Controls</string>
<string name="settings.show_lockscreen_controls_summary">Show playback controls on the lock screen</string>
<string name="settings.use_stream_proxy">Use Stream Proxy</string>
<string name="settings.use_stream_proxy_summary">Stream media playback through a proxy (may help stutter)</string>
<string name="settings.download_transition">Show Downloads On Play</string>
<string name="settings.download_transition_summary">Transition to download activity when starting playback</string>
<string name="settings.gapless_playback">Gapless Playback</string>
<string name="settings.gapless_playback_summary">Enable gapless playback</string>
<string name="settings.show_now_playing">Show Now Playing</string>
<string name="settings.show_now_playing_summary">Show currently playing track in all activities</string>
<string name="settings.max_albums">Max Albums</string>
<string name="settings.network_title">Network</string>
<string name="settings.other_title">Other Settings</string>
<string name="settings.playback_control_title">Playback Control Settings</string>
<string name="settings.preload">Songs To Preload</string>
<string name="settings.preload_1">1 song</string>
<string name="settings.preload_10">10 songs</string>
<string name="settings.preload_2">2 songs</string>
<string name="settings.preload_3">3 songs</string>
<string name="settings.preload_5">5 songs</string>
<string name="settings.preload_unlimited">Unlimited</string>
<string name="settings.screen_lit_summary">Keeping the screen on while downloading improves download speed.</string>
<string name="settings.screen_lit_title">Keep Screen On</string>
<string name="settings.scrobble_summary">Remember to set up your Last.fm user and password on the Subsonic server</string>
<string name="settings.scrobble_title">Scrobble To Last.fm</string>
<string name="settings.search_1">1</string>
<string name="settings.search_3">3</string>
<string name="settings.search_5">5</string>
<string name="settings.search_10">10</string>
<string name="settings.search_100">100</string>
<string name="settings.search_15">15</string>
<string name="settings.search_20">20</string>
<string name="settings.search_25">25</string>
<string name="settings.search_250">250</string>
<string name="settings.search_3">3</string>
<string name="settings.search_30">30</string>
<string name="settings.search_40">40</string>
<string name="settings.search_5">5</string>
<string name="settings.search_50">50</string>
<string name="settings.search_75">75</string>
<string name="settings.search_100">100</string>
<string name="settings.search_250">250</string>
<string name="settings.search_500">500</string>
<string name="settings.max_artists">Max Artists</string>
<string name="settings.max_songs">Max Songs</string>
<string name="settings.default_artists">Default Artists</string>
<string name="settings.default_albums">Default Albums</string>
<string name="settings.default_songs">Default Songs</string>
<string name="settings.increment_time">Skip Interval</string>
<string name="settings.search_75">75</string>
<string name="settings.search_history_cleared">Search history cleared</string>
<string name="settings.search_title">Search Settings</string>
<string name="settings.server_add_server">Add Server</string>
<string name="settings.server_address">Server Address</string>
<string name="settings.server_name">Name</string>
<string name="settings.server_number">Number Of Servers</string>
<string name="settings.server_password">Password</string>
<string name="settings.server_remove_server">Remove Server</string>
<string name="settings.server_scaling_summary">Download scaled images from the server instead of full size (saves bandwidth)</string>
<string name="settings.server_scaling_title">Server-Side Album Art Scaling</string>
<string name="settings.server_unused">Unused</string>
<string name="settings.server_unused1">Unused 1</string>
<string name="settings.server_unused2">Unused 2</string>
<string name="settings.server_unused3">Unused 3</string>
<string name="settings.server_username">Username</string>
<string name="settings.servers_title">Servers</string>
<string name="settings.show_lockscreen_controls">Show Lock Screen Controls</string>
<string name="settings.show_lockscreen_controls_summary">Show playback controls on the lock screen</string>
<string name="settings.show_notification">Show Notification</string>
<string name="settings.show_notification_always">Always Show Notification</string>
<string name="settings.show_notification_always_summary">Always show now playing notification when playlist is populated</string>
<string name="settings.show_notification_summary">Show now playing notification in the status bar</string>
<string name="settings.show_now_playing">Show Now Playing</string>
<string name="settings.show_now_playing_summary">Show currently playing track in all activities</string>
<string name="settings.show_track_number">Show Track Number</string>
<string name="settings.show_track_number_summary">Include track number when displaying a song</string>
<string name="settings.test_connection_title">Test Connection</string>
<string name="settings.testing_connection">Testing connection&#8230;</string>
<string name="settings.testing_ok">Connection is OK</string>
<string name="settings.testing_unlicensed">Connection is OK. Server unlicensed.</string>
<string name="settings.theme_dark">Dark</string>
<string name="settings.theme_light">Light</string>
<string name="settings.theme_title">Theme</string>
<string name="settings.title">UltraSonic Settings</string>
<string name="settings.use_folder_for_album_artist">Use Folders For Artist Name</string>
<string name="settings.use_folder_for_album_artist_summary">Assume top-level folder is the name of the album artist</string>
<string name="settings.use_id3">Browse Using ID3 Tags</string>
<string name="settings.use_id3_summary">Use ID3 tag methods instead of file system based methods</string>
<string name="shuffle.startYear">Start Year:</string>
<string name="shuffle.endYear">End Year:</string>
<string name="shuffle.genre">Genre:</string>
<string name="music_service.retry">A network error occurred. Retrying %1$d of %2$d.</string>
<string name="background_task.wait">Please wait&#8230;</string>
<string name="background_task.loading">Loading.</string>
<string name="background_task.no_network">This program requires network access. Please turn on Wi-Fi or mobile network.</string>
<string name="background_task.network_error">A network error occurred. Please check the server address or try again later.</string>
<string name="background_task.not_found">Resource not found. Please check the server address.</string>
<string name="background_task.parse_error">Didn\'t understand the reply. Please check the server address.</string>
<string name="service.connecting">Contacting server, please wait.</string>
<string name="parser.reading">Reading from server.</string>
<string name="parser.reading_done">Reading from server. Done!</string>
<string name="parser.upgrade_client">Incompatible versions. Please upgrade UltraSonic Android app.</string>
<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="select_artist.refresh">Refresh</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>
<string name="settings.use_stream_proxy">Use Stream Proxy</string>
<string name="settings.use_stream_proxy_summary">Stream media playback through a proxy (may help stutter)</string>
<string name="settings.wifi_required_summary">Only stream media if connected to Wi-Fi</string>
<string name="settings.wifi_required_title">Wi-Fi Streaming Only</string>
<string name="shuffle.endYear">End Year:</string>
<string name="shuffle.genre">Genre:</string>
<string name="shuffle.startYear">Start Year:</string>
<string name="song_details.all">%1$s%2$s</string>
<string name="song_details.kbps">%d kbps</string>
<string name="updated_playlist">Added %1$s songs to \"%2$s\"</string>
<string name="updated_playlist_error">Failed to update \"%s\", please try later.</string>
<string name="util.bytes_format.byte">0 B</string>
<string name="util.bytes_format.gigabyte">0.00 GB</string>
<string name="util.bytes_format.kilobyte">0 KB</string>
<string name="util.bytes_format.megabyte">0.00 MB</string>
<string name="util.no_time">-:--</string>
<string name="util.zero_time">0:00</string>
<string name="widget.initial_text">Touch to select music</string>
<string name="widget.sdcard_busy">SD card unavailable</string>
<string name="widget.sdcard_missing">No SD card</string>
<string name="util.bytes_format.gigabyte">0.00 GB</string>
<string name="util.bytes_format.megabyte">0.00 MB</string>
<string name="util.bytes_format.kilobyte">0 KB</string>
<string name="util.bytes_format.byte">0 B</string>
<string name="util.no_time">-:--</string>
<string name="util.zero_time">0:00</string>
<string name="chat.send_a_message">Send a message</string>
<plurals name="select_album_n_songs">
<item quantity="zero">No songs</item>

View File

@ -84,5 +84,7 @@
<attr name="media_toggle" format="reference"/>
<attr name="chat" format="reference"/>
<attr name="chat_send" format="reference" />
<attr name="bookmark" format="reference" />
</resources>

View File

@ -40,6 +40,8 @@
<item name="media_toggle">@drawable/media_toggle_list_normal_dark</item>
<item name="chat">@drawable/ic_menu_chat_dark</item>
<item name="chat_send">@drawable/ic_menu_chat_send_dark</item>
<item name="chat_send">@drawable/ic_menu_chat_send_dark</item>
<item name="bookmark">@drawable/ic_menu_bookmark_dark</item>
</style>
<style name="UltraSonicTheme.Light" parent="@android:style/Theme.Holo.Light">
@ -81,6 +83,7 @@
<item name="media_toggle">@drawable/media_toggle_list_normal_light</item>
<item name="chat">@drawable/ic_menu_chat_light</item>
<item name="chat_send">@drawable/ic_menu_chat_send_light</item>
</style>
<item name="bookmark">@drawable/ic_menu_bookmark_light</item>
s </style>
</resources>

View File

@ -32,6 +32,11 @@
a:key="showTrackNumber"
a:summary="@string/settings.show_track_number_summary"
a:title="@string/settings.show_track_number" />
<CheckBoxPreference
a:defaultValue="false"
a:key="discAndTrackSort"
a:summary="@string/settings.disc_sort_summary"
a:title="@string/settings.disc_sort" />
<CheckBoxPreference
a:defaultValue="true"
a:key="showNowPlaying"
@ -79,6 +84,16 @@
a:key="gaplessPlayback"
a:summary="@string/settings.gapless_playback_summary"
a:title="@string/settings.gapless_playback" />
<CheckBoxPreference
a:defaultValue="false"
a:key="clearPlaylist"
a:summary="@string/settings.clear_playlist_summary"
a:title="@string/settings.clear_playlist" />
<CheckBoxPreference
a:defaultValue="false"
a:key="clearBookmark"
a:summary="@string/settings.clear_bookmark_summary"
a:title="@string/settings.clear_bookmark" />
<ListPreference
a:defaultValue="5000"
a:entries="@array/bufferLengthNames"

View File

@ -0,0 +1,424 @@
/*
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.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import com.thejoshwa.ultrasonic.androidapp.R;
import com.thejoshwa.ultrasonic.androidapp.domain.MusicDirectory;
import com.thejoshwa.ultrasonic.androidapp.domain.MusicDirectory.Entry;
import com.thejoshwa.ultrasonic.androidapp.service.DownloadFile;
import com.thejoshwa.ultrasonic.androidapp.service.MusicService;
import com.thejoshwa.ultrasonic.androidapp.service.MusicServiceFactory;
import com.thejoshwa.ultrasonic.androidapp.util.Constants;
import com.thejoshwa.ultrasonic.androidapp.util.FileUtil;
import com.thejoshwa.ultrasonic.androidapp.util.Pair;
import com.thejoshwa.ultrasonic.androidapp.util.TabActivityBackgroundTask;
import com.thejoshwa.ultrasonic.androidapp.util.Util;
import com.thejoshwa.ultrasonic.androidapp.view.EntryAdapter;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
public class BookmarkActivity extends SubsonicTabActivity {
private PullToRefreshListView refreshAlbumListView;
private ListView albumListView;
private View albumButtons;
private View emptyView;
private ImageView selectButton;
private ImageView playNowButton;
private ImageView playNextButton;
private ImageView playLastButton;
private ImageView pinButton;
private ImageView unpinButton;
private ImageView downloadButton;
private ImageView deleteButton;
private ImageView moreButton;
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.select_album);
albumButtons = findViewById(R.id.menu_album);
refreshAlbumListView = (PullToRefreshListView) findViewById(R.id.select_album_entries);
albumListView = refreshAlbumListView.getRefreshableView();
refreshAlbumListView.setOnRefreshListener(new OnRefreshListener<ListView>() {
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
new GetDataTask().execute();
}
});
albumListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
albumListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position >= 0) {
Entry entry = (Entry) parent.getItemAtPosition(position);
if (entry.isVideo()) {
playVideo(entry);
} else {
enableButtons();
}
}
}
});
selectButton = (ImageView) findViewById(R.id.select_album_select);
playNowButton = (ImageView) findViewById(R.id.select_album_play_now);
playNextButton = (ImageView) findViewById(R.id.select_album_play_next);
playLastButton = (ImageView) findViewById(R.id.select_album_play_last);
pinButton = (ImageView) findViewById(R.id.select_album_pin);
unpinButton = (ImageView) findViewById(R.id.select_album_unpin);
downloadButton = (ImageView) findViewById(R.id.select_album_download);
deleteButton = (ImageView) findViewById(R.id.select_album_delete);
moreButton = (ImageView) findViewById(R.id.select_album_more);
emptyView = findViewById(R.id.select_album_empty);
selectButton.setVisibility(View.GONE);
playNextButton.setVisibility(View.GONE);
playLastButton.setVisibility(View.GONE);
moreButton.setVisibility(View.GONE);
playNowButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
playNow(getSelectedSongs(albumListView));
}
});
selectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
selectAllOrNone();
}
});
pinButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
downloadBackground(true);
selectAll(false, false);
}
});
unpinButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
unpin();
selectAll(false, false);
}
});
downloadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
downloadBackground(false);
selectAll(false, false);
}
});
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
delete();
selectAll(false, false);
}
});
registerForContextMenu(albumListView);
enableButtons();
View browseMenuItem = findViewById(R.id.menu_bookmarks);
menuDrawer.setActiveView(browseMenuItem);
getBookmarks();
}
private void getBookmarks() {
getActionBar().setSubtitle(R.string.button_bar_bookmarks);
new LoadTask() {
@Override
protected MusicDirectory load(MusicService service) throws Exception {
return Util.getSongsFromBookmarks(service.getBookmarks(BookmarkActivity.this, this));
}
}.execute();
}
private void playNow(List<Entry> songs) {
if(getSelectedSongs(albumListView).size() > 0) {
int position = songs.get(0).getBookmarkPosition();
getDownloadService().restore(songs, 0, position, true, true);
selectAll(false, false);
}
}
private List<MusicDirectory.Entry> getSelectedSongs(ListView albumListView) {
List<MusicDirectory.Entry> songs = new ArrayList<MusicDirectory.Entry>(10);
if (albumListView != null) {
int count = albumListView.getCount();
for (int i = 0; i < count; i++) {
if (albumListView.isItemChecked(i)) {
songs.add((MusicDirectory.Entry) albumListView.getItemAtPosition(i));
}
}
}
return songs;
}
private void refresh() {
finish();
Intent intent = getIntent();
intent.putExtra(Constants.INTENT_EXTRA_NAME_REFRESH, true);
Util.startActivityWithoutTransition(this, intent);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
menuDrawer.toggleMenu();
return true;
}
return false;
}
private void selectAllOrNone() {
boolean someUnselected = false;
int count = albumListView.getCount();
for (int i = 0; i < count; i++) {
if (!albumListView.isItemChecked(i) && albumListView.getItemAtPosition(i) instanceof MusicDirectory.Entry) {
someUnselected = true;
break;
}
}
selectAll(someUnselected, true);
}
private void selectAll(boolean selected, boolean toast) {
int count = albumListView.getCount();
int selectedCount = 0;
for (int i = 0; i < count; i++) {
MusicDirectory.Entry entry = (MusicDirectory.Entry) albumListView.getItemAtPosition(i);
if (entry != null && !entry.isDirectory() && !entry.isVideo()) {
albumListView.setItemChecked(i, selected);
selectedCount++;
}
}
// Display toast: N tracks selected / N tracks unselected
if (toast) {
int toastResId = selected ? R.string.select_album_n_selected : R.string.select_album_n_unselected;
Util.toast(this, getString(toastResId, selectedCount));
}
enableButtons();
}
private void enableButtons() {
if (getDownloadService() == null) {
return;
}
List<MusicDirectory.Entry> selection = getSelectedSongs(albumListView);
boolean enabled = !selection.isEmpty();
boolean unpinEnabled = false;
boolean deleteEnabled = false;
int pinnedCount = 0;
for (MusicDirectory.Entry song : selection) {
DownloadFile downloadFile = getDownloadService().forSong(song);
if (downloadFile.isWorkDone()) {
deleteEnabled = true;
}
if (downloadFile.isSaved()) {
pinnedCount++;
unpinEnabled = true;
}
}
playNowButton.setVisibility(enabled && deleteEnabled ? View.VISIBLE : View.GONE);
pinButton.setVisibility((enabled && !Util.isOffline(this) && selection.size() > pinnedCount) ? View.VISIBLE : View.GONE);
unpinButton.setVisibility(enabled && unpinEnabled ? View.VISIBLE : View.GONE);
downloadButton.setVisibility(enabled && !deleteEnabled && !Util.isOffline(this) ? View.VISIBLE : View.GONE);
deleteButton.setVisibility(enabled && deleteEnabled ? View.VISIBLE : View.GONE);
}
private void downloadBackground(final boolean save) {
List<MusicDirectory.Entry> songs = getSelectedSongs(albumListView);
if(songs.isEmpty()) {
selectAll(true, false);
songs = getSelectedSongs(albumListView);
}
downloadBackground(save, songs);
}
private void downloadBackground(final boolean save, final List<MusicDirectory.Entry> songs) {
if (getDownloadService() == null) {
return;
}
Runnable onValid = new Runnable() {
@Override
public void run() {
warnIfNetworkOrStorageUnavailable();
getDownloadService().downloadBackground(songs, save);
if (save) {
Util.toast(BookmarkActivity.this, getResources().getQuantityString(R.plurals.select_album_n_songs_pinned, songs.size(), songs.size()));
} else {
Util.toast(BookmarkActivity.this, getResources().getQuantityString(R.plurals.select_album_n_songs_downloaded, songs.size(), songs.size()));
}
}
};
checkLicenseAndTrialPeriod(onValid);
}
private void delete() {
List<MusicDirectory.Entry> songs = getSelectedSongs(albumListView);
if(songs.isEmpty()) {
selectAll(true, false);
songs = getSelectedSongs(albumListView);
}
if (getDownloadService() != null) {
getDownloadService().delete(songs);
}
}
private void unpin() {
if (getDownloadService() != null) {
List<MusicDirectory.Entry> songs = getSelectedSongs(albumListView);
Util.toast(BookmarkActivity.this, getResources().getQuantityString(R.plurals.select_album_n_songs_unpinned, songs.size(), songs.size()));
getDownloadService().unpin(songs);
}
}
private void playVideo(MusicDirectory.Entry entry) {
int maxBitrate = Util.getMaxVideoBitrate(this);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(MusicServiceFactory.getMusicService(this).getVideoUrl(maxBitrate, this, entry.getId())));
startActivity(intent);
}
public void deleteRecursively(MusicDirectory.Entry album) {
File dir = FileUtil.getAlbumDirectory(this, album);
Util.recursiveDelete(dir);
if(Util.isOffline(this)) {
refresh();
}
}
private abstract class LoadTask extends TabActivityBackgroundTask<Pair<MusicDirectory, Boolean>> {
public LoadTask() {
super(BookmarkActivity.this, true);
}
protected abstract MusicDirectory load(MusicService service) throws Exception;
@Override
protected Pair<MusicDirectory, Boolean> doInBackground() throws Throwable {
MusicService musicService = MusicServiceFactory.getMusicService(BookmarkActivity.this);
MusicDirectory dir = load(musicService);
boolean valid = musicService.isLicenseValid(BookmarkActivity.this, this);
return new Pair<MusicDirectory, Boolean>(dir, valid);
}
@Override
protected void done(Pair<MusicDirectory, Boolean> result) {
MusicDirectory musicDirectory = result.getFirst();
List<MusicDirectory.Entry> entries = musicDirectory.getChildren();
int songCount = 0;
for (MusicDirectory.Entry entry : entries) {
if (!entry.isDirectory()) {
songCount++;
}
}
final int listSize = getIntent().getIntExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, 0);
if (songCount > 0) {
pinButton.setVisibility(View.VISIBLE);
unpinButton.setVisibility(View.VISIBLE);
downloadButton.setVisibility(View.VISIBLE);
deleteButton.setVisibility(View.VISIBLE);
playNowButton.setVisibility(View.VISIBLE);
} else {
pinButton.setVisibility(View.GONE);
unpinButton.setVisibility(View.GONE);
downloadButton.setVisibility(View.GONE);
deleteButton.setVisibility(View.GONE);
playNowButton.setVisibility(View.GONE);
if (listSize == 0 || result.getFirst().getChildren().size() < listSize) {
albumButtons.setVisibility(View.GONE);
}
}
enableButtons();
emptyView.setVisibility(entries.isEmpty() ? View.VISIBLE : View.GONE);
albumListView.setAdapter(new EntryAdapter(BookmarkActivity.this, getImageLoader(), entries, true));
licenseValid = result.getSecond();
}
}
private class GetDataTask extends AsyncTask<Void, Void, String[]> {
@Override
protected void onPostExecute(String[] result) {
refreshAlbumListView.onRefreshComplete();
super.onPostExecute(result);
}
@Override
protected String[] doInBackground(Void... params) {
refresh();
return null;
}
}
}

View File

@ -32,7 +32,6 @@ import android.view.animation.AnimationUtils;
import android.widget.*;
import com.thejoshwa.ultrasonic.androidapp.R;
import com.thejoshwa.ultrasonic.androidapp.domain.Bookmark;
import com.thejoshwa.ultrasonic.androidapp.domain.MusicDirectory;
import com.thejoshwa.ultrasonic.androidapp.domain.MusicDirectory.Entry;
import com.thejoshwa.ultrasonic.androidapp.domain.PlayerState;
@ -75,13 +74,15 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
private TextView downloadTrackTextView;
private TextView downloadTotalDurationTextView;
private TextView durationTextView;
private TextView statusTextView;
private static SeekBar progressBar;
private View pauseButton;
private View stopButton;
private View startButton;
private ImageView repeatButton;
private ImageView starImageView;
private ImageButton starImageButton;
private ImageButton bookmarkImageButton;
private ImageButton removeAllImageButton;
private ImageButton saveImageButton;
private ScheduledExecutorService executorService;
private DownloadFile currentPlaying;
private Entry currentSong;
@ -94,7 +95,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
private boolean visualizerAvailable;
private boolean equalizerAvailable;
private SilentBackgroundTask<Void> onProgressChangedTask;
//private volatile List<Bookmark> bookmarks;
LinearLayout visualizerViewLayout;
/**
* Called when the activity is first created.
@ -120,7 +121,6 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
downloadTrackTextView = (TextView) findViewById(R.id.download_track);
downloadTotalDurationTextView = (TextView) findViewById(R.id.download_total_duration);
durationTextView = (TextView) findViewById(R.id.download_duration);
statusTextView = (TextView) findViewById(R.id.download_status);
progressBar = (SeekBar) findViewById(R.id.download_progress_bar);
playlistView = (ListView) findViewById(R.id.download_list);
final AutoRepeatButton previousButton = (AutoRepeatButton) findViewById(R.id.download_previous);
@ -130,10 +130,13 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
startButton = findViewById(R.id.download_start);
final View shuffleButton = findViewById(R.id.download_shuffle);
repeatButton = (ImageView) findViewById(R.id.download_repeat);
starImageView = (ImageView) findViewById(R.id.download_star);
final LinearLayout visualizerViewLayout = (LinearLayout) findViewById(R.id.download_visualizer_view_layout);
starImageButton = (ImageButton) findViewById(R.id.download_star);
bookmarkImageButton = (ImageButton) findViewById(R.id.download_bookmark);
removeAllImageButton = (ImageButton) findViewById(R.id.download_remove_all);
saveImageButton = (ImageButton) findViewById(R.id.download_save_playlist);
visualizerViewLayout = (LinearLayout) findViewById(R.id.download_visualizer_view_layout);
final View toggleListButton = findViewById(R.id.download_toggle_list);
final ImageButton toggleListButton = (ImageButton) findViewById(R.id.download_toggle_list);
albumArtImageView.setOnClickListener(new View.OnClickListener() {
@Override
@ -360,10 +363,11 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
}
if (Util.isOffline(this)) {
starImageView.setVisibility(View.GONE);
starImageButton.setVisibility(View.GONE);
bookmarkImageButton.setVisibility(View.GONE);
}
starImageView.setOnClickListener(new View.OnClickListener() {
starImageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
if (currentSong == null) {
@ -374,10 +378,10 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
final String id = currentSong.getId();
if (isStarred) {
starImageView.setImageDrawable(Util.getDrawableFromAttribute(SubsonicTabActivity.getInstance(), R.attr.star_hollow));
starImageButton.setImageDrawable(Util.getDrawableFromAttribute(SubsonicTabActivity.getInstance(), R.attr.star_hollow));
currentSong.setStarred(false);
} else {
starImageView.setImageDrawable(Util.getDrawableFromAttribute(SubsonicTabActivity.getInstance(), R.attr.star_full));
starImageButton.setImageDrawable(Util.getDrawableFromAttribute(SubsonicTabActivity.getInstance(), R.attr.star_full));
currentSong.setStarred(true);
}
@ -399,18 +403,82 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
}
});
// TODO: Add bookmark support
// new Thread(new Runnable() {
// public void run() {
// final MusicService musicService = MusicServiceFactory.getMusicService(DownloadActivity.this);
//
// try {
// bookmarks = musicService.getBookmarks(DownloadActivity.this, null);
// } catch (Exception e) {
// Log.e(TAG, e.getMessage(), e);
// }
// }
// }).start();
bookmarkImageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
if (currentSong == null) {
return;
}
final String id = currentSong.getId();
final int playerPosition = getDownloadService()
.getPlayerPosition();
currentSong.setBookmarkPosition(playerPosition);
String bookmarkTime = Util.formatTotalDuration(playerPosition, true);
new Thread(new Runnable() {
public void run() {
final MusicService musicService = MusicServiceFactory.getMusicService(DownloadActivity.this);
try {
musicService.createBookmark(id, playerPosition, DownloadActivity.this, null);
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
}
}
}).start();
String msg = getResources().getString(R.string.download_bookmark_set_at_position, bookmarkTime);
Util.toast(DownloadActivity.this, msg);
}
});
bookmarkImageButton.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(final View view) {
if (currentSong == null) {
return true;
}
final String id = currentSong.getId();
currentSong.setBookmarkPosition(0);
new Thread(new Runnable() {
public void run() {
final MusicService musicService = MusicServiceFactory.getMusicService(DownloadActivity.this);
try {
musicService.deleteBookmark(id, DownloadActivity.this, null);
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
}
}
}).start();
Util.toast(DownloadActivity.this, R.string.download_bookmark_removed);
return true;
}
});
removeAllImageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
getDownloadService().setShufflePlayEnabled(false);
getDownloadService().clear();
onDownloadListChanged();
}
});
saveImageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
showDialog(DIALOG_SAVE_PLAYLIST);
}
});
visualizerAvailable = downloadService != null && downloadService.getVisualizerController() != null;
equalizerAvailable = downloadService != null && downloadService.getEqualizerController() != null;
@ -422,6 +490,12 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
visualizerView = new VisualizerView(this);
visualizerViewLayout.addView(visualizerView, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
if (!visualizerView.isActive()) {
visualizerViewLayout.setVisibility(View.GONE);
} else {
visualizerViewLayout.setVisibility(View.VISIBLE);
}
visualizerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(final View view, final MotionEvent motionEvent) {
@ -430,6 +504,8 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
return true;
}
});
} else {
visualizerViewLayout.setVisibility(View.GONE);
}
}
@ -437,6 +513,12 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
protected void onResume() {
super.onResume();
final DownloadService downloadService = getDownloadService();
if (downloadService == null || downloadService.getCurrentPlaying() == null) {
playlistFlipper.setDisplayedChild(1);
}
final Handler handler = new Handler();
final Runnable runnable = new Runnable() {
@Override
@ -451,16 +533,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
};
executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleWithFixedDelay(runnable, 0L, 1000L, TimeUnit.MILLISECONDS);
final DownloadService downloadService = getDownloadService();
if (downloadService == null || downloadService.getCurrentPlaying() == null) {
playlistFlipper.setDisplayedChild(1);
}
onDownloadListChanged();
onCurrentChanged();
onSliderProgressChanged();
executorService.scheduleWithFixedDelay(runnable, 0L, 500L, TimeUnit.MILLISECONDS);
if (downloadService != null && downloadService.getKeepScreenOn()) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
@ -471,6 +544,10 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
if (visualizerView != null) {
visualizerView.setActive(downloadService != null && downloadService.getShowVisualization());
}
if (Util.isOffline(this)) {
saveImageButton.setVisibility(View.GONE);
}
}
// Scroll to current playing/downloading.
@ -479,19 +556,25 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
return;
}
for (int i = 0; i < playlistView.getAdapter().getCount(); i++) {
if (currentPlaying == playlistView.getItemAtPosition(i)) {
playlistView.smoothScrollToPositionFromTop(i, 40);
return;
}
}
ListAdapter adapter = playlistView.getAdapter();
final DownloadFile currentDownloading = getDownloadService().getCurrentDownloading();
for (int i = 0; i < playlistView.getAdapter().getCount(); i++) {
if (currentDownloading == playlistView.getItemAtPosition(i)) {
playlistView.smoothScrollToPositionFromTop(i, 40);
return;
}
if (adapter != null) {
int count = adapter.getCount();
for (int i = 0; i < count; i++) {
if (currentPlaying == playlistView.getItemAtPosition(i)) {
playlistView.smoothScrollToPositionFromTop(i, 40);
return;
}
}
final DownloadFile currentDownloading = getDownloadService().getCurrentDownloading();
for (int i = 0; i < count; i++) {
if (currentDownloading == playlistView.getItemAtPosition(i)) {
playlistView.smoothScrollToPositionFromTop(i, 40);
return;
}
}
}
}
@ -499,6 +582,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
protected void onPause() {
super.onPause();
executorService.shutdown();
if (visualizerView != null) {
visualizerView.setActive(false);
}
@ -560,14 +644,10 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
@Override
public boolean onPrepareOptionsMenu(final Menu menu) {
final MenuItem savePlaylist = menu.findItem(R.id.menu_save_playlist);
final boolean savePlaylistEnabled = !Util.isOffline(this);
if (savePlaylist != null) {
savePlaylist.setEnabled(savePlaylistEnabled);
savePlaylist.setVisible(savePlaylistEnabled);
}
super.onPrepareOptionsMenu(menu);
final MenuItem screenOption = menu.findItem(R.id.menu_screen_on_off);
final MenuItem jukeboxOption = menu.findItem(R.id.download_jukebox);
final MenuItem equalizerMenuItem = menu.findItem(R.id.download_equalizer);
final MenuItem visualizerMenuItem = menu.findItem(R.id.download_visualizer);
@ -581,11 +661,10 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
visualizerMenuItem.setVisible(visualizerAvailable);
}
final DownloadService downloadService = getDownloadService();
if (downloadService != null) {
if (getDownloadService().getKeepScreenOn()) {
if (downloadService.getKeepScreenOn()) {
if (screenOption != null) {
screenOption.setTitle(R.string.download_menu_screen_off);
}
@ -594,8 +673,19 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
screenOption.setTitle(R.string.download_menu_screen_on);
}
}
if (downloadService.isJukeboxEnabled()) {
if (jukeboxOption != null) {
jukeboxOption.setTitle(R.string.download_menu_jukebox_off);
}
} else {
if (jukeboxOption != null) {
jukeboxOption.setTitle(R.string.download_menu_jukebox_on);
}
}
}
return super.onPrepareOptionsMenu(menu);
return true;
}
@Override
@ -619,7 +709,6 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
}
if (Util.isOffline(this)) {
menu.findItem(R.id.menu_lyrics).setVisible(false);
menu.findItem(R.id.menu_save_playlist).setVisible(false);
}
}
}
@ -660,11 +749,6 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
getDownloadService().remove(song);
onDownloadListChanged();
return true;
case R.id.menu_remove_all:
getDownloadService().setShufflePlayEnabled(false);
getDownloadService().clear();
onDownloadListChanged();
return true;
case R.id.menu_screen_on_off:
if (getDownloadService().getKeepScreenOn()) {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
@ -678,15 +762,19 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
getDownloadService().shuffle();
Util.toast(this, R.string.download_menu_shuffle_notification);
return true;
case R.id.menu_save_playlist:
showDialog(DIALOG_SAVE_PLAYLIST);
return true;
case R.id.download_equalizer:
startActivity(new Intent(DownloadActivity.this, EqualizerActivity.class));
return true;
case R.id.download_visualizer:
final boolean active = !visualizerView.isActive();
visualizerView.setActive(active);
if (!visualizerView.isActive()) {
visualizerViewLayout.setVisibility(View.GONE);
} else {
visualizerViewLayout.setVisibility(View.VISIBLE);
}
getDownloadService().setShowVisualization(visualizerView.isActive());
Util.toast(DownloadActivity.this, active ? R.string.download_visualizer_on : R.string.download_visualizer_off);
return true;
@ -745,7 +833,6 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
}
private void toggleFullScreenAlbumArt() {
scrollToCurrent();
if (playlistFlipper.getDisplayedChild() == 1) {
playlistFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_down_in));
playlistFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_down_out));
@ -755,6 +842,8 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
playlistFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_up_out));
playlistFlipper.setDisplayedChild(1);
}
scrollToCurrent();
}
private void start() {
@ -827,7 +916,7 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
if (currentPlaying != null) {
currentSong = currentPlaying.getSong();
final Drawable starDrawable = currentSong.getStarred() ? Util.getDrawableFromAttribute(SubsonicTabActivity.getInstance(), R.attr.star_full) : Util.getDrawableFromAttribute(SubsonicTabActivity.getInstance(), R.attr.star_hollow);
starImageView.setImageDrawable(starDrawable);
starImageButton.setImageDrawable(starDrawable);
songTitleTextView.setText(currentSong.getTitle());
albumTextView.setText(currentSong.getAlbum());
artistTextView.setText(currentSong.getArtist());
@ -888,27 +977,25 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi
switch (playerState) {
case DOWNLOADING:
final long bytes = currentPlaying != null ? currentPlaying.getPartialFile().length() : 0;
statusTextView.setText(getResources().getString(
getActionBar().setSubtitle(getResources().getString(
R.string.download_playerstate_downloading,
Util.formatLocalizedBytes(bytes,
DownloadActivity.this)));
break;
case PREPARING:
statusTextView
.setText(R.string.download_playerstate_buffering);
getActionBar().setSubtitle(R.string.download_playerstate_buffering);
break;
case STARTED:
final DownloadService downloadService = getDownloadService();
if (downloadService != null && downloadService.isShufflePlayEnabled()) {
statusTextView
.setText(R.string.download_playerstate_playing_shuffle);
getActionBar().setSubtitle(R.string.download_playerstate_playing_shuffle);
} else {
statusTextView.setText(null);
getActionBar().setSubtitle(null);
}
break;
default:
statusTextView.setText(null);
getActionBar().setSubtitle(null);
break;
case IDLE:
break;

View File

@ -59,8 +59,8 @@ public final class HelpActivity extends Activity implements OnClickListener {
public MenuDrawer menuDrawer;
private int activePosition = 1;
private int menuActiveViewId;
View searchMenuItem = null;
View playlistsMenuItem = null;
View chatMenuItem = null;
View bookmarksMenuItem = null;
View menuMain = null;
@Override
@ -79,14 +79,15 @@ public final class HelpActivity extends Activity implements OnClickListener {
menuDrawer = MenuDrawer.attach(this, MenuDrawer.MENU_DRAG_WINDOW, Position.LEFT);
menuDrawer.setMenuView(R.layout.menu_main);
searchMenuItem = findViewById(R.id.menu_search);
playlistsMenuItem = findViewById(R.id.menu_playlists);
chatMenuItem = findViewById(R.id.menu_chat);
bookmarksMenuItem = findViewById(R.id.menu_bookmarks);
findViewById(R.id.menu_home).setOnClickListener(this);
findViewById(R.id.menu_browse).setOnClickListener(this);
searchMenuItem.setOnClickListener(this);
playlistsMenuItem.setOnClickListener(this);
findViewById(R.id.menu_chat).setOnClickListener(this);
findViewById(R.id.menu_search).setOnClickListener(this);
findViewById(R.id.menu_playlists).setOnClickListener(this);
chatMenuItem.setOnClickListener(this);
bookmarksMenuItem.setOnClickListener(this);
findViewById(R.id.menu_now_playing).setOnClickListener(this);
findViewById(R.id.menu_settings).setOnClickListener(this);
findViewById(R.id.menu_about).setOnClickListener(this);
@ -133,6 +134,15 @@ public final class HelpActivity extends Activity implements OnClickListener {
});
}
@Override
protected void onPostCreate(Bundle bundle) {
super.onPostCreate(bundle);
int visibility = Util.isOffline(this) ? View.GONE : View.VISIBLE;
chatMenuItem.setVisibility(visibility);
bookmarksMenuItem.setVisibility(visibility);
}
@Override
public void onResume() {
super.onResume();
@ -229,6 +239,9 @@ public final class HelpActivity extends Activity implements OnClickListener {
case R.id.menu_chat:
Util.startActivityWithoutTransition(this, ChatActivity.class);
break;
case R.id.menu_bookmarks:
Util.startActivityWithoutTransition(this, BookmarkActivity.class);
break;
case R.id.menu_now_playing:
Util.startActivityWithoutTransition(this, DownloadActivity.class);
break;

View File

@ -190,6 +190,7 @@ public class MainActivity extends SubsonicTabActivity {
private void loadSettings() {
PreferenceManager.setDefaultValues(this, R.xml.settings, false);
final SharedPreferences preferences = Util.getPreferences(this);
if (!preferences.contains(Constants.PREFERENCES_KEY_CACHE_LOCATION)) {
final SharedPreferences.Editor editor = preferences.edit();
editor.putString(Constants.PREFERENCES_KEY_CACHE_LOCATION, FileUtil.getDefaultMusicDirectory().getPath());
@ -359,12 +360,18 @@ public class MainActivity extends SubsonicTabActivity {
}
private void setActiveServer(final int instance) {
final DownloadService service = getDownloadService();
if (Util.getActiveServer(this) != instance) {
final DownloadService service = getDownloadService();
if (service != null) {
service.clearIncomplete();
}
Util.setActiveServer(this, instance);
}
Util.setActiveServer(this, instance);
if (service != null) {
service.setJukeboxEnabled(Util.getJukeboxEnabled(this, instance));
}
}

View File

@ -407,7 +407,7 @@ public class SearchActivity extends SubsonicTabActivity {
downloadService.clear();
}
downloadService.download(Arrays.asList(song), save, false, playNext, false);
downloadService.download(Arrays.asList(song), save, false, playNext, false, false);
if (autoplay) {
downloadService.play(downloadService.size() - 1);

View File

@ -47,12 +47,12 @@ import com.thejoshwa.ultrasonic.androidapp.view.EntryAdapter;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
@ -311,7 +311,6 @@ public class SelectAlbumActivity extends SubsonicTabActivity {
MusicDirectory.Entry entry = (MusicDirectory.Entry) albumListView.getItemAtPosition(info.position);
if (entry.isDirectory()) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.select_album_context, menu);
@ -451,7 +450,7 @@ public class SelectAlbumActivity extends SubsonicTabActivity {
@Override
protected MusicDirectory load(MusicService service) throws Exception {
if (Util.getShouldUseId3Tags(SelectAlbumActivity.this)) {
return Util.getSongsFromSearchResult(service.getStarred(SelectAlbumActivity.this, this));
return Util.getSongsFromSearchResult(service.getStarred2(SelectAlbumActivity.this, this));
} else {
return Util.getSongsFromSearchResult(service.getStarred(SelectAlbumActivity.this, this));
}
@ -582,7 +581,7 @@ public class SelectAlbumActivity extends SubsonicTabActivity {
for (MusicDirectory.Entry song : selection) {
DownloadFile downloadFile = getDownloadService().forSong(song);
if (downloadFile.isCompleteFileAvailable()) {
if (downloadFile.isWorkDone()) {
deleteEnabled = true;
}
@ -603,10 +602,12 @@ public class SelectAlbumActivity extends SubsonicTabActivity {
private void downloadBackground(final boolean save) {
List<MusicDirectory.Entry> songs = getSelectedSongs(albumListView);
if(songs.isEmpty()) {
selectAll(true, false);
songs = getSelectedSongs(albumListView);
}
downloadBackground(save, songs);
}
@ -688,6 +689,11 @@ public class SelectAlbumActivity extends SubsonicTabActivity {
protected void done(Pair<MusicDirectory, Boolean> result) {
MusicDirectory musicDirectory = result.getFirst();
List<MusicDirectory.Entry> entries = musicDirectory.getChildren();
if (Util.getShouldSortByDisc(SelectAlbumActivity.this)){
Collections.sort(entries, new EntryByDiscAndTrackComparer());
}
String directoryName = musicDirectory.getName();
int songCount = 0;
@ -740,7 +746,7 @@ public class SelectAlbumActivity extends SubsonicTabActivity {
deleteButton.setVisibility(View.GONE);
selectButton.setVisibility(View.GONE);
playNowButton.setVisibility(View.GONE);
playNextButton.setVisibility(View.VISIBLE);
playNextButton.setVisibility(View.GONE);
playLastButton.setVisibility(View.GONE);
if (listSize == 0 || result.getFirst().getChildren().size() < listSize) {
@ -859,4 +865,23 @@ public class SelectAlbumActivity extends SubsonicTabActivity {
return null;
}
}
public class EntryByDiscAndTrackComparer implements Comparator<MusicDirectory.Entry> {
@Override
public int compare(MusicDirectory.Entry x, MusicDirectory.Entry y) {
Integer discX = x.getDiscNumber();
Integer discY = y.getDiscNumber();
Integer trackX = x.getTrack();
Integer trackY = y.getTrack();
int startComparison = compare(discX == null ? 0 : discX, discY == null ? 0 : discY);
return startComparison != 0 ? startComparison : compare(trackX == null ? 0 : trackX, trackY == null ? 0 : trackY);
}
private int compare(long a, long b) {
return a < b ? -1
: a > b ? 1
: 0;
}
}
}

View File

@ -93,8 +93,8 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer
private int activePosition = 1;
private int menuActiveViewId;
private int activeServers = 3;
View searchMenuItem = null;
View playlistsMenuItem = null;
View chatMenuItem = null;
View bookmarksMenuItem = null;
View menuMain = null;
PreferenceCategory serversCategory;
Preference addServerPreference;
@ -114,14 +114,15 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer
menuDrawer = MenuDrawer.attach(this, MenuDrawer.MENU_DRAG_WINDOW, Position.LEFT);
menuDrawer.setMenuView(R.layout.menu_main);
searchMenuItem = findViewById(R.id.menu_search);
playlistsMenuItem = findViewById(R.id.menu_playlists);
chatMenuItem = findViewById(R.id.menu_chat);
bookmarksMenuItem = findViewById(R.id.menu_bookmarks);
findViewById(R.id.menu_home).setOnClickListener(this);
findViewById(R.id.menu_browse).setOnClickListener(this);
searchMenuItem.setOnClickListener(this);
playlistsMenuItem.setOnClickListener(this);
findViewById(R.id.menu_chat).setOnClickListener(this);
findViewById(R.id.menu_search).setOnClickListener(this);
findViewById(R.id.menu_playlists).setOnClickListener(this);
chatMenuItem.setOnClickListener(this);
bookmarksMenuItem.setOnClickListener(this);
findViewById(R.id.menu_now_playing).setOnClickListener(this);
findViewById(R.id.menu_settings).setOnClickListener(this);
findViewById(R.id.menu_about).setOnClickListener(this);
@ -169,7 +170,7 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer
}
});
if (Build.VERSION.SDK_INT < 14) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
gaplessPlaybackEnabled.setChecked(false);
gaplessPlaybackEnabled.setEnabled(false);
}
@ -184,6 +185,7 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer
addServerPreference.setPersistent(false);
addServerPreference.setTitle(getResources().getString(R.string.settings_server_add_server));
addServerPreference.setEnabled(activeServers < maxServerCount);
serversCategory.addPreference(addServerPreference);
for (int i = 1; i <= activeServers; i++) {
@ -194,7 +196,6 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer
findPreference(Constants.PREFERENCES_KEY_TEST_CONNECTION + i).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
testConnection(instanceValue);
return false;
}
@ -240,6 +241,15 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer
update();
}
@Override
protected void onPostCreate(Bundle bundle) {
super.onPostCreate(bundle);
int visibility = Util.isOffline(this) ? View.GONE : View.VISIBLE;
chatMenuItem.setVisibility(visibility);
bookmarksMenuItem.setVisibility(visibility);
}
private PreferenceScreen addServer(final int instance) {
final PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(this);
screen.setTitle(R.string.settings_server_unused);
@ -285,6 +295,11 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer
serverEnabledPreference.setKey(Constants.PREFERENCES_KEY_SERVER_ENABLED + instance);
serverEnabledPreference.setTitle(R.string.equalizer_enabled);
final CheckBoxPreference jukeboxEnabledPreference = new CheckBoxPreference(this);
jukeboxEnabledPreference.setDefaultValue(false);
jukeboxEnabledPreference.setKey(Constants.PREFERENCES_KEY_JUKEBOX_BY_DEFAULT + instance);
jukeboxEnabledPreference.setTitle(R.string.jukebox_is_default);
Preference serverRemoveServerPreference = new Preference(this);
serverRemoveServerPreference.setKey(Constants.PREFERENCES_KEY_REMOVE_SERVER + instance);
serverRemoveServerPreference.setPersistent(false);
@ -304,6 +319,7 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer
serverUsernamePreference.setText(null);
serverPasswordPreference.setText(null);
serverEnabledPreference.setChecked(true);
jukeboxEnabledPreference.setChecked(false);
if (instance < activeServers) {
@ -332,10 +348,10 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer
serverTestConnectionPreference.setKey(Constants.PREFERENCES_KEY_TEST_CONNECTION + instance);
serverTestConnectionPreference.setPersistent(false);
serverTestConnectionPreference.setTitle(R.string.settings_test_connection_title);
serverTestConnectionPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
testConnection(instance);
return false;
}
@ -346,6 +362,7 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer
screen.addPreference(serverUsernamePreference);
screen.addPreference(serverPasswordPreference);
screen.addPreference(serverEnabledPreference);
screen.addPreference(jukeboxEnabledPreference);
screen.addPreference(serverRemoveServerPreference);
screen.addPreference(serverTestConnectionPreference);
@ -516,7 +533,6 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer
private EditTextPreference serverName;
private EditTextPreference serverUrl;
private EditTextPreference username;
private CheckBoxPreference enabled;
private PreferenceScreen screen;
private ServerSettings(String instance) {
@ -525,7 +541,6 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer
serverName = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_SERVER_NAME + instance);
serverUrl = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_SERVER_URL + instance);
username = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_USERNAME + instance);
enabled = (CheckBoxPreference) findPreference(Constants.PREFERENCES_KEY_SERVER_ENABLED + instance);
serverUrl.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
@ -633,6 +648,9 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer
case R.id.menu_chat:
Util.startActivityWithoutTransition(this, ChatActivity.class);
break;
case R.id.menu_bookmarks:
Util.startActivityWithoutTransition(this, BookmarkActivity.class);
break;
case R.id.menu_now_playing:
Util.startActivityWithoutTransition(this, DownloadActivity.class);
break;

View File

@ -94,6 +94,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener{
private int menuActiveViewId;
private View nowPlayingView = null;
View chatMenuItem = null;
View bookmarksMenuItem = null;
View menuMain = null;
public static boolean nowPlayingHidden = false;
private static Entry currentSong;
@ -118,12 +119,14 @@ public class SubsonicTabActivity extends Activity implements OnClickListener{
menuDrawer.setMenuView(R.layout.menu_main);
chatMenuItem = findViewById(R.id.menu_chat);
bookmarksMenuItem = findViewById(R.id.menu_bookmarks);
findViewById(R.id.menu_home).setOnClickListener(this);
findViewById(R.id.menu_browse).setOnClickListener(this);
findViewById(R.id.menu_search).setOnClickListener(this);
findViewById(R.id.menu_playlists).setOnClickListener(this);
chatMenuItem.setOnClickListener(this);
bookmarksMenuItem.setOnClickListener(this);
findViewById(R.id.menu_now_playing).setOnClickListener(this);
findViewById(R.id.menu_settings).setOnClickListener(this);
findViewById(R.id.menu_about).setOnClickListener(this);
@ -145,6 +148,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener{
int visibility = Util.isOffline(this) ? View.GONE : View.VISIBLE;
chatMenuItem.setVisibility(visibility);
bookmarksMenuItem.setVisibility(visibility);
}
@Override
@ -657,8 +661,9 @@ public class SubsonicTabActivity extends Activity implements OnClickListener{
}
warnIfNetworkOrStorageUnavailable();
getDownloadService().download(songs, save, autoplay, playNext, shuffle);
getDownloadService().download(songs, save, autoplay, playNext, shuffle, false);
String playlistName = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_PLAYLIST_NAME);
if (playlistName != null) {
getDownloadService().setSuggestedPlaylistName(playlistName);
}
@ -748,7 +753,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener{
if (unpin) {
downloadService.unpin(songs);
} else {
downloadService.download(songs, save, autoplay, playNext, shuffle);
downloadService.download(songs, save, autoplay, playNext, shuffle, false);
if (!append && Util.getShouldTransitionOnPlaybackPreference(SubsonicTabActivity.this)) {
Util.startActivityWithoutTransition(SubsonicTabActivity.this, DownloadActivity.class);
}
@ -973,6 +978,9 @@ public class SubsonicTabActivity extends Activity implements OnClickListener{
case R.id.menu_chat:
Util.startActivityWithoutTransition(SubsonicTabActivity.this, ChatActivity.class);
break;
case R.id.menu_bookmarks:
Util.startActivityWithoutTransition(this, BookmarkActivity.class);
break;
case R.id.menu_now_playing:
Util.startActivityWithoutTransition(SubsonicTabActivity.this, DownloadActivity.class);
break;

View File

@ -14,18 +14,18 @@ public class Bookmark implements Serializable {
*
*/
private static final long serialVersionUID = 8988990025189807803L;
private Long position;
private int position;
private String username;
private String comment;
private Date created;
private Date changed;
private List<Entry> entries;
private Entry entry;
public Long getPosition() {
public int getPosition() {
return position;
}
public void setPosition(Long position) {
public void setPosition(int position) {
this.position = position;
}
@ -77,11 +77,11 @@ public class Bookmark implements Serializable {
}
}
public List<Entry> getEntries() {
return this.entries;
public Entry getEntry() {
return this.entry;
}
public void addEntry(Entry entry) {
entries.add(entry);
public void setEntry(Entry entry) {
this.entry = entry;
}
}

View File

@ -99,6 +99,7 @@ public class MusicDirectory {
private String type;
private Date created;
private int closeness;
private int bookmarkPosition;
public Integer getDiscNumber() {
return discNumber;
@ -328,6 +329,14 @@ public class MusicDirectory {
this.closeness = closeness;
}
public int getBookmarkPosition() {
return bookmarkPosition;
}
public void setBookmarkPosition(int bookmarkPosition) {
this.bookmarkPosition = bookmarkPosition;
}
@Override
public boolean equals(Object o) {
if (this == o) {

View File

@ -385,7 +385,7 @@ public class CachedMusicService implements MusicService {
}
@Override
public void createBookmark(String id, Long position, Context context, ProgressListener progressListener) throws Exception {
public void createBookmark(String id, int position, Context context, ProgressListener progressListener) throws Exception {
musicService.createBookmark(id, position, context, progressListener);
}
}

View File

@ -22,7 +22,7 @@ import java.util.List;
import com.thejoshwa.ultrasonic.androidapp.audiofx.EqualizerController;
import com.thejoshwa.ultrasonic.androidapp.audiofx.VisualizerController;
import com.thejoshwa.ultrasonic.androidapp.domain.MusicDirectory;
import com.thejoshwa.ultrasonic.androidapp.domain.MusicDirectory.Entry;
import com.thejoshwa.ultrasonic.androidapp.domain.PlayerState;
import com.thejoshwa.ultrasonic.androidapp.domain.RepeatMode;
@ -32,9 +32,9 @@ import com.thejoshwa.ultrasonic.androidapp.domain.RepeatMode;
*/
public interface DownloadService {
void download(List<MusicDirectory.Entry> songs, boolean save, boolean autoplay, boolean playNext, boolean shuffle);
void download(List<Entry> songs, boolean save, boolean autoplay, boolean playNext, boolean shuffle, boolean newPlaylist);
void downloadBackground(List<MusicDirectory.Entry> songs, boolean save);
void downloadBackground(List<Entry> songs, boolean save);
void setShufflePlayEnabled(boolean enabled);
@ -106,11 +106,11 @@ public interface DownloadService {
int getPlayerDuration();
void delete(List<MusicDirectory.Entry> songs);
void delete(List<Entry> songs);
void unpin(List<MusicDirectory.Entry> songs);
void unpin(List<Entry> songs);
DownloadFile forSong(MusicDirectory.Entry song);
DownloadFile forSong(Entry song);
long getDownloadListUpdateRevision();
@ -133,4 +133,6 @@ public interface DownloadService {
void setVolume(float volume);
void swap(boolean mainList, int from, int to);
void restore(List<Entry> songs, int currentPlayingIndex, int currentPlayingPosition, boolean autoPlay, boolean newPlaylist);
}

View File

@ -296,30 +296,39 @@ public class DownloadServiceImpl extends Service implements DownloadService {
}
@Override
public synchronized void download(List<MusicDirectory.Entry> songs, boolean save, boolean autoplay, boolean playNext, boolean shuffle) {
public synchronized void download(List<MusicDirectory.Entry> songs, boolean save, boolean autoplay, boolean playNext, boolean shuffle, boolean newPlaylist) {
shufflePlay = false;
int offset = 1;
if (songs.isEmpty()) {
return;
}
if (newPlaylist) {
downloadList.clear();
}
if (playNext) {
if (autoplay && getCurrentPlayingIndex() >= 0) {
offset = 0;
}
for (MusicDirectory.Entry song : songs) {
DownloadFile downloadFile = new DownloadFile(this, song, save);
downloadList.add(getCurrentPlayingIndex() + offset, downloadFile);
offset++;
}
revision++;
} else {
for (MusicDirectory.Entry song : songs) {
DownloadFile downloadFile = new DownloadFile(this, song, save);
downloadList.add(downloadFile);
}
revision++;
}
updateJukeboxPlaylist();
if(shuffle)
@ -332,8 +341,10 @@ public class DownloadServiceImpl extends Service implements DownloadService {
currentPlaying = downloadList.get(0);
currentPlaying.setPlaying(true);
}
checkDownloads();
}
lifecycleSupport.serializeDownloadQueue();
}
@ -353,13 +364,23 @@ public class DownloadServiceImpl extends Service implements DownloadService {
}
}
public void restore(List<MusicDirectory.Entry> songs, int currentPlayingIndex, int currentPlayingPosition) {
download(songs, false, false, false, false);
@Override
public void restore(List<MusicDirectory.Entry> songs, int currentPlayingIndex, int currentPlayingPosition, boolean autoPlay, boolean newPlaylist) {
download(songs, false, false, false, false, newPlaylist);
if (currentPlayingIndex != -1) {
play(currentPlayingIndex, autoPlayStart);
if (currentPlaying != null && currentPlaying.isCompleteFileAvailable()) {
doPlay(currentPlaying, currentPlayingPosition, autoPlayStart);
if (currentPlaying != null) {
if (autoPlay && jukeboxEnabled) {
jukeboxService.skip(getCurrentPlayingIndex(), currentPlayingPosition / 1000);
} else {
if (currentPlaying.isCompleteFileAvailable()) {
doPlay(currentPlaying, currentPlayingPosition, autoPlay);
}
}
}
autoPlayStart = false;
}
}
@ -683,9 +704,7 @@ public class DownloadServiceImpl extends Service implements DownloadService {
private synchronized void play(int index, boolean start) {
if (index < 0 || index >= size()) {
reset();
setCurrentPlaying(null, false);
lifecycleSupport.serializeDownloadQueue();
resetPlayback();
} else {
if (nextPlayingTask != null) {
nextPlayingTask.cancel();
@ -708,13 +727,20 @@ public class DownloadServiceImpl extends Service implements DownloadService {
}
}
private synchronized void resetPlayback() {
reset();
setCurrentPlaying(null, false);
lifecycleSupport.serializeDownloadQueue();
}
private synchronized void playNext(boolean start) {
// Swap the media players since nextMediaPlayer is ready to play
if(start) {
if (start) {
nextMediaPlayer.start();
} else {
Log.i(TAG, "nextMediaPlayer already playing");
}
MediaPlayer tmp = mediaPlayer;
mediaPlayer = nextMediaPlayer;
nextMediaPlayer = tmp;
@ -724,7 +750,7 @@ public class DownloadServiceImpl extends Service implements DownloadService {
setNextPlaying();
// Proxy should not be being used here since the next player was already setup to play
if(proxy != null) {
if (proxy != null) {
proxy.stop();
proxy = null;
}
@ -781,9 +807,32 @@ public class DownloadServiceImpl extends Service implements DownloadService {
private void onSongCompleted() {
int index = getCurrentPlayingIndex();
if (currentPlaying != null) {
final Entry song = currentPlaying.getSong();
if (song != null && song.getBookmarkPosition() > 0 && Util.getShouldClearBookmark(this)) {
MusicService musicService = MusicServiceFactory.getMusicService(DownloadServiceImpl.this);
try {
musicService.deleteBookmark(song.getId(), DownloadServiceImpl.this, null);
} catch (Exception e) {
}
}
}
if (index != -1) {
switch (getRepeatMode()) {
case OFF:
if (index + 1 < 0 || index + 1 >= size()) {
if (Util.getShouldClearPlaylist(this)) {
clear();
}
resetPlayback();
break;
}
play(index + 1);
break;
case ALL:
@ -969,10 +1018,12 @@ public class DownloadServiceImpl extends Service implements DownloadService {
private void setPlayerStateCompleted() {
Log.i(TAG, this.playerState.name() + " -> " + PlayerState.COMPLETED + " (" + currentPlaying + ")");
this.playerState = PlayerState.COMPLETED;
if(positionCache != null) {
positionCache.stop();
positionCache = null;
}
scrobbler.scrobble(this, currentPlaying, true);
}
@ -1201,7 +1252,7 @@ public class DownloadServiceImpl extends Service implements DownloadService {
SeekBar progressBar = DownloadActivity.getProgressBar();
if (progressBar != null && downloadFile.isCompleteFileAvailable()) {
if (progressBar != null && downloadFile.isWorkDone()) {
// Populate seek bar secondary progress if we have a complete file for consistency
DownloadActivity.getProgressBar().setSecondaryProgress(100 * progressBar.getMax());
}
@ -1236,18 +1287,22 @@ public class DownloadServiceImpl extends Service implements DownloadService {
private synchronized void setupNext(final DownloadFile downloadFile) {
try {
final File file = downloadFile.isCompleteFileAvailable() ? downloadFile.getCompleteFile() : downloadFile.getPartialFile();
if(nextMediaPlayer != null) {
nextMediaPlayer.setOnCompletionListener(null);
nextMediaPlayer.release();
nextMediaPlayer = null;
}
nextMediaPlayer = new MediaPlayer();
nextMediaPlayer.setWakeMode(DownloadServiceImpl.this, PowerManager.PARTIAL_WAKE_LOCK);
try {
nextMediaPlayer.setAudioSessionId(mediaPlayer.getAudioSessionId());
} catch(Throwable e) {
nextMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
nextMediaPlayer.setDataSource(file.getPath());
setNextPlayerState(PREPARING);
@ -1308,6 +1363,7 @@ public class DownloadServiceImpl extends Service implements DownloadService {
int pos = cachedPosition;
Log.i(TAG, "Ending position " + pos + " of " + duration);
if (!isPartial || (downloadFile.isWorkDone() && (Math.abs(duration - pos) < 10000))) {
if(nextPlaying != null && nextPlayerState == PlayerState.PREPARED) {
if(!nextSetup) {
@ -1319,6 +1375,7 @@ public class DownloadServiceImpl extends Service implements DownloadService {
} else {
onSongCompleted();
}
return;
}

View File

@ -153,6 +153,9 @@ public class DownloadServiceLifecycleSupport {
commandFilter.addAction(DownloadServiceImpl.CMD_NEXT);
downloadService.registerReceiver(intentReceiver, commandFilter);
int instance = Util.getActiveServer(downloadService);
downloadService.setJukeboxEnabled(Util.getJukeboxEnabled(downloadService, instance));
deserializeDownloadQueue();
new CacheCleaner(downloadService, downloadService).clean();
@ -209,7 +212,7 @@ public class DownloadServiceLifecycleSupport {
return;
}
Log.i(TAG, "Deserialized currentPlayingIndex: " + state.currentPlayingIndex + ", currentPlayingPosition: " + state.currentPlayingPosition);
downloadService.restore(state.songs, state.currentPlayingIndex, state.currentPlayingPosition);
downloadService.restore(state.songs, state.currentPlayingIndex, state.currentPlayingPosition, false, false);
// Work-around: Serialize again, as the restore() method creates a serialization without current playing info.
serializeDownloadQueue();

View File

@ -164,9 +164,11 @@ public class JukeboxService {
tasks.remove(Start.class);
startStatusUpdate();
if (jukeboxStatus != null) {
jukeboxStatus.setPositionSeconds(offsetSeconds);
}
tasks.add(new Skip(index, offsetSeconds));
downloadService.setPlayerState(PlayerState.STARTED);
}

View File

@ -32,7 +32,6 @@ import com.thejoshwa.ultrasonic.androidapp.domain.Indexes;
import com.thejoshwa.ultrasonic.androidapp.domain.JukeboxStatus;
import com.thejoshwa.ultrasonic.androidapp.domain.Lyrics;
import com.thejoshwa.ultrasonic.androidapp.domain.MusicDirectory;
import com.thejoshwa.ultrasonic.androidapp.domain.MusicDirectory.Entry;
import com.thejoshwa.ultrasonic.androidapp.domain.MusicFolder;
import com.thejoshwa.ultrasonic.androidapp.domain.Playlist;
import com.thejoshwa.ultrasonic.androidapp.domain.SearchCritera;
@ -135,5 +134,5 @@ public interface MusicService {
void deleteBookmark(String id, Context context, ProgressListener progressListener) throws Exception;
void createBookmark(String id, Long position, Context context, ProgressListener progressListener) throws Exception;
void createBookmark(String id, int position, Context context, ProgressListener progressListener) throws Exception;
}

View File

@ -1221,7 +1221,7 @@ public class RESTMusicService implements MusicService {
}
@Override
public void createBookmark(String id, Long position, Context context, ProgressListener progressListener) throws Exception {
public void createBookmark(String id, int position, Context context, ProgressListener progressListener) throws Exception {
checkServerVersion(context, "1.9", "Bookmarks not supported.");
HttpParams params = new BasicHttpParams();

View File

@ -47,7 +47,7 @@ public class AlbumListParser extends MusicDirectoryEntryParser {
if (eventType == XmlPullParser.START_TAG) {
String name = getElementName();
if ("album".equals(name)) {
dir.addChild(parseEntry("", useId3));
dir.addChild(parseEntry("", useId3, 0));
} else if ("error".equals(name)) {
handleError();
}

View File

@ -38,10 +38,11 @@ public class BookmarkParser extends MusicDirectoryEntryParser {
bookmark.setChanged(get("changed"));
bookmark.setCreated(get("created"));
bookmark.setComment(get("comment"));
bookmark.setPosition(getLong("position"));
bookmark.setPosition(getInteger("position"));
bookmark.setUsername(get("username"));
} else if ("entry".equals(name)) {
bookmark.addEntry(parseEntry(null, false));
bookmark.setEntry(parseEntry(null, false, bookmark.getPosition()));
dir.add(bookmark);
} else if ("error".equals(name)) {
handleError();
}

View File

@ -31,7 +31,7 @@ public class MusicDirectoryEntryParser extends AbstractParser {
super(context);
}
protected MusicDirectory.Entry parseEntry(String artist, boolean isAlbum) {
protected MusicDirectory.Entry parseEntry(String artist, boolean isAlbum, int bookmarkPosition) {
MusicDirectory.Entry entry = new MusicDirectory.Entry();
entry.setId(get("id"));
entry.setParent(get("parent"));
@ -60,6 +60,7 @@ public class MusicDirectoryEntryParser extends AbstractParser {
entry.setIsVideo(getBoolean("isVideo"));
entry.setDiscNumber(getInteger("discNumber"));
entry.setType(get("type"));
entry.setBookmarkPosition(bookmarkPosition);
} else if(!"".equals(artist)) {
entry.setPath(artist + "/" + entry.getTitle());
}

View File

@ -51,9 +51,9 @@ public class MusicDirectoryParser extends MusicDirectoryEntryParser {
String name = getElementName();
if ("child".equals(name) || "song".equals(name)) {
dir.addChild(parseEntry(artist, false));
dir.addChild(parseEntry(artist, false, 0));
} else if ("album".equals(name) && !isAlbum) {
dir.addChild(parseEntry(artist, true));
dir.addChild(parseEntry(artist, true, 0));
} else if ("directory".equals(name) || "artist".equals(name)) {
dir.setName(get("name"));
} else if ("error".equals(name)) {

View File

@ -46,7 +46,7 @@ public class PlaylistParser extends MusicDirectoryEntryParser {
if (eventType == XmlPullParser.START_TAG) {
String name = getElementName();
if ("entry".equals(name)) {
dir.addChild(parseEntry("", false));
dir.addChild(parseEntry("", false, 0));
} else if ("error".equals(name)) {
handleError();
}

View File

@ -46,7 +46,7 @@ public class RandomSongsParser extends MusicDirectoryEntryParser {
if (eventType == XmlPullParser.START_TAG) {
String name = getElementName();
if ("song".equals(name)) {
dir.addChild(parseEntry("", false));
dir.addChild(parseEntry("", false, 0));
} else if ("error".equals(name)) {
handleError();
}

View File

@ -57,9 +57,9 @@ public class SearchResult2Parser extends MusicDirectoryEntryParser {
artist.setName(get("name"));
artists.add(artist);
} else if ("album".equals(name)) {
albums.add(parseEntry("", useId3));
albums.add(parseEntry("", useId3, 0));
} else if ("song".equals(name)) {
songs.add(parseEntry("", false));
songs.add(parseEntry("", false, 0));
} else if ("error".equals(name)) {
handleError();
}

View File

@ -51,7 +51,7 @@ public class SearchResultParser extends MusicDirectoryEntryParser {
if (eventType == XmlPullParser.START_TAG) {
String name = getElementName();
if ("match".equals(name)) {
songs.add(parseEntry("", false));
songs.add(parseEntry("", false, 0));
} else if ("error".equals(name)) {
handleError();
}

View File

@ -44,7 +44,7 @@ public class ShareParser extends MusicDirectoryEntryParser {
share.setUsername(get("username"));
share.setVisitCount(getLong("visitCount"));
} else if ("entry".equals(name)) {
share.addEntry(parseEntry(null, false));
share.addEntry(parseEntry(null, false, 0));
} else if ("error".equals(name)) {
handleError();
}

View File

@ -62,6 +62,7 @@ public final class Constants {
// Preferences keys.
public static final String PREFERENCES_KEY_SERVER = "server";
public static final String PREFERENCES_KEY_SERVER_ENABLED = "serverEnabled";
public static final String PREFERENCES_KEY_JUKEBOX_BY_DEFAULT = "jukeboxEnabled";
public static final String PREFERENCES_KEY_SERVER_INSTANCE = "serverInstanceId";
public static final String PREFERENCES_KEY_SERVER_NAME = "serverName";
public static final String PREFERENCES_KEY_SERVER_URL = "serverUrl";
@ -118,6 +119,9 @@ public final class Constants {
public static final String PREFERENCES_KEY_TEMP_LOSS = "tempLoss";
public static final String PREFERENCES_KEY_CHAT_REFRESH_INTERVAL = "chatRefreshInterval";
public static final String PREFERENCES_KEY_DIRECTORY_CACHE_TIME = "directoryCacheTime";
public static final String PREFERENCES_KEY_CLEAR_PLAYLIST = "clearPlaylist";
public static final String PREFERENCES_KEY_CLEAR_BOOKMARK = "clearBookmark";
public static final String PREFERENCES_KEY_DISC_SORT = "discAndTrackSort";
// Name of the preferences file.
public static final String PREFERENCES_FILE_NAME = "com.thejoshwa.ultrasonic.androidapp_preferences";

View File

@ -48,6 +48,7 @@ import android.widget.Toast;
import com.thejoshwa.ultrasonic.androidapp.R;
import com.thejoshwa.ultrasonic.androidapp.activity.DownloadActivity;
import com.thejoshwa.ultrasonic.androidapp.activity.MainActivity;
import com.thejoshwa.ultrasonic.androidapp.domain.Bookmark;
import com.thejoshwa.ultrasonic.androidapp.domain.MusicDirectory;
import com.thejoshwa.ultrasonic.androidapp.domain.PlayerState;
import com.thejoshwa.ultrasonic.androidapp.domain.RepeatMode;
@ -74,7 +75,7 @@ import java.lang.reflect.Method;
import java.security.MessageDigest;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
@ -221,6 +222,14 @@ public class Util extends DownloadActivity {
return prefs.getBoolean(Constants.PREFERENCES_KEY_SERVER_ENABLED + instance, true);
}
public static boolean getJukeboxEnabled(Context context, int instance) {
if (instance == 0) {
return false;
}
SharedPreferences prefs = getPreferences(context);
return prefs.getBoolean(Constants.PREFERENCES_KEY_JUKEBOX_BY_DEFAULT + instance, false);
}
public static void setServerRestVersion(Context context, Version version) {
SERVER_REST_VERSIONS.put(getActiveServer(context), version);
}
@ -241,6 +250,7 @@ public class Util extends DownloadActivity {
String userName = prefs.getString(Constants.PREFERENCES_KEY_USERNAME + newInstance, null);
String password = prefs.getString(Constants.PREFERENCES_KEY_PASSWORD + newInstance, null);
boolean serverEnabled = prefs.getBoolean(Constants.PREFERENCES_KEY_SERVER_ENABLED + newInstance, true);
boolean jukeboxEnabled = prefs.getBoolean(Constants.PREFERENCES_KEY_JUKEBOX_BY_DEFAULT + newInstance, true);
editor.putString(Constants.PREFERENCES_KEY_SERVER + instance, server);
editor.putString(Constants.PREFERENCES_KEY_SERVER_NAME + instance, serverName);
@ -248,6 +258,7 @@ public class Util extends DownloadActivity {
editor.putString(Constants.PREFERENCES_KEY_USERNAME + instance, userName);
editor.putString(Constants.PREFERENCES_KEY_PASSWORD + instance, password);
editor.putBoolean(Constants.PREFERENCES_KEY_SERVER_ENABLED + instance, serverEnabled);
editor.putBoolean(Constants.PREFERENCES_KEY_JUKEBOX_BY_DEFAULT + instance, jukeboxEnabled);
editor.putString(Constants.PREFERENCES_KEY_SERVER + newInstance, null);
editor.putString(Constants.PREFERENCES_KEY_SERVER_NAME + newInstance, null);
@ -255,6 +266,7 @@ public class Util extends DownloadActivity {
editor.putString(Constants.PREFERENCES_KEY_USERNAME + newInstance, null);
editor.putString(Constants.PREFERENCES_KEY_PASSWORD + newInstance, null);
editor.putBoolean(Constants.PREFERENCES_KEY_SERVER_ENABLED + newInstance, true);
editor.putBoolean(Constants.PREFERENCES_KEY_JUKEBOX_BY_DEFAULT + newInstance, false);
editor.commit();
if (instance == activeInstance) {
@ -819,6 +831,16 @@ public class Util extends DownloadActivity {
return musicDirectory;
}
public static MusicDirectory getSongsFromBookmarks(List<Bookmark> bookmarks) {
MusicDirectory musicDirectory = new MusicDirectory();
for (Bookmark bookmark : bookmarks) {
musicDirectory.addChild(bookmark.getEntry());
}
return musicDirectory;
}
/**
* <p>Broadcasts the given song info as the new song being played.</p>
*/
@ -1252,7 +1274,30 @@ public class Util extends DownloadActivity {
}
public static String formatTotalDuration(long totalDuration) {
long millis = totalDuration * 1000;
return formatTotalDuration(totalDuration, false);
}
public static boolean getShouldClearPlaylist(Context context) {
SharedPreferences prefs = getPreferences(context);
return prefs.getBoolean(Constants.PREFERENCES_KEY_CLEAR_PLAYLIST, false);
}
public static boolean getShouldSortByDisc(Context context) {
SharedPreferences prefs = getPreferences(context);
return prefs.getBoolean(Constants.PREFERENCES_KEY_DISC_SORT, false);
}
public static boolean getShouldClearBookmark(Context context) {
SharedPreferences prefs = getPreferences(context);
return prefs.getBoolean(Constants.PREFERENCES_KEY_CLEAR_BOOKMARK, false);
}
public static String formatTotalDuration(long totalDuration, boolean inMilliseconds) {
long millis = totalDuration;
if (!inMilliseconds) {
millis = totalDuration * 1000;
}
long hours = TimeUnit.MILLISECONDS.toHours(millis);
long minutes = TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(hours);

View File

@ -59,8 +59,9 @@ public class ChatAdapter extends ArrayAdapter<ChatMessage> {
if (convertView == null)
{
holder = new ViewHolder();
holder.layout = layout;
convertView = LayoutInflater.from(activity).inflate(layout, parent, false);
convertView = LayoutInflater.from(activity).inflate(holder.layout, parent, false);
TextView usernameView = (TextView) convertView.findViewById(R.id.chat_username);
TextView timeView = (TextView) convertView.findViewById(R.id.chat_time);
@ -94,6 +95,7 @@ public class ChatAdapter extends ArrayAdapter<ChatMessage> {
private static class ViewHolder
{
int layout;
TextView message;
TextView username;
TextView time;