mirror of
https://gitlab.com/ultrasonic/ultrasonic.git
synced 2025-04-12 23:47:16 +03:00
RM Visualizer
This commit is contained in:
parent
9cb77c0e67
commit
7256cc7d12
@ -1,9 +1,9 @@
|
||||
[versions]
|
||||
# You need to run ./gradlew wrapper after updating the version
|
||||
gradle = "7.3.3"
|
||||
gradle = "7.5.1"
|
||||
|
||||
navigation = "2.3.5"
|
||||
gradlePlugin = "7.2.1"
|
||||
gradlePlugin = "7.2.2"
|
||||
androidxcore = "1.6.0"
|
||||
ktlint = "0.43.2"
|
||||
ktlintGradle = "10.2.0"
|
||||
@ -26,7 +26,7 @@ viewModelKtx = "2.4.1"
|
||||
retrofit = "2.9.0"
|
||||
jackson = "2.10.1"
|
||||
okhttp = "4.10.0"
|
||||
koin = "3.0.2"
|
||||
koin = "3.2.0"
|
||||
picasso = "2.71828"
|
||||
|
||||
junit4 = "4.13.2"
|
||||
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
5
gradle/wrapper/gradle-wrapper.properties
vendored
5
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,5 @@
|
||||
#Fri Jun 17 23:13:49 CEST 2022
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
|
||||
distributionPath=wrapper/dists
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
16
gradlew
vendored
16
gradlew
vendored
@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright © 2015-2021 the original authors.
|
||||
# Copyright © 2015-2021 the original authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (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
|
||||
# requires all of these POSIX shell features:
|
||||
# * functions;
|
||||
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||
# * compound commands having a testable exit status, especially «case»;
|
||||
# * various built-in commands including «command», «set», and «ulimit».
|
||||
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||
# * compound commands having a testable exit status, especially «case»;
|
||||
# * various built-in commands including «command», «set», and «ulimit».
|
||||
#
|
||||
# Important for patching:
|
||||
#
|
||||
@ -205,6 +205,12 @@ set -- \
|
||||
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.
|
||||
#
|
||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||
|
14
gradlew.bat
vendored
14
gradlew.bat
vendored
@ -14,7 +14,7 @@
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@if "%DEBUG%"=="" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@ -25,7 +25,7 @@
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
if "%DIRNAME%"=="" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto execute
|
||||
if %ERRORLEVEL% equ 0 goto execute
|
||||
|
||||
echo.
|
||||
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
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
if %ERRORLEVEL% equ 0 goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
set EXIT_CODE=%ERRORLEVEL%
|
||||
if %EXIT_CODE% equ 0 set EXIT_CODE=1
|
||||
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
|
||||
exit /b %EXIT_CODE%
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?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
|
||||
id="InflateParams"
|
||||
@ -19,7 +19,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="156"
|
||||
line="153"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -9,7 +9,6 @@ import kotlinx.coroutines.launch
|
||||
import org.koin.android.ext.koin.androidContext
|
||||
import org.koin.core.context.startKoin
|
||||
import org.koin.core.context.stopKoin
|
||||
import org.koin.core.logger.Level
|
||||
import org.moire.ultrasonic.BuildConfig
|
||||
import org.moire.ultrasonic.di.appPermanentStorage
|
||||
import org.moire.ultrasonic.di.applicationModule
|
||||
@ -61,12 +60,14 @@ class UApp : MultiDexApplication() {
|
||||
internal fun startKoin() {
|
||||
initiated = true
|
||||
startKoin {
|
||||
// TODO Currently there is a bug in Koin which makes necessary to set the log level to ERROR
|
||||
logger(TimberKoinLogger(Level.ERROR))
|
||||
// logger(TimberKoinLogger(Level.INFO))
|
||||
// Sometimes Koin breaks when Kotlin version is upgraded,
|
||||
// you can normally fix it by changing to logger(TimberKoinLogger(Level.ERROR))
|
||||
// See https://github.com/InsertKoinIO/koin/issues/1188
|
||||
logger(TimberKoinLogger())
|
||||
|
||||
// declare Android context
|
||||
androidContext(this@UApp)
|
||||
|
||||
// declare modules to use
|
||||
modules(
|
||||
applicationModule,
|
||||
|
@ -72,7 +72,6 @@ import org.moire.ultrasonic.R
|
||||
import org.moire.ultrasonic.adapters.BaseAdapter
|
||||
import org.moire.ultrasonic.adapters.TrackViewBinder
|
||||
import org.moire.ultrasonic.audiofx.EqualizerController
|
||||
import org.moire.ultrasonic.audiofx.VisualizerController
|
||||
import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline
|
||||
import org.moire.ultrasonic.domain.Identifiable
|
||||
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.toTrack
|
||||
import org.moire.ultrasonic.view.AutoRepeatButton
|
||||
import org.moire.ultrasonic.view.VisualizerView
|
||||
import timber.log.Timber
|
||||
|
||||
/**
|
||||
@ -111,7 +109,6 @@ class PlayerFragment :
|
||||
private var jukeboxAvailable = false
|
||||
private var useFiveStarRating = false
|
||||
private var isEqualizerAvailable = false
|
||||
private var isVisualizerAvailable = false
|
||||
|
||||
// Detectors & Callbacks
|
||||
private lateinit var gestureScanner: GestureDetector
|
||||
@ -130,8 +127,6 @@ class PlayerFragment :
|
||||
private var ioScope = CoroutineScope(Dispatchers.IO)
|
||||
|
||||
// Views and UI Elements
|
||||
private lateinit var visualizerViewLayout: LinearLayout
|
||||
private lateinit var visualizerView: VisualizerView
|
||||
private lateinit var playlistNameView: EditText
|
||||
private lateinit var starMenuItem: MenuItem
|
||||
private lateinit var fiveStar1ImageView: ImageView
|
||||
@ -198,7 +193,6 @@ class PlayerFragment :
|
||||
stopButton = view.findViewById(R.id.button_stop)
|
||||
playButton = view.findViewById(R.id.button_start)
|
||||
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)
|
||||
fiveStar2ImageView = view.findViewById(R.id.song_five_star_2)
|
||||
fiveStar3ImageView = view.findViewById(R.id.song_five_star_3)
|
||||
@ -354,36 +348,6 @@ class PlayerFragment :
|
||||
|
||||
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(
|
||||
requireActivity()
|
||||
) { equalizerController ->
|
||||
@ -489,10 +453,6 @@ class PlayerFragment :
|
||||
requireActivity().window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
|
||||
}
|
||||
|
||||
if (::visualizerView.isInitialized) {
|
||||
visualizerView.isActive = mediaPlayerController.showVisualization
|
||||
}
|
||||
|
||||
requireActivity().invalidateOptionsMenu()
|
||||
}
|
||||
|
||||
@ -510,9 +470,6 @@ class PlayerFragment :
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
executorService.shutdown()
|
||||
if (::visualizerView.isInitialized) {
|
||||
visualizerView.isActive = mediaPlayerController.showVisualization
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
@ -533,7 +490,6 @@ class PlayerFragment :
|
||||
val screenOption = menu.findItem(R.id.menu_item_screen_on_off)
|
||||
val jukeboxOption = menu.findItem(R.id.menu_item_jukebox)
|
||||
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 shareSongMenuItem = menu.findItem(R.id.menu_item_share_song)
|
||||
starMenuItem = menu.findItem(R.id.menu_item_star)
|
||||
@ -556,10 +512,6 @@ class PlayerFragment :
|
||||
equalizerMenuItem.isEnabled = isEqualizerAvailable
|
||||
equalizerMenuItem.isVisible = isEqualizerAvailable
|
||||
}
|
||||
if (visualizerMenuItem != null) {
|
||||
visualizerMenuItem.isEnabled = isVisualizerAvailable
|
||||
visualizerMenuItem.isVisible = isVisualizerAvailable
|
||||
}
|
||||
val mediaPlayerController = mediaPlayerController
|
||||
val track = mediaPlayerController.currentMediaItem?.toTrack()
|
||||
|
||||
@ -692,20 +644,6 @@ class PlayerFragment :
|
||||
Navigation.findNavController(requireView()).navigate(R.id.playerToEqualizer)
|
||||
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 -> {
|
||||
val jukeboxEnabled = !mediaPlayerController.isJukeboxEnabled
|
||||
mediaPlayerController.isJukeboxEnabled = jukeboxEnabled
|
||||
|
@ -112,16 +112,6 @@
|
||||
|
||||
</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/media_buttons" />
|
||||
|
@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
a:layout_width="fill_parent"
|
||||
a:layout_height="fill_parent"
|
||||
a:orientation="vertical" >
|
||||
@ -39,7 +40,8 @@
|
||||
a:layout_height="60dip"
|
||||
a:layout_gravity="center"
|
||||
a:layout_margin="40dip"
|
||||
a:orientation="horizontal">
|
||||
a:orientation="horizontal"
|
||||
tools:ignore="UselessParent">
|
||||
|
||||
<ImageView
|
||||
a:id="@+id/song_five_star_1"
|
||||
@ -107,18 +109,6 @@
|
||||
a:importantForAccessibility="no" />
|
||||
|
||||
</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>
|
||||
</RelativeLayout>
|
||||
|
||||
|
@ -49,10 +49,6 @@
|
||||
a:id="@+id/menu_item_equalizer"
|
||||
app:showAsAction="never"
|
||||
a:title="@string/download.menu_equalizer"/>
|
||||
<item
|
||||
a:id="@+id/menu_item_visualizer"
|
||||
app:showAsAction="never"
|
||||
a:title="@string/download.menu_visualizer"/>
|
||||
<item
|
||||
a:id="@+id/menu_item_jukebox"
|
||||
app:showAsAction="never"
|
||||
|
@ -61,7 +61,6 @@
|
||||
<string name="download.menu_screen_on">Obrazovka zapnuta</string>
|
||||
<string name="download.menu_show_album">Zobrazit album</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.playlist_done">Playlist úspěšně uložen.</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_off">Opakování vypnuto</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.label">Ekvalizér</string>
|
||||
<string name="equalizer.preset">Vybrat předvolbu</string>
|
||||
|
@ -76,7 +76,6 @@
|
||||
<string name="download.menu_shuffle">Mischen</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_visualizer">Grafik</string>
|
||||
<string name="download.playerstate_loading">Laden …</string>
|
||||
<string name="download.playerstate_playing_shuffle">Wiedergabeliste mischen</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_off">Wiederholen aus</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.label">Equalizer</string>
|
||||
<string name="equalizer.preset">Voreinstellung wählen</string>
|
||||
|
@ -76,7 +76,6 @@
|
||||
<string name="download.menu_shuffle">Aleatorio</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_visualizer">Visualizador</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.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_off">No repetir</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.label">Ecualizador</string>
|
||||
<string name="equalizer.preset">Seleccionar preajuste</string>
|
||||
|
@ -72,7 +72,6 @@
|
||||
<string name="download.menu_screen_on">Sur l\'écran</string>
|
||||
<string name="download.menu_show_album">Afficher l\'album</string>
|
||||
<string name="download.menu_shuffle">Aléatoire</string>
|
||||
<string name="download.menu_visualizer">Visualiseur</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_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_off">Répétition désactivée</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.label">Égaliseur</string>
|
||||
<string name="equalizer.preset">Sélection prédéfinie</string>
|
||||
|
@ -67,7 +67,6 @@
|
||||
<string name="download.menu_screen_on">Kijelző be</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_visualizer">Visualizer</string>
|
||||
<string name="download.playerstate_playing_shuffle">Véletlen sorrendű</string>
|
||||
<string name="download.playlist_done">Lejátszási lista mentése sikeres.</string>
|
||||
<string name="download.playlist_error">Lejátszási lista mentése sikertelen, próbálja később!</string>
|
||||
@ -77,8 +76,6 @@
|
||||
<string name="download.repeat_all">Összes ismétlése</string>
|
||||
<string name="download.repeat_off">Ismétlés ki</string>
|
||||
<string name="download.repeat_single">Dal ismétlése</string>
|
||||
<string name="download.visualizer_off">Visualizer ki</string>
|
||||
<string name="download.visualizer_on">Visualizer be</string>
|
||||
<string name="equalizer.enabled">Engedélyezve</string>
|
||||
<string name="equalizer.label">Equalizer</string>
|
||||
<string name="equalizer.preset">Profil kiválasztása</string>
|
||||
|
@ -58,7 +58,6 @@
|
||||
<string name="download.menu_screen_on">Schermo acceso</string>
|
||||
<string name="download.menu_show_album">Visualizza Album</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.playlist_done">Playlist salvata con successo </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_off">Ripetizione spenta</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.label">Equalizzatore</string>
|
||||
<string name="equalizer.preset">Selezione Preset</string>
|
||||
|
@ -76,7 +76,6 @@
|
||||
<string name="download.menu_shuffle">Willekeurig</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_visualizer">Visualisatie</string>
|
||||
<string name="download.playerstate_loading">Bezig met bufferen…</string>
|
||||
<string name="download.playerstate_playing_shuffle">Bezig met willekeurig afspelen</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_off">Herhalen uitgeschakeld</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.label">Equalizer</string>
|
||||
<string name="equalizer.preset">Kies een voorinstelling</string>
|
||||
|
@ -61,7 +61,6 @@
|
||||
<string name="download.menu_screen_on">Ekran włączony</string>
|
||||
<string name="download.menu_show_album">Wyświetl album</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.playlist_done">Playlista została zapisana.</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_off">Powtarzanie wyłączone</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.label">Korektor dźwięku</string>
|
||||
<string name="equalizer.preset">Wybierz preset</string>
|
||||
|
@ -72,7 +72,6 @@
|
||||
<string name="download.menu_screen_on">Tela Ligada</string>
|
||||
<string name="download.menu_show_album">Mostrar Álbum</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.playlist_done">Playlist salva com sucesso.</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_off">Repetição Desligada</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.label">Equalizador</string>
|
||||
<string name="equalizer.preset">Selecionar Configuração Prévia</string>
|
||||
|
@ -61,7 +61,6 @@
|
||||
<string name="download.menu_screen_on">Ecrã Ligado</string>
|
||||
<string name="download.menu_show_album">Mostrar Álbum</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.playlist_done">Playlist salva com sucesso.</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_off">Repetição Desligada</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.label">Equalizador</string>
|
||||
<string name="equalizer.preset">Selecionar Configuração Prévia</string>
|
||||
|
@ -72,7 +72,6 @@
|
||||
<string name="download.menu_screen_on">Включение дисплея</string>
|
||||
<string name="download.menu_show_album">Показать альбом</string>
|
||||
<string name="download.menu_shuffle">Случайное воспроизведение</string>
|
||||
<string name="download.menu_visualizer">Визуализатор</string>
|
||||
<string name="download.playerstate_playing_shuffle">Игра в случайном порядке</string>
|
||||
<string name="download.playlist_done">Плейлист был успешно сохранен.</string>
|
||||
<string name="download.playlist_error">Не удалось сохранить плейлист, попробуйте позже.</string>
|
||||
@ -82,8 +81,6 @@
|
||||
<string name="download.repeat_all">Повторить все</string>
|
||||
<string name="download.repeat_off">Выключить повтор</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.label">Эквалайзер</string>
|
||||
<string name="equalizer.preset">Выберите предустановку</string>
|
||||
|
@ -72,7 +72,6 @@
|
||||
<string name="download.menu_screen_on">开启屏幕常亮</string>
|
||||
<string name="download.menu_show_album">显示专辑</string>
|
||||
<string name="download.menu_shuffle">随机</string>
|
||||
<string name="download.menu_visualizer">可视化</string>
|
||||
<string name="download.playerstate_playing_shuffle">随机播放</string>
|
||||
<string name="download.playlist_done">已成功保存播放列表。</string>
|
||||
<string name="download.playlist_error">保存播放列表失败,请重试。</string>
|
||||
@ -82,8 +81,6 @@
|
||||
<string name="download.repeat_all">循环播放所有</string>
|
||||
<string name="download.repeat_off">关闭循环播放</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.label">均衡器</string>
|
||||
<string name="equalizer.preset">选择预设</string>
|
||||
|
@ -6,7 +6,6 @@
|
||||
<color name="cyan">#0099cc</color>
|
||||
<color name="navigation_header_light">#6200EE</color>
|
||||
<color name="navigation_header_dark">#BB86FC</color>
|
||||
<color name="translucent">#80000000</color>
|
||||
<color name="background_color_dark">#000000</color>
|
||||
<color name="background_color_grey">#333333</color>
|
||||
<color name="background_color_light">#ffffff</color>
|
||||
|
@ -76,7 +76,6 @@
|
||||
<string name="download.menu_shuffle">Shuffle</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_visualizer">Visualizer</string>
|
||||
<string name="download.playerstate_loading">Buffering …</string>
|
||||
<string name="download.playerstate_playing_shuffle">Playing shuffle</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_off">Repeat Off</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.label">Equalizer</string>
|
||||
<string name="equalizer.preset">Select Preset</string>
|
||||
|
Loading…
x
Reference in New Issue
Block a user