From 1e42dedb4a15450f8e0e57c7f68b79975c52db18 Mon Sep 17 00:00:00 2001 From: YSmhXQDd6Z Date: Mon, 18 Sep 2017 19:01:43 +0000 Subject: Update strings.xml --- app/src/main/res/values-pt-rPT/strings.xml | 42 +++++++++++++++++------------- 1 file changed, 24 insertions(+), 18 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 885035a4..c8f59195 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -50,11 +50,11 @@ Cache vs Cache permanente: -
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. +
Quando o DSub transfere as músicas, as mesmas poderão vir a ser eliminadas para dar espaço a novas transferências. Por outro lado, as músicas que ficam permanentemente na cache nunca serão eliminadas automaticamente.

Falhas com o Chromecast:
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.

Primeiro nível na biblioteca são grupos de artistas: -
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. +
No menu de opções, desmarque a opção "Artistas no primeiro nível". Isto fará com que o primeiro nível de diretórios apresentado seja tratado como grupos de artistas em vez de artistas propriamente ditos. ]]> Aleatório @@ -102,7 +102,7 @@ Adicionar canal Manter sincronizado Parar sincronização - Mostrar todo o conteúdo + Mostrar todas as músicas Mostrar artista Partilhar Eliminar cache @@ -161,8 +161,8 @@ %d músicas %d álbuns - Houve um erro ao transferir este podcast no servidor. O servidor deve transferi-lo primeiro. - Este podcast não foi transferido no servidor. O servidor deve transferi-lo primeiro. + Ocorreu um erro ao transferir este podcast no servidor. O servidor deve de o transferir primeiro. + Este podcast não foi transferido no servidor. O servidor deve de o transferir primeiro. Este podcast está a ser inicializado no servidor. Por favor atualize dentro de momentos. Transferir no servidor Eliminar do servidor @@ -282,13 +282,13 @@ Palavra-passe Abrir no navegador Ativar ou não a sincronização para este servidor - Sincronização ativa + Ativar sincronização Cache de música Músicas para pré-carregar (Wi-Fi) Músicas para pré-carregar (dados móveis) Tamanho da cache Localização da cache - Localização da cache inválida. A utilizar predefinição. + Localização da cache inválida. A usar predefinição. Não foi possível escrever na localização da cache que definiu. Se atualizou recentemente o SO do seu dispositivo para o KitKat 4.4, então o modo como as aplicações escrevem no cartão SD mudou e só podem escrever numa localização específica. A localização que o DSub usa já foi alterada para a localização correta. Para eliminar os antigos dados da aplicação, terá que montar o cartão SD no computador e eliminar a pasta manualmente Interna Externa @@ -320,6 +320,7 @@ Taxa de bits máxima do áudio - Wi-Fi Taxa de bits máxima do áudio - Dados móveis 32 Kbps + 48 Kbps 64 Kbps 80 Kbps 96 Kbps @@ -383,7 +384,7 @@ Não fazer nada Manter as músicas reproduzidas Remover todas as músicas reproduzidas - Manter as últimas músicas reproduzidas + Manter a última música reproduzida Manter as 2 últimas músicas reproduzidas Manter as 3 últimas músicas reproduzidas Pausar ao desconectar @@ -400,7 +401,7 @@ Reprodutor de vídeo Raw (Requer Subsonic 4.8+) HTTP Live Stream (HLS) (Requer Subsonic 4.8+) - Transcodificação direta (Requer vídeo -> mp4 ou configuração similar no servidor + Transcodificação direta (Requer vídeo -> mp4 ou configuração semelhante no servidor Flash (Requer plugin) Cache/Ligação Reprodução @@ -415,8 +416,8 @@ Ativar partilhas Mostrar ou não a opção \"Partilhas\" no menu lateral Sincronização - Sincronização ativa - Verificar periodicamente ou não as listas de reprodução ou podcasts por alterações + Ativar sincronização + Verificar ou não periodicamente as listas de reprodução ou podcasts por alterações Intervalo de sincronização 15 minutos 30 minutos @@ -445,8 +446,8 @@ Mostrar \"Marcar/Remover estrela\" nos menus Mostrar \"Partilhar\" nos menus Mostrar \"Classificar\" nos menus - Procurar por tags - Procurar por tags em vez da estrutura das pastas. Requer Subsonic 4.7+ + Navegar por etiquetas + Navegar por etiquetas em vez da estrutura das pastas. Requer Subsonic 4.7+ Desativar diálogo de saída Fechar a aplicação imediatamente após pressionar o botão de voltar no ecrã inicial Sobrepor linguagem do sistema @@ -462,11 +463,11 @@ Ativar administração Mostrar ou não a opção \"Administração\" no menu lateral Replay Gain - Escalar ou não o volume da reprodução por tags \"replay gain\" nos álbuns e faixas - Ler pelas tags + Escalar ou não o volume da reprodução por etiquetas \"replay gain\" nos álbuns e faixas + Ler pelas etiquetas Deteção inteligente - Tags nos álbuns - Tags nas faixas + Etiquetas nos álbuns + Etiquetas nas faixas Pré-amplificação do Replay Gain Músicas sem Replay Gain Transmissão @@ -487,7 +488,12 @@ Mostrar notificações de reprodução como notificações \"Heads Up\" (Android Lollipop+ apenas) Cache durante a transmissão Adicionar à cache as músicas a reproduzir no momento da transmissão + Ativar DLNA + Se tiver problemas com o descarregamento da bateria no Android 7.0 experimente desativar isto + Intervalo de retrocesso + Intervalo de avanço + Falha ao criar a partilha %s Aleatorizar por Ano de início: Ano de fim: @@ -521,7 +527,7 @@ Introduza um email válido Alterar palavra-passe A palavra-passe de %1$s foi alterada com sucesso - Falha ao alterar palavra-passe de %1$s + Falha ao alterar a palavra-passe de %1$s Palavra-passe atual: Nova palavra-passe: Introduza uma palavra-passe válida -- cgit v1.2.3 From 3f69787cd029def7cb1b0a82a8082aafa9791f7f Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Thu, 26 Jul 2018 16:29:35 -0700 Subject: Fix deadlock bugs at startup --- .../daneren2005/dsub/service/DownloadService.java | 133 +++++++++------------ 1 file changed, 57 insertions(+), 76 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java b/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java index c5caad26..a4ca705c 100644 --- a/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java +++ b/app/src/main/java/github/daneren2005/dsub/service/DownloadService.java @@ -68,6 +68,7 @@ import java.util.Iterator; import java.util.List; import java.util.Timer; import java.util.TimerTask; +import java.util.concurrent.CopyOnWriteArrayList; import android.annotation.TargetApi; import android.app.Service; @@ -154,7 +155,7 @@ public class DownloadService extends Service { private boolean removePlayed; private boolean shufflePlay; private boolean artistRadio; - private final List onSongChangedListeners = new ArrayList<>(); + private final CopyOnWriteArrayList onSongChangedListeners = new CopyOnWriteArrayList<>(); private long revision; private static DownloadService instance; private String suggestedPlaylistName; @@ -2800,12 +2801,7 @@ public class DownloadService extends Service { addOnSongChangedListener(listener, false); } public void addOnSongChangedListener(OnSongChangedListener listener, boolean run) { - synchronized(onSongChangedListeners) { - int index = onSongChangedListeners.indexOf(listener); - if (index == -1) { - onSongChangedListeners.add(listener); - } - } + onSongChangedListeners.addIfAbsent(listener); if(run) { if(mediaPlayerHandler != null) { @@ -2824,56 +2820,47 @@ public class DownloadService extends Service { } } public void removeOnSongChangeListener(OnSongChangedListener listener) { - synchronized(onSongChangedListeners) { - int index = onSongChangedListeners.indexOf(listener); - if (index != -1) { - onSongChangedListeners.remove(index); - } - } + onSongChangedListeners.remove(listener); } private void onSongChanged() { final long atRevision = revision; - synchronized(onSongChangedListeners) { - final boolean shouldFastForward = shouldFastForward(); - for (final OnSongChangedListener listener : onSongChangedListeners) { - handler.post(new Runnable() { - @Override - public void run() { - if (revision == atRevision && instance != null) { - listener.onSongChanged(currentPlaying, currentPlayingIndex, shouldFastForward); + final boolean shouldFastForward = shouldFastForward(); + for (final OnSongChangedListener listener : onSongChangedListeners) { + handler.post(new Runnable() { + @Override + public void run() { + if (revision == atRevision && instance != null) { + listener.onSongChanged(currentPlaying, currentPlayingIndex, shouldFastForward); - MusicDirectory.Entry entry = currentPlaying != null ? currentPlaying.getSong() : null; - listener.onMetadataUpdate(entry, METADATA_UPDATED_ALL); - } + MusicDirectory.Entry entry = currentPlaying != null ? currentPlaying.getSong() : null; + listener.onMetadataUpdate(entry, METADATA_UPDATED_ALL); } - }); - } + } + }); + } - if (mediaPlayerHandler != null && !onSongChangedListeners.isEmpty()) { - mediaPlayerHandler.post(new Runnable() { - @Override - public void run() { - onSongProgress(); - } - }); - } + if (mediaPlayerHandler != null && !onSongChangedListeners.isEmpty()) { + mediaPlayerHandler.post(new Runnable() { + @Override + public void run() { + onSongProgress(); + } + }); } } private void onSongsChanged() { final long atRevision = revision; - synchronized(onSongChangedListeners) { - final boolean shouldFastForward = shouldFastForward(); - for (final OnSongChangedListener listener : onSongChangedListeners) { - handler.post(new Runnable() { - @Override - public void run() { - if (revision == atRevision && instance != null) { - listener.onSongsChanged(downloadList, currentPlaying, currentPlayingIndex, shouldFastForward); - } + final boolean shouldFastForward = shouldFastForward(); + for (final OnSongChangedListener listener : onSongChangedListeners) { + handler.post(new Runnable() { + @Override + public void run() { + if (revision == atRevision && instance != null) { + listener.onSongsChanged(downloadList, currentPlaying, currentPlayingIndex, shouldFastForward); } - }); - } + } + }); } } @@ -2888,17 +2875,15 @@ public class DownloadService extends Service { final int index = getCurrentPlayingIndex(); final int queueSize = size(); - synchronized(onSongChangedListeners) { - for (final OnSongChangedListener listener : onSongChangedListeners) { - handler.post(new Runnable() { - @Override - public void run() { - if (revision == atRevision && instance != null) { - listener.onSongProgress(currentPlaying, position, duration, isSeekable); - } + for (final OnSongChangedListener listener : onSongChangedListeners) { + handler.post(new Runnable() { + @Override + public void run() { + if (revision == atRevision && instance != null) { + listener.onSongProgress(currentPlaying, position, duration, isSeekable); } - }); - } + } + }); } if(manual) { @@ -2921,35 +2906,31 @@ public class DownloadService extends Service { } private void onStateUpdate() { final long atRevision = revision; - synchronized(onSongChangedListeners) { - for (final OnSongChangedListener listener : onSongChangedListeners) { - handler.post(new Runnable() { - @Override - public void run() { - if (revision == atRevision && instance != null) { - listener.onStateUpdate(currentPlaying, playerState); - } + for (final OnSongChangedListener listener : onSongChangedListeners) { + handler.post(new Runnable() { + @Override + public void run() { + if (revision == atRevision && instance != null) { + listener.onStateUpdate(currentPlaying, playerState); } - }); - } + } + }); } } public void onMetadataUpdate() { onMetadataUpdate(METADATA_UPDATED_ALL); } public void onMetadataUpdate(final int updateType) { - synchronized(onSongChangedListeners) { - for (final OnSongChangedListener listener : onSongChangedListeners) { - handler.post(new Runnable() { - @Override - public void run() { - if (instance != null) { - MusicDirectory.Entry entry = currentPlaying != null ? currentPlaying.getSong() : null; - listener.onMetadataUpdate(entry, updateType); - } + for (final OnSongChangedListener listener : onSongChangedListeners) { + handler.post(new Runnable() { + @Override + public void run() { + if (instance != null) { + MusicDirectory.Entry entry = currentPlaying != null ? currentPlaying.getSong() : null; + listener.onMetadataUpdate(entry, updateType); } - }); - } + } + }); } handler.post(new Runnable() { -- cgit v1.2.3 From 78cccaac966e449ebfd83e69c1f56a5873766a93 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Thu, 26 Jul 2018 17:12:32 -0700 Subject: Dsub 5.4 released --- app/build.gradle | 4 ++-- app/src/main/res/xml/changelog.xml | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) (limited to 'app/src/main') diff --git a/app/build.gradle b/app/build.gradle index 47604723..34743802 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "github.daneren2005.dsub" minSdkVersion 14 targetSdkVersion 23 - versionCode 195 - versionName '5.3.5' + versionCode 197 + versionName '5.4' setProperty("archivesBaseName", "DSub $versionName") resConfigs "de", "es", "fr", "hu", "nl", "pt-rPT", "ru", "sv" } diff --git a/app/src/main/res/xml/changelog.xml b/app/src/main/res/xml/changelog.xml index d31f6df6..ec9c4ea4 100644 --- a/app/src/main/res/xml/changelog.xml +++ b/app/src/main/res/xml/changelog.xml @@ -1,5 +1,18 @@ + + Add option to change rewind/fast forward interval (thanks KBerstene) + Auto: Play entire directory when selecting song (thanks hufman) + Auto: Show 50 songs instead of 3 (thanks hufman) + Auto: Fix playing from a bookmark when multiple bookmarks in directory (thanks hufman) + Add option to disable downloads while roaming (thanks The-Compiler) + Fix persistent notification showing different actions when paused + Fix OPUS files not showing up in Offline mode + Fix not being able to have servers with _ in the domain + Fix cache exceeding limit with long playlist + Fix error if null album when applying ReplayGain + Fix deadlock bug + Add option to scan server for Subsonic 6.1+ Enhanced custom playback speed UI (thanks SilentViking) -- cgit v1.2.3 From eebdb979a2d6d114ab4d8c2e6f5f6ed762b3ae4c Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Thu, 26 Jul 2018 18:00:58 -0700 Subject: Add notification channels for API v26 compliance --- app/build.gradle | 12 ++-- .../daneren2005/dsub/util/Notifications.java | 68 +++++++++++++++++++++- build.gradle | 5 ++ 3 files changed, 77 insertions(+), 8 deletions(-) (limited to 'app/src/main') diff --git a/app/build.gradle b/app/build.gradle index 93d4c38f..803d85eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 26 + compileSdkVersion 27 buildToolsVersion '25.0.0' defaultConfig { @@ -56,11 +56,11 @@ android { dependencies { compile project(':Server Proxy') compile fileTree(include: ['*.jar'], dir: 'libs') - compile 'com.android.support:support-v4:24.2.+' - compile 'com.android.support:appcompat-v7:24.2.+' - compile 'com.android.support:mediarouter-v7:24.2.+' - compile 'com.android.support:recyclerview-v7:24.2.+' - compile 'com.android.support:design:24.2.+' + compile 'com.android.support:support-v4:27.1.+' + compile 'com.android.support:appcompat-v7:27.1.+' + compile 'com.android.support:mediarouter-v7:27.1.+' + compile 'com.android.support:recyclerview-v7:27.1.+' + compile 'com.android.support:design:27.1.+' googleCompile 'com.google.android.gms:play-services-cast:8.1.0' compile 'com.sothree.slidinguppanel:library:3.0.0' compile 'de.hdodenhof:circleimageview:1.2.1' 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 750ab40c..ac36c99d 100644 --- a/app/src/main/java/github/daneren2005/dsub/util/Notifications.java +++ b/app/src/main/java/github/daneren2005/dsub/util/Notifications.java @@ -15,7 +15,9 @@ package github.daneren2005.dsub.util; +import android.annotation.TargetApi; import android.app.Notification; +import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.ComponentName; @@ -56,11 +58,24 @@ public final class Notifications { private static boolean downloadForeground = false; private static boolean persistentPlayingShowing = false; + private static NotificationChannel playingChannel; + private static NotificationChannel downloadingChannel; + private static NotificationChannel syncChannel; + private final static Pair NOTIFICATION_TEXT_COLORS = new Pair(); public static void showPlayingNotification(final Context context, final DownloadService downloadService, final Handler handler, MusicDirectory.Entry song) { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + getPlayingNotificationChannel(context); + } + // Set the icon, scrolling text and timestamp - final Notification notification = new Notification(R.drawable.stat_notify_playing, song.getTitle(), System.currentTimeMillis()); + final Notification notification = new NotificationCompat.Builder(context) + .setSmallIcon(R.drawable.stat_notify_playing) + .setTicker(song.getTitle()) + .setWhen(System.currentTimeMillis()) + .setChannelId("now-playing-channel") + .build(); final boolean playing = downloadService.getPlayerState() == PlayerState.STARTED; if(playing) { @@ -331,7 +346,24 @@ public final class Notifications { DSubWidgetProvider.notifyInstances(context, downloadService, false); } + @TargetApi(Build.VERSION_CODES.O) + private static NotificationChannel getPlayingNotificationChannel(Context context) { + if(playingChannel == null) { + playingChannel = new NotificationChannel("now-playing-channel", "Now Playing", NotificationManager.IMPORTANCE_DEFAULT); + playingChannel.setDescription("Now playing notification"); + + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + notificationManager.createNotificationChannel(playingChannel); + } + + return playingChannel; + } + public static void showDownloadingNotification(final Context context, final DownloadService downloadService, Handler handler, DownloadFile file, int size) { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + getDownloadingNotificationChannel(context); + } + Intent cancelIntent = new Intent(context, DownloadService.class); cancelIntent.setAction(DownloadService.CANCEL_DOWNLOADS); PendingIntent cancelPI = PendingIntent.getService(context, 0, cancelIntent, 0); @@ -356,7 +388,8 @@ public final class Notifications { .setOngoing(true) .addAction(R.drawable.notification_close, context.getResources().getString(R.string.common_cancel), - cancelPI); + cancelPI) + .setChannelId("downloading-channel"); Intent notificationIntent = new Intent(context, SubsonicFragmentActivity.class); notificationIntent.putExtra(Constants.INTENT_EXTRA_NAME_DOWNLOAD_VIEW, true); @@ -395,6 +428,19 @@ public final class Notifications { } } + @TargetApi(Build.VERSION_CODES.O) + private static NotificationChannel getDownloadingNotificationChannel(Context context) { + if(downloadingChannel == null) { + downloadingChannel = new NotificationChannel("downloading-channel", "Downloading Notification", NotificationManager.IMPORTANCE_DEFAULT); + downloadingChannel.setDescription("Ongoing downloading notification to keep the service alive"); + + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + notificationManager.createNotificationChannel(downloadingChannel); + } + + return downloadingChannel; + } + public static void showSyncNotification(final Context context, int stringId, String extra) { showSyncNotification(context, stringId, extra, null); } @@ -404,6 +450,10 @@ public final class Notifications { extra = ""; } + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + getSyncNotificationChannel(context); + } + NotificationCompat.Builder builder; builder = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.stat_notify_sync) @@ -413,6 +463,7 @@ public final class Notifications { .setOngoing(false) .setGroup(NOTIFICATION_SYNC_GROUP) .setPriority(NotificationCompat.PRIORITY_LOW) + .setChannelId("sync-channel") .setAutoCancel(true); Intent notificationIntent = new Intent(context, SubsonicFragmentActivity.class); @@ -449,4 +500,17 @@ public final class Notifications { notificationManager.notify(stringId, builder.build()); } } + + @TargetApi(Build.VERSION_CODES.O) + private static NotificationChannel getSyncNotificationChannel(Context context) { + if(syncChannel == null) { + syncChannel = new NotificationChannel("sync-channel", "Sync Notifications", NotificationManager.IMPORTANCE_LOW); + syncChannel.setDescription("Sync notifications"); + + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + notificationManager.createNotificationChannel(syncChannel); + } + + return syncChannel; + } } diff --git a/build.gradle b/build.gradle index b304f7fc..d5dfdd4f 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,10 @@ buildscript { repositories { jcenter() + maven { + url 'https://maven.google.com/' + name 'Google' + } } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' @@ -18,5 +22,6 @@ allprojects { maven { url 'http://4thline.org/m2' } + google() } } -- cgit v1.2.3 From 2f2a031cfbf71b3cfe87567be86618235493f564 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sun, 29 Jul 2018 14:31:32 -0700 Subject: Probably fix crashes in DLNARouterProvider from concurrent add/remove events --- .../dsub/provider/DLNARouteProvider.java | 24 ++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/github/daneren2005/dsub/provider/DLNARouteProvider.java b/app/src/main/java/github/daneren2005/dsub/provider/DLNARouteProvider.java index 0ee16723..f4238c99 100644 --- a/app/src/main/java/github/daneren2005/dsub/provider/DLNARouteProvider.java +++ b/app/src/main/java/github/daneren2005/dsub/provider/DLNARouteProvider.java @@ -228,7 +228,9 @@ public class DLNARouteProvider extends MediaRouteProvider { removing.remove(id); return; } - adding.add(id); + synchronized (adding) { + adding.add(id); + } if(device.getType().getType().equals("MediaRenderer") && device instanceof RemoteDevice) { try { @@ -255,21 +257,35 @@ public class DLNARouteProvider extends MediaRouteProvider { broadcastDescriptors(); } }); - adding.remove(id); + + synchronized (adding) { + if (adding.contains(id)) { + adding.remove(id); + } + } } @Override public void failure(ActionInvocation actionInvocation, UpnpResponse upnpResponse, String s) { Log.w(TAG, "Failed to get default volume for DLNA route"); Log.w(TAG, "Reason: " + s); - adding.remove(id); + + synchronized (adding) { + if (adding.contains(id)) { + adding.remove(id); + } + } } }); } catch(Exception e) { Log.e(TAG, "Failed to add device", e); } } else { - adding.remove(id); + synchronized (adding) { + if(adding.contains(id)) { + adding.remove(id); + } + } } } private void deviceRemoved(Device device) { -- cgit v1.2.3 From ec8eda88305cad19f2fe16cf5516f27cd9fb2e50 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sun, 29 Jul 2018 14:31:32 -0700 Subject: Probably fix crashes in DLNARouterProvider from concurrent add/remove events --- .../dsub/provider/DLNARouteProvider.java | 24 ++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/github/daneren2005/dsub/provider/DLNARouteProvider.java b/app/src/main/java/github/daneren2005/dsub/provider/DLNARouteProvider.java index 0ee16723..f4238c99 100644 --- a/app/src/main/java/github/daneren2005/dsub/provider/DLNARouteProvider.java +++ b/app/src/main/java/github/daneren2005/dsub/provider/DLNARouteProvider.java @@ -228,7 +228,9 @@ public class DLNARouteProvider extends MediaRouteProvider { removing.remove(id); return; } - adding.add(id); + synchronized (adding) { + adding.add(id); + } if(device.getType().getType().equals("MediaRenderer") && device instanceof RemoteDevice) { try { @@ -255,21 +257,35 @@ public class DLNARouteProvider extends MediaRouteProvider { broadcastDescriptors(); } }); - adding.remove(id); + + synchronized (adding) { + if (adding.contains(id)) { + adding.remove(id); + } + } } @Override public void failure(ActionInvocation actionInvocation, UpnpResponse upnpResponse, String s) { Log.w(TAG, "Failed to get default volume for DLNA route"); Log.w(TAG, "Reason: " + s); - adding.remove(id); + + synchronized (adding) { + if (adding.contains(id)) { + adding.remove(id); + } + } } }); } catch(Exception e) { Log.e(TAG, "Failed to add device", e); } } else { - adding.remove(id); + synchronized (adding) { + if(adding.contains(id)) { + adding.remove(id); + } + } } } private void deviceRemoved(Device device) { -- cgit v1.2.3 From 16f0d95d9a5a2cde9998535322174e96fb96fb3e Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sun, 29 Jul 2018 14:58:22 -0700 Subject: DSub 5.4.1 released --- app/build.gradle | 4 ++-- app/src/main/res/xml/changelog.xml | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) (limited to 'app/src/main') diff --git a/app/build.gradle b/app/build.gradle index 34743802..339853e6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "github.daneren2005.dsub" minSdkVersion 14 targetSdkVersion 23 - versionCode 197 - versionName '5.4' + versionCode 198 + versionName '5.4.1' setProperty("archivesBaseName", "DSub $versionName") resConfigs "de", "es", "fr", "hu", "nl", "pt-rPT", "ru", "sv" } diff --git a/app/src/main/res/xml/changelog.xml b/app/src/main/res/xml/changelog.xml index ec9c4ea4..8aa15153 100644 --- a/app/src/main/res/xml/changelog.xml +++ b/app/src/main/res/xml/changelog.xml @@ -1,5 +1,8 @@ + + Fix Android Auto compatibility + Add option to change rewind/fast forward interval (thanks KBerstene) Auto: Play entire directory when selecting song (thanks hufman) -- cgit v1.2.3 From f8efd89f200ef7aadc1d2f2dd0ffb6475e927a59 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sun, 29 Jul 2018 15:10:58 -0700 Subject: Update HU translation --- app/src/main/res/values-hu/strings.xml | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'app/src/main') diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 3416a471..6a2799ea 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -346,6 +346,8 @@ Korlátlan Streamelés csak Wi-Fivel Streamelés csak Wi-Fi hálózaton keresztül. + Ne streameljen roaming közben + Ne streameljen médiát roaming közben Hálózati időtúllépés 10 másodperc 15 másodperc @@ -491,6 +493,8 @@ Az éppen lejátszott dal gyorsítótárazása a tartalomátküldés (Casting) alatt. DLNA engedélyezve Ha akkumulátor-merülési probléma lépne fel Android 7.0 alatt, kapcsolja ki a funkciót! + Visszatekerés időintervalluma + Gyors előretekerés időintervalluma Dalsorrend keverése Kezdő év: @@ -498,6 +502,7 @@ Műfaj: Műfaj kiválasztása + %s megosztás létrehozása sikertelen! Lejárati idő: %s Nincs lejárati idő \"%s\" megosztás törölve -- cgit v1.2.3 From 50583cec5ab2148209ea8b050712aa5f1878ed64 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sun, 29 Jul 2018 15:21:39 -0700 Subject: Lower notification channel importance so it doesn't play a ding every time a song changes... --- app/src/main/java/github/daneren2005/dsub/util/Notifications.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app/src/main') 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 ac36c99d..428c33e0 100644 --- a/app/src/main/java/github/daneren2005/dsub/util/Notifications.java +++ b/app/src/main/java/github/daneren2005/dsub/util/Notifications.java @@ -349,7 +349,7 @@ public final class Notifications { @TargetApi(Build.VERSION_CODES.O) private static NotificationChannel getPlayingNotificationChannel(Context context) { if(playingChannel == null) { - playingChannel = new NotificationChannel("now-playing-channel", "Now Playing", NotificationManager.IMPORTANCE_DEFAULT); + playingChannel = new NotificationChannel("now-playing-channel", "Now Playing", NotificationManager.IMPORTANCE_LOW); playingChannel.setDescription("Now playing notification"); NotificationManager notificationManager = context.getSystemService(NotificationManager.class); @@ -431,7 +431,7 @@ public final class Notifications { @TargetApi(Build.VERSION_CODES.O) private static NotificationChannel getDownloadingNotificationChannel(Context context) { if(downloadingChannel == null) { - downloadingChannel = new NotificationChannel("downloading-channel", "Downloading Notification", NotificationManager.IMPORTANCE_DEFAULT); + downloadingChannel = new NotificationChannel("downloading-channel", "Downloading Notification", NotificationManager.IMPORTANCE_LOW); downloadingChannel.setDescription("Ongoing downloading notification to keep the service alive"); NotificationManager notificationManager = context.getSystemService(NotificationManager.class); @@ -504,7 +504,7 @@ public final class Notifications { @TargetApi(Build.VERSION_CODES.O) private static NotificationChannel getSyncNotificationChannel(Context context) { if(syncChannel == null) { - syncChannel = new NotificationChannel("sync-channel", "Sync Notifications", NotificationManager.IMPORTANCE_LOW); + syncChannel = new NotificationChannel("sync-channel", "Sync Notifications", NotificationManager.IMPORTANCE_MIN); syncChannel.setDescription("Sync notifications"); NotificationManager notificationManager = context.getSystemService(NotificationManager.class); -- cgit v1.2.3