RM Visualizer

This commit is contained in:
birdbird 2022-08-10 10:41:53 +00:00
parent 9cb77c0e67
commit 7256cc7d12
27 changed files with 34 additions and 422 deletions

View File

@ -1,9 +1,9 @@
[versions] [versions]
# You need to run ./gradlew wrapper after updating the version # You need to run ./gradlew wrapper after updating the version
gradle = "7.3.3" gradle = "7.5.1"
navigation = "2.3.5" navigation = "2.3.5"
gradlePlugin = "7.2.1" gradlePlugin = "7.2.2"
androidxcore = "1.6.0" androidxcore = "1.6.0"
ktlint = "0.43.2" ktlint = "0.43.2"
ktlintGradle = "10.2.0" ktlintGradle = "10.2.0"
@ -26,7 +26,7 @@ viewModelKtx = "2.4.1"
retrofit = "2.9.0" retrofit = "2.9.0"
jackson = "2.10.1" jackson = "2.10.1"
okhttp = "4.10.0" okhttp = "4.10.0"
koin = "3.0.2" koin = "3.2.0"
picasso = "2.71828" picasso = "2.71828"
junit4 = "4.13.2" junit4 = "4.13.2"

Binary file not shown.

View File

@ -1,6 +1,5 @@
#Fri Jun 17 23:13:49 CEST 2022
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

16
gradlew vendored
View File

@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# #
# Copyright © 2015-2021 the original authors. # Copyright © 2015-2021 the original authors.
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@ -32,10 +32,10 @@
# Busybox and similar reduced shells will NOT work, because this script # Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features: # requires all of these POSIX shell features:
# * functions; # * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», # * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»; # «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»; # * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit». # * various built-in commands including «command», «set», and «ulimit».
# #
# Important for patching: # Important for patching:
# #
@ -205,6 +205,12 @@ set -- \
org.gradle.wrapper.GradleWrapperMain \ org.gradle.wrapper.GradleWrapperMain \
"$@" "$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args. # Use "xargs" to parse quoted args.
# #
# With -n1 it outputs one arg per line, with the quotes and backslashes removed. # With -n1 it outputs one arg per line, with the quotes and backslashes removed.

14
gradlew.bat vendored
View File

@ -14,7 +14,7 @@
@rem limitations under the License. @rem limitations under the License.
@rem @rem
@if "%DEBUG%" == "" @echo off @if "%DEBUG%"=="" @echo off
@rem ########################################################################## @rem ##########################################################################
@rem @rem
@rem Gradle startup script for Windows @rem Gradle startup script for Windows
@ -25,7 +25,7 @@
if "%OS%"=="Windows_NT" setlocal if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0 set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=. if "%DIRNAME%"=="" set DIRNAME=.
set APP_BASE_NAME=%~n0 set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME% set APP_HOME=%DIRNAME%
@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute if %ERRORLEVEL% equ 0 goto execute
echo. echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@ -75,13 +75,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
:end :end
@rem End local scope for the variables with windows NT shell @rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd if %ERRORLEVEL% equ 0 goto mainEnd
:fail :fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code! rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 set EXIT_CODE=%ERRORLEVEL%
exit /b 1 if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd :mainEnd
if "%OS%"=="Windows_NT" endlocal if "%OS%"=="Windows_NT" endlocal

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<issues format="6" by="lint 7.2.1" type="baseline" client="gradle" dependencies="false" name="AGP (7.2.1)" variant="all" version="7.2.1"> <issues format="6" by="lint 7.2.2" type="baseline" client="gradle" dependencies="false" name="AGP (7.2.2)" variant="all" version="7.2.2">
<issue <issue
id="InflateParams" id="InflateParams"
@ -19,7 +19,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location <location
file="src/main/res/values/strings.xml" file="src/main/res/values/strings.xml"
line="156" line="153"
column="5"/> column="5"/>
</issue> </issue>

View File

@ -1,110 +0,0 @@
/*
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 2011 (C) Sindre Mehus
*/
package org.moire.ultrasonic.audiofx;
import android.media.MediaPlayer;
import android.media.audiofx.Visualizer;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import timber.log.Timber;
/**
* Backward-compatible wrapper for {@link Visualizer}, which is API Level 9.
*
* @author Sindre Mehus
* @version $Id$
*/
public class VisualizerController
{
private static final int PREFERRED_CAPTURE_SIZE = 128; // Must be a power of two.
private static Boolean available = null;
private static final MutableLiveData<VisualizerController> instance = new MutableLiveData<>();
public Visualizer visualizer;
private int audioSessionId;
/**
* Retrieves the VisualizerController as LiveData
*/
public static LiveData<VisualizerController> get()
{
return instance;
}
/**
* Initializes the VisualizerController instance with a MediaPlayer
*/
public static void create(MediaPlayer mediaPlayer)
{
if (mediaPlayer == null) return;
if (!isAvailable()) return;
VisualizerController controller = new VisualizerController();
try
{
controller.audioSessionId = mediaPlayer.getAudioSessionId();
controller.visualizer = new Visualizer(controller.audioSessionId);
int[] captureSizeRange = Visualizer.getCaptureSizeRange();
int captureSize = Math.max(PREFERRED_CAPTURE_SIZE, captureSizeRange[0]);
captureSize = Math.min(captureSize, captureSizeRange[1]);
controller.visualizer.setCaptureSize(captureSize);
instance.postValue(controller);
}
catch (Throwable x)
{
Timber.w(x, "Failed to create visualizer.");
}
}
/**
* Releases the VisualizerController instance when the underlying MediaPlayer is no longer available
*/
public static void release()
{
VisualizerController controller = instance.getValue();
if (controller == null) return;
controller.visualizer.release();
instance.postValue(null);
}
/**
* Checks if the {@link Visualizer} class is available.
*/
private static boolean isAvailable()
{
if (available != null) return available;
try
{
Class.forName("android.media.audiofx.Visualizer");
available = true;
}
catch (Exception ex)
{
Timber.i(ex, "CheckAvailable received an exception getting class for the Visualizer");
available = false;
}
return available;
}
}

View File

@ -1,160 +0,0 @@
/*
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 2011 (C) Sindre Mehus
*/
package org.moire.ultrasonic.view;
import static org.koin.java.KoinJavaComponent.inject;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.media.audiofx.Visualizer;
import android.view.View;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.Observer;
import org.moire.ultrasonic.audiofx.VisualizerController;
import org.moire.ultrasonic.service.MediaPlayerController;
import kotlin.Lazy;
import timber.log.Timber;
/**
* A simple class that draws waveform data received from a
* {@link Visualizer.OnDataCaptureListener#onWaveFormDataCapture}
*
* @author Sindre Mehus
* @version $Id$
*/
public class VisualizerView extends View
{
private static final int PREFERRED_CAPTURE_RATE_MILLIHERTZ = 20000;
private final Paint paint = new Paint();
private Lazy<MediaPlayerController> mediaPlayerControllerLazy = inject(MediaPlayerController.class);
private byte[] data;
private float[] points;
private boolean active;
private Visualizer visualizer;
public VisualizerView(final Context context)
{
super(context);
paint.setStrokeWidth(2f);
paint.setAntiAlias(true);
paint.setColor(Color.rgb(0, 153, 204));
VisualizerController.get().observe((LifecycleOwner) context, new Observer<VisualizerController>() {
@Override
public void onChanged(VisualizerController controller) {
if (controller != null) {
Timber.d("VisualizerController Observer.onChanged received controller");
visualizer = controller.visualizer;
setActive(true);
} else {
Timber.d("VisualizerController Observer.onChanged has no controller");
visualizer = null;
setActive(false);
}
}
});
}
public boolean isActive()
{
return active;
}
public void setActive(boolean value)
{
active = value;
int captureRate = Math.min(PREFERRED_CAPTURE_RATE_MILLIHERTZ, Visualizer.getMaxCaptureRate());
if (active)
{
visualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener()
{
@Override
public void onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate)
{
updateVisualizer(waveform);
}
@Override
public void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate)
{
}
}, captureRate, true, false);
}
else
{
if (visualizer != null) visualizer.setDataCaptureListener(null, captureRate, false, false);
}
if (visualizer != null) visualizer.setEnabled(active);
invalidate();
}
private void updateVisualizer(byte[] waveform)
{
this.data = waveform;
invalidate();
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
if (!active)
{
return;
}
if (!mediaPlayerControllerLazy.getValue().isPlaying())
{
return;
}
if (data == null)
{
return;
}
if (points == null || points.length < data.length * 4)
{
points = new float[data.length * 4];
}
int w = getWidth();
int h = getHeight();
for (int i = 0; i < data.length - 1; i++)
{
points[i * 4] = w * i / (data.length - 1);
points[i * 4 + 1] = h / 2 + ((byte) (data[i] + 128)) * (h / 2) / 128;
points[i * 4 + 2] = w * (i + 1) / (data.length - 1);
points[i * 4 + 3] = h / 2 + ((byte) (data[i + 1] + 128)) * (h / 2) / 128;
}
canvas.drawLines(points, paint);
}
}

View File

@ -9,7 +9,6 @@ import kotlinx.coroutines.launch
import org.koin.android.ext.koin.androidContext import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin import org.koin.core.context.startKoin
import org.koin.core.context.stopKoin import org.koin.core.context.stopKoin
import org.koin.core.logger.Level
import org.moire.ultrasonic.BuildConfig import org.moire.ultrasonic.BuildConfig
import org.moire.ultrasonic.di.appPermanentStorage import org.moire.ultrasonic.di.appPermanentStorage
import org.moire.ultrasonic.di.applicationModule import org.moire.ultrasonic.di.applicationModule
@ -61,12 +60,14 @@ class UApp : MultiDexApplication() {
internal fun startKoin() { internal fun startKoin() {
initiated = true initiated = true
startKoin { startKoin {
// TODO Currently there is a bug in Koin which makes necessary to set the log level to ERROR // Sometimes Koin breaks when Kotlin version is upgraded,
logger(TimberKoinLogger(Level.ERROR)) // you can normally fix it by changing to logger(TimberKoinLogger(Level.ERROR))
// logger(TimberKoinLogger(Level.INFO)) // See https://github.com/InsertKoinIO/koin/issues/1188
logger(TimberKoinLogger())
// declare Android context // declare Android context
androidContext(this@UApp) androidContext(this@UApp)
// declare modules to use // declare modules to use
modules( modules(
applicationModule, applicationModule,

View File

@ -72,7 +72,6 @@ import org.moire.ultrasonic.R
import org.moire.ultrasonic.adapters.BaseAdapter import org.moire.ultrasonic.adapters.BaseAdapter
import org.moire.ultrasonic.adapters.TrackViewBinder import org.moire.ultrasonic.adapters.TrackViewBinder
import org.moire.ultrasonic.audiofx.EqualizerController import org.moire.ultrasonic.audiofx.EqualizerController
import org.moire.ultrasonic.audiofx.VisualizerController
import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline
import org.moire.ultrasonic.domain.Identifiable import org.moire.ultrasonic.domain.Identifiable
import org.moire.ultrasonic.domain.Track import org.moire.ultrasonic.domain.Track
@ -91,7 +90,6 @@ import org.moire.ultrasonic.util.Settings
import org.moire.ultrasonic.util.Util import org.moire.ultrasonic.util.Util
import org.moire.ultrasonic.util.toTrack import org.moire.ultrasonic.util.toTrack
import org.moire.ultrasonic.view.AutoRepeatButton import org.moire.ultrasonic.view.AutoRepeatButton
import org.moire.ultrasonic.view.VisualizerView
import timber.log.Timber import timber.log.Timber
/** /**
@ -111,7 +109,6 @@ class PlayerFragment :
private var jukeboxAvailable = false private var jukeboxAvailable = false
private var useFiveStarRating = false private var useFiveStarRating = false
private var isEqualizerAvailable = false private var isEqualizerAvailable = false
private var isVisualizerAvailable = false
// Detectors & Callbacks // Detectors & Callbacks
private lateinit var gestureScanner: GestureDetector private lateinit var gestureScanner: GestureDetector
@ -130,8 +127,6 @@ class PlayerFragment :
private var ioScope = CoroutineScope(Dispatchers.IO) private var ioScope = CoroutineScope(Dispatchers.IO)
// Views and UI Elements // Views and UI Elements
private lateinit var visualizerViewLayout: LinearLayout
private lateinit var visualizerView: VisualizerView
private lateinit var playlistNameView: EditText private lateinit var playlistNameView: EditText
private lateinit var starMenuItem: MenuItem private lateinit var starMenuItem: MenuItem
private lateinit var fiveStar1ImageView: ImageView private lateinit var fiveStar1ImageView: ImageView
@ -198,7 +193,6 @@ class PlayerFragment :
stopButton = view.findViewById(R.id.button_stop) stopButton = view.findViewById(R.id.button_stop)
playButton = view.findViewById(R.id.button_start) playButton = view.findViewById(R.id.button_start)
repeatButton = view.findViewById(R.id.button_repeat) repeatButton = view.findViewById(R.id.button_repeat)
visualizerViewLayout = view.findViewById(R.id.current_playing_visualizer_layout)
fiveStar1ImageView = view.findViewById(R.id.song_five_star_1) fiveStar1ImageView = view.findViewById(R.id.song_five_star_1)
fiveStar2ImageView = view.findViewById(R.id.song_five_star_2) fiveStar2ImageView = view.findViewById(R.id.song_five_star_2)
fiveStar3ImageView = view.findViewById(R.id.song_five_star_3) fiveStar3ImageView = view.findViewById(R.id.song_five_star_3)
@ -354,36 +348,6 @@ class PlayerFragment :
registerForContextMenu(playlistView) registerForContextMenu(playlistView)
visualizerViewLayout.isVisible = false
VisualizerController.get().observe(
requireActivity()
) { visualizerController ->
if (visualizerController != null) {
Timber.d("VisualizerController Observer.onChanged received controller")
visualizerView = VisualizerView(context)
visualizerViewLayout.addView(
visualizerView,
LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT
)
)
visualizerViewLayout.isVisible = visualizerView.isActive
visualizerView.setOnTouchListener { _, _ ->
visualizerView.isActive = !visualizerView.isActive
mediaPlayerController.showVisualization = visualizerView.isActive
true
}
isVisualizerAvailable = true
} else {
Timber.d("VisualizerController Observer.onChanged has no controller")
visualizerViewLayout.isVisible = false
isVisualizerAvailable = false
}
}
EqualizerController.get().observe( EqualizerController.get().observe(
requireActivity() requireActivity()
) { equalizerController -> ) { equalizerController ->
@ -489,10 +453,6 @@ class PlayerFragment :
requireActivity().window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) requireActivity().window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
} }
if (::visualizerView.isInitialized) {
visualizerView.isActive = mediaPlayerController.showVisualization
}
requireActivity().invalidateOptionsMenu() requireActivity().invalidateOptionsMenu()
} }
@ -510,9 +470,6 @@ class PlayerFragment :
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
executorService.shutdown() executorService.shutdown()
if (::visualizerView.isInitialized) {
visualizerView.isActive = mediaPlayerController.showVisualization
}
} }
override fun onDestroyView() { override fun onDestroyView() {
@ -533,7 +490,6 @@ class PlayerFragment :
val screenOption = menu.findItem(R.id.menu_item_screen_on_off) val screenOption = menu.findItem(R.id.menu_item_screen_on_off)
val jukeboxOption = menu.findItem(R.id.menu_item_jukebox) val jukeboxOption = menu.findItem(R.id.menu_item_jukebox)
val equalizerMenuItem = menu.findItem(R.id.menu_item_equalizer) val equalizerMenuItem = menu.findItem(R.id.menu_item_equalizer)
val visualizerMenuItem = menu.findItem(R.id.menu_item_visualizer)
val shareMenuItem = menu.findItem(R.id.menu_item_share) val shareMenuItem = menu.findItem(R.id.menu_item_share)
val shareSongMenuItem = menu.findItem(R.id.menu_item_share_song) val shareSongMenuItem = menu.findItem(R.id.menu_item_share_song)
starMenuItem = menu.findItem(R.id.menu_item_star) starMenuItem = menu.findItem(R.id.menu_item_star)
@ -556,10 +512,6 @@ class PlayerFragment :
equalizerMenuItem.isEnabled = isEqualizerAvailable equalizerMenuItem.isEnabled = isEqualizerAvailable
equalizerMenuItem.isVisible = isEqualizerAvailable equalizerMenuItem.isVisible = isEqualizerAvailable
} }
if (visualizerMenuItem != null) {
visualizerMenuItem.isEnabled = isVisualizerAvailable
visualizerMenuItem.isVisible = isVisualizerAvailable
}
val mediaPlayerController = mediaPlayerController val mediaPlayerController = mediaPlayerController
val track = mediaPlayerController.currentMediaItem?.toTrack() val track = mediaPlayerController.currentMediaItem?.toTrack()
@ -692,20 +644,6 @@ class PlayerFragment :
Navigation.findNavController(requireView()).navigate(R.id.playerToEqualizer) Navigation.findNavController(requireView()).navigate(R.id.playerToEqualizer)
return true return true
} }
R.id.menu_item_visualizer -> {
val active = !visualizerView.isActive
visualizerView.isActive = active
visualizerViewLayout.isVisible = visualizerView.isActive
mediaPlayerController.showVisualization = visualizerView.isActive
Util.toast(
context,
if (active) R.string.download_visualizer_on
else R.string.download_visualizer_off
)
return true
}
R.id.menu_item_jukebox -> { R.id.menu_item_jukebox -> {
val jukeboxEnabled = !mediaPlayerController.isJukeboxEnabled val jukeboxEnabled = !mediaPlayerController.isJukeboxEnabled
mediaPlayerController.isJukeboxEnabled = jukeboxEnabled mediaPlayerController.isJukeboxEnabled = jukeboxEnabled

View File

@ -112,16 +112,6 @@
</LinearLayout> </LinearLayout>
<LinearLayout
a:id="@+id/current_playing_visualizer_layout"
a:layout_width="fill_parent"
a:layout_height="60dip"
a:layout_gravity="bottom|center_horizontal"
a:layout_marginStart="60dip"
a:layout_marginEnd="60dip"
a:background="@color/translucent"
a:orientation="vertical" />
<include layout="@layout/player_slider" /> <include layout="@layout/player_slider" />
<include layout="@layout/media_buttons" /> <include layout="@layout/media_buttons" />

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
a:layout_width="fill_parent" a:layout_width="fill_parent"
a:layout_height="fill_parent" a:layout_height="fill_parent"
a:orientation="vertical" > a:orientation="vertical" >
@ -39,7 +40,8 @@
a:layout_height="60dip" a:layout_height="60dip"
a:layout_gravity="center" a:layout_gravity="center"
a:layout_margin="40dip" a:layout_margin="40dip"
a:orientation="horizontal"> a:orientation="horizontal"
tools:ignore="UselessParent">
<ImageView <ImageView
a:id="@+id/song_five_star_1" a:id="@+id/song_five_star_1"
@ -107,18 +109,6 @@
a:importantForAccessibility="no" /> a:importantForAccessibility="no" />
</LinearLayout> </LinearLayout>
<LinearLayout
a:id="@+id/current_playing_visualizer_layout"
a:layout_width="fill_parent"
a:layout_height="60dip"
a:layout_gravity="center"
a:background="@color/translucent"
a:layout_marginStart="80dip"
a:layout_marginEnd="80dip"
a:orientation="vertical"
/>
</LinearLayout> </LinearLayout>
</RelativeLayout> </RelativeLayout>

View File

@ -49,10 +49,6 @@
a:id="@+id/menu_item_equalizer" a:id="@+id/menu_item_equalizer"
app:showAsAction="never" app:showAsAction="never"
a:title="@string/download.menu_equalizer"/> a:title="@string/download.menu_equalizer"/>
<item
a:id="@+id/menu_item_visualizer"
app:showAsAction="never"
a:title="@string/download.menu_visualizer"/>
<item <item
a:id="@+id/menu_item_jukebox" a:id="@+id/menu_item_jukebox"
app:showAsAction="never" app:showAsAction="never"

View File

@ -61,7 +61,6 @@
<string name="download.menu_screen_on">Obrazovka zapnuta</string> <string name="download.menu_screen_on">Obrazovka zapnuta</string>
<string name="download.menu_show_album">Zobrazit album</string> <string name="download.menu_show_album">Zobrazit album</string>
<string name="download.menu_shuffle">Náhodně</string> <string name="download.menu_shuffle">Náhodně</string>
<string name="download.menu_visualizer">Vizualizér</string>
<string name="download.playerstate_playing_shuffle">Přehrávám mix</string> <string name="download.playerstate_playing_shuffle">Přehrávám mix</string>
<string name="download.playlist_done">Playlist úspěšně uložen.</string> <string name="download.playlist_done">Playlist úspěšně uložen.</string>
<string name="download.playlist_error">Chyba ukládání playlistu, zkuste později.</string> <string name="download.playlist_error">Chyba ukládání playlistu, zkuste později.</string>
@ -71,8 +70,6 @@
<string name="download.repeat_all">Opakovat vše</string> <string name="download.repeat_all">Opakovat vše</string>
<string name="download.repeat_off">Opakování vypnuto</string> <string name="download.repeat_off">Opakování vypnuto</string>
<string name="download.repeat_single">Opakovat skladbu</string> <string name="download.repeat_single">Opakovat skladbu</string>
<string name="download.visualizer_off">Vizualizér vypnut.</string>
<string name="download.visualizer_on">Vizualizér zapnut.</string>
<string name="equalizer.enabled">Zapnut</string> <string name="equalizer.enabled">Zapnut</string>
<string name="equalizer.label">Ekvalizér</string> <string name="equalizer.label">Ekvalizér</string>
<string name="equalizer.preset">Vybrat předvolbu</string> <string name="equalizer.preset">Vybrat předvolbu</string>

View File

@ -76,7 +76,6 @@
<string name="download.menu_shuffle">Mischen</string> <string name="download.menu_shuffle">Mischen</string>
<string name="download.menu_shuffle_on">Zufalls-Modus aktiviert</string> <string name="download.menu_shuffle_on">Zufalls-Modus aktiviert</string>
<string name="download.menu_shuffle_off">Zufalls-Modus deaktiviert</string> <string name="download.menu_shuffle_off">Zufalls-Modus deaktiviert</string>
<string name="download.menu_visualizer">Grafik</string>
<string name="download.playerstate_loading">Laden …</string> <string name="download.playerstate_loading">Laden …</string>
<string name="download.playerstate_playing_shuffle">Wiedergabeliste mischen</string> <string name="download.playerstate_playing_shuffle">Wiedergabeliste mischen</string>
<string name="download.playlist_done">Die Wiedergabeliste wurde gespeichert</string> <string name="download.playlist_done">Die Wiedergabeliste wurde gespeichert</string>
@ -87,8 +86,6 @@
<string name="download.repeat_all">Alles wiederholen</string> <string name="download.repeat_all">Alles wiederholen</string>
<string name="download.repeat_off">Wiederholen aus</string> <string name="download.repeat_off">Wiederholen aus</string>
<string name="download.repeat_single">Titel wiederholen</string> <string name="download.repeat_single">Titel wiederholen</string>
<string name="download.visualizer_off">Grafik ausgeschaltet</string>
<string name="download.visualizer_on">Grafik eingeschaltet</string>
<string name="equalizer.enabled">Aktiviert</string> <string name="equalizer.enabled">Aktiviert</string>
<string name="equalizer.label">Equalizer</string> <string name="equalizer.label">Equalizer</string>
<string name="equalizer.preset">Voreinstellung wählen</string> <string name="equalizer.preset">Voreinstellung wählen</string>

View File

@ -76,7 +76,6 @@
<string name="download.menu_shuffle">Aleatorio</string> <string name="download.menu_shuffle">Aleatorio</string>
<string name="download.menu_shuffle_on">Modo aleatorio activado</string> <string name="download.menu_shuffle_on">Modo aleatorio activado</string>
<string name="download.menu_shuffle_off">Modo aleatorio desactivado</string> <string name="download.menu_shuffle_off">Modo aleatorio desactivado</string>
<string name="download.menu_visualizer">Visualizador</string>
<string name="download.playerstate_loading">Almacenando en el buffer …</string> <string name="download.playerstate_loading">Almacenando en el buffer …</string>
<string name="download.playerstate_playing_shuffle">Reproduciendo en modo aleatorio</string> <string name="download.playerstate_playing_shuffle">Reproduciendo en modo aleatorio</string>
<string name="download.playlist_done">Lista de reproducción guardada con éxito.</string> <string name="download.playlist_done">Lista de reproducción guardada con éxito.</string>
@ -87,8 +86,6 @@
<string name="download.repeat_all">Repetir todo</string> <string name="download.repeat_all">Repetir todo</string>
<string name="download.repeat_off">No repetir</string> <string name="download.repeat_off">No repetir</string>
<string name="download.repeat_single">Repetir canción</string> <string name="download.repeat_single">Repetir canción</string>
<string name="download.visualizer_off">Visualizador apagado.</string>
<string name="download.visualizer_on">Visualizador encendido.</string>
<string name="equalizer.enabled">Activado</string> <string name="equalizer.enabled">Activado</string>
<string name="equalizer.label">Ecualizador</string> <string name="equalizer.label">Ecualizador</string>
<string name="equalizer.preset">Seleccionar preajuste</string> <string name="equalizer.preset">Seleccionar preajuste</string>

View File

@ -72,7 +72,6 @@
<string name="download.menu_screen_on">Sur 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_show_album">Afficher l\'album</string>
<string name="download.menu_shuffle">Aléatoire</string> <string name="download.menu_shuffle">Aléatoire</string>
<string name="download.menu_visualizer">Visualiseur</string>
<string name="download.playerstate_playing_shuffle">En lecture aléatoire</string> <string name="download.playerstate_playing_shuffle">En lecture aléatoire</string>
<string name="download.playlist_done">Playlist enregistrée avec succès !</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.playlist_error">Échec de l\'enregistrement de la playlist, veuillez réessayer plus tard.</string>
@ -82,8 +81,6 @@
<string name="download.repeat_all">Tout répéter</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_off">Répétition désactivée</string>
<string name="download.repeat_single">Répéter le morceau</string> <string name="download.repeat_single">Répéter le morceau</string>
<string name="download.visualizer_off">Visualiseur désactivé</string>
<string name="download.visualizer_on">Visualiseur activé</string>
<string name="equalizer.enabled">Activé</string> <string name="equalizer.enabled">Activé</string>
<string name="equalizer.label">Égaliseur</string> <string name="equalizer.label">Égaliseur</string>
<string name="equalizer.preset">Sélection prédéfinie</string> <string name="equalizer.preset">Sélection prédéfinie</string>

View File

@ -67,7 +67,6 @@
<string name="download.menu_screen_on">Kijelző be</string> <string name="download.menu_screen_on">Kijelző be</string>
<string name="download.menu_show_album">Ugrás az albumhoz</string> <string name="download.menu_show_album">Ugrás az albumhoz</string>
<string name="download.menu_shuffle">Véletlen sorrendű</string> <string name="download.menu_shuffle">Véletlen sorrendű</string>
<string name="download.menu_visualizer">Visualizer</string>
<string name="download.playerstate_playing_shuffle">Véletlen sorrendű</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_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.playlist_error">Lejátszási lista mentése sikertelen, próbálja később!</string>
@ -77,8 +76,6 @@
<string name="download.repeat_all">Összes ismétlé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_off">Ismétlés ki</string>
<string name="download.repeat_single">Dal ismétlése</string> <string name="download.repeat_single">Dal ismétlése</string>
<string name="download.visualizer_off">Visualizer ki</string>
<string name="download.visualizer_on">Visualizer be</string>
<string name="equalizer.enabled">Engedélyezve</string> <string name="equalizer.enabled">Engedélyezve</string>
<string name="equalizer.label">Equalizer</string> <string name="equalizer.label">Equalizer</string>
<string name="equalizer.preset">Profil kiválasztása</string> <string name="equalizer.preset">Profil kiválasztása</string>

View File

@ -58,7 +58,6 @@
<string name="download.menu_screen_on">Schermo acceso</string> <string name="download.menu_screen_on">Schermo acceso</string>
<string name="download.menu_show_album">Visualizza Album</string> <string name="download.menu_show_album">Visualizza Album</string>
<string name="download.menu_shuffle">Casuale</string> <string name="download.menu_shuffle">Casuale</string>
<string name="download.menu_visualizer">Visualizzatore</string>
<string name="download.playerstate_playing_shuffle">Riproduzione casuale</string> <string name="download.playerstate_playing_shuffle">Riproduzione casuale</string>
<string name="download.playlist_done">Playlist salvata con successo </string> <string name="download.playlist_done">Playlist salvata con successo </string>
<string name="download.playlist_error">Impossibile salvare la playlist, riprovare più tardi.</string> <string name="download.playlist_error">Impossibile salvare la playlist, riprovare più tardi.</string>
@ -68,8 +67,6 @@
<string name="download.repeat_all">Ripeti tutto</string> <string name="download.repeat_all">Ripeti tutto</string>
<string name="download.repeat_off">Ripetizione spenta</string> <string name="download.repeat_off">Ripetizione spenta</string>
<string name="download.repeat_single">Ripeti canzone</string> <string name="download.repeat_single">Ripeti canzone</string>
<string name="download.visualizer_off">Visualizzatore disattivato.</string>
<string name="download.visualizer_on">Visualizzatore attivato.</string>
<string name="equalizer.enabled">Abilitato</string> <string name="equalizer.enabled">Abilitato</string>
<string name="equalizer.label">Equalizzatore</string> <string name="equalizer.label">Equalizzatore</string>
<string name="equalizer.preset">Selezione Preset</string> <string name="equalizer.preset">Selezione Preset</string>

View File

@ -76,7 +76,6 @@
<string name="download.menu_shuffle">Willekeurig</string> <string name="download.menu_shuffle">Willekeurig</string>
<string name="download.menu_shuffle_on">Willekeurige modus is ingeschakeld</string> <string name="download.menu_shuffle_on">Willekeurige modus is ingeschakeld</string>
<string name="download.menu_shuffle_off">Willekeurige modus is uitgeschakeld</string> <string name="download.menu_shuffle_off">Willekeurige modus is uitgeschakeld</string>
<string name="download.menu_visualizer">Visualisatie</string>
<string name="download.playerstate_loading">Bezig met bufferen…</string> <string name="download.playerstate_loading">Bezig met bufferen…</string>
<string name="download.playerstate_playing_shuffle">Bezig met willekeurig afspelen</string> <string name="download.playerstate_playing_shuffle">Bezig met willekeurig afspelen</string>
<string name="download.playlist_done">Afspeellijst is opgeslagen.</string> <string name="download.playlist_done">Afspeellijst is opgeslagen.</string>
@ -87,8 +86,6 @@
<string name="download.repeat_all">Alles herhalen</string> <string name="download.repeat_all">Alles herhalen</string>
<string name="download.repeat_off">Herhalen uitgeschakeld</string> <string name="download.repeat_off">Herhalen uitgeschakeld</string>
<string name="download.repeat_single">Nummer herhalen</string> <string name="download.repeat_single">Nummer herhalen</string>
<string name="download.visualizer_off">Visualisatie uitgeschakeld.</string>
<string name="download.visualizer_on">Visualisatie ingeschakeld.</string>
<string name="equalizer.enabled">Ingeschakeld</string> <string name="equalizer.enabled">Ingeschakeld</string>
<string name="equalizer.label">Equalizer</string> <string name="equalizer.label">Equalizer</string>
<string name="equalizer.preset">Kies een voorinstelling</string> <string name="equalizer.preset">Kies een voorinstelling</string>

View File

@ -61,7 +61,6 @@
<string name="download.menu_screen_on">Ekran włączony</string> <string name="download.menu_screen_on">Ekran włączony</string>
<string name="download.menu_show_album">Wyświetl album</string> <string name="download.menu_show_album">Wyświetl album</string>
<string name="download.menu_shuffle">Wymieszaj</string> <string name="download.menu_shuffle">Wymieszaj</string>
<string name="download.menu_visualizer">Efekt wizualny</string>
<string name="download.playerstate_playing_shuffle">Odtwarzanie losowe</string> <string name="download.playerstate_playing_shuffle">Odtwarzanie losowe</string>
<string name="download.playlist_done">Playlista została zapisana.</string> <string name="download.playlist_done">Playlista została zapisana.</string>
<string name="download.playlist_error">Błąd zapisu playlisty. Proszę spróbować później.</string> <string name="download.playlist_error">Błąd zapisu playlisty. Proszę spróbować później.</string>
@ -71,8 +70,6 @@
<string name="download.repeat_all">Powtarzaj wszystko</string> <string name="download.repeat_all">Powtarzaj wszystko</string>
<string name="download.repeat_off">Powtarzanie wyłączone</string> <string name="download.repeat_off">Powtarzanie wyłączone</string>
<string name="download.repeat_single">Powtarzaj utwór</string> <string name="download.repeat_single">Powtarzaj utwór</string>
<string name="download.visualizer_off">Efekt wizualny wyłączony.</string>
<string name="download.visualizer_on">Efekt wizualny włączony.</string>
<string name="equalizer.enabled">Włączony</string> <string name="equalizer.enabled">Włączony</string>
<string name="equalizer.label">Korektor dźwięku</string> <string name="equalizer.label">Korektor dźwięku</string>
<string name="equalizer.preset">Wybierz preset</string> <string name="equalizer.preset">Wybierz preset</string>

View File

@ -72,7 +72,6 @@
<string name="download.menu_screen_on">Tela Ligada</string> <string name="download.menu_screen_on">Tela Ligada</string>
<string name="download.menu_show_album">Mostrar Álbum</string> <string name="download.menu_show_album">Mostrar Álbum</string>
<string name="download.menu_shuffle">Misturar</string> <string name="download.menu_shuffle">Misturar</string>
<string name="download.menu_visualizer">Visualizador</string>
<string name="download.playerstate_playing_shuffle">Tocando misturado</string> <string name="download.playerstate_playing_shuffle">Tocando misturado</string>
<string name="download.playlist_done">Playlist salva com sucesso.</string> <string name="download.playlist_done">Playlist salva com sucesso.</string>
<string name="download.playlist_error">Falha ao salvar a playlist, Tente mais tarde.</string> <string name="download.playlist_error">Falha ao salvar a playlist, Tente mais tarde.</string>
@ -82,8 +81,6 @@
<string name="download.repeat_all">Repetir Tudo</string> <string name="download.repeat_all">Repetir Tudo</string>
<string name="download.repeat_off">Repetição Desligada</string> <string name="download.repeat_off">Repetição Desligada</string>
<string name="download.repeat_single">Repetir Música</string> <string name="download.repeat_single">Repetir Música</string>
<string name="download.visualizer_off">Visualizador Desligado.</string>
<string name="download.visualizer_on">Visualizador Ligado.</string>
<string name="equalizer.enabled">Habilitado</string> <string name="equalizer.enabled">Habilitado</string>
<string name="equalizer.label">Equalizador</string> <string name="equalizer.label">Equalizador</string>
<string name="equalizer.preset">Selecionar Configuração Prévia</string> <string name="equalizer.preset">Selecionar Configuração Prévia</string>

View File

@ -61,7 +61,6 @@
<string name="download.menu_screen_on">Ecrã Ligado</string> <string name="download.menu_screen_on">Ecrã Ligado</string>
<string name="download.menu_show_album">Mostrar Álbum</string> <string name="download.menu_show_album">Mostrar Álbum</string>
<string name="download.menu_shuffle">Misturar</string> <string name="download.menu_shuffle">Misturar</string>
<string name="download.menu_visualizer">Visualizador</string>
<string name="download.playerstate_playing_shuffle">Tocando misturado</string> <string name="download.playerstate_playing_shuffle">Tocando misturado</string>
<string name="download.playlist_done">Playlist salva com sucesso.</string> <string name="download.playlist_done">Playlist salva com sucesso.</string>
<string name="download.playlist_error">Falha ao salvar a playlist, Tente mais tarde.</string> <string name="download.playlist_error">Falha ao salvar a playlist, Tente mais tarde.</string>
@ -71,8 +70,6 @@
<string name="download.repeat_all">Repetir Tudo</string> <string name="download.repeat_all">Repetir Tudo</string>
<string name="download.repeat_off">Repetição Desligada</string> <string name="download.repeat_off">Repetição Desligada</string>
<string name="download.repeat_single">Repetir Música</string> <string name="download.repeat_single">Repetir Música</string>
<string name="download.visualizer_off">Visualizador Desligado.</string>
<string name="download.visualizer_on">Visualizador Ligado.</string>
<string name="equalizer.enabled">Habilitado</string> <string name="equalizer.enabled">Habilitado</string>
<string name="equalizer.label">Equalizador</string> <string name="equalizer.label">Equalizador</string>
<string name="equalizer.preset">Selecionar Configuração Prévia</string> <string name="equalizer.preset">Selecionar Configuração Prévia</string>

View File

@ -72,7 +72,6 @@
<string name="download.menu_screen_on">Включение дисплея</string> <string name="download.menu_screen_on">Включение дисплея</string>
<string name="download.menu_show_album">Показать альбом</string> <string name="download.menu_show_album">Показать альбом</string>
<string name="download.menu_shuffle">Случайное воспроизведение</string> <string name="download.menu_shuffle">Случайное воспроизведение</string>
<string name="download.menu_visualizer">Визуализатор</string>
<string name="download.playerstate_playing_shuffle">Игра в случайном порядке</string> <string name="download.playerstate_playing_shuffle">Игра в случайном порядке</string>
<string name="download.playlist_done">Плейлист был успешно сохранен.</string> <string name="download.playlist_done">Плейлист был успешно сохранен.</string>
<string name="download.playlist_error">Не удалось сохранить плейлист, попробуйте позже.</string> <string name="download.playlist_error">Не удалось сохранить плейлист, попробуйте позже.</string>
@ -82,8 +81,6 @@
<string name="download.repeat_all">Повторить все</string> <string name="download.repeat_all">Повторить все</string>
<string name="download.repeat_off">Выключить повтор</string> <string name="download.repeat_off">Выключить повтор</string>
<string name="download.repeat_single">Повторить песню</string> <string name="download.repeat_single">Повторить песню</string>
<string name="download.visualizer_off">Выключить визуализатор.</string>
<string name="download.visualizer_on">Включить визуализатор.</string>
<string name="equalizer.enabled">Включено</string> <string name="equalizer.enabled">Включено</string>
<string name="equalizer.label">Эквалайзер</string> <string name="equalizer.label">Эквалайзер</string>
<string name="equalizer.preset">Выберите предустановку</string> <string name="equalizer.preset">Выберите предустановку</string>

View File

@ -72,7 +72,6 @@
<string name="download.menu_screen_on">开启屏幕常亮</string> <string name="download.menu_screen_on">开启屏幕常亮</string>
<string name="download.menu_show_album">显示专辑</string> <string name="download.menu_show_album">显示专辑</string>
<string name="download.menu_shuffle">随机</string> <string name="download.menu_shuffle">随机</string>
<string name="download.menu_visualizer">可视化</string>
<string name="download.playerstate_playing_shuffle">随机播放</string> <string name="download.playerstate_playing_shuffle">随机播放</string>
<string name="download.playlist_done">已成功保存播放列表。</string> <string name="download.playlist_done">已成功保存播放列表。</string>
<string name="download.playlist_error">保存播放列表失败,请重试。</string> <string name="download.playlist_error">保存播放列表失败,请重试。</string>
@ -82,8 +81,6 @@
<string name="download.repeat_all">循环播放所有</string> <string name="download.repeat_all">循环播放所有</string>
<string name="download.repeat_off">关闭循环播放</string> <string name="download.repeat_off">关闭循环播放</string>
<string name="download.repeat_single">循环播放</string> <string name="download.repeat_single">循环播放</string>
<string name="download.visualizer_off">关闭可视化</string>
<string name="download.visualizer_on">打开可视化</string>
<string name="equalizer.enabled">开启</string> <string name="equalizer.enabled">开启</string>
<string name="equalizer.label">均衡器</string> <string name="equalizer.label">均衡器</string>
<string name="equalizer.preset">选择预设</string> <string name="equalizer.preset">选择预设</string>

View File

@ -6,7 +6,6 @@
<color name="cyan">#0099cc</color> <color name="cyan">#0099cc</color>
<color name="navigation_header_light">#6200EE</color> <color name="navigation_header_light">#6200EE</color>
<color name="navigation_header_dark">#BB86FC</color> <color name="navigation_header_dark">#BB86FC</color>
<color name="translucent">#80000000</color>
<color name="background_color_dark">#000000</color> <color name="background_color_dark">#000000</color>
<color name="background_color_grey">#333333</color> <color name="background_color_grey">#333333</color>
<color name="background_color_light">#ffffff</color> <color name="background_color_light">#ffffff</color>

View File

@ -76,7 +76,6 @@
<string name="download.menu_shuffle">Shuffle</string> <string name="download.menu_shuffle">Shuffle</string>
<string name="download.menu_shuffle_on">Shuffle mode enabled</string> <string name="download.menu_shuffle_on">Shuffle mode enabled</string>
<string name="download.menu_shuffle_off">Shuffle mode disabled</string> <string name="download.menu_shuffle_off">Shuffle mode disabled</string>
<string name="download.menu_visualizer">Visualizer</string>
<string name="download.playerstate_loading">Buffering …</string> <string name="download.playerstate_loading">Buffering …</string>
<string name="download.playerstate_playing_shuffle">Playing shuffle</string> <string name="download.playerstate_playing_shuffle">Playing shuffle</string>
<string name="download.playlist_done">Playlist was successfully saved.</string> <string name="download.playlist_done">Playlist was successfully saved.</string>
@ -87,8 +86,6 @@
<string name="download.repeat_all">Repeat All</string> <string name="download.repeat_all">Repeat All</string>
<string name="download.repeat_off">Repeat Off</string> <string name="download.repeat_off">Repeat Off</string>
<string name="download.repeat_single">Repeat Song</string> <string name="download.repeat_single">Repeat Song</string>
<string name="download.visualizer_off">Turned off visualizer.</string>
<string name="download.visualizer_on">Turned on visualizer.</string>
<string name="equalizer.enabled">Enabled</string> <string name="equalizer.enabled">Enabled</string>
<string name="equalizer.label">Equalizer</string> <string name="equalizer.label">Equalizer</string>
<string name="equalizer.preset">Select Preset</string> <string name="equalizer.preset">Select Preset</string>