aboutsummaryrefslogtreecommitdiff
path: root/app/src
diff options
context:
space:
mode:
authorScott Jackson <daneren2005@users.noreply.github.com>2016-10-04 17:10:48 -0700
committerGitHub <noreply@github.com>2016-10-04 17:10:48 -0700
commit2b973ff6571e565bb6752be616439dbe26b2ce88 (patch)
treee1a743383488c00b85360555d07c78da526a4408 /app/src
parent72751eafc2f9485d4720bbed9ec3b75726f92c9d (diff)
parent54da1317ce7a9b846faf01fc22504334f357892c (diff)
downloaddsub-2b973ff6571e565bb6752be616439dbe26b2ce88.tar.gz
dsub-2b973ff6571e565bb6752be616439dbe26b2ce88.tar.bz2
dsub-2b973ff6571e565bb6752be616439dbe26b2ce88.zip
Merge pull request #744 from daneren2005/edge
Edge
Diffstat (limited to 'app/src')
-rw-r--r--app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java2
-rw-r--r--app/src/main/java/github/daneren2005/dsub/fragments/SelectInternetRadioStationFragment.java45
-rw-r--r--app/src/main/java/github/daneren2005/dsub/service/ChromeCastController.java5
-rw-r--r--app/src/main/java/github/daneren2005/dsub/util/BackgroundTask.java19
-rw-r--r--app/src/main/java/github/daneren2005/dsub/util/EnvironmentVariables.java1
-rw-r--r--app/src/main/java/github/daneren2005/dsub/util/Notifications.java20
-rw-r--r--app/src/main/java/github/daneren2005/dsub/util/compat/CastCompat.java8
-rw-r--r--app/src/main/res/values-hu/strings.xml8
-rw-r--r--app/src/main/res/values-pt-rPT/strings.xml63
-rw-r--r--app/src/main/res/xml/changelog.xml4
10 files changed, 139 insertions, 36 deletions
diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java
index 985b7bec..f55dbe1d 100644
--- a/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java
+++ b/app/src/main/java/github/daneren2005/dsub/fragments/NowPlayingFragment.java
@@ -522,7 +522,7 @@ public class NowPlayingFragment extends SubsonicFragment implements OnGestureLis
menu.removeItem(R.id.menu_equalizer);
}
- if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && isRemoteEnabled) {
+ if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || isRemoteEnabled) {
playbackSpeedButton.setVisibility(View.GONE);
} else {
playbackSpeedButton.setVisibility(View.VISIBLE);
diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/SelectInternetRadioStationFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/SelectInternetRadioStationFragment.java
index 16082cbd..c39e9f61 100644
--- a/app/src/main/java/github/daneren2005/dsub/fragments/SelectInternetRadioStationFragment.java
+++ b/app/src/main/java/github/daneren2005/dsub/fragments/SelectInternetRadioStationFragment.java
@@ -18,10 +18,18 @@
*/
package github.daneren2005.dsub.fragments;
+import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.util.ArrayList;
import java.util.List;
@@ -37,6 +45,8 @@ import github.daneren2005.dsub.util.Util;
import github.daneren2005.dsub.view.UpdateView;
public class SelectInternetRadioStationFragment extends SelectRecyclerFragment<InternetRadioStation> {
+ private static final String TAG = SelectInternetRadioStationFragment.class.getSimpleName();
+
@Override
public int getOptionsMenu() {
return R.menu.abstract_top_menu;
@@ -67,6 +77,7 @@ public class SelectInternetRadioStationFragment extends SelectRecyclerFragment<I
return null;
}
+ getStreamFromPlaylist(item);
downloadService.download(item);
return null;
}
@@ -94,6 +105,40 @@ public class SelectInternetRadioStationFragment extends SelectRecyclerFragment<I
return false;
}
+ private void getStreamFromPlaylist(InternetRadioStation internetRadioStation) {
+ if(internetRadioStation.getStreamUrl() != null && (internetRadioStation.getStreamUrl().indexOf(".m3u") != -1 || internetRadioStation.getStreamUrl().indexOf(".pls") != -1)) {
+ try {
+ URL url = new URL(internetRadioStation.getStreamUrl());
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+
+ try {
+ BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+ String line;
+ while((line = in.readLine()) != null) {
+ // Not blank line or comment
+ if(line.length() > 0 && line.indexOf('#') != 0) {
+ if(internetRadioStation.getStreamUrl().indexOf(".m3u") != -1) {
+ internetRadioStation.setStreamUrl(line);
+ break;
+ } else {
+ if(line.indexOf("File1=") == 0) {
+ internetRadioStation.setStreamUrl(line.replace("File1=", ""));
+ } else if(line.indexOf("Title1=") == 0) {
+ internetRadioStation.setTitle(line.replace("Title1=", ""));
+ }
+ }
+ }
+ }
+ } finally {
+ connection.disconnect();
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Failed to get stream data from playlist");
+ }
+
+ }
+ }
+
private void displayInternetRadioStationInfo(final InternetRadioStation station) {
List<Integer> headers = new ArrayList<>();
List<String> details = new ArrayList<>();
diff --git a/app/src/main/java/github/daneren2005/dsub/service/ChromeCastController.java b/app/src/main/java/github/daneren2005/dsub/service/ChromeCastController.java
index c2007139..2df290cf 100644
--- a/app/src/main/java/github/daneren2005/dsub/service/ChromeCastController.java
+++ b/app/src/main/java/github/daneren2005/dsub/service/ChromeCastController.java
@@ -41,6 +41,7 @@ import github.daneren2005.dsub.domain.MusicDirectory;
import github.daneren2005.dsub.domain.PlayerState;
import github.daneren2005.dsub.domain.RemoteControlState;
import github.daneren2005.dsub.util.Constants;
+import github.daneren2005.dsub.util.EnvironmentVariables;
import github.daneren2005.dsub.util.FileUtil;
import github.daneren2005.dsub.util.Util;
import github.daneren2005.dsub.util.compat.CastCompat;
@@ -465,14 +466,14 @@ public class ChromeCastController extends RemoteController {
void launchApplication() {
try {
- Cast.CastApi.launchApplication(apiClient, CastCompat.APPLICATION_ID, false).setResultCallback(resultCallback);
+ Cast.CastApi.launchApplication(apiClient, EnvironmentVariables.CAST_APPLICATION_ID, false).setResultCallback(resultCallback);
} catch (Exception e) {
Log.e(TAG, "Failed to launch application", e);
}
}
void reconnectApplication() {
try {
- Cast.CastApi.joinApplication(apiClient, CastCompat.APPLICATION_ID, sessionId).setResultCallback(resultCallback);
+ Cast.CastApi.joinApplication(apiClient, EnvironmentVariables.CAST_APPLICATION_ID, sessionId).setResultCallback(resultCallback);
} catch (Exception e) {
Log.e(TAG, "Failed to reconnect application", e);
}
diff --git a/app/src/main/java/github/daneren2005/dsub/util/BackgroundTask.java b/app/src/main/java/github/daneren2005/dsub/util/BackgroundTask.java
index 31e83200..2b0c6279 100644
--- a/app/src/main/java/github/daneren2005/dsub/util/BackgroundTask.java
+++ b/app/src/main/java/github/daneren2005/dsub/util/BackgroundTask.java
@@ -27,6 +27,7 @@ import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
import org.xmlpull.v1.XmlPullParserException;
@@ -54,6 +55,7 @@ public abstract class BackgroundTask<T> implements ProgressListener {
private static final Collection<Thread> threads = Collections.synchronizedCollection(new ArrayList<Thread>());
protected static final BlockingQueue<BackgroundTask.Task> queue = new LinkedBlockingQueue<BackgroundTask.Task>(10);
private static Handler handler = null;
+ private static AtomicInteger currentlyRunning = new AtomicInteger(0);
static {
try {
handler = new Handler(Looper.getMainLooper());
@@ -71,6 +73,11 @@ public abstract class BackgroundTask<T> implements ProgressListener {
threads.add(thread);
thread.start();
}
+ } else if(currentlyRunning.get() >= threads.size()) {
+ Log.w(TAG, "Emergency add new thread: " + (threads.size() + 1));
+ Thread thread = new Thread(new TaskRunnable(), String.format("BackgroundTask_%d", threads.size()));
+ threads.add(thread);
+ thread.start();
}
if(handler == null) {
try {
@@ -304,22 +311,30 @@ public abstract class BackgroundTask<T> implements ProgressListener {
@Override
public void run() {
Looper.prepare();
+ final Thread currentThread = Thread.currentThread();
while(running) {
try {
Task task = queue.take();
+ currentlyRunning.incrementAndGet();
task.execute();
} catch(InterruptedException stop) {
Log.e(TAG, "Thread died");
running = false;
- threads.remove(Thread.currentThread());
} catch(Throwable t) {
Log.e(TAG, "Unexpected crash in BackgroundTask thread", t);
+ running = false;
}
+
+ currentlyRunning.decrementAndGet();
+ }
+
+ if(threads.contains(currentThread)) {
+ threads.remove(currentThread);
}
}
}
- public static interface OnCancelListener {
+ public interface OnCancelListener {
void onCancel();
}
}
diff --git a/app/src/main/java/github/daneren2005/dsub/util/EnvironmentVariables.java b/app/src/main/java/github/daneren2005/dsub/util/EnvironmentVariables.java
index d8046d1b..710d5232 100644
--- a/app/src/main/java/github/daneren2005/dsub/util/EnvironmentVariables.java
+++ b/app/src/main/java/github/daneren2005/dsub/util/EnvironmentVariables.java
@@ -17,4 +17,5 @@ package github.daneren2005.dsub.util;
public final class EnvironmentVariables {
public static final String PASTEBIN_DEV_KEY = "";
+ public static final String CAST_APPLICATION_ID = "";
}
diff --git a/app/src/main/java/github/daneren2005/dsub/util/Notifications.java b/app/src/main/java/github/daneren2005/dsub/util/Notifications.java
index 0d4a0f9c..d6a92b07 100644
--- a/app/src/main/java/github/daneren2005/dsub/util/Notifications.java
+++ b/app/src/main/java/github/daneren2005/dsub/util/Notifications.java
@@ -99,7 +99,12 @@ public final class Notifications {
public void run() {
downloadService.stopForeground(true);
showDownloadingNotification(context, downloadService, handler, downloadService.getCurrentDownloading(), downloadService.getBackgroundDownloads().size());
- downloadService.startForeground(NOTIFICATION_ID_PLAYING, notification);
+
+ try {
+ downloadService.startForeground(NOTIFICATION_ID_PLAYING, notification);
+ } catch(Exception e) {
+ Log.e(TAG, "Failed to start notifications after stopping foreground download");
+ }
}
});
} else {
@@ -107,13 +112,22 @@ public final class Notifications {
@Override
public void run() {
if (playing) {
- downloadService.startForeground(NOTIFICATION_ID_PLAYING, notification);
+ try {
+ downloadService.startForeground(NOTIFICATION_ID_PLAYING, notification);
+ } catch(Exception e) {
+ Log.e(TAG, "Failed to start notifications while playing");
+ }
} else {
playShowing = false;
persistentPlayingShowing = true;
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
downloadService.stopForeground(false);
- notificationManager.notify(NOTIFICATION_ID_PLAYING, notification);
+
+ try {
+ notificationManager.notify(NOTIFICATION_ID_PLAYING, notification);
+ } catch(Exception e) {
+ Log.e(TAG, "Failed to start notifications while paused");
+ }
}
}
});
diff --git a/app/src/main/java/github/daneren2005/dsub/util/compat/CastCompat.java b/app/src/main/java/github/daneren2005/dsub/util/compat/CastCompat.java
index ab64bca9..415106db 100644
--- a/app/src/main/java/github/daneren2005/dsub/util/compat/CastCompat.java
+++ b/app/src/main/java/github/daneren2005/dsub/util/compat/CastCompat.java
@@ -23,13 +23,9 @@ import com.google.android.gms.cast.CastMediaControlIntent;
import github.daneren2005.dsub.service.ChromeCastController;
import github.daneren2005.dsub.service.DownloadService;
import github.daneren2005.dsub.service.RemoteController;
+import github.daneren2005.dsub.util.EnvironmentVariables;
-/**
- * Created by owner on 2/9/14.
- */
public final class CastCompat {
- public static final String APPLICATION_ID = "5F85EBEB";
-
static {
try {
Class.forName("com.google.android.gms.cast.CastDevice");
@@ -52,6 +48,6 @@ public final class CastCompat {
}
public static String getCastControlCategory() {
- return CastMediaControlIntent.categoryForCast(APPLICATION_ID);
+ return CastMediaControlIntent.categoryForCast(EnvironmentVariables.CAST_APPLICATION_ID);
}
}
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index a720b214..12102043 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -36,6 +36,7 @@
<string name="button_bar.now_playing">Várólista</string>
<string name="button_bar.podcasts">Podcastok</string>
<string name="button_bar.bookmarks">Könyvjelzők</string>
+ <string name="button_bar.internet_radio">Internet rádió</string>
<string name="button_bar.shares">Megosztások</string>
<string name="button_bar.chat">Csevegés (Chat)</string>
<string name="button_bar.admin">Admin</string>
@@ -225,6 +226,7 @@
<string name="download.playback_speed_one_half">1.5x</string>
<string name="download.playback_speed_double">2x</string>
<string name="download.playback_speed_tripple">3x</string>
+ <string name="download.playback_speed_custom">Egyéni</string>
<string name="sync.new_podcasts">Új podcastok: \"%s\"</string>
<string name="sync.new_playlists">Új lejátszási listák: \"%s\"</string>
@@ -305,6 +307,8 @@
<string name="settings.theme_dark">Sötét</string>
<string name="settings.theme_black">Fekete</string>
<string name="settings.theme_holo">Holo</string>
+ <string name="settings.theme_day_night">Nappal/Éjszaka</string>
+ <string name="settings.theme_day_black_night">Nappal/Fekete éjszaka</string>
<string name="settings.theme_fullscreen">Teljes képernyős</string>
<string name="settings.theme_fullscreen_summary">Teljes képernyős üzemmód (értesítési sáv elrejtése).</string>
<string name="settings.track_title">Dalsorszám megjelenítése</string>
@@ -407,6 +411,8 @@
<string name="settings.podcasts_enabled_summary">Podcastok menüpont megjelenítése az elhúzható oldalsávon.</string>
<string name="settings.bookmarks_enabled">Könyvjelzők engedélyezése</string>
<string name="settings.bookmarks_enabled_summary">Könyvjelzők menüpont megjelenítése az elhúzható oldalsávon.</string>
+ <string name="settings.internet_radio_enabled">Internet rádió engedélyezése</string>
+ <string name="settings.internet_radio_enabled_summary">Internet rádió menüpont megjelenítése az elhúzható oldalsávon.</string>
<string name="settings.shares_enabled">Megosztások engedélyezése</string>
<string name="settings.shares_enabled_summary">Megosztások menüpont megjelenítése az elhúzható oldalsávon.</string>
<string name="settings.sync_title">Szinkronizálás</string>
@@ -464,7 +470,7 @@
<string name="settings.replay_gain_type.track">Dal értékeiből</string>
<string name="settings.replay_gain_bump">Hangerő-kiegyenlítés előerősítése</string>
<string name="settings.replay_gain_untagged">Dalok hangerő-kiegyenlítés nélkül</string>
- <string name="settings.casting">Casting (Tartalmak átküldése)</string>
+ <string name="settings.casting">Casting (tartalmak átküldése)</string>
<string name="settings.casting_proxy">Eszköz használata proxyként</string>
<string name="settings.casting_proxy_summary">Streamelés az eszközön (mint egy proxyn) keresztül. Ez megoldást jelenthet néhány esetben, pl. saját aláírású tanúsítvány használatakor.</string>
<string name="settings.rename_duplicates">Duplikált dalok átnevezése</string>
diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml
index 9042839f..885035a4 100644
--- a/app/src/main/res/values-pt-rPT/strings.xml
+++ b/app/src/main/res/values-pt-rPT/strings.xml
@@ -36,6 +36,7 @@
<string name="button_bar.now_playing">A reproduzir agora</string>
<string name="button_bar.podcasts">Podcasts</string>
<string name="button_bar.bookmarks">Marcadores</string>
+ <string name="button_bar.internet_radio">Rádios online</string>
<string name="button_bar.shares">Partilhas</string>
<string name="button_bar.chat">Chat</string>
<string name="button_bar.admin">Administração</string>
@@ -43,17 +44,17 @@
<string name="button_bar.offline">Offline</string>
<string name="main.welcome_title">Bem-vindo!</string>
- <string name="main.welcome_text">Bem-vindo ao DSub! Atualmente a aplicação está configurada para usar o servidor de demonstração do Subsonic. Depois de configurar o seu servidor pessoal (disponível em <b>subsonic.org</b>), vá às <b>Definições</b> e altere as configurações para que possa conectar-se.</string>
+ <string name="main.welcome_text">Bem-vindo ao DSub! Atualmente a aplicação está configurada para usar o servidor de demonstração do Subsonic. Depois de configurar o seu servidor pessoal (disponível em <b>subsonic.org</b>), consulte as <b>Definições</b> e altere as configurações para que possa conectar-se.</string>
<string name="main.about_title">Sobre o DSub</string>
<string name="main.faq_title">FAQ</string>
<string name="main.faq_text">
<![CDATA[
<font color="red">Cache vs Cache permanente</font>:
- <br/>Quando o DSub transfere as músicas, elas poderão vir a ser eliminadas mais tarde para dar espaço para novas transferências. Por outro lado, as músicas que ficam permanentemente na cache nunca serão eliminadas.
- <p/><font color="red">Falhas com o ChromeCast</font>:
- <br/>Experimente a opção Definições -> Reprodução -> Usar dispositivo como proxy. É uma solução alternativa devido ao Chromecast não aceitar certificados auto-assinados.
+ <br/>Quando o DSub transfere as músicas, as mesmas poderão ser eliminadas mais tarde para dar espaço para novas transferências. Por outro lado, as músicas que ficam permanentemente na cache nunca serão eliminadas.
+ <p/><font color="red">Falhas com o Chromecast</font>:
+ <br/>Experimente a opção Definições -> Transmissão -> Usar dispositivo como proxy. É uma solução alternativa devido ao Chromecast não aceitar certificados auto-assinados.
<p/><font color="red">Primeiro nível na biblioteca são grupos de artistas</font>:
- <br/>No menu de opções, desmarque a opção "Artistas no primeiro nível". Isto irá fazer com que o primeiro nível de diretorias apresentado seja tratado como grupos de artistas em vez de artistas propriamente ditos.
+ <br/>No menu de opções, desmarque a opção "Artistas no primeiro nível". Isto fará com que o primeiro nível de diretorias apresentado seja tratado como grupos de artistas em vez de artistas propriamente ditos.
]]>
</string>
<string name="main.shuffle">Aleatório</string>
@@ -192,7 +193,7 @@
<string name="download.menu_shuffle_notification">A lista de reprodução foi aleatorizada</string>
<string name="download.menu_remove_played_songs">Remover músicas reproduzidas</string>
<string name="download.playlist_title">Guardar lista de reprodução</string>
- <string name="download.playlist_name">Introduza o nome da lista de reprodução:</string>
+ <string name="download.playlist_name">Introduza um nome para a lista de reprodução:</string>
<string name="download.playlist_saving">A guardar a lista de reprodução \"%s\"...</string>
<string name="download.playlist_done">A lista de reprodução foi guardada com sucesso.</string>
<string name="download.playlist_error">Falha ao guardar a lista de reprodução, tente novamente mais tarde.</string>
@@ -219,6 +220,12 @@
<string name="download.thumbs_up">Gosto</string>
<string name="download.thumbs_down">Não gosto</string>
<string name="download.batch_mode">Modo em série</string>
+ <string name="download.playback_speed_half">0.5x</string>
+ <string name="download.playback_speed_normal">1x</string>
+ <string name="download.playback_speed_one_half">1.5x</string>
+ <string name="download.playback_speed_double">2x</string>
+ <string name="download.playback_speed_tripple">3x</string>
+ <string name="download.playback_speed_custom">Personalizado</string>
<string name="sync.new_podcasts">Novos podcasts disponíveis</string>
<string name="sync.new_playlists">Novas músicas nas listas de reprodução</string>
@@ -277,8 +284,8 @@
<string name="settings.server_sync_summary">Ativar ou não a sincronização para este servidor</string>
<string name="settings.server_sync">Sincronização ativa</string>
<string name="settings.cache_title">Cache de música</string>
- <string name="settings.preload_wifi">Músicas para pre-carregar (Wi-Fi)</string>
- <string name="settings.preload_mobile">Músicas para pre-carregar (dados móveis)</string>
+ <string name="settings.preload_wifi">Músicas para pré-carregar (Wi-Fi)</string>
+ <string name="settings.preload_mobile">Músicas para pré-carregar (dados móveis)</string>
<string name="settings.cache_size">Tamanho da cache</string>
<string name="settings.cache_location">Localização da cache</string>
<string name="settings.cache_location_error">Localização da cache inválida. A utilizar predefinição.</string>
@@ -299,6 +306,8 @@
<string name="settings.theme_dark">Escuro</string>
<string name="settings.theme_black">Preto</string>
<string name="settings.theme_holo">Holo</string>
+ <string name="settings.theme_day_night">Dia/Noite</string>
+ <string name="settings.theme_day_black_night">Dia/Noite (Preto)</string>
<string name="settings.theme_fullscreen">Ecrã inteiro</string>
<string name="settings.theme_fullscreen_summary">Ocultar o maior número de elementos da interface que o Android permita</string>
<string name="settings.track_title">Mostrar número da faixa</string>
@@ -332,7 +341,7 @@
<string name="settings.max_video_bitrate_2000">2000 Kbps</string>
<string name="settings.max_video_bitrate_3000">3000 Kbps</string>
<string name="settings.max_video_bitrate_5000">5000 Kbps</string>
- <string name="settings.max_bitrate_unlimited">Ilimitado</string>
+ <string name="settings.max_bitrate_unlimited">Ilimitada</string>
<string name="settings.wifi_required_title">Transmissão apenas em Wi-Fi</string>
<string name="settings.wifi_required_summary">Apenas transmitir multimédia se ligado por Wi-Fi</string>
<string name="settings.network_timeout_title">Intervalo de ligação</string>
@@ -352,7 +361,7 @@
<string name="settings.search_history_cleared">O histório de pesquisa foi apagado</string>
<string name="settings.other_title">Outras definições</string>
<string name="settings.scrobble_title">Scrobble para Last.FM</string>
- <string name="settings.scrobble_summary">Lembrar de configurar o nome de utilizador e palavra-passe do Last.FM no servidor Subsonic</string>
+ <string name="settings.scrobble_summary">Não se esqueça de configurar o seu nome de utilizador e palavra-passe do Last.FM no servidor Subsonic</string>
<string name="settings.hide_media_title">Ocultar do resto</string>
<string name="settings.hide_media_summary">Ocultar ficheiros de música das outras aplicações</string>
<string name="settings.hide_media_toast">As mudanças terão efeito na próxima vez que o Android procure músicas no seu dispositivo.</string>
@@ -367,12 +376,12 @@
<string name="settings.sleep_timer_off">Desligado</string>
<string name="settings.sleep_timer_on">Ligado</string>
<string name="settings.sleep_timer_always_on">Sempre ligado</string>
- <string name="settings.temp_loss_title">Perda de foco temporário</string>
+ <string name="settings.temp_loss_title">Perda temporária de foco</string>
<string name="settings.temp_loss_pause">Pausar sempre</string>
<string name="settings.temp_loss_pause_lower">Pausar, baixar volume quando pedido</string>
<string name="settings.temp_loss_lower">Baixar sempre o volume</string>
<string name="settings.temp_loss_nothing">Não fazer nada</string>
- <string name="settings.keep_played_count_title">Manter músicas reproduzidas</string>
+ <string name="settings.keep_played_count_title">Manter as músicas reproduzidas</string>
<string name="settings.keep_played_count_none">Remover todas as músicas reproduzidas</string>
<string name="settings.keep_played_count_one">Manter as últimas músicas reproduzidas</string>
<string name="settings.keep_played_count_two">Manter as 2 últimas músicas reproduzidas</string>
@@ -384,14 +393,14 @@
<string name="settings.persistent_summary">Mostrar a notificação mesmo depois de pausar. Pressione o botão de parar para a remover</string>
<string name="settings.gapless_playback">Reprodução sem pausas</string>
<string name="settings.gapless_playback_summary">Se notar falhas estranhas durante a reprodução, desmarcar esta opção pode ajudar</string>
- <string name="settings.chat_refresh">Taxa de atualização do Chat (s)</string>
+ <string name="settings.chat_refresh">Taxa de atualização do chat (s)</string>
<string name="settings.chat_enabled">Ativar chat</string>
<string name="settings.chat_enabled_summary">Mostrar ou não a opção \"Chat\" no menu lateral</string>
<string name="settings.video_title">Vídeo</string>
<string name="settings.video_player">Reprodutor de vídeo</string>
<string name="settings.video_raw">Raw (Requer Subsonic 4.8+)</string>
<string name="settings.video_hls">HTTP Live Stream (HLS) (Requer Subsonic 4.8+)</string>
- <string name="settings.video_transcode">Transcodificação direta (Requísitos de vídeo -> mp4 ou configuração similar no servidor</string>
+ <string name="settings.video_transcode">Transcodificação direta (Requer vídeo -> mp4 ou configuração similar no servidor</string>
<string name="settings.video_flash">Flash (Requer plugin)</string>
<string name="settings.cache_screen_title">Cache/Ligação</string>
<string name="settings.playback_title">Reprodução</string>
@@ -401,6 +410,8 @@
<string name="settings.podcasts_enabled_summary">Mostrar ou não a opção \"Podcasts\" no menu lateral</string>
<string name="settings.bookmarks_enabled">Ativar marcadores</string>
<string name="settings.bookmarks_enabled_summary">Mostrar ou não a opção \"Marcadores\" no menu lateral</string>
+ <string name="settings.internet_radio_enabled">Ativar rádios online</string>
+ <string name="settings.internet_radio_enabled_summary">Mostrar ou não a opção \"Rádios online\" no menu lateral</string>
<string name="settings.shares_enabled">Ativar partilhas</string>
<string name="settings.shares_enabled_summary">Mostrar ou não a opção \"Partilhas\" no menu lateral</string>
<string name="settings.sync_title">Sincronização</string>
@@ -437,21 +448,26 @@
<string name="settings.browse_by_tags">Procurar por tags</string>
<string name="settings.browse_by_tags_summary">Procurar por tags em vez da estrutura das pastas. Requer Subsonic 4.7+</string>
<string name="settings.disable_exit_prompt">Desativar diálogo de saída</string>
- <string name="settings.disable_exit_prompt_summary">Fechar a aplicação imediatamente após pressionar o botão voltar no ecrã inicial</string>
+ <string name="settings.disable_exit_prompt_summary">Fechar a aplicação imediatamente após pressionar o botão de voltar no ecrã inicial</string>
<string name="settings.override_system_language">Sobrepor linguagem do sistema</string>
<string name="settings.override_system_language_summary">Mostrar a aplicação em inglês mesmo se o DSub tiver uma tradução disponível para a linguagem do sistema. Poderá ser necessário limpar a aplicação da memória para as alterações terem efeito</string>
<string name="settings.drawer_items_title">Separadores laterais</string>
+ <string name="settings.song_press_action">Ação ao pressionar uma música</string>
+ <string name="settings.song_press_play_single">Reproduzir apenas essa música</string>
+ <string name="settings.song_press_play_all">Adicionar tudo no álbum à fila de reprodução</string>
+ <string name="settings.song_press_play_next">Adicionar como próxima música</string>
+ <string name="settings.song_press_play_last">Adicionar música ao fim da fila de reprodução</string>
<string name="settings.large_album_art">Grandes capas de álbum</string>
<string name="settings.large_album_art_summary">Mostrar os álbuns com uma grande capa em vez de em lista</string>
<string name="settings.admin_enabled">Ativar administração</string>
<string name="settings.admin_enabled_summary">Mostrar ou não a opção \"Administração\" no menu lateral</string>
<string name="settings.replay_gain">Replay Gain</string>
- <string name="settings.replay_gain_summary">Escalar ou não o volume da reprodução por tags de replay gain nos álbuns e faixas</string>
+ <string name="settings.replay_gain_summary">Escalar ou não o volume da reprodução por tags \"replay gain\" nos álbuns e faixas</string>
<string name="settings.replay_gain_type">Ler pelas tags</string>
<string name="settings.replay_gain_type.smart">Deteção inteligente</string>
<string name="settings.replay_gain_type.album">Tags nos álbuns</string>
<string name="settings.replay_gain_type.track">Tags nas faixas</string>
- <string name="settings.replay_gain_bump">Pré-amp do Replay Gain</string>
+ <string name="settings.replay_gain_bump">Pré-amplificação do Replay Gain</string>
<string name="settings.replay_gain_untagged">Músicas sem Replay Gain</string>
<string name="settings.casting">Transmissão</string>
<string name="settings.casting_proxy">Usar dispositivo como proxy</string>
@@ -461,14 +477,14 @@
<string name="settings.start_on_headphones">Iniciar com os auscultadores</string>
<string name="settings.start_on_headphones_summary">Iniciar quando os auscultadores são ligados. Isto requer o uso de um serviço que inicia com o arranque, para verificar o evento de ligação dos auscultadores mesmo quando o DSub não está a ser executado</string>
<string name="settings.color_action_bar">Colorir barra de ações</string>
- <string name="settings.color_action_bar.summary">Colorir ou não a barra de ações e barra de estado</string>
+ <string name="settings.color_action_bar.summary">Colorir ou não a barra de ações e a barra de estado</string>
<string name="settings.shuffle_by_album">Aleatorizar por álbum</string>
<string name="settings.shuffle_by_album.true">Aleatorizar a ordem dos álbuns</string>
<string name="settings.shuffle_by_album.false">Aleatorizar todas as músicas juntas</string>
<string name="settings.casting_stream_original">Transmitir original</string>
<string name="settings.casting_stream_original_summary">Transmitir os ficheiros originais se suportado pelo dispositivo de transmissão</string>
<string name="settings.heads_up_notification">Notificações Heads Up (5.0+)</string>
- <string name="settings.heads_up_notification_summary">Mostrar notificações de reprodução como notificações Heads Up (Android Lollipop+ apenas)</string>
+ <string name="settings.heads_up_notification_summary">Mostrar notificações de reprodução como notificações \"Heads Up\" (Android Lollipop+ apenas)</string>
<string name="settings.casting_cache">Cache durante a transmissão</string>
<string name="settings.casting_cache_summary">Adicionar à cache as músicas a reproduzir no momento da transmissão</string>
@@ -596,6 +612,7 @@
<string name="details.title.podcast">Detalhes do podcast</string>
<string name="details.title.playlist">Detalhes da lista de reprodução</string>
<string name="details.title.artist">Detalhes do artista</string>
+ <string name="details.title.internet_radio_station">Detalhes da rádio online</string>
<string name="details.podcast">Podcast</string>
<string name="details.status">Estado</string>
<string name="details.artist">Artista</string>
@@ -635,6 +652,10 @@
<string name="details.last_played">Última reprodução</string>
<string name="details.expiration">Expiração</string>
<string name="details.played_count">Nº de reproduções</string>
+ <string name="details.stream_url">URL da transmissão</string>
+ <string name="details.home_page">Página web</string>
+
+ <string name="permission.external_storage.failed">O DSub não funciona se não puder escrever no armazenamento</string>
<plurals name="select_album_n_songs">
<item quantity="zero">Sem músicas</item>
@@ -646,8 +667,8 @@
<item quantity="other">%d músicas agendadas para transferência.</item>
</plurals>
<plurals name="select_album_n_songs_added">
- <item quantity="one">Uma música adicionada à lista de reprodução.</item>
- <item quantity="other">%d músicas adicionadas à lista de reprodução.</item>
+ <item quantity="one">Uma música adicionada à fila de reprodução.</item>
+ <item quantity="other">%d músicas adicionadas à fila de reprodução.</item>
</plurals>
<plurals name="select_album_donate_dialog_n_trial_days_left">
<item quantity="one">Um dia de período de testes restante</item>
diff --git a/app/src/main/res/xml/changelog.xml b/app/src/main/res/xml/changelog.xml
index 89f076f7..169edaa0 100644
--- a/app/src/main/res/xml/changelog.xml
+++ b/app/src/main/res/xml/changelog.xml
@@ -1,5 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<changelog>
+ <release version="5.3.1" versioncode="187" releasedate="10/4/2016">
+ <change>Fix Internet Radio streams which point to playlists</change>
+ <change>Don't show playback speed button below Android 6.0</change>
+ </release>
<release version="5.3" versioncode="186" releasedate="9/23/2016">
<change>Listen to Radio Internet Stations</change>
<change>Automatic Day/Night theme</change>