From 51b0bafb801880d72a55f982f4d2001e7f58d5cb Mon Sep 17 00:00:00 2001
From: dylan <56566724+d-l-n@users.noreply.github.com>
Date: Sun, 16 Aug 2020 17:32:35 -0300
Subject: [PATCH 01/72] Update strings.xml
updated some translations. also i suggest to change the "blacklist" strings/references for a more inclusive name like denylist or blocklist as even Linux did.
---
app/src/main/res/values-es-rES/strings.xml | 98 +++++++++++-----------
1 file changed, 49 insertions(+), 49 deletions(-)
diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml
index c58a3e9e0..4ae9f8692 100644
--- a/app/src/main/res/values-es-rES/strings.xml
+++ b/app/src/main/res/values-es-rES/strings.xml
@@ -51,7 +51,7 @@
Añadir letra
Agregar foto
"Agregar a lista de reproducción"
- Añadir retardo para letras
+ Añadir retraso para letras
"Se ha agregado 1 canción a la cola de reproducción"
%1$d canciones agregadas a la cola de reproducción
Álbum
@@ -74,7 +74,7 @@
Automático
Color base del tema
Refuerzo de graves
- Biografía
+ Bio
Biografía
Negro
Lista Negra
@@ -82,7 +82,7 @@
Tarjeta con desenfoque
Enviando el reporte a GitHub...
Token de acceso inválido. Por favor, contacta con el desarrollador de la aplicación
- El problema no esta habilitado para el repositorio seleccionado. Por favor, contacta col el desarrollador de la app.
+ El problema no está habilitado para el repositorio seleccionado. Por favor, contacta con el desarrollador de la app.
Se ha producido un error inesperado. Por favor, contacta con el desarrollador de la aplicación
Usuario o contraseña incorrectos
Problema
@@ -183,7 +183,7 @@
6
7
8
- Cuadricula y estilo
+ Cuadrícula y estilo
Giro
Historial
Inicio
@@ -207,10 +207,10 @@
Última canción
Vamos a tocar un poco de música
Biblioteca
- Categorías biblioteca
+ Categorías de la Biblioteca
Licencias
Blanco claro
- Escuchadores
+ Oyentes
Listando archivos
Cargando productos...
Iniciar Sección
@@ -230,9 +230,9 @@
No hay Álbumes
No hay Artistas
"Primero reproduce una canción, luego intenta de nuevo."
- No se encontró ecualizador
+ No se encontró nigún ecualizador
No hay Géneros
- No se encontró letra
+ No se encontró la letra
No hay canciones tocando
No hay Listas de Reproducción
No se encontraron compras.
@@ -256,7 +256,7 @@
Contraseña
Más de 3 meses
Pegar letra aquí
- Peak
+ Pica
Permiso de acceso al almacenamiento externo denegado.
Permiso denegado.
Personalizar
@@ -289,7 +289,7 @@
Biblioteca
Pantalla de bloqueo
Listas de reproducción
- Pausar la reproducción cuando se esta en silencio y reproducir cuando se aumenta el volumen. ¡Cuidado! Cuando se aumenta el volumen se empezara la reproducción aunque se este fuera de la app.
+ Pausar la reproducción cuando se está en silencio y reproducir cuando se aumenta el volumen. ¡Cuidado! Cuando se aumenta el volumen se empezará la reproducción aunque se esté fuera de la app.
Pausar en cero
Tenga en cuenta que habilitar esta función puede afectar la duración de la batería
Mantener la pantalla encendida
@@ -306,14 +306,14 @@
El color del fondo y los botones de control cambian de acuerdo a la portada del álbum para la ventana de reproducción
Colorea los accesos directos de la aplicación en el color de énfasis. Cada vez que cambie el color, active esta opción
Colorea la barra de navegación con el color principal
- "Colorea la notificaci\u00f3n con el color vibrante de la portada del \u00e1lbum"
+ "Colorea la notificación con el color vibrante de la portada del álbum"
Según las líneas de la guía Material Design en los colores del modo oscuro deben ser desaturados
Se tomará el color dominante de la portada del álbum o imagen del artista
Añadir controles extra al mini reproductor
- Mostrar información extra de canciones, como el formato de archivo, bitrate y frecuencia
+ Mostrar información extra de canciones, como el formato de archivo, tasa de bits y frecuencia
"Puede causar problemas de reproducción en algunos dispositivos"
- Mostrar/Ocultar pestaña de géneros
- Mostrar/Ocultar banner en inicio
+ Mostrar/Ocultar pestaña Géneros
+ Mostrar/Ocultar banner en Inicio
Puede aumentar la calidad de la portada del álbum, pero provoca tiempos de carga de imágenes más lentos. Solo habilite esto si tiene problemas con portadas de baja resolución
Configure la visibilidad y el orden de las categorías de la biblioteca.
Usar los controles personalizados de Retro Music en la pantalla de bloqueo
@@ -321,32 +321,32 @@
Redondear las esquinas de la aplicación
Mostrar/Ocultar nombres de las pestañas de navegación
Modo inmersivo
- Comenzar a reproducir inmediatamente se conecten audífonos
+ Comenzar a reproducir inmediatamente cuando se conecten audífonos
El modo aleatorio se desactivará cuando se reproduzca una nueva lista de canciones
Mostrar controles de volumen si hay suficiente espacio disponible.
Mostrar/Ocultar portada del álbum
Tema de la portada del álbum
Estilo de portada del álbum en reproducción
- Cuadricula del álbum
+ Cuadrícula del álbum
Accesos directos de la aplicación coloreados
- Cuadricula de los artistas
- Reducir el volumen en pérdida de enfoque
+ Cuadrícula de los artistas
+ Reducir el volumen cuando se pierda el enfoque
Descarga automática de imágenes de artistas
Lista Negra
Reproducción por Bluetooth
Desenfocar portada del álbum
Elegir ecualizador
Diseño de notificación clásico
- Color adaptativo
+ Color Adaptativo
Notificación coloreada
Color Desaturado
Controles extra
Información de la canción
Reproducción sin pausas
Tema de la aplicación
- Mostrar pestaña de géneros
- Cuadricula de los artistas en inicio
- Banner de inicio
+ Mostrar pestaña Géneros
+ Cuadrícula de los artistas en inicio
+ Banner de Inicio
Ignorar las portadas de la biblioteca de medios
Intervalo de la lista \"Añadidos Recientemente\"
Controles en pantalla completa
@@ -355,7 +355,7 @@
Licencias de código abierto
Bordes de las esquinas
Forma de los títulos de las pestañas
- Efecto carrusel
+ Efecto Carrusel
Color dominante
Aplicación en pantalla completa
Títulos de las pestañas
@@ -364,7 +364,7 @@
Controles de volumen
Información de usuario
Color principal
- El color principal del tema, por defecto es gris azulado, por ahora funciona con colores oscuros
+ El color principal del tema, por defecto gris azulado, por ahora funciona con colores oscuros
Pro
Temas en reproducción, efecto Carrusel, tema de color y más ...
Perfil
@@ -378,7 +378,7 @@
Eliminar
Eliminar foto del banner
Eliminar portada
- Eliminar de la lista negra
+ Eliminar de la Lista Negra
Eliminar foto de perfil
Eliminar canción de la lista
%1$s de la lista?]]>
@@ -393,8 +393,8 @@
Compra anterior restaurada. Por favor, reinicie la aplicación para hacer uso de todas las funciones.
Compras anteriores restauradas.
Restaurando compra...
- Ecualizador de Reto Music
- Reproductor de Música Retro
+ Ecualizador de Retro Music
+ Reproductor de Retro Music
Retro Music Pro
La eliminación del archivo falló
@@ -471,12 +471,12 @@
Tablero
¡Buenas Tardes!
¡Buen Día!
- ¡Buenas Tardes!
- ¡Buenos días!
- Buenas noches
+ ¡Buenas Noches!
+ ¡Buen Día!
+ ¡Buenas Noches!
¿Cómo te llamas?
Hoy
- Álbumes mas reproducidos
+ Álbumes más reproducidos
Artistas más reproducidos
"Pista (2 para pista 2 o 3004 para CD3 pista 4)"
Número de pista
@@ -485,7 +485,7 @@
Twitter
Comparte tu diseño con Retro Music
Sin etiqueta
- No se pudo reproducir esta canci\u00f3n
+ No se pudo reproducir esta canción
A continuación
Actualizar imagen
Actualizando...
@@ -504,37 +504,37 @@
%1$d seleccionados
Año
Tienes que seleccionar al menos una categoría
- Sera redirigido al sitio web para reportar problemas.
+ Será redirigido al sitio web para reportar problemas.
Los datos de tu cuenta sólo se utilizan para la autenticación
Cantidad
Nota (Opcional)
Iniciar pago
Mostrar en pantalla de reproducción
Al hacer clic en la notificación se mostrará la pantalla de reproducción en lugar de la pantalla de inicio
- Tiny card
- About %s
- Select language
- Translators
- The people who helped translate this app
- Try Retro Music Premium
+ Carta pequeña
+ Acerca de %s
+ Seleccionar idioma
+ Traductores
+ La gente que ayudó a traductir esta app
+ Prueba Retro Music Premium
- - Song
- - Songs
+ - Canción
+ - Canciones
- - Album
- - Albums
+ - Álbum
+ - Álbumes
- - %d Song
- - %d Songs
+ - %d Canción
+ - %d Canciones
- - %d Album
- - %d Albums
+ - %d Álbum
+ - %d Álbumes
- - %d Artist
- - %d Artists
+ - %d Artista
+ - %d Artistas
From bbd1853e78011d544672a8dace7c82d55acce99a Mon Sep 17 00:00:00 2001
From: thomas
Date: Sun, 13 Sep 2020 21:42:12 -0400
Subject: [PATCH 02/72] Minimum working prototype
---
.../java/code/name/monkey/retromusic/Constants.kt | 1 +
.../monkey/retromusic/fragments/LibraryViewModel.kt | 11 +++++++++--
.../monkey/retromusic/repository/ArtistRepository.kt | 5 ++++-
.../name/monkey/retromusic/util/PreferenceUtil.kt | 9 ++++++++-
app/src/main/res/values/strings.xml | 4 ++++
app/src/main/res/xml/pref_ui.xml | 7 +++++++
6 files changed, 33 insertions(+), 4 deletions(-)
diff --git a/app/src/main/java/code/name/monkey/retromusic/Constants.kt b/app/src/main/java/code/name/monkey/retromusic/Constants.kt
index 4e3a7a241..f0ce5dbd1 100644
--- a/app/src/main/java/code/name/monkey/retromusic/Constants.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/Constants.kt
@@ -123,6 +123,7 @@ const val AUTO_DOWNLOAD_IMAGES_POLICY = "auto_download_images_policy"
const val START_DIRECTORY = "start_directory"
const val RECENTLY_PLAYED_CUTOFF = "recently_played_interval"
const val LOCK_SCREEN = "lock_screen"
+const val ALBUM_ARTISTS_ONLY = "album_artists_only"
const val ALBUM_DETAIL_SONG_SORT_ORDER = "album_detail_song_sort_order"
const val LYRICS_OPTIONS = "lyrics_tab_position"
const val CHOOSE_EQUALIZER = "choose_equalizer"
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
index 3999ee708..ffccd49ca 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
@@ -12,6 +12,7 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.interfaces.MusicServiceEventListener
import code.name.monkey.retromusic.model.*
import code.name.monkey.retromusic.repository.RealRepository
+import code.name.monkey.retromusic.util.PreferenceUtil
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch
@@ -91,8 +92,14 @@ class LibraryViewModel(
}
private fun fetchArtists() {
- viewModelScope.launch(IO) {
- artists.postValue(repository.fetchArtists())
+ if (PreferenceUtil.albumArtistsOnly) {
+ viewModelScope.launch(IO) {
+ artists.postValue(repository.albumArtists())
+ }
+ } else {
+ viewModelScope.launch(IO) {
+ artists.postValue(repository.fetchArtists())
+ }
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt
index 9a309b2aa..bf1b41e35 100644
--- a/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt
@@ -69,7 +69,10 @@ class RealArtistRepository(
getSongLoaderSortOrder()
)
)
- return splitIntoAlbumArtists(albumRepository.splitIntoAlbums(songs))
+
+ val sortString = if (PreferenceUtil.artistSortOrder.contains("DESC")) String.CASE_INSENSITIVE_ORDER.reversed() else String.CASE_INSENSITIVE_ORDER
+
+ return splitIntoAlbumArtists(albumRepository.splitIntoAlbums(songs)).sortedWith(compareBy(sortString) { it.name })
}
private fun splitIntoAlbumArtists(albums: List): List {
diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt
index 883336841..22221639e 100644
--- a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt
@@ -122,6 +122,13 @@ object PreferenceUtil {
"only_wifi"
)
+ var albumArtistsOnly
+ get() = sharedPreferences.getBoolean(
+ ALBUM_ARTISTS_ONLY,
+ false
+ )
+ set(value) = sharedPreferences.edit { putBoolean(ALBUM_ARTISTS_ONLY, value) }
+
var albumDetailSongSortOrder
get() = sharedPreferences.getStringOrDefault(
ALBUM_DETAIL_SONG_SORT_ORDER,
@@ -150,7 +157,7 @@ object PreferenceUtil {
var artistSortOrder
get() = sharedPreferences.getStringOrDefault(
ARTIST_SORT_ORDER,
- AlbumSortOrder.ALBUM_A_Z
+ ArtistSortOrder.ARTIST_A_Z
)
set(value) = sharedPreferences.edit {
putString(ARTIST_SORT_ORDER, value)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 018bdc9f8..be213e122 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -69,6 +69,8 @@
Sort order
+ Album artists only
+
Tag editor
Toggle favorite
@@ -517,6 +519,7 @@
Snow fall effect
+ Show Album Artists in the Artist category
Use the currently playing song album cover as the lockscreen wallpaper
Lower the volume when a system sound is played or a notification is received
The content of blacklisted folders is hidden from your library.
@@ -546,6 +549,7 @@
Shuffle mode will turn off when playing a new list of songs
If enough space is available, show volume controls in the now playing screen
+ Navigate by Album Artist
Show album cover
Album cover theme
Album cover skip
diff --git a/app/src/main/res/xml/pref_ui.xml b/app/src/main/res/xml/pref_ui.xml
index 364756242..50c1e7d29 100644
--- a/app/src/main/res/xml/pref_ui.xml
+++ b/app/src/main/res/xml/pref_ui.xml
@@ -45,6 +45,13 @@
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_tab_text_mode" />
+
+
Date: Mon, 14 Sep 2020 01:13:15 -0400
Subject: [PATCH 03/72] Album art fallback working
---
.../retromusic/glide/ArtistGlideRequest.java | 2 +-
.../glide/artistimage/ArtistImageLoader.kt | 27 ++++++++++++++++---
2 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/app/src/main/java/code/name/monkey/retromusic/glide/ArtistGlideRequest.java b/app/src/main/java/code/name/monkey/retromusic/glide/ArtistGlideRequest.java
index 4d9d2124b..c11ffcc2d 100644
--- a/app/src/main/java/code/name/monkey/retromusic/glide/ArtistGlideRequest.java
+++ b/app/src/main/java/code/name/monkey/retromusic/glide/ArtistGlideRequest.java
@@ -62,7 +62,7 @@ public class ArtistGlideRequest {
boolean hasCustomImage = CustomArtistImageUtil.Companion.getInstance(App.Companion.getContext())
.hasCustomArtistImage(artist);
if (noCustomImage || !hasCustomImage) {
- return requestManager.load(new ArtistImage(artist.getName()));
+ return requestManager.load(new ArtistImage(artist));
} else {
return requestManager.load(CustomArtistImageUtil.getFile(artist));
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/glide/artistimage/ArtistImageLoader.kt b/app/src/main/java/code/name/monkey/retromusic/glide/artistimage/ArtistImageLoader.kt
index 43d23120d..8052705d7 100644
--- a/app/src/main/java/code/name/monkey/retromusic/glide/artistimage/ArtistImageLoader.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/glide/artistimage/ArtistImageLoader.kt
@@ -14,7 +14,11 @@
package code.name.monkey.retromusic.glide.artistimage
+import android.content.ContentResolver
import android.content.Context
+import androidx.core.net.toFile
+import code.name.monkey.retromusic.repository.ArtistRepository
+import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.model.Data
import code.name.monkey.retromusic.network.DeezerService
import code.name.monkey.retromusic.util.MusicUtil
@@ -30,11 +34,20 @@ import com.bumptech.glide.load.model.stream.StreamModelLoader
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
+import java.io.File
import java.io.IOException
import java.io.InputStream
import java.util.concurrent.TimeUnit
-class ArtistImage(val artistName: String)
+class ArtistImage {
+ val artist: Artist
+ val artistName: String
+
+ constructor(artist: Artist) {
+ this.artist = artist
+ this.artistName = artist.name
+ }
+}
class ArtistImageFetcher(
private val context: Context,
@@ -85,9 +98,12 @@ class ArtistImageFetcher(
val glideUrl = GlideUrl(imageUrl)
urlFetcher = urlLoader.getResourceFetcher(glideUrl, width, height)
urlFetcher?.loadData(priority)
- } else null
+ } else {
+ // Image not found by deezer. Use an album cover instead
+ getFallbackAlbumImage()
+ }
} catch (e: Exception) {
- null
+ getFallbackAlbumImage()
}
} else return null
}
@@ -102,6 +118,11 @@ class ArtistImageFetcher(
else -> ""
}
}
+
+ private fun getFallbackAlbumImage(): InputStream? {
+ val imageUri = MusicUtil.getMediaStoreAlbumCoverUri(model.artist.safeGetFirstAlbum().id)
+ return context.getContentResolver().openInputStream(imageUri)
+ }
}
class ArtistImageLoader(
From 24f91a48dbe8c2d009d1c2d132a7025f23b6e1ab Mon Sep 17 00:00:00 2001
From: thomas
Date: Mon, 14 Sep 2020 02:07:11 -0400
Subject: [PATCH 04/72] Removed unnecessary imports
---
.../monkey/retromusic/glide/artistimage/ArtistImageLoader.kt | 4 ----
1 file changed, 4 deletions(-)
diff --git a/app/src/main/java/code/name/monkey/retromusic/glide/artistimage/ArtistImageLoader.kt b/app/src/main/java/code/name/monkey/retromusic/glide/artistimage/ArtistImageLoader.kt
index 8052705d7..f9992d121 100644
--- a/app/src/main/java/code/name/monkey/retromusic/glide/artistimage/ArtistImageLoader.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/glide/artistimage/ArtistImageLoader.kt
@@ -14,10 +14,7 @@
package code.name.monkey.retromusic.glide.artistimage
-import android.content.ContentResolver
import android.content.Context
-import androidx.core.net.toFile
-import code.name.monkey.retromusic.repository.ArtistRepository
import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.model.Data
import code.name.monkey.retromusic.network.DeezerService
@@ -34,7 +31,6 @@ import com.bumptech.glide.load.model.stream.StreamModelLoader
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
-import java.io.File
import java.io.IOException
import java.io.InputStream
import java.util.concurrent.TimeUnit
From 03723b62eb90e1a58a0edad07ca4d1aba2d875da Mon Sep 17 00:00:00 2001
From: Hemanth S
Date: Thu, 17 Sep 2020 23:26:59 +0530
Subject: [PATCH 05/72] Now playing state management
---
.../base/AbsSlidingMusicPanelActivity.kt | 83 +++++++++++++++++--
.../fragments/DetailListFragment.kt | 64 +++++---------
.../retromusic/fragments/LibraryViewModel.kt | 54 ++++++++++--
.../fragments/albums/AlbumDetailsFragment.kt | 6 +-
.../artists/ArtistDetailsFragment.kt | 13 +--
.../fragments/genres/GenreDetailsFragment.kt | 7 +-
.../playlists/PlaylistDetailsFragment.kt | 7 +-
.../fragments/search/SearchViewModel.kt | 2 +-
.../retromusic/state/NowPlayingPanelState.kt | 8 ++
9 files changed, 177 insertions(+), 67 deletions(-)
create mode 100644 app/src/main/java/code/name/monkey/retromusic/state/NowPlayingPanelState.kt
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt
index 729adee2f..c78c75da1 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt
@@ -9,7 +9,7 @@ import android.widget.FrameLayout
import androidx.annotation.LayoutRes
import androidx.core.view.ViewCompat
import androidx.core.view.isVisible
-import androidx.lifecycle.Observer
+import androidx.transition.TransitionManager
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.retromusic.R
@@ -22,6 +22,7 @@ import code.name.monkey.retromusic.fragments.NowPlayingScreen
import code.name.monkey.retromusic.fragments.NowPlayingScreen.*
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.CategoryInfo
+import code.name.monkey.retromusic.state.NowPlayingPanelState.*
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.views.BottomNavigationBarTinted
import com.google.android.material.bottomsheet.BottomSheetBehavior
@@ -75,13 +76,11 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
setupSlidingUpPanel()
setupBottomSheet()
-
- libraryViewModel.paletteColorLiveData.observe(this, Observer {
- this.paletteColor = it
- onPaletteColorChanged()
- })
+ updatePanelState()
+ updateColor()
}
+
fun getBottomSheetBehavior() = behavior
private fun setupBottomSheet() {
@@ -201,7 +200,11 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
slidingPanel.viewTreeObserver.removeOnGlobalLayoutListener(this)
- hideBottomBar(false)
+ if (bottomNavigationView.isVisible) {
+ libraryViewModel.setPanelState(COLLAPSED_WITH)
+ } else {
+ libraryViewModel.setPanelState(COLLAPSED_WITHOUT)
+ }
}
})
} // don't call hideBottomBar(true) here as it causes a bug with the SlidingUpPanelLayout
@@ -209,7 +212,16 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
override fun onQueueChanged() {
super.onQueueChanged()
- hideBottomBar(MusicPlayerRemote.playingQueue.isEmpty())
+ val isEmpty = MusicPlayerRemote.playingQueue.isEmpty()
+ if (isEmpty) {
+ libraryViewModel.setPanelState(HIDE)
+ } else {
+ if (bottomNavigationView.isVisible) {
+ libraryViewModel.setPanelState(EXPAND)
+ } else {
+ libraryViewModel.setPanelState(COLLAPSED_WITHOUT)
+ }
+ }
}
override fun onBackPressed() {
@@ -308,4 +320,59 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
bottomNavigationView.hide()
}
}
+
+ private fun updateColor() {
+ libraryViewModel.paletteColor.observe(this, { color ->
+ this.paletteColor = color
+ onPaletteColorChanged()
+ })
+ }
+
+ private fun updatePanelState() {
+ libraryViewModel.panelState.observe(this, { state ->
+ when (state) {
+ EXPAND -> {
+ println("EXPAND")
+ expandPanel()
+ }
+ HIDE -> {
+ println("HIDE")
+ behavior.isHideable = true
+ behavior.peekHeight = 0
+ collapsePanel()
+ ViewCompat.setElevation(slidingPanel, 0f)
+ ViewCompat.setElevation(bottomNavigationView, 10f)
+ }
+ COLLAPSED_WITH -> {
+ println("COLLAPSED_WITH")
+ TransitionManager.beginDelayedTransition(mainContent)
+ bottomNavigationView.isVisible = true
+ val heightOfBar = bottomNavigationView.height
+ ViewCompat.setElevation(bottomNavigationView, 10f)
+ ViewCompat.setElevation(slidingPanel, 10f)
+ behavior.isHideable = false
+ behavior.peekHeight = (heightOfBar * 2) - 24
+ }
+ COLLAPSED_WITHOUT -> {
+ println("COLLAPSED_WITHOUT")
+ TransitionManager.beginDelayedTransition(mainContent)
+ TransitionManager.beginDelayedTransition(slidingPanel)
+ val heightOfBar = bottomNavigationView.height
+ bottomNavigationView.isVisible = false
+ ViewCompat.setElevation(bottomNavigationView, 10f)
+ ViewCompat.setElevation(slidingPanel, 10f)
+ behavior.isHideable = false
+ behavior.peekHeight = heightOfBar - 24
+ }
+ else -> {
+ println("ELSE")
+ behavior.isHideable = true
+ behavior.peekHeight = 0
+ collapsePanel()
+ ViewCompat.setElevation(slidingPanel, 0f)
+ ViewCompat.setElevation(bottomNavigationView, 10f)
+ }
+ }
+ })
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/DetailListFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/DetailListFragment.kt
index 6c7230a52..c08611daf 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/DetailListFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/DetailListFragment.kt
@@ -4,7 +4,6 @@ import android.os.Bundle
import android.view.View
import android.widget.ImageView
import androidx.lifecycle.Observer
-import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.navArgs
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
@@ -18,23 +17,19 @@ import code.name.monkey.retromusic.fragments.artists.ArtistClickListener
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Artist
-import code.name.monkey.retromusic.repository.RealRepository
+import code.name.monkey.retromusic.state.NowPlayingPanelState
import kotlinx.android.synthetic.main.fragment_playlist_detail.*
-import kotlinx.coroutines.Dispatchers.IO
-import kotlinx.coroutines.Dispatchers.Main
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
-import org.koin.android.ext.android.inject
+import org.koin.androidx.viewmodel.ext.android.sharedViewModel
class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail),
ArtistClickListener, AlbumClickListener {
private val args by navArgs()
- private val repository by inject()
+ private val libraryViewModel by sharedViewModel()
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
+ libraryViewModel.setPanelState(NowPlayingPanelState.COLLAPSED_WITHOUT)
mainActivity.setSupportActionBar(toolbar)
- mainActivity.hideBottomBarVisibility(false)
progressIndicator.hide()
when (args.type) {
TOP_ARTISTS -> {
@@ -67,10 +62,9 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
adapter = songAdapter
layoutManager = linearLayoutManager()
}
- lifecycleScope.launch(IO) {
- val songs = repository.recentSongs()
- withContext(Main) { songAdapter.swapDataSet(songs) }
- }
+ libraryViewModel.recentSongs().observe(viewLifecycleOwner, Observer { songs ->
+ songAdapter.swapDataSet(songs)
+ })
}
private fun topPlayed() {
@@ -84,12 +78,10 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
adapter = songAdapter
layoutManager = linearLayoutManager()
}
- lifecycleScope.launch(IO) {
- val songs = repository.playCountSongs().map {
- it.toSong()
- }
- withContext(Main) { songAdapter.swapDataSet(songs) }
- }
+ libraryViewModel.playCountSongs().observe(viewLifecycleOwner, Observer { songs ->
+ songAdapter.swapDataSet(songs)
+ })
+
}
private fun loadHistory() {
@@ -104,7 +96,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
adapter = songAdapter
layoutManager = linearLayoutManager()
}
- repository.observableHistorySongs().observe(viewLifecycleOwner, Observer {
+ libraryViewModel.observableHistorySongs().observe(viewLifecycleOwner, Observer {
val songs = it.map { historyEntity -> historyEntity.toSong() }
songAdapter.swapDataSet(songs)
})
@@ -121,8 +113,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
adapter = songAdapter
layoutManager = linearLayoutManager()
}
- repository.favorites().observe(viewLifecycleOwner, Observer {
- println(it.size)
+ libraryViewModel.favorites().observe(viewLifecycleOwner, {
val songs = it.map { songEntity -> songEntity.toSong() }
songAdapter.swapDataSet(songs)
})
@@ -130,31 +121,22 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
private fun loadArtists(title: Int, type: Int) {
toolbar.setTitle(title)
- lifecycleScope.launch(IO) {
- val artists =
- if (type == TOP_ARTISTS) repository.topArtists() else repository.recentArtists()
- withContext(Main) {
- recyclerView.apply {
- adapter = artistAdapter(artists)
- layoutManager = gridLayoutManager()
- }
+ libraryViewModel.artists(type).observe(viewLifecycleOwner, { artists ->
+ recyclerView.apply {
+ adapter = artistAdapter(artists)
+ layoutManager = gridLayoutManager()
}
- }
+ })
}
private fun loadAlbums(title: Int, type: Int) {
toolbar.setTitle(title)
- lifecycleScope.launch(IO) {
- val albums =
- if (type == TOP_ALBUMS) repository.topAlbums() else repository.recentAlbums()
- withContext(Main) {
- recyclerView.apply {
- adapter = albumAdapter(albums)
- layoutManager = gridLayoutManager()
-
- }
+ libraryViewModel.albums(type).observe(viewLifecycleOwner, { albums ->
+ recyclerView.apply {
+ adapter = albumAdapter(albums)
+ layoutManager = gridLayoutManager()
}
- }
+ })
}
private fun artistAdapter(artists: List): ArtistAdapter = ArtistAdapter(
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
index 3999ee708..07ed2acd8 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
@@ -1,17 +1,20 @@
package code.name.monkey.retromusic.fragments
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.viewModelScope
+import androidx.lifecycle.*
+import code.name.monkey.retromusic.RECENT_ALBUMS
+import code.name.monkey.retromusic.RECENT_ARTISTS
+import code.name.monkey.retromusic.TOP_ALBUMS
+import code.name.monkey.retromusic.TOP_ARTISTS
import code.name.monkey.retromusic.db.PlaylistEntity
import code.name.monkey.retromusic.db.PlaylistWithSongs
import code.name.monkey.retromusic.db.SongEntity
+import code.name.monkey.retromusic.db.toSong
import code.name.monkey.retromusic.fragments.ReloadType.*
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.interfaces.MusicServiceEventListener
import code.name.monkey.retromusic.model.*
import code.name.monkey.retromusic.repository.RealRepository
+import code.name.monkey.retromusic.state.NowPlayingPanelState
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch
@@ -19,7 +22,7 @@ class LibraryViewModel(
private val repository: RealRepository
) : ViewModel(), MusicServiceEventListener {
- private val paletteColor = MutableLiveData()
+ private val _paletteColor = MutableLiveData()
private val albums = MutableLiveData>()
private val songs = MutableLiveData>()
private val artists = MutableLiveData>()
@@ -28,12 +31,17 @@ class LibraryViewModel(
private val genres = MutableLiveData>()
private val home = MutableLiveData>()
- val paletteColorLiveData: LiveData = paletteColor
+ val paletteColor: LiveData = _paletteColor
+ val panelState: MutableLiveData = MutableLiveData()
init {
fetchHomeSections()
}
+ fun setPanelState(state: NowPlayingPanelState) {
+ panelState.postValue(state)
+ }
+
private fun loadLibraryContent() = viewModelScope.launch(IO) {
fetchHomeSections()
fetchSongs()
@@ -132,7 +140,7 @@ class LibraryViewModel(
}
fun updateColor(newColor: Int) {
- paletteColor.postValue(newColor)
+ _paletteColor.postValue(newColor)
}
override fun onMediaStoreChanged() {
@@ -232,6 +240,38 @@ class LibraryViewModel(
fetchPlaylists()
loadLibraryContent()
}
+
+ fun recentSongs(): LiveData> = liveData {
+ emit(repository.recentSongs())
+ }
+
+ fun playCountSongs(): LiveData> = liveData {
+ emit(repository.playCountSongs().map {
+ it.toSong()
+ })
+ }
+
+ fun observableHistorySongs() = repository.observableHistorySongs()
+
+ fun favorites() = repository.favorites()
+
+ fun artists(type: Int): LiveData> = liveData {
+ when (type) {
+ TOP_ARTISTS -> emit(repository.topArtists())
+ RECENT_ARTISTS -> {
+ emit(repository.recentArtists())
+ }
+ }
+ }
+
+ fun albums(type: Int): LiveData> = liveData {
+ when (type) {
+ TOP_ALBUMS -> emit(repository.topAlbums())
+ RECENT_ALBUMS -> {
+ emit(repository.recentAlbums())
+ }
+ }
+ }
}
enum class ReloadType {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt
index bade59ff5..e1e4fc878 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt
@@ -29,6 +29,7 @@ import code.name.monkey.retromusic.dialogs.DeleteSongsDialog
import code.name.monkey.retromusic.extensions.applyColor
import code.name.monkey.retromusic.extensions.applyOutlineColor
import code.name.monkey.retromusic.extensions.show
+import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.glide.AlbumGlideRequest
import code.name.monkey.retromusic.glide.ArtistGlideRequest
@@ -41,6 +42,7 @@ import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.network.Result
import code.name.monkey.retromusic.network.model.LastFmAlbum
import code.name.monkey.retromusic.repository.RealRepository
+import code.name.monkey.retromusic.state.NowPlayingPanelState
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
@@ -52,6 +54,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.koin.android.ext.android.get
+import org.koin.androidx.viewmodel.ext.android.sharedViewModel
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf
import java.util.*
@@ -63,6 +66,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
private val detailsViewModel by viewModel {
parametersOf(arguments.extraAlbumId)
}
+ private val libraryViewModel by sharedViewModel()
private lateinit var simpleSongAdapter: SimpleSongAdapter
private lateinit var album: Album
@@ -73,7 +77,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
- mainActivity.hideBottomBarVisibility(false)
+ libraryViewModel.setPanelState(NowPlayingPanelState.COLLAPSED_WITHOUT)
mainActivity.addMusicServiceEventListener(detailsViewModel)
mainActivity.setSupportActionBar(toolbar)
toolbar.title = " "
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsFragment.kt
index 877def068..45469fb51 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsFragment.kt
@@ -27,6 +27,7 @@ import code.name.monkey.retromusic.extensions.applyColor
import code.name.monkey.retromusic.extensions.applyOutlineColor
import code.name.monkey.retromusic.extensions.show
import code.name.monkey.retromusic.extensions.showToast
+import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.albums.AlbumClickListener
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.glide.ArtistGlideRequest
@@ -36,6 +37,7 @@ import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.network.Result
import code.name.monkey.retromusic.network.model.LastFmArtist
import code.name.monkey.retromusic.repository.RealRepository
+import code.name.monkey.retromusic.state.NowPlayingPanelState
import code.name.monkey.retromusic.util.CustomArtistImageUtil
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
@@ -47,6 +49,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.koin.android.ext.android.get
+import org.koin.androidx.viewmodel.ext.android.sharedViewModel
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf
import java.util.*
@@ -58,7 +61,7 @@ class ArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_artist_d
private val detailsViewModel: ArtistDetailsViewModel by viewModel {
parametersOf(arguments.extraArtistId)
}
-
+ private val libraryViewModel by sharedViewModel()
private lateinit var artist: Artist
private lateinit var songAdapter: SimpleSongAdapter
private lateinit var albumAdapter: HorizontalAlbumAdapter
@@ -70,17 +73,17 @@ class ArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_artist_d
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
+ libraryViewModel.setPanelState(NowPlayingPanelState.COLLAPSED_WITHOUT)
mainActivity.setSupportActionBar(toolbar)
- mainActivity.hideBottomBarVisibility(false)
+
toolbar.title = null
setupRecyclerView()
+
postponeEnterTransition()
detailsViewModel.getArtist().observe(viewLifecycleOwner, Observer {
- showArtist(it)
startPostponedEnterTransition()
+ showArtist(it)
})
-
-
playAction.apply {
setOnClickListener { MusicPlayerRemote.openQueue(artist.songs, 0, true) }
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreDetailsFragment.kt
index fef2df722..8a5f7d522 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreDetailsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreDetailsFragment.kt
@@ -12,11 +12,14 @@ import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.song.SongAdapter
import code.name.monkey.retromusic.extensions.dipToPix
+import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.helper.menu.GenreMenuHelper
import code.name.monkey.retromusic.model.Genre
import code.name.monkey.retromusic.model.Song
+import code.name.monkey.retromusic.state.NowPlayingPanelState
import kotlinx.android.synthetic.main.fragment_playlist_detail.*
+import org.koin.androidx.viewmodel.ext.android.sharedViewModel
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf
import java.util.*
@@ -26,7 +29,7 @@ class GenreDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_
private val detailsViewModel: GenreDetailsViewModel by viewModel {
parametersOf(arguments.extraGenre)
}
-
+ private val libraryViewModel by sharedViewModel()
private lateinit var genre: Genre
private lateinit var songAdapter: SongAdapter
@@ -35,7 +38,7 @@ class GenreDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playlist_
setHasOptionsMenu(true)
mainActivity.addMusicServiceEventListener(detailsViewModel)
mainActivity.setSupportActionBar(toolbar)
- mainActivity.hideBottomBarVisibility(false)
+ libraryViewModel.setPanelState(NowPlayingPanelState.COLLAPSED_WITHOUT)
progressIndicator.hide()
setupRecyclerView()
detailsViewModel.getSongs().observe(viewLifecycleOwner, androidx.lifecycle.Observer {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt
index a47e29a6d..641cab49d 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt
@@ -14,14 +14,17 @@ import code.name.monkey.retromusic.adapter.song.SongAdapter
import code.name.monkey.retromusic.db.PlaylistWithSongs
import code.name.monkey.retromusic.db.toSongs
import code.name.monkey.retromusic.extensions.dipToPix
+import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper
import code.name.monkey.retromusic.model.Song
+import code.name.monkey.retromusic.state.NowPlayingPanelState
import code.name.monkey.retromusic.util.PlaylistsUtil
import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator
import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager
import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils
import kotlinx.android.synthetic.main.fragment_playlist_detail.*
+import org.koin.androidx.viewmodel.ext.android.sharedViewModel
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf
@@ -30,7 +33,7 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
private val viewModel: PlaylistDetailsViewModel by viewModel {
parametersOf(arguments.extraPlaylist)
}
-
+ private val libraryViewModel by sharedViewModel()
private lateinit var playlist: PlaylistWithSongs
private lateinit var adapter: SongAdapter
@@ -40,9 +43,9 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
+ libraryViewModel.setPanelState(NowPlayingPanelState.COLLAPSED_WITHOUT)
mainActivity.addMusicServiceEventListener(viewModel)
mainActivity.setSupportActionBar(toolbar)
- mainActivity.hideBottomBarVisibility(false)
playlist = arguments.extraPlaylist
toolbar.title = playlist.playlistEntity.playlistName
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchViewModel.kt
index 506810236..adeb09c89 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchViewModel.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchViewModel.kt
@@ -15,6 +15,6 @@ class SearchViewModel(private val realRepository: RealRepository) : ViewModel()
fun search(query: String?) = viewModelScope.launch(IO) {
val result = realRepository.search(query)
- results.value = result
+ results.postValue(result)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/state/NowPlayingPanelState.kt b/app/src/main/java/code/name/monkey/retromusic/state/NowPlayingPanelState.kt
new file mode 100644
index 000000000..b142f1436
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/state/NowPlayingPanelState.kt
@@ -0,0 +1,8 @@
+package code.name.monkey.retromusic.state
+
+enum class NowPlayingPanelState {
+ EXPAND,
+ COLLAPSED_WITH,
+ COLLAPSED_WITHOUT,
+ HIDE,
+}
\ No newline at end of file
From 76e55ba07931664438b6f5e805412335594ad451 Mon Sep 17 00:00:00 2001
From: thomas
Date: Sun, 13 Sep 2020 21:42:12 -0400
Subject: [PATCH 06/72] Minimum working prototype
---
.../java/code/name/monkey/retromusic/Constants.kt | 1 +
.../monkey/retromusic/fragments/LibraryViewModel.kt | 11 +++++++++--
.../monkey/retromusic/repository/ArtistRepository.kt | 5 ++++-
.../name/monkey/retromusic/util/PreferenceUtil.kt | 9 ++++++++-
app/src/main/res/values/strings.xml | 4 ++++
app/src/main/res/xml/pref_ui.xml | 7 +++++++
6 files changed, 33 insertions(+), 4 deletions(-)
diff --git a/app/src/main/java/code/name/monkey/retromusic/Constants.kt b/app/src/main/java/code/name/monkey/retromusic/Constants.kt
index 4e3a7a241..f0ce5dbd1 100644
--- a/app/src/main/java/code/name/monkey/retromusic/Constants.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/Constants.kt
@@ -123,6 +123,7 @@ const val AUTO_DOWNLOAD_IMAGES_POLICY = "auto_download_images_policy"
const val START_DIRECTORY = "start_directory"
const val RECENTLY_PLAYED_CUTOFF = "recently_played_interval"
const val LOCK_SCREEN = "lock_screen"
+const val ALBUM_ARTISTS_ONLY = "album_artists_only"
const val ALBUM_DETAIL_SONG_SORT_ORDER = "album_detail_song_sort_order"
const val LYRICS_OPTIONS = "lyrics_tab_position"
const val CHOOSE_EQUALIZER = "choose_equalizer"
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
index a44cd7bb0..f3b609b45 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
@@ -13,6 +13,7 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.interfaces.MusicServiceEventListener
import code.name.monkey.retromusic.model.*
import code.name.monkey.retromusic.repository.RealRepository
+import code.name.monkey.retromusic.util.PreferenceUtil
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch
@@ -91,8 +92,14 @@ class LibraryViewModel(
}
private fun fetchArtists() {
- viewModelScope.launch(IO) {
- artists.postValue(repository.fetchArtists())
+ if (PreferenceUtil.albumArtistsOnly) {
+ viewModelScope.launch(IO) {
+ artists.postValue(repository.albumArtists())
+ }
+ } else {
+ viewModelScope.launch(IO) {
+ artists.postValue(repository.fetchArtists())
+ }
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt
index 6ecf6509b..314d13316 100644
--- a/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt
@@ -67,7 +67,10 @@ class RealArtistRepository(
getSongLoaderSortOrder()
)
)
- return splitIntoAlbumArtists(albumRepository.splitIntoAlbums(songs))
+
+ val sortString = if (PreferenceUtil.artistSortOrder.contains("DESC")) String.CASE_INSENSITIVE_ORDER.reversed() else String.CASE_INSENSITIVE_ORDER
+
+ return splitIntoAlbumArtists(albumRepository.splitIntoAlbums(songs)).sortedWith(compareBy(sortString) { it.name })
}
override fun artists(query: String): List {
diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt
index 883336841..22221639e 100644
--- a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt
@@ -122,6 +122,13 @@ object PreferenceUtil {
"only_wifi"
)
+ var albumArtistsOnly
+ get() = sharedPreferences.getBoolean(
+ ALBUM_ARTISTS_ONLY,
+ false
+ )
+ set(value) = sharedPreferences.edit { putBoolean(ALBUM_ARTISTS_ONLY, value) }
+
var albumDetailSongSortOrder
get() = sharedPreferences.getStringOrDefault(
ALBUM_DETAIL_SONG_SORT_ORDER,
@@ -150,7 +157,7 @@ object PreferenceUtil {
var artistSortOrder
get() = sharedPreferences.getStringOrDefault(
ARTIST_SORT_ORDER,
- AlbumSortOrder.ALBUM_A_Z
+ ArtistSortOrder.ARTIST_A_Z
)
set(value) = sharedPreferences.edit {
putString(ARTIST_SORT_ORDER, value)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 018bdc9f8..be213e122 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -69,6 +69,8 @@
Sort order
+ Album artists only
+
Tag editor
Toggle favorite
@@ -517,6 +519,7 @@
Snow fall effect
+ Show Album Artists in the Artist category
Use the currently playing song album cover as the lockscreen wallpaper
Lower the volume when a system sound is played or a notification is received
The content of blacklisted folders is hidden from your library.
@@ -546,6 +549,7 @@
Shuffle mode will turn off when playing a new list of songs
If enough space is available, show volume controls in the now playing screen
+ Navigate by Album Artist
Show album cover
Album cover theme
Album cover skip
diff --git a/app/src/main/res/xml/pref_ui.xml b/app/src/main/res/xml/pref_ui.xml
index 364756242..50c1e7d29 100644
--- a/app/src/main/res/xml/pref_ui.xml
+++ b/app/src/main/res/xml/pref_ui.xml
@@ -45,6 +45,13 @@
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_tab_text_mode" />
+
+
Date: Sun, 20 Sep 2020 17:23:32 -0400
Subject: [PATCH 07/72] Fix incorrect loading from #895
---
.../code/name/monkey/retromusic/repository/ArtistRepository.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt
index 314d13316..907bf49c9 100644
--- a/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt
@@ -90,7 +90,7 @@ class RealArtistRepository(
.map {
val currentAlbums = it.value
if (albums.isNotEmpty()) {
- Artist(currentAlbums[0].id, currentAlbums)
+ Artist(currentAlbums[0].artistId, currentAlbums)
} else {
Artist.empty
}
From 6747af076fd29a3b01bc1e7ecd4f2d2a46f98237 Mon Sep 17 00:00:00 2001
From: thomas
Date: Mon, 21 Sep 2020 00:17:53 -0400
Subject: [PATCH 08/72] Various artists is working
---
.../name/monkey/retromusic/model/Artist.kt | 4 +++
.../retromusic/repository/ArtistRepository.kt | 25 +++++++++++++++----
.../name/monkey/retromusic/util/MusicUtil.kt | 7 ++++++
3 files changed, 31 insertions(+), 5 deletions(-)
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt b/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt
index 98fe4209e..fbfde54c8 100644
--- a/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt
@@ -27,6 +27,8 @@ data class Artist(
val name = safeGetFirstAlbum().safeGetFirstSong().albumArtist
return if (MusicUtil.isArtistNameUnknown(name)) {
UNKNOWN_ARTIST_DISPLAY_NAME
+ } else if (MusicUtil.isVariousArtists(name)) {
+ VARIOUS_ARTISTS_DISPLAY_NAME
} else safeGetFirstAlbum().safeGetFirstSong().artistName
}
@@ -51,6 +53,8 @@ data class Artist(
companion object {
const val UNKNOWN_ARTIST_DISPLAY_NAME = "Unknown Artist"
+ const val VARIOUS_ARTISTS_DISPLAY_NAME = "Various Artists"
+ const val VARIOUS_ARTISTS_ID : Long = -2
val empty = Artist(-1, emptyList())
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt
index 907bf49c9..d78df6d1f 100644
--- a/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt
@@ -40,6 +40,19 @@ class RealArtistRepository(
PreferenceUtil.artistSongSortOrder
}
override fun artist(artistId: Long): Artist {
+ if (artistId == Artist.VARIOUS_ARTISTS_ID) {
+ // Get Various Artists
+ val songs = songRepository.songs(
+ songRepository.makeSongCursor(
+ null,
+ null,
+ getSongLoaderSortOrder()
+ )
+ )
+ val albums = albumRepository.splitIntoAlbums(songs).filter { it.albumArtist == Artist.VARIOUS_ARTISTS_DISPLAY_NAME }
+ return Artist(Artist.VARIOUS_ARTISTS_ID, albums)
+ }
+
val songs = songRepository.songs(
songRepository.makeSongCursor(
AudioColumns.ARTIST_ID + "=?",
@@ -68,9 +81,7 @@ class RealArtistRepository(
)
)
- val sortString = if (PreferenceUtil.artistSortOrder.contains("DESC")) String.CASE_INSENSITIVE_ORDER.reversed() else String.CASE_INSENSITIVE_ORDER
-
- return splitIntoAlbumArtists(albumRepository.splitIntoAlbums(songs)).sortedWith(compareBy(sortString) { it.name })
+ return splitIntoAlbumArtists(albumRepository.splitIntoAlbums(songs))
}
override fun artists(query: String): List {
@@ -89,8 +100,12 @@ class RealArtistRepository(
return albums.groupBy { it.albumArtist }
.map {
val currentAlbums = it.value
- if (albums.isNotEmpty()) {
- Artist(currentAlbums[0].artistId, currentAlbums)
+ if (currentAlbums.isNotEmpty()) {
+ if (currentAlbums[0].albumArtist == Artist.VARIOUS_ARTISTS_DISPLAY_NAME) {
+ Artist(Artist.VARIOUS_ARTISTS_ID, currentAlbums)
+ } else {
+ Artist(currentAlbums[0].artistId, currentAlbums)
+ }
} else {
Artist.empty
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt
index 0af7cb916..e267966a4 100644
--- a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt
@@ -299,6 +299,13 @@ object MusicUtil : KoinComponent {
return tempName == "unknown" || tempName == ""
}
+ fun isVariousArtists(artistName: String): Boolean {
+ if (artistName == Artist.VARIOUS_ARTISTS_DISPLAY_NAME) {
+ return true
+ }
+ return false
+ }
+
fun isFavorite(context: Context, song: Song): Boolean {
return PlaylistsUtil
.doPlaylistContains(context, getFavoritesPlaylist(context).id, song.id)
From 991c4ee36e5449b5d5c200799631241c129b0e5c Mon Sep 17 00:00:00 2001
From: thomas
Date: Mon, 21 Sep 2020 00:31:53 -0400
Subject: [PATCH 09/72] Got code cleanup happy... all fixed
---
.../main/java/code/name/monkey/retromusic/util/MusicUtil.kt | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt
index e267966a4..645b88433 100644
--- a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt
@@ -299,7 +299,10 @@ object MusicUtil : KoinComponent {
return tempName == "unknown" || tempName == ""
}
- fun isVariousArtists(artistName: String): Boolean {
+ fun isVariousArtists(artistName: String?): Boolean {
+ if (TextUtils.isEmpty(artistName)) {
+ return false
+ }
if (artistName == Artist.VARIOUS_ARTISTS_DISPLAY_NAME) {
return true
}
From 5d1a75bc1384ee32d296b0d076753733d503f6b2 Mon Sep 17 00:00:00 2001
From: thomas
Date: Mon, 21 Sep 2020 00:39:26 -0400
Subject: [PATCH 10/72] Fixing bug when preference is not set
---
.../main/java/code/name/monkey/retromusic/model/Artist.kt | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt b/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt
index fbfde54c8..bb4fd0b1c 100644
--- a/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt
@@ -15,6 +15,7 @@
package code.name.monkey.retromusic.model
import code.name.monkey.retromusic.util.MusicUtil
+import code.name.monkey.retromusic.util.PreferenceUtil
import java.util.*
data class Artist(
@@ -25,10 +26,11 @@ data class Artist(
val name: String
get() {
val name = safeGetFirstAlbum().safeGetFirstSong().albumArtist
+ if (PreferenceUtil.albumArtistsOnly && MusicUtil.isVariousArtists(name)) {
+ return VARIOUS_ARTISTS_DISPLAY_NAME
+ }
return if (MusicUtil.isArtistNameUnknown(name)) {
UNKNOWN_ARTIST_DISPLAY_NAME
- } else if (MusicUtil.isVariousArtists(name)) {
- VARIOUS_ARTISTS_DISPLAY_NAME
} else safeGetFirstAlbum().safeGetFirstSong().artistName
}
From 40ceb57c45d51687ab5af82e9e1b8b796f0abcdd Mon Sep 17 00:00:00 2001
From: Hemanth S
Date: Mon, 21 Sep 2020 16:17:08 +0530
Subject: [PATCH 11/72] Update AlbumDetailsFragment.kt
---
.../retromusic/fragments/albums/AlbumDetailsFragment.kt | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt
index e730a025c..a793f0e36 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt
@@ -77,6 +77,11 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
private val savedSortOrder: String
get() = PreferenceUtil.albumDetailSongSortOrder
+ override fun onActivityCreated(savedInstanceState: Bundle?) {
+ super.onActivityCreated(savedInstanceState)
+ libraryViewModel.setPanelState(NowPlayingPanelState.COLLAPSED_WITHOUT)
+ }
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sharedElementEnterTransition = MaterialContainerTransform().apply {
@@ -88,7 +93,6 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
- libraryViewModel.setPanelState(NowPlayingPanelState.COLLAPSED_WITHOUT)
mainActivity.addMusicServiceEventListener(detailsViewModel)
mainActivity.setSupportActionBar(toolbar)
toolbar.title = " "
From c495c66a38a23a588c1c1ed28a82e61aa4895d13 Mon Sep 17 00:00:00 2001
From: Hemanth S
Date: Tue, 22 Sep 2020 13:50:43 +0530
Subject: [PATCH 12/72] Added animation collapse when navigating to details
---
.../base/AbsSlidingMusicPanelActivity.kt | 29 +++++++------------
.../retromusic/extensions/ViewExtensions.kt | 20 +++++++++++++
.../artists/ArtistDetailsFragment.kt | 1 -
.../fragments/library/LibraryFragment.kt | 7 ++++-
.../fragments/search/SearchFragment.kt | 7 +++--
5 files changed, 42 insertions(+), 22 deletions(-)
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt
index c78c75da1..e7b2355e4 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt
@@ -9,12 +9,13 @@ import android.widget.FrameLayout
import androidx.annotation.LayoutRes
import androidx.core.view.ViewCompat
import androidx.core.view.isVisible
-import androidx.transition.TransitionManager
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.RetroBottomSheetBehavior
import code.name.monkey.retromusic.extensions.hide
+import code.name.monkey.retromusic.extensions.peekHeightAnimate
+import code.name.monkey.retromusic.extensions.translateXAnimate
import code.name.monkey.retromusic.extensions.whichFragment
import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.MiniPlayerFragment
@@ -217,7 +218,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
libraryViewModel.setPanelState(HIDE)
} else {
if (bottomNavigationView.isVisible) {
- libraryViewModel.setPanelState(EXPAND)
+ libraryViewModel.setPanelState(COLLAPSED_WITH)
} else {
libraryViewModel.setPanelState(COLLAPSED_WITHOUT)
}
@@ -301,12 +302,6 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
}
}
- fun hideBottomNavigation() {
- behavior.isHideable = true
- behavior.peekHeight = 0
- hideBottomBarVisibility(false)
- }
-
fun updateTabs() {
bottomNavigationView.menu.clear()
val currentTabs: List = PreferenceUtil.libraryCategory
@@ -330,6 +325,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
private fun updatePanelState() {
libraryViewModel.panelState.observe(this, { state ->
+ val isQueueEmpty = MusicPlayerRemote.playingQueue.isEmpty()
when (state) {
EXPAND -> {
println("EXPAND")
@@ -337,32 +333,29 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
}
HIDE -> {
println("HIDE")
- behavior.isHideable = true
- behavior.peekHeight = 0
- collapsePanel()
ViewCompat.setElevation(slidingPanel, 0f)
ViewCompat.setElevation(bottomNavigationView, 10f)
+ behavior.isHideable = true
+ behavior.peekHeightAnimate(0)
+ collapsePanel()
}
COLLAPSED_WITH -> {
println("COLLAPSED_WITH")
- TransitionManager.beginDelayedTransition(mainContent)
- bottomNavigationView.isVisible = true
val heightOfBar = bottomNavigationView.height
ViewCompat.setElevation(bottomNavigationView, 10f)
ViewCompat.setElevation(slidingPanel, 10f)
behavior.isHideable = false
- behavior.peekHeight = (heightOfBar * 2) - 24
+ behavior.peekHeightAnimate(if(isQueueEmpty) 0 else (heightOfBar * 2) - 24)
+ bottomNavigationView.translateXAnimate(0f)
}
COLLAPSED_WITHOUT -> {
println("COLLAPSED_WITHOUT")
- TransitionManager.beginDelayedTransition(mainContent)
- TransitionManager.beginDelayedTransition(slidingPanel)
val heightOfBar = bottomNavigationView.height
- bottomNavigationView.isVisible = false
ViewCompat.setElevation(bottomNavigationView, 10f)
ViewCompat.setElevation(slidingPanel, 10f)
behavior.isHideable = false
- behavior.peekHeight = heightOfBar - 24
+ behavior.peekHeightAnimate(if(isQueueEmpty) 0 else heightOfBar - 24)
+ bottomNavigationView.translateXAnimate(heightOfBar.toFloat())
}
else -> {
println("ELSE")
diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt
index 0f9e30e8a..3c224ed6a 100644
--- a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt
@@ -14,6 +14,7 @@
package code.name.monkey.retromusic.extensions
+import android.animation.ObjectAnimator
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@@ -21,6 +22,7 @@ import android.widget.EditText
import androidx.annotation.LayoutRes
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.TintHelper
+import com.google.android.material.bottomsheet.BottomSheetBehavior
@Suppress("UNCHECKED_CAST")
fun ViewGroup.inflate(@LayoutRes layout: Int): T {
@@ -45,3 +47,21 @@ fun EditText.appHandleColor(): EditText {
TintHelper.colorHandles(this, ThemeStore.accentColor(context))
return this
}
+
+
+fun View.translateXAnimate(value: Float) {
+ ObjectAnimator.ofFloat(this, "translationY", value)
+ .apply {
+ duration = 300
+ start()
+ }
+}
+
+fun BottomSheetBehavior<*>.peekHeightAnimate(value: Int) {
+ ObjectAnimator.ofInt(this, "peekHeight", value)
+ .apply {
+ duration = 300
+ start()
+ }
+}
+
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsFragment.kt
index 65cc18c2d..1caec7e6f 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsFragment.kt
@@ -73,7 +73,6 @@ class ArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_artist_d
setHasOptionsMenu(true)
libraryViewModel.setPanelState(NowPlayingPanelState.COLLAPSED_WITHOUT)
mainActivity.setSupportActionBar(toolbar)
-
toolbar.title = null
setupRecyclerView()
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt
index 086e0a09b..545f06c40 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt
@@ -14,17 +14,22 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog
import code.name.monkey.retromusic.dialogs.ImportPlaylistDialog
import code.name.monkey.retromusic.extensions.findNavController
+import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
+import code.name.monkey.retromusic.state.NowPlayingPanelState
import kotlinx.android.synthetic.main.fragment_library.*
+import org.koin.androidx.viewmodel.ext.android.sharedViewModel
import java.lang.String
class LibraryFragment : AbsMainActivityFragment(R.layout.fragment_library) {
+ private val libraryViewModel by sharedViewModel()
+
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setHasOptionsMenu(true)
retainInstance = true
- mainActivity.hideBottomBarVisibility(true)
+ libraryViewModel.setPanelState(NowPlayingPanelState.COLLAPSED_WITH)
mainActivity.setSupportActionBar(toolbar)
mainActivity.supportActionBar?.title = null
toolbar.setNavigationOnClickListener {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
index a900341e2..14fdc80e9 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
@@ -20,10 +20,13 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.SearchAdapter
import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.showToast
+import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
+import code.name.monkey.retromusic.state.NowPlayingPanelState
import com.google.android.material.textfield.TextInputEditText
import kotlinx.android.synthetic.main.fragment_search.*
import org.koin.android.ext.android.inject
+import org.koin.androidx.viewmodel.ext.android.sharedViewModel
import java.util.*
import kotlin.collections.ArrayList
@@ -33,6 +36,7 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa
const val REQ_CODE_SPEECH_INPUT = 9001
}
+ private val libraryViewModel by sharedViewModel()
private val viewModel: SearchViewModel by inject()
private lateinit var searchAdapter: SearchAdapter
private var query: String? = null
@@ -40,8 +44,7 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mainActivity.setSupportActionBar(toolbar)
- mainActivity.hideBottomBarVisibility(false)
-
+ libraryViewModel.setPanelState(NowPlayingPanelState.COLLAPSED_WITHOUT)
setupRecyclerView()
keyboardPopup.accentColor()
searchView.addTextChangedListener(this)
From 7c0b3ee82ccfd2b52e75665e7c308bea80909643 Mon Sep 17 00:00:00 2001
From: Hemanth S
Date: Tue, 22 Sep 2020 15:00:00 +0530
Subject: [PATCH 13/72] Update ViewExtensions.kt
---
.../name/monkey/retromusic/extensions/ViewExtensions.kt | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt
index 3c224ed6a..d32583fbc 100644
--- a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt
@@ -20,6 +20,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import androidx.annotation.LayoutRes
+import androidx.core.animation.doOnEnd
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.TintHelper
import com.google.android.material.bottomsheet.BottomSheetBehavior
@@ -54,6 +55,12 @@ fun View.translateXAnimate(value: Float) {
.apply {
duration = 300
start()
+ doOnEnd {
+
+ if (value != 0f) {
+ this@translateXAnimate.hide()
+ }
+ }
}
}
From 3f368e186b6de1c21dbf5c0ba8c302cec9b11728 Mon Sep 17 00:00:00 2001
From: Hemanth S
Date: Thu, 24 Sep 2020 02:25:12 +0530
Subject: [PATCH 14/72] Updated code
Added Fragment options
Renamed Interfaces
Rolled back to previous implementaion for Now playing to handle backpress
---
.../code/name/monkey/retromusic/MainModule.kt | 5 -
.../base/AbsMusicServiceActivity.kt | 18 +-
.../base/AbsSlidingMusicPanelActivity.kt | 162 ++++++++++-------
.../retromusic/adapter/SearchAdapter.kt | 2 +-
.../retromusic/adapter/SongFileAdapter.kt | 20 +--
.../retromusic/adapter/album/AlbumAdapter.kt | 6 +-
.../adapter/album/HorizontalAlbumAdapter.kt | 6 +-
.../adapter/artist/ArtistAdapter.kt | 6 +-
.../adapter/base/AbsMultiSelectAdapter.java | 16 +-
.../adapter/playlist/PlaylistAdapter.kt | 6 +-
.../adapter/song/AbsOffsetSongAdapter.kt | 6 +-
.../song/OrderablePlaylistSongAdapter.kt | 6 +-
.../adapter/song/PlaylistSongAdapter.kt | 6 +-
.../adapter/song/ShuffleButtonSongAdapter.kt | 6 +-
.../adapter/song/SimpleSongAdapter.kt | 6 +-
.../retromusic/adapter/song/SongAdapter.kt | 6 +-
.../retromusic/dialogs/SavePlaylistDialog.kt | 13 +-
.../retromusic/extensions/ViewExtensions.kt | 7 -
.../retromusic/fragments/LibraryViewModel.kt | 29 ++-
.../fragments/albums/AlbumDetailsFragment.kt | 2 +-
.../fragments/albums/AlbumDetailsViewModel.kt | 4 +-
.../artists/ArtistDetailsViewModel.kt | 4 +-
.../fragments/base/AbsMusicServiceFragment.kt | 14 +-
.../fragments/base/AbsPlayerFragment.kt | 4 +-
.../fragments/folder/FoldersFragment.java | 49 ++++--
.../fragments/genres/GenreDetailsViewModel.kt | 4 +-
.../fragments/library/LibraryFragment.kt | 1 -
.../player/NowPlayingPlayerFragment.kt | 42 -----
.../fragments/player/color/ColorFragment.kt | 2 +-
.../player/full/FullPlayerFragment.kt | 16 +-
.../playlists/PlaylistDetailsViewModel.kt | 4 +-
.../fragments/search/SearchFragment.kt | 28 +--
.../fragments/search/SearchViewModel.kt | 20 ---
.../retromusic/helper/menu/SongMenuHelper.kt | 6 +-
.../{CabHolder.kt => ICabHolder.kt} | 2 +-
.../{Callbacks.kt => ICallbacks.kt} | 2 +-
...s.kt => IMainActivityFragmentCallbacks.kt} | 2 +-
...tener.kt => IMusicServiceEventListener.kt} | 2 +-
...eColorHolder.kt => IPaletteColorHolder.kt} | 2 +-
.../retromusic/repository/GenreRepository.kt | 5 +-
.../monkey/retromusic/util/PlaylistsUtil.java | 2 +-
.../layout/fragment_now_playing_player.xml | 13 --
.../res/layout/sliding_music_panel_layout.xml | 3 +-
app/src/main/res/menu/menu_main.xml | 1 +
app/src/main/res/navigation/now_playing.xml | 165 ------------------
45 files changed, 274 insertions(+), 457 deletions(-)
delete mode 100644 app/src/main/java/code/name/monkey/retromusic/fragments/player/NowPlayingPlayerFragment.kt
delete mode 100644 app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchViewModel.kt
rename app/src/main/java/code/name/monkey/retromusic/interfaces/{CabHolder.kt => ICabHolder.kt} (97%)
rename app/src/main/java/code/name/monkey/retromusic/interfaces/{Callbacks.kt => ICallbacks.kt} (92%)
rename app/src/main/java/code/name/monkey/retromusic/interfaces/{MainActivityFragmentCallbacks.kt => IMainActivityFragmentCallbacks.kt} (93%)
rename app/src/main/java/code/name/monkey/retromusic/interfaces/{MusicServiceEventListener.kt => IMusicServiceEventListener.kt} (95%)
rename app/src/main/java/code/name/monkey/retromusic/interfaces/{PaletteColorHolder.kt => IPaletteColorHolder.kt} (95%)
delete mode 100644 app/src/main/res/layout/fragment_now_playing_player.xml
delete mode 100644 app/src/main/res/navigation/now_playing.xml
diff --git a/app/src/main/java/code/name/monkey/retromusic/MainModule.kt b/app/src/main/java/code/name/monkey/retromusic/MainModule.kt
index 3e068f205..4552702ae 100644
--- a/app/src/main/java/code/name/monkey/retromusic/MainModule.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/MainModule.kt
@@ -12,7 +12,6 @@ import code.name.monkey.retromusic.fragments.albums.AlbumDetailsViewModel
import code.name.monkey.retromusic.fragments.artists.ArtistDetailsViewModel
import code.name.monkey.retromusic.fragments.genres.GenreDetailsViewModel
import code.name.monkey.retromusic.fragments.playlists.PlaylistDetailsViewModel
-import code.name.monkey.retromusic.fragments.search.SearchViewModel
import code.name.monkey.retromusic.model.Genre
import code.name.monkey.retromusic.network.*
import code.name.monkey.retromusic.repository.*
@@ -189,10 +188,6 @@ private val viewModules = module {
genre
)
}
-
- viewModel {
- SearchViewModel(get())
- }
}
val appModules = listOf(mainModule, dataModule, viewModules, networkModule, roomModule)
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt
index 1e9efee87..7b13a4bca 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt
@@ -8,7 +8,7 @@ import androidx.lifecycle.lifecycleScope
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.db.toPlayCount
import code.name.monkey.retromusic.helper.MusicPlayerRemote
-import code.name.monkey.retromusic.interfaces.MusicServiceEventListener
+import code.name.monkey.retromusic.interfaces.IMusicServiceEventListener
import code.name.monkey.retromusic.repository.RealRepository
import code.name.monkey.retromusic.service.MusicService.*
import kotlinx.coroutines.Dispatchers
@@ -17,9 +17,9 @@ import org.koin.android.ext.android.inject
import java.lang.ref.WeakReference
import java.util.*
-abstract class AbsMusicServiceActivity : AbsBaseActivity(), MusicServiceEventListener {
+abstract class AbsMusicServiceActivity : AbsBaseActivity(), IMusicServiceEventListener {
- private val mMusicServiceEventListeners = ArrayList()
+ private val mMusicServiceEventListeners = ArrayList()
private val repository: RealRepository by inject()
private var serviceToken: MusicPlayerRemote.ServiceToken? = null
private var musicStateReceiver: MusicStateReceiver? = null
@@ -49,15 +49,15 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), MusicServiceEventLis
}
}
- fun addMusicServiceEventListener(listener: MusicServiceEventListener?) {
- if (listener != null) {
- mMusicServiceEventListeners.add(listener)
+ fun addMusicServiceEventListener(listenerI: IMusicServiceEventListener?) {
+ if (listenerI != null) {
+ mMusicServiceEventListeners.add(listenerI)
}
}
- fun removeMusicServiceEventListener(listener: MusicServiceEventListener?) {
- if (listener != null) {
- mMusicServiceEventListeners.remove(listener)
+ fun removeMusicServiceEventListener(listenerI: IMusicServiceEventListener?) {
+ if (listenerI != null) {
+ mMusicServiceEventListeners.remove(listenerI)
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt
index e7b2355e4..638118361 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt
@@ -8,25 +8,41 @@ import android.view.ViewTreeObserver
import android.widget.FrameLayout
import androidx.annotation.LayoutRes
import androidx.core.view.ViewCompat
+import androidx.core.view.isGone
import androidx.core.view.isVisible
+import androidx.fragment.app.Fragment
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.RetroBottomSheetBehavior
import code.name.monkey.retromusic.extensions.hide
-import code.name.monkey.retromusic.extensions.peekHeightAnimate
-import code.name.monkey.retromusic.extensions.translateXAnimate
import code.name.monkey.retromusic.extensions.whichFragment
import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.MiniPlayerFragment
import code.name.monkey.retromusic.fragments.NowPlayingScreen
import code.name.monkey.retromusic.fragments.NowPlayingScreen.*
+import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
+import code.name.monkey.retromusic.fragments.player.adaptive.AdaptiveFragment
+import code.name.monkey.retromusic.fragments.player.blur.BlurPlayerFragment
+import code.name.monkey.retromusic.fragments.player.card.CardFragment
+import code.name.monkey.retromusic.fragments.player.cardblur.CardBlurFragment
+import code.name.monkey.retromusic.fragments.player.circle.CirclePlayerFragment
+import code.name.monkey.retromusic.fragments.player.color.ColorFragment
+import code.name.monkey.retromusic.fragments.player.fit.FitFragment
+import code.name.monkey.retromusic.fragments.player.flat.FlatPlayerFragment
+import code.name.monkey.retromusic.fragments.player.full.FullPlayerFragment
+import code.name.monkey.retromusic.fragments.player.gradient.GradientPlayerFragment
+import code.name.monkey.retromusic.fragments.player.material.MaterialFragment
+import code.name.monkey.retromusic.fragments.player.normal.PlayerFragment
+import code.name.monkey.retromusic.fragments.player.plain.PlainPlayerFragment
+import code.name.monkey.retromusic.fragments.player.simple.SimplePlayerFragment
+import code.name.monkey.retromusic.fragments.player.tiny.TinyPlayerFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.CategoryInfo
import code.name.monkey.retromusic.state.NowPlayingPanelState.*
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.views.BottomNavigationBarTinted
-import com.google.android.material.bottomsheet.BottomSheetBehavior
+import com.google.android.material.bottomsheet.BottomSheetBehavior.*
import kotlinx.android.synthetic.main.sliding_music_panel_layout.*
import org.koin.androidx.viewmodel.ext.android.viewModel
@@ -36,9 +52,9 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
}
protected val libraryViewModel by viewModel()
- private lateinit var behavior: RetroBottomSheetBehavior
+ private lateinit var bottomSheetBehavior: RetroBottomSheetBehavior
private var miniPlayerFragment: MiniPlayerFragment? = null
- private var cps: NowPlayingScreen? = null
+ private var nowPlayingScreen: NowPlayingScreen? = null
private var navigationBarColor: Int = 0
private var taskColor: Int = 0
private var lightStatusBar: Boolean = false
@@ -46,9 +62,9 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
private var paletteColor: Int = Color.WHITE
protected abstract fun createContentView(): View
private val panelState: Int
- get() = behavior.state
+ get() = bottomSheetBehavior.state
- private val bottomSheetCallbackList = object : BottomSheetBehavior.BottomSheetCallback() {
+ private val bottomSheetCallbackList = object : BottomSheetCallback() {
override fun onSlide(bottomSheet: View, slideOffset: Float) {
setMiniPlayerAlphaProgress(slideOffset)
@@ -56,14 +72,14 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
override fun onStateChanged(bottomSheet: View, newState: Int) {
when (newState) {
- BottomSheetBehavior.STATE_EXPANDED -> {
+ STATE_EXPANDED -> {
onPanelExpanded()
}
- BottomSheetBehavior.STATE_COLLAPSED -> {
+ STATE_COLLAPSED -> {
onPanelCollapsed()
}
else -> {
-
+ println("Do something")
}
}
}
@@ -75,34 +91,29 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
setContentView(createContentView())
chooseFragmentForTheme()
setupSlidingUpPanel()
-
setupBottomSheet()
updatePanelState()
updateColor()
}
- fun getBottomSheetBehavior() = behavior
+ fun getBottomSheetBehavior() = bottomSheetBehavior
private fun setupBottomSheet() {
- behavior = BottomSheetBehavior.from(slidingPanel) as RetroBottomSheetBehavior
- behavior.addBottomSheetCallback(bottomSheetCallbackList)
-
- if (behavior.state == BottomSheetBehavior.STATE_EXPANDED) {
- setMiniPlayerAlphaProgress(1f)
- }
+ bottomSheetBehavior = from(slidingPanel) as RetroBottomSheetBehavior
+ bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallbackList)
}
override fun onResume() {
super.onResume()
- if (cps != PreferenceUtil.nowPlayingScreen) {
+ if (nowPlayingScreen != PreferenceUtil.nowPlayingScreen) {
postRecreate()
}
}
override fun onDestroy() {
super.onDestroy()
- behavior.removeBottomSheetCallback(bottomSheetCallbackList)
+ bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallbackList)
}
protected fun wrapSlidingMusicPanel(@LayoutRes resId: Int): View {
@@ -115,17 +126,14 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
}
fun collapsePanel() {
- behavior.state = BottomSheetBehavior.STATE_COLLAPSED
- setMiniPlayerAlphaProgress(0f)
+ bottomSheetBehavior.state = STATE_COLLAPSED
}
fun expandPanel() {
- behavior.state = BottomSheetBehavior.STATE_EXPANDED
- setMiniPlayerAlphaProgress(1f)
+ bottomSheetBehavior.state = STATE_EXPANDED
}
private fun setMiniPlayerAlphaProgress(progress: Float) {
- if (miniPlayerFragment?.view == null) return
val alpha = 1 - progress
miniPlayerFragment?.view?.alpha = alpha
miniPlayerFragment?.view?.visibility = if (alpha == 0f) View.GONE else View.VISIBLE
@@ -151,8 +159,8 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
override fun onGlobalLayout() {
slidingPanel.viewTreeObserver.removeOnGlobalLayoutListener(this)
when (panelState) {
- BottomSheetBehavior.STATE_EXPANDED -> onPanelExpanded()
- BottomSheetBehavior.STATE_COLLAPSED -> onPanelCollapsed()
+ STATE_EXPANDED -> onPanelExpanded()
+ STATE_COLLAPSED -> onPanelCollapsed()
else -> {
//playerFragment!!.onHide()
}
@@ -175,24 +183,20 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
val isBottomBarVisible = bottomNavigationView.isVisible
if (hide) {
- behavior.isHideable = true
- behavior.peekHeight = 0
+ bottomSheetBehavior.isHideable = true
+ bottomSheetBehavior.peekHeight = 0
collapsePanel()
ViewCompat.setElevation(slidingPanel, 0f)
ViewCompat.setElevation(bottomNavigationView, 10f)
} else {
ViewCompat.setElevation(bottomNavigationView, 10f)
ViewCompat.setElevation(slidingPanel, 10f)
- behavior.isHideable = false
- behavior.peekHeight = (if (isBottomBarVisible) heightOfBar * 2 else heightOfBar) - 24
+ bottomSheetBehavior.isHideable = false
+ bottomSheetBehavior.peekHeight =
+ (if (isBottomBarVisible) heightOfBar * 2 else heightOfBar) - 24
}
}
- private fun chooseFragmentForTheme() {
- cps = PreferenceUtil.nowPlayingScreen
- miniPlayerFragment = whichFragment(R.id.miniPlayerFragment)
- miniPlayerFragment?.view?.setOnClickListener { expandPanel() }
- }
override fun onServiceConnected() {
super.onServiceConnected()
@@ -229,8 +233,9 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
if (!handleBackPress()) super.onBackPressed()
}
- open fun handleBackPress(): Boolean {
- if (panelState == BottomSheetBehavior.STATE_EXPANDED) {
+ private fun handleBackPress(): Boolean {
+ if (bottomSheetBehavior.peekHeight != 0 && playerFragment!!.onBackPressed()) return true
+ if (panelState == STATE_EXPANDED) {
collapsePanel()
return true
}
@@ -238,27 +243,27 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
}
private fun onPaletteColorChanged() {
- if (panelState == BottomSheetBehavior.STATE_EXPANDED) {
+ if (panelState == STATE_EXPANDED) {
super.setTaskDescriptionColor(paletteColor)
val isColorLight = ColorUtil.isColorLight(paletteColor)
- if (PreferenceUtil.isAdaptiveColor && (cps == Normal || cps == Flat)) {
+ if (PreferenceUtil.isAdaptiveColor && (nowPlayingScreen == Normal || nowPlayingScreen == Flat)) {
super.setLightNavigationBar(true)
super.setLightStatusbar(isColorLight)
- } else if (cps == Card || cps == Blur || cps == BlurCard) {
+ } else if (nowPlayingScreen == Card || nowPlayingScreen == Blur || nowPlayingScreen == BlurCard) {
super.setLightStatusbar(false)
super.setLightNavigationBar(true)
super.setNavigationbarColor(Color.BLACK)
- } else if (cps == Color || cps == Tiny || cps == Gradient) {
+ } else if (nowPlayingScreen == Color || nowPlayingScreen == Tiny || nowPlayingScreen == Gradient) {
super.setNavigationbarColor(paletteColor)
super.setLightNavigationBar(isColorLight)
super.setLightStatusbar(isColorLight)
- } else if (cps == Full) {
+ } else if (nowPlayingScreen == Full) {
super.setNavigationbarColor(paletteColor)
super.setLightNavigationBar(isColorLight)
super.setLightStatusbar(false)
- } else if (cps == Classic) {
+ } else if (nowPlayingScreen == Classic) {
super.setLightStatusbar(false)
- } else if (cps == Fit) {
+ } else if (nowPlayingScreen == Fit) {
super.setLightStatusbar(false)
} else {
super.setLightStatusbar(
@@ -276,28 +281,28 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
override fun setLightStatusbar(enabled: Boolean) {
lightStatusBar = enabled
- if (panelState == BottomSheetBehavior.STATE_COLLAPSED) {
+ if (panelState == STATE_COLLAPSED) {
super.setLightStatusbar(enabled)
}
}
override fun setLightNavigationBar(enabled: Boolean) {
lightNavigationBar = enabled
- if (panelState == BottomSheetBehavior.STATE_COLLAPSED) {
+ if (panelState == STATE_COLLAPSED) {
super.setLightNavigationBar(enabled)
}
}
override fun setNavigationbarColor(color: Int) {
navigationBarColor = color
- if (panelState == BottomSheetBehavior.STATE_COLLAPSED) {
+ if (panelState == STATE_COLLAPSED) {
super.setNavigationbarColor(color)
}
}
override fun setTaskDescriptionColor(color: Int) {
taskColor = color
- if (panelState == BottomSheetBehavior.STATE_COLLAPSED) {
+ if (panelState == STATE_COLLAPSED) {
super.setTaskDescriptionColor(color)
}
}
@@ -335,32 +340,38 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
println("HIDE")
ViewCompat.setElevation(slidingPanel, 0f)
ViewCompat.setElevation(bottomNavigationView, 10f)
- behavior.isHideable = true
- behavior.peekHeightAnimate(0)
- collapsePanel()
+ bottomSheetBehavior.isHideable = true
+ bottomSheetBehavior.setPeekHeight(0, true)
+ bottomSheetBehavior.state = STATE_COLLAPSED
}
COLLAPSED_WITH -> {
println("COLLAPSED_WITH")
val heightOfBar = bottomNavigationView.height
ViewCompat.setElevation(bottomNavigationView, 10f)
ViewCompat.setElevation(slidingPanel, 10f)
- behavior.isHideable = false
- behavior.peekHeightAnimate(if(isQueueEmpty) 0 else (heightOfBar * 2) - 24)
- bottomNavigationView.translateXAnimate(0f)
+ bottomSheetBehavior.isHideable = false
+ bottomSheetBehavior.setPeekHeight(
+ if (isQueueEmpty) 0 else (heightOfBar * 2) - 24,
+ true
+ )
+ bottomNavigationView.isVisible = true
}
COLLAPSED_WITHOUT -> {
println("COLLAPSED_WITHOUT")
val heightOfBar = bottomNavigationView.height
ViewCompat.setElevation(bottomNavigationView, 10f)
ViewCompat.setElevation(slidingPanel, 10f)
- behavior.isHideable = false
- behavior.peekHeightAnimate(if(isQueueEmpty) 0 else heightOfBar - 24)
- bottomNavigationView.translateXAnimate(heightOfBar.toFloat())
+ bottomSheetBehavior.isHideable = false
+ bottomSheetBehavior.setPeekHeight(
+ if (isQueueEmpty) 0 else heightOfBar - 24,
+ true
+ )
+ bottomNavigationView.isGone = true
}
else -> {
println("ELSE")
- behavior.isHideable = true
- behavior.peekHeight = 0
+ bottomSheetBehavior.isHideable = true
+ bottomSheetBehavior.peekHeight = 0
collapsePanel()
ViewCompat.setElevation(slidingPanel, 0f)
ViewCompat.setElevation(bottomNavigationView, 10f)
@@ -368,4 +379,35 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
}
})
}
+ private var playerFragment: AbsPlayerFragment? = null
+ private fun chooseFragmentForTheme() {
+ nowPlayingScreen = PreferenceUtil.nowPlayingScreen
+
+ val fragment: Fragment = when (nowPlayingScreen) {
+ Blur -> BlurPlayerFragment()
+ Adaptive -> AdaptiveFragment()
+ Normal -> PlayerFragment()
+ Card -> CardFragment()
+ BlurCard -> CardBlurFragment()
+ Fit -> FitFragment()
+ Flat -> FlatPlayerFragment()
+ Full -> FullPlayerFragment()
+ Plain -> PlainPlayerFragment()
+ Simple -> SimplePlayerFragment()
+ Material -> MaterialFragment()
+ Color -> ColorFragment()
+ Gradient -> GradientPlayerFragment()
+ Tiny -> TinyPlayerFragment()
+ //PEAK -> PeakPlayerFragment()
+ Circle -> CirclePlayerFragment()
+ else -> PlayerFragment()
+ } // must implement AbsPlayerFragment
+ supportFragmentManager.beginTransaction().replace(R.id.playerFragmentContainer, fragment)
+ .commit()
+ supportFragmentManager.executePendingTransactions()
+
+ playerFragment = supportFragmentManager.findFragmentById(R.id.playerFragmentContainer) as AbsPlayerFragment
+ miniPlayerFragment = whichFragment(R.id.miniPlayerFragment)
+ miniPlayerFragment?.view?.setOnClickListener { expandPanel() }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/SearchAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/SearchAdapter.kt
index 97e2ada1d..21d1b92a1 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/SearchAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/SearchAdapter.kt
@@ -25,7 +25,7 @@ class SearchAdapter(
private var dataSet: List
) : RecyclerView.Adapter() {
- fun swapDataSet(dataSet: MutableList) {
+ fun swapDataSet(dataSet: List) {
this.dataSet = dataSet
notifyDataSetChanged()
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt
index 0f073f182..511336227 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt
@@ -26,8 +26,8 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.glide.audiocover.AudioFileCover
-import code.name.monkey.retromusic.interfaces.CabHolder
-import code.name.monkey.retromusic.interfaces.Callbacks
+import code.name.monkey.retromusic.interfaces.ICabHolder
+import code.name.monkey.retromusic.interfaces.ICallbacks
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.RetroUtil
import com.bumptech.glide.Glide
@@ -43,10 +43,10 @@ class SongFileAdapter(
private val activity: AppCompatActivity,
private var dataSet: List,
private val itemLayoutRes: Int,
- private val callbacks: Callbacks?,
- cabHolder: CabHolder?
+ private val ICallbacks: ICallbacks?,
+ ICabHolder: ICabHolder?
) : AbsMultiSelectAdapter(
- activity, cabHolder, R.menu.menu_media_selection
+ activity, ICabHolder, R.menu.menu_media_selection
), PopupTextProvider {
init {
@@ -136,8 +136,8 @@ class SongFileAdapter(
}
override fun onMultipleItemAction(menuItem: MenuItem, selection: List) {
- if (callbacks == null) return
- callbacks.onMultipleItemAction(menuItem, selection as ArrayList)
+ if (ICallbacks == null) return
+ ICallbacks.onMultipleItemAction(menuItem, selection as ArrayList)
}
override fun getPopupText(position: Int): String {
@@ -152,11 +152,11 @@ class SongFileAdapter(
inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) {
init {
- if (menu != null && callbacks != null) {
+ if (menu != null && ICallbacks != null) {
menu?.setOnClickListener { v ->
val position = layoutPosition
if (isPositionInRange(position)) {
- callbacks.onFileMenuClicked(dataSet[position], v)
+ ICallbacks.onFileMenuClicked(dataSet[position], v)
}
}
}
@@ -171,7 +171,7 @@ class SongFileAdapter(
if (isInQuickSelectMode) {
toggleChecked(position)
} else {
- callbacks?.onFileSelected(dataSet[position])
+ ICallbacks?.onFileSelected(dataSet[position])
}
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt
index 73c071452..2d3896cbc 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt
@@ -16,7 +16,7 @@ import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.SortOrder
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
-import code.name.monkey.retromusic.interfaces.CabHolder
+import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
@@ -29,11 +29,11 @@ open class AlbumAdapter(
protected val activity: FragmentActivity,
var dataSet: List,
protected var itemLayoutRes: Int,
- cabHolder: CabHolder?,
+ ICabHolder: ICabHolder?,
private val albumClickListener: AlbumClickListener?
) : AbsMultiSelectAdapter(
activity,
- cabHolder,
+ ICabHolder,
R.menu.menu_media_selection
), PopupTextProvider {
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/HorizontalAlbumAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/HorizontalAlbumAdapter.kt
index 8198a957e..7ff459ec3 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/HorizontalAlbumAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/HorizontalAlbumAdapter.kt
@@ -7,7 +7,7 @@ import code.name.monkey.retromusic.fragments.albums.AlbumClickListener
import code.name.monkey.retromusic.glide.AlbumGlideRequest
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.helper.HorizontalAdapterHelper
-import code.name.monkey.retromusic.interfaces.CabHolder
+import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
@@ -16,10 +16,10 @@ import com.bumptech.glide.Glide
class HorizontalAlbumAdapter(
activity: FragmentActivity,
dataSet: List,
- cabHolder: CabHolder?,
+ ICabHolder: ICabHolder?,
albumClickListener: AlbumClickListener
) : AlbumAdapter(
- activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, cabHolder, albumClickListener
+ activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, ICabHolder, albumClickListener
) {
override fun createViewHolder(view: View, viewType: Int): ViewHolder {
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/artist/ArtistAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/artist/ArtistAdapter.kt
index 5f55486e1..7f32e9848 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/artist/ArtistAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/artist/ArtistAdapter.kt
@@ -16,7 +16,7 @@ import code.name.monkey.retromusic.fragments.artists.ArtistClickListener
import code.name.monkey.retromusic.glide.ArtistGlideRequest
import code.name.monkey.retromusic.glide.RetroMusicColoredTarget
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
-import code.name.monkey.retromusic.interfaces.CabHolder
+import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
@@ -29,10 +29,10 @@ class ArtistAdapter(
val activity: FragmentActivity,
var dataSet: List,
var itemLayoutRes: Int,
- cabHolder: CabHolder?,
+ ICabHolder: ICabHolder?,
private val artistClickListener: ArtistClickListener
) : AbsMultiSelectAdapter(
- activity, cabHolder, R.menu.menu_media_selection
+ activity, ICabHolder, R.menu.menu_media_selection
), PopupTextProvider {
init {
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/base/AbsMultiSelectAdapter.java b/app/src/main/java/code/name/monkey/retromusic/adapter/base/AbsMultiSelectAdapter.java
index bca248f6d..0e2667ae6 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/base/AbsMultiSelectAdapter.java
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/base/AbsMultiSelectAdapter.java
@@ -15,21 +15,21 @@ import java.util.ArrayList;
import java.util.List;
import code.name.monkey.retromusic.R;
-import code.name.monkey.retromusic.interfaces.CabHolder;
+import code.name.monkey.retromusic.interfaces.ICabHolder;
public abstract class AbsMultiSelectAdapter extends RecyclerView.Adapter
implements MaterialCab.Callback {
@Nullable
- private final CabHolder cabHolder;
+ private final ICabHolder ICabHolder;
private final Context context;
private MaterialCab cab;
private List checked;
private int menuRes;
- public AbsMultiSelectAdapter(@NonNull Context context, @Nullable CabHolder cabHolder, @MenuRes int menuRes) {
- this.cabHolder = cabHolder;
+ public AbsMultiSelectAdapter(@NonNull Context context, @Nullable ICabHolder ICabHolder, @MenuRes int menuRes) {
+ this.ICabHolder = ICabHolder;
checked = new ArrayList<>();
this.menuRes = menuRes;
this.context = context;
@@ -59,7 +59,7 @@ public abstract class AbsMultiSelectAdapter,
private var itemLayoutRes: Int,
- cabHolder: CabHolder?
+ ICabHolder: ICabHolder?
) : AbsMultiSelectAdapter(
activity,
- cabHolder,
+ ICabHolder,
R.menu.menu_playlists_selection
) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/AbsOffsetSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/AbsOffsetSongAdapter.kt
index d1141341c..9904bc5b5 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/AbsOffsetSongAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/AbsOffsetSongAdapter.kt
@@ -7,15 +7,15 @@ import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
-import code.name.monkey.retromusic.interfaces.CabHolder
+import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Song
abstract class AbsOffsetSongAdapter(
activity: AppCompatActivity,
dataSet: MutableList,
@LayoutRes itemLayoutRes: Int,
- cabHolder: CabHolder?
-) : SongAdapter(activity, dataSet, itemLayoutRes, cabHolder) {
+ ICabHolder: ICabHolder?
+) : SongAdapter(activity, dataSet, itemLayoutRes, ICabHolder) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SongAdapter.ViewHolder {
if (viewType == OFFSET_ITEM) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt
index a806c72a0..64f9aa199 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt
@@ -9,7 +9,7 @@ import code.name.monkey.retromusic.db.PlaylistEntity
import code.name.monkey.retromusic.db.toSongEntity
import code.name.monkey.retromusic.db.toSongs
import code.name.monkey.retromusic.dialogs.RemoveSongFromPlaylistDialog
-import code.name.monkey.retromusic.interfaces.CabHolder
+import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.PlaylistSong
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.ViewUtil
@@ -23,13 +23,13 @@ class OrderablePlaylistSongAdapter(
activity: FragmentActivity,
dataSet: ArrayList,
itemLayoutRes: Int,
- cabHolder: CabHolder?,
+ ICabHolder: ICabHolder?,
private val onMoveItemListener: OnMoveItemListener?
) : SongAdapter(
activity,
dataSet,
itemLayoutRes,
- cabHolder
+ ICabHolder
), DraggableItemAdapter {
init {
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlaylistSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlaylistSongAdapter.kt
index 7d73b9529..27f7edec6 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlaylistSongAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlaylistSongAdapter.kt
@@ -8,7 +8,7 @@ import androidx.navigation.findNavController
import code.name.monkey.retromusic.EXTRA_ALBUM_ID
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
-import code.name.monkey.retromusic.interfaces.CabHolder
+import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Song
import com.google.android.material.button.MaterialButton
@@ -16,8 +16,8 @@ open class PlaylistSongAdapter(
activity: AppCompatActivity,
dataSet: MutableList,
itemLayoutRes: Int,
- cabHolder: CabHolder?
-) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, cabHolder) {
+ ICabHolder: ICabHolder?
+) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, ICabHolder) {
init {
this.setMultiSelectMenuRes(R.menu.menu_cannot_delete_single_songs_playlist_songs_selection)
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/ShuffleButtonSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/ShuffleButtonSongAdapter.kt
index 4f3935ad4..794cb8a4c 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/ShuffleButtonSongAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/ShuffleButtonSongAdapter.kt
@@ -4,7 +4,7 @@ import android.view.View
import androidx.appcompat.app.AppCompatActivity
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.helper.MusicPlayerRemote
-import code.name.monkey.retromusic.interfaces.CabHolder
+import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Song
import com.google.android.material.button.MaterialButton
@@ -12,8 +12,8 @@ class ShuffleButtonSongAdapter(
activity: AppCompatActivity,
dataSet: MutableList,
itemLayoutRes: Int,
- cabHolder: CabHolder?
-) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, cabHolder) {
+ ICabHolder: ICabHolder?
+) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, ICabHolder) {
override fun createViewHolder(view: View): SongAdapter.ViewHolder {
return ViewHolder(view)
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SimpleSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SimpleSongAdapter.kt
index d75400289..7bfc4a1c1 100755
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SimpleSongAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SimpleSongAdapter.kt
@@ -3,7 +3,7 @@ package code.name.monkey.retromusic.adapter.song
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.fragment.app.FragmentActivity
-import code.name.monkey.retromusic.interfaces.CabHolder
+import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
import java.util.*
@@ -12,8 +12,8 @@ class SimpleSongAdapter(
context: FragmentActivity,
songs: ArrayList,
layoutRes: Int,
- cabHolder: CabHolder?
-) : SongAdapter(context, songs, layoutRes, cabHolder) {
+ ICabHolder: ICabHolder?
+) : SongAdapter(context, songs, layoutRes, ICabHolder) {
override fun swapDataSet(dataSet: List) {
this.dataSet = dataSet.toMutableList()
diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt
index b7b1f8e45..f7707c5a6 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt
@@ -21,7 +21,7 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.SortOrder
import code.name.monkey.retromusic.helper.menu.SongMenuHelper
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
-import code.name.monkey.retromusic.interfaces.CabHolder
+import code.name.monkey.retromusic.interfaces.ICabHolder
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
@@ -38,11 +38,11 @@ open class SongAdapter(
protected val activity: FragmentActivity,
var dataSet: MutableList,
protected var itemLayoutRes: Int,
- cabHolder: CabHolder?,
+ ICabHolder: ICabHolder?,
showSectionName: Boolean = true
) : AbsMultiSelectAdapter(
activity,
- cabHolder,
+ ICabHolder,
R.menu.menu_media_selection
), MaterialCab.Callback, PopupTextProvider {
diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/SavePlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/SavePlaylistDialog.kt
index dd92a9a2d..bf726887b 100644
--- a/app/src/main/java/code/name/monkey/retromusic/dialogs/SavePlaylistDialog.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/SavePlaylistDialog.kt
@@ -1,6 +1,7 @@
package code.name.monkey.retromusic.dialogs
import android.app.Dialog
+import android.media.MediaScannerConnection
import android.os.Bundle
import android.widget.Toast
import androidx.core.os.bundleOf
@@ -33,9 +34,15 @@ class SavePlaylistDialog : DialogFragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launch(Dispatchers.IO) {
- val playlistWithSongs: PlaylistWithSongs =
- extraNotNull(EXTRA_PLAYLIST).value
- val file = PlaylistsUtil.savePlaylistWithSongs(requireContext(), playlistWithSongs)
+ val playlistWithSongs = extraNotNull(EXTRA_PLAYLIST).value
+ val file = PlaylistsUtil.savePlaylistWithSongs(playlistWithSongs)
+ MediaScannerConnection.scanFile(
+ requireActivity(),
+ arrayOf(file.path),
+ null
+ ) { _, _ ->
+
+ }
withContext(Dispatchers.Main) {
Toast.makeText(
requireContext(),
diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt
index d32583fbc..3c224ed6a 100644
--- a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt
@@ -20,7 +20,6 @@ import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import androidx.annotation.LayoutRes
-import androidx.core.animation.doOnEnd
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.TintHelper
import com.google.android.material.bottomsheet.BottomSheetBehavior
@@ -55,12 +54,6 @@ fun View.translateXAnimate(value: Float) {
.apply {
duration = 300
start()
- doOnEnd {
-
- if (value != 0f) {
- this@translateXAnimate.hide()
- }
- }
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
index 1c27813cc..248951353 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
@@ -8,7 +8,7 @@ import code.name.monkey.retromusic.TOP_ARTISTS
import code.name.monkey.retromusic.db.*
import code.name.monkey.retromusic.fragments.ReloadType.*
import code.name.monkey.retromusic.helper.MusicPlayerRemote
-import code.name.monkey.retromusic.interfaces.MusicServiceEventListener
+import code.name.monkey.retromusic.interfaces.IMusicServiceEventListener
import code.name.monkey.retromusic.model.*
import code.name.monkey.retromusic.repository.RealRepository
@@ -21,24 +21,21 @@ import kotlinx.coroutines.launch
class LibraryViewModel(
private val repository: RealRepository
-) : ViewModel(), MusicServiceEventListener {
+) : ViewModel(), IMusicServiceEventListener {
private val _paletteColor = MutableLiveData()
+ private val home = MutableLiveData>()
private val albums = MutableLiveData>()
private val songs = MutableLiveData>()
private val artists = MutableLiveData>()
private val playlists = MutableLiveData>()
private val legacyPlaylists = MutableLiveData>()
private val genres = MutableLiveData>()
- private val home = MutableLiveData>()
+ private val searchResults = MutableLiveData>()
val paletteColor: LiveData = _paletteColor
val panelState: MutableLiveData = MutableLiveData()
- init {
- fetchHomeSections()
- }
-
fun setPanelState(state: NowPlayingPanelState) {
panelState.postValue(state)
}
@@ -52,6 +49,8 @@ class LibraryViewModel(
fetchPlaylists()
}
+ fun getSearchResult(): LiveData> = searchResults
+
fun getSongs(): LiveData> {
fetchSongs()
return songs
@@ -83,6 +82,7 @@ class LibraryViewModel(
}
fun getHome(): LiveData> {
+ fetchHomeSections()
return home
}
@@ -134,6 +134,11 @@ class LibraryViewModel(
}
}
+ fun search(query: String?) = viewModelScope.launch(IO) {
+ val result = repository.search(query)
+ searchResults.postValue(result)
+ }
+
fun forceReload(reloadType: ReloadType) = viewModelScope.launch {
when (reloadType) {
Songs -> fetchSongs()
@@ -278,6 +283,16 @@ class LibraryViewModel(
}
}
}
+
+ fun clearSearchResult() {
+ viewModelScope.launch {
+ searchResults.postValue(emptyList())
+ }
+ }
+
+ fun artist(artistId: Long): LiveData = liveData {
+ emit(repository.artistById(artistId))
+ }
}
enum class ReloadType {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt
index a793f0e36..296d8955b 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt
@@ -133,7 +133,7 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
override fun onDestroy() {
super.onDestroy()
- playerActivity?.removeMusicServiceEventListener(detailsViewModel)
+ serviceActivity?.removeMusicServiceEventListener(detailsViewModel)
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsViewModel.kt
index 025449331..f764a98ba 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsViewModel.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsViewModel.kt
@@ -3,7 +3,7 @@ package code.name.monkey.retromusic.fragments.albums
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.liveData
-import code.name.monkey.retromusic.interfaces.MusicServiceEventListener
+import code.name.monkey.retromusic.interfaces.IMusicServiceEventListener
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.network.Result
@@ -14,7 +14,7 @@ import kotlinx.coroutines.Dispatchers.IO
class AlbumDetailsViewModel(
private val repository: RealRepository,
private val albumId: Long
-) : ViewModel(), MusicServiceEventListener {
+) : ViewModel(), IMusicServiceEventListener {
fun getAlbum(): LiveData = liveData(IO) {
emit(repository.albumByIdAsync(albumId))
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsViewModel.kt
index 1f883600c..26fbc2acb 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsViewModel.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/artists/ArtistDetailsViewModel.kt
@@ -3,7 +3,7 @@ package code.name.monkey.retromusic.fragments.artists
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.liveData
-import code.name.monkey.retromusic.interfaces.MusicServiceEventListener
+import code.name.monkey.retromusic.interfaces.IMusicServiceEventListener
import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.network.Result
import code.name.monkey.retromusic.network.model.LastFmArtist
@@ -13,7 +13,7 @@ import kotlinx.coroutines.Dispatchers.IO
class ArtistDetailsViewModel(
private val realRepository: RealRepository,
private val artistId: Long
-) : ViewModel(), MusicServiceEventListener {
+) : ViewModel(), IMusicServiceEventListener {
fun getArtist(): LiveData = liveData(IO) {
val artist = realRepository.artistById(artistId)
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMusicServiceFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMusicServiceFragment.kt
index 1ce30de03..fcfdc3c25 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMusicServiceFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMusicServiceFragment.kt
@@ -10,7 +10,7 @@ import androidx.fragment.app.Fragment
import androidx.navigation.navOptions
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity
-import code.name.monkey.retromusic.interfaces.MusicServiceEventListener
+import code.name.monkey.retromusic.interfaces.IMusicServiceEventListener
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.RetroUtil
import org.jaudiotagger.audio.AudioFileIO
@@ -23,7 +23,7 @@ import java.util.*
*/
open class AbsMusicServiceFragment(@LayoutRes layout: Int) : Fragment(layout),
- MusicServiceEventListener {
+ IMusicServiceEventListener {
val navOptions by lazy {
navOptions {
@@ -40,13 +40,13 @@ open class AbsMusicServiceFragment(@LayoutRes layout: Int) : Fragment(layout),
}
}
- var playerActivity: AbsMusicServiceActivity? = null
+ var serviceActivity: AbsMusicServiceActivity? = null
private set
override fun onAttach(context: Context) {
super.onAttach(context)
try {
- playerActivity = context as AbsMusicServiceActivity?
+ serviceActivity = context as AbsMusicServiceActivity?
} catch (e: ClassCastException) {
throw RuntimeException(context.javaClass.simpleName + " must be an instance of " + AbsMusicServiceActivity::class.java.simpleName)
}
@@ -54,17 +54,17 @@ open class AbsMusicServiceFragment(@LayoutRes layout: Int) : Fragment(layout),
override fun onDetach() {
super.onDetach()
- playerActivity = null
+ serviceActivity = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- playerActivity?.addMusicServiceEventListener(this)
+ serviceActivity?.addMusicServiceEventListener(this)
}
override fun onDestroyView() {
super.onDestroyView()
- playerActivity?.removeMusicServiceEventListener(this)
+ serviceActivity?.removeMusicServiceEventListener(this)
}
override fun onPlayingMetaChanged() {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt
index e2b499a00..8f067d478 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt
@@ -31,7 +31,7 @@ import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.ReloadType
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
-import code.name.monkey.retromusic.interfaces.PaletteColorHolder
+import code.name.monkey.retromusic.interfaces.IPaletteColorHolder
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.model.lyrics.Lyrics
import code.name.monkey.retromusic.repository.RealRepository
@@ -47,7 +47,7 @@ import org.koin.androidx.viewmodel.ext.android.sharedViewModel
import java.io.FileNotFoundException
abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMainActivityFragment(layout),
- Toolbar.OnMenuItemClickListener, PaletteColorHolder, PlayerAlbumCoverFragment.Callbacks {
+ Toolbar.OnMenuItemClickListener, IPaletteColorHolder, PlayerAlbumCoverFragment.Callbacks {
private var playerAlbumCoverFragment: PlayerAlbumCoverFragment? = null
protected val libraryViewModel by sharedViewModel()
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.java b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.java
index 4d5a0d099..329172b7f 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.java
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.java
@@ -21,6 +21,8 @@ import android.os.Bundle;
import android.os.Environment;
import android.text.Html;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@@ -41,6 +43,8 @@ import com.afollestad.materialcab.MaterialCab;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.snackbar.Snackbar;
+import org.jetbrains.annotations.NotNull;
+
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
@@ -59,9 +63,9 @@ import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment;
import code.name.monkey.retromusic.helper.MusicPlayerRemote;
import code.name.monkey.retromusic.helper.menu.SongMenuHelper;
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper;
-import code.name.monkey.retromusic.interfaces.CabHolder;
-import code.name.monkey.retromusic.interfaces.Callbacks;
-import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks;
+import code.name.monkey.retromusic.interfaces.ICabHolder;
+import code.name.monkey.retromusic.interfaces.ICallbacks;
+import code.name.monkey.retromusic.interfaces.IMainActivityFragmentCallbacks;
import code.name.monkey.retromusic.misc.DialogAsyncTask;
import code.name.monkey.retromusic.misc.UpdateToastMediaScannerCompletionListener;
import code.name.monkey.retromusic.misc.WrappedAsyncTaskLoader;
@@ -76,10 +80,10 @@ import code.name.monkey.retromusic.views.ScrollingViewOnApplyWindowInsetsListene
import me.zhanghai.android.fastscroll.FastScroller;
public class FoldersFragment extends AbsMainActivityFragment implements
- MainActivityFragmentCallbacks,
- CabHolder,
+ IMainActivityFragmentCallbacks,
+ ICabHolder,
BreadCrumbLayout.SelectionCallback,
- Callbacks,
+ ICallbacks,
LoaderManager.LoaderCallbacks> {
public static final String TAG = FoldersFragment.class.getSimpleName();
@@ -137,6 +141,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements
}
}
+
@NonNull
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@@ -159,13 +164,12 @@ public class FoldersFragment extends AbsMainActivityFragment implements
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
-
+ setHasOptionsMenu(true);
if (savedInstanceState == null) {
- //noinspection ConstantConditions
setCrumb(new BreadCrumbLayout.Crumb(FileUtil.safeGetCanonicalFile(PreferenceUtil.INSTANCE.getStartDirectory())), true);
} else {
breadCrumbs.restoreFromStateWrapper(savedInstanceState.getParcelable(CRUMBS));
- getLoaderManager().initLoader(LOADER_ID, null, this);
+ LoaderManager.getInstance(this).initLoader(LOADER_ID, null, this);
}
}
@@ -181,7 +185,6 @@ public class FoldersFragment extends AbsMainActivityFragment implements
if (breadCrumbs != null) {
outState.putParcelable(CRUMBS, breadCrumbs.getStateWrapper());
}
-
}
@Override
@@ -209,7 +212,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements
}
@Override
- public void onFileMenuClicked(final File file, View view) {
+ public void onFileMenuClicked(final File file, @NotNull View view) {
PopupMenu popupMenu = new PopupMenu(getActivity(), view);
if (file.isDirectory()) {
popupMenu.inflate(R.menu.menu_item_directory);
@@ -222,7 +225,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements
case R.id.action_delete_from_device:
new ListSongsAsyncTask(getActivity(), null, (songs, extra) -> {
if (!songs.isEmpty()) {
- SongsMenuHelper.INSTANCE.handleMenuClick(getActivity(), songs, itemId);
+ SongsMenuHelper.INSTANCE.handleMenuClick(requireActivity(), songs, itemId);
}
}).execute(new ListSongsAsyncTask.LoadingInfo(toList(file), AUDIO_FILE_FILTER,
getFileComparator()));
@@ -256,7 +259,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements
case R.id.action_set_as_ringtone:
case R.id.action_delete_from_device:
new ListSongsAsyncTask(getActivity(), null,
- (songs, extra) -> SongMenuHelper.INSTANCE.handleMenuClick(getActivity(),
+ (songs, extra) -> SongMenuHelper.INSTANCE.handleMenuClick(requireActivity(),
songs.get(0), itemId))
.execute(new ListSongsAsyncTask.LoadingInfo(toList(file), AUDIO_FILE_FILTER,
getFileComparator()));
@@ -273,7 +276,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements
}
@Override
- public void onFileSelected(File file) {
+ public void onFileSelected(@NotNull File file) {
file = tryGetCanonicalFile(file); // important as we compare the path value later
if (file.isDirectory()) {
setCrumb(new BreadCrumbLayout.Crumb(file), true);
@@ -319,13 +322,23 @@ public class FoldersFragment extends AbsMainActivityFragment implements
}
@Override
- public void onMultipleItemAction(MenuItem item, ArrayList files) {
+ public void onMultipleItemAction(MenuItem item, @NotNull ArrayList files) {
final int itemId = item.getItemId();
new ListSongsAsyncTask(getActivity(), null,
- (songs, extra) -> SongsMenuHelper.INSTANCE.handleMenuClick(getActivity(), songs, itemId))
+ (songs, extra) -> SongsMenuHelper.INSTANCE.handleMenuClick(requireActivity(), songs, itemId))
.execute(new ListSongsAsyncTask.LoadingInfo(files, AUDIO_FILE_FILTER, getFileComparator()));
}
+ @Override
+ public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
+ super.onCreateOptionsMenu(menu, inflater);
+ menu.add(0, R.id.action_scan, 0, R.string.scan_media).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+ menu.add(0, R.id.action_go_to_start_directory, 1, R.string.action_go_to_start_directory).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+ menu.removeItem(R.id.action_grid_size);
+ menu.removeItem(R.id.action_layout_type);
+ menu.removeItem(R.id.action_sort_order);
+ }
+
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
@@ -360,7 +373,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements
@NonNull
@Override
- public MaterialCab openCab(int menuRes, MaterialCab.Callback callback) {
+ public MaterialCab openCab(int menuRes, @NotNull MaterialCab.Callback callback) {
if (cab != null && cab.isActive()) {
cab.finish();
}
@@ -438,7 +451,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements
if (addToHistory) {
breadCrumbs.addHistory(crumb);
}
- getLoaderManager().restartLoader(LOADER_ID, null, this);
+ LoaderManager.getInstance(this).restartLoader(LOADER_ID, null, this);
}
private void setUpAdapter() {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreDetailsViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreDetailsViewModel.kt
index 7641784cd..ceb419d83 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreDetailsViewModel.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/genres/GenreDetailsViewModel.kt
@@ -4,7 +4,7 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import code.name.monkey.retromusic.interfaces.MusicServiceEventListener
+import code.name.monkey.retromusic.interfaces.IMusicServiceEventListener
import code.name.monkey.retromusic.model.Genre
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.repository.RealRepository
@@ -15,7 +15,7 @@ import kotlinx.coroutines.withContext
class GenreDetailsViewModel(
private val realRepository: RealRepository,
private val genre: Genre
-) : ViewModel(), MusicServiceEventListener {
+) : ViewModel(), IMusicServiceEventListener {
private val _playListSongs = MutableLiveData>()
private val _genre = MutableLiveData().apply {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt
index 545f06c40..818f52aa7 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt
@@ -19,7 +19,6 @@ import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.state.NowPlayingPanelState
import kotlinx.android.synthetic.main.fragment_library.*
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
-import java.lang.String
class LibraryFragment : AbsMainActivityFragment(R.layout.fragment_library) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/NowPlayingPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/NowPlayingPlayerFragment.kt
deleted file mode 100644
index 3de375140..000000000
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/NowPlayingPlayerFragment.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-package code.name.monkey.retromusic.fragments.player
-
-import android.os.Bundle
-import androidx.fragment.app.Fragment
-import androidx.navigation.NavController
-import code.name.monkey.retromusic.R
-import code.name.monkey.retromusic.extensions.findNavController
-import code.name.monkey.retromusic.fragments.NowPlayingScreen.*
-import code.name.monkey.retromusic.util.PreferenceUtil
-
-class NowPlayingPlayerFragment : Fragment(R.layout.fragment_now_playing_player) {
- companion object {
- const val TAG = "NowPlaying"
- }
-
- override fun onActivityCreated(savedInstanceState: Bundle?) {
- super.onActivityCreated(savedInstanceState)
- val navController = findNavController(R.id.playerFragmentContainer)
- updateNowPlaying(navController)
- }
-
- private fun updateNowPlaying(navController: NavController) {
- when (PreferenceUtil.nowPlayingScreen) {
- Adaptive -> navController.navigate(R.id.adaptiveFragment)
- Blur -> navController.navigate(R.id.blurPlayerFragment)
- BlurCard -> navController.navigate(R.id.cardBlurFragment)
- Card -> navController.navigate(R.id.cardFragment)
- Circle -> navController.navigate(R.id.circlePlayerFragment)
- Classic -> navController.navigate(R.id.classicPlayerFragment)
- Color -> navController.navigate(R.id.colorFragment)
- Fit -> navController.navigate(R.id.fitFragment)
- Flat -> navController.navigate(R.id.flatPlayerFragment)
- Full -> navController.navigate(R.id.fullPlayerFragment)
- Gradient -> navController.navigate(R.id.gradientPlayerFragment)
- Material -> navController.navigate(R.id.materialFragment)
- Plain -> navController.navigate(R.id.plainPlayerFragment)
- Simple -> navController.navigate(R.id.simplePlayerFragment)
- Tiny -> navController.navigate(R.id.tinyPlayerFragment)
- else -> navController.navigate(R.id.playerFragment)
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt
index ef3b3b5c4..ab8d70e72 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt
@@ -37,7 +37,7 @@ class ColorFragment : AbsPlayerFragment(R.layout.fragment_color_player) {
navigationColor = color.backgroundColor
colorGradientBackground?.setBackgroundColor(color.backgroundColor)
- playerActivity?.setLightNavigationBar(ColorUtil.isColorLight(color.backgroundColor))
+ serviceActivity?.setLightNavigationBar(ColorUtil.isColorLight(color.backgroundColor))
Handler().post {
ToolbarContentTintHelper.colorizeToolbar(
playerToolbar,
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlayerFragment.kt
index 9a2f23c38..f68d538aa 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlayerFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlayerFragment.kt
@@ -8,7 +8,6 @@ import android.widget.FrameLayout
import android.widget.TextView
import androidx.appcompat.widget.Toolbar
import androidx.core.os.bundleOf
-import androidx.lifecycle.lifecycleScope
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import code.name.monkey.retromusic.EXTRA_ARTIST_ID
import code.name.monkey.retromusic.R
@@ -25,18 +24,12 @@ import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.model.lyrics.AbsSynchronizedLyrics
import code.name.monkey.retromusic.model.lyrics.Lyrics
-import code.name.monkey.retromusic.repository.ArtistRepository
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.fragment_full.*
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
-import org.koin.android.ext.android.inject
class FullPlayerFragment : AbsPlayerFragment(R.layout.fragment_full),
MusicProgressViewUpdateHelper.Callback {
- private val artistRepository by inject()
private lateinit var lyricsLayout: FrameLayout
private lateinit var lyricsLine1: TextView
private lateinit var lyricsLine2: TextView
@@ -222,9 +215,8 @@ class FullPlayerFragment : AbsPlayerFragment(R.layout.fragment_full),
}
private fun updateArtistImage() {
- lifecycleScope.launch {
- val artist = artistRepository.artist(MusicPlayerRemote.currentSong.artistId)
- withContext(Dispatchers.Main) {
+ libraryViewModel.artist(MusicPlayerRemote.currentSong.artistId)
+ .observe(viewLifecycleOwner, { artist ->
ArtistGlideRequest.Builder.from(Glide.with(requireContext()), artist)
.generatePalette(requireContext())
.build()
@@ -233,8 +225,8 @@ class FullPlayerFragment : AbsPlayerFragment(R.layout.fragment_full),
}
})
- }
- }
+ })
+
}
override fun onQueueChanged() {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt
index ac498b4e2..d35a90718 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsViewModel.kt
@@ -5,14 +5,14 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import code.name.monkey.retromusic.db.PlaylistWithSongs
import code.name.monkey.retromusic.db.SongEntity
-import code.name.monkey.retromusic.interfaces.MusicServiceEventListener
+import code.name.monkey.retromusic.interfaces.IMusicServiceEventListener
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.repository.RealRepository
class PlaylistDetailsViewModel(
private val realRepository: RealRepository,
private var playlist: PlaylistWithSongs
-) : ViewModel(), MusicServiceEventListener {
+) : ViewModel(), IMusicServiceEventListener {
private val _playListSongs = MutableLiveData>()
private val _playlist = MutableLiveData().apply {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
index 14fdc80e9..f2dd37a34 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
@@ -12,20 +12,19 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat.getSystemService
import androidx.core.view.isGone
import androidx.core.view.isVisible
-import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.transition.TransitionManager
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.SearchAdapter
import code.name.monkey.retromusic.extensions.accentColor
+import code.name.monkey.retromusic.extensions.dipToPix
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.state.NowPlayingPanelState
import com.google.android.material.textfield.TextInputEditText
import kotlinx.android.synthetic.main.fragment_search.*
-import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
import java.util.*
import kotlin.collections.ArrayList
@@ -37,38 +36,37 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa
}
private val libraryViewModel by sharedViewModel()
- private val viewModel: SearchViewModel by inject()
private lateinit var searchAdapter: SearchAdapter
private var query: String? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- mainActivity.setSupportActionBar(toolbar)
libraryViewModel.setPanelState(NowPlayingPanelState.COLLAPSED_WITHOUT)
+ mainActivity.setSupportActionBar(toolbar)
+ libraryViewModel.clearSearchResult();
setupRecyclerView()
- keyboardPopup.accentColor()
searchView.addTextChangedListener(this)
voiceSearch.setOnClickListener { startMicSearch() }
clearText.setOnClickListener { searchView.clearText() }
- keyboardPopup.setOnClickListener {
- val inputManager =
- getSystemService(
+ keyboardPopup.apply {
+ accentColor()
+ setOnClickListener {
+ val inputManager = getSystemService(
requireContext(),
InputMethodManager::class.java
)
- inputManager?.showSoftInput(searchView, InputMethodManager.SHOW_IMPLICIT)
+ inputManager?.showSoftInput(searchView, InputMethodManager.SHOW_IMPLICIT)
+ }
}
-
if (savedInstanceState != null) {
query = savedInstanceState.getString(QUERY)
}
-
- viewModel.getSearchResult().observe(viewLifecycleOwner, Observer {
+ libraryViewModel.getSearchResult().observe(viewLifecycleOwner, {
showData(it)
})
}
- private fun showData(data: MutableList) {
+ private fun showData(data: List) {
if (data.isNotEmpty()) {
searchAdapter.swapDataSet(data)
} else {
@@ -83,6 +81,8 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa
override fun onChanged() {
super.onChanged()
empty.isVisible = searchAdapter.itemCount < 1
+ val height = dipToPix(52f)
+ recyclerView.setPadding(0, 0, 0, height.toInt())
}
})
recyclerView.apply {
@@ -118,7 +118,7 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa
TransitionManager.beginDelayedTransition(appBarLayout)
voiceSearch.isGone = query.isNotEmpty()
clearText.isVisible = query.isNotEmpty()
- viewModel.search(query)
+ libraryViewModel.search(query)
}
private fun startMicSearch() {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchViewModel.kt
deleted file mode 100644
index adeb09c89..000000000
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchViewModel.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package code.name.monkey.retromusic.fragments.search
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.viewModelScope
-import code.name.monkey.retromusic.repository.RealRepository
-import kotlinx.coroutines.Dispatchers.IO
-import kotlinx.coroutines.launch
-
-class SearchViewModel(private val realRepository: RealRepository) : ViewModel() {
- private val results = MutableLiveData>()
-
- fun getSearchResult(): LiveData> = results
-
- fun search(query: String?) = viewModelScope.launch(IO) {
- val result = realRepository.search(query)
- results.postValue(result)
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt b/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt
index 07e590a6c..ac161880c 100644
--- a/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt
@@ -30,7 +30,7 @@ import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog
import code.name.monkey.retromusic.dialogs.DeleteSongsDialog
import code.name.monkey.retromusic.dialogs.SongDetailDialog
import code.name.monkey.retromusic.helper.MusicPlayerRemote
-import code.name.monkey.retromusic.interfaces.PaletteColorHolder
+import code.name.monkey.retromusic.interfaces.IPaletteColorHolder
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.repository.RealRepository
import code.name.monkey.retromusic.util.MusicUtil
@@ -90,10 +90,10 @@ object SongMenuHelper : KoinComponent {
R.id.action_tag_editor -> {
val tagEditorIntent = Intent(activity, SongTagEditorActivity::class.java)
tagEditorIntent.putExtra(AbsTagEditorActivity.EXTRA_ID, song.id)
- if (activity is PaletteColorHolder)
+ if (activity is IPaletteColorHolder)
tagEditorIntent.putExtra(
AbsTagEditorActivity.EXTRA_PALETTE,
- (activity as PaletteColorHolder).paletteColor
+ (activity as IPaletteColorHolder).paletteColor
)
activity.startActivity(tagEditorIntent)
return true
diff --git a/app/src/main/java/code/name/monkey/retromusic/interfaces/CabHolder.kt b/app/src/main/java/code/name/monkey/retromusic/interfaces/ICabHolder.kt
similarity index 97%
rename from app/src/main/java/code/name/monkey/retromusic/interfaces/CabHolder.kt
rename to app/src/main/java/code/name/monkey/retromusic/interfaces/ICabHolder.kt
index 95bb43618..c444933c3 100644
--- a/app/src/main/java/code/name/monkey/retromusic/interfaces/CabHolder.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/interfaces/ICabHolder.kt
@@ -17,7 +17,7 @@ package code.name.monkey.retromusic.interfaces
import com.afollestad.materialcab.MaterialCab
-interface CabHolder {
+interface ICabHolder {
fun openCab(menuRes: Int, callback: MaterialCab.Callback): MaterialCab
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/interfaces/Callbacks.kt b/app/src/main/java/code/name/monkey/retromusic/interfaces/ICallbacks.kt
similarity index 92%
rename from app/src/main/java/code/name/monkey/retromusic/interfaces/Callbacks.kt
rename to app/src/main/java/code/name/monkey/retromusic/interfaces/ICallbacks.kt
index 998e23d78..205970f40 100644
--- a/app/src/main/java/code/name/monkey/retromusic/interfaces/Callbacks.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/interfaces/ICallbacks.kt
@@ -4,7 +4,7 @@ import android.view.MenuItem
import android.view.View
import java.io.File
-interface Callbacks {
+interface ICallbacks {
fun onFileSelected(file: File)
fun onFileMenuClicked(file: File, view: View)
diff --git a/app/src/main/java/code/name/monkey/retromusic/interfaces/MainActivityFragmentCallbacks.kt b/app/src/main/java/code/name/monkey/retromusic/interfaces/IMainActivityFragmentCallbacks.kt
similarity index 93%
rename from app/src/main/java/code/name/monkey/retromusic/interfaces/MainActivityFragmentCallbacks.kt
rename to app/src/main/java/code/name/monkey/retromusic/interfaces/IMainActivityFragmentCallbacks.kt
index 454d36087..034040143 100644
--- a/app/src/main/java/code/name/monkey/retromusic/interfaces/MainActivityFragmentCallbacks.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/interfaces/IMainActivityFragmentCallbacks.kt
@@ -16,6 +16,6 @@ package code.name.monkey.retromusic.interfaces
/**
* Created by hemanths on 14/08/17.
*/
-internal interface MainActivityFragmentCallbacks {
+interface IMainActivityFragmentCallbacks {
fun handleBackPress(): Boolean
}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/interfaces/MusicServiceEventListener.kt b/app/src/main/java/code/name/monkey/retromusic/interfaces/IMusicServiceEventListener.kt
similarity index 95%
rename from app/src/main/java/code/name/monkey/retromusic/interfaces/MusicServiceEventListener.kt
rename to app/src/main/java/code/name/monkey/retromusic/interfaces/IMusicServiceEventListener.kt
index a62e7ab76..15e7a0399 100644
--- a/app/src/main/java/code/name/monkey/retromusic/interfaces/MusicServiceEventListener.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/interfaces/IMusicServiceEventListener.kt
@@ -15,7 +15,7 @@
package code.name.monkey.retromusic.interfaces
-interface MusicServiceEventListener {
+interface IMusicServiceEventListener {
fun onServiceConnected()
fun onServiceDisconnected()
diff --git a/app/src/main/java/code/name/monkey/retromusic/interfaces/PaletteColorHolder.kt b/app/src/main/java/code/name/monkey/retromusic/interfaces/IPaletteColorHolder.kt
similarity index 95%
rename from app/src/main/java/code/name/monkey/retromusic/interfaces/PaletteColorHolder.kt
rename to app/src/main/java/code/name/monkey/retromusic/interfaces/IPaletteColorHolder.kt
index 31d417cbe..e05349738 100644
--- a/app/src/main/java/code/name/monkey/retromusic/interfaces/PaletteColorHolder.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/interfaces/IPaletteColorHolder.kt
@@ -17,6 +17,6 @@ package code.name.monkey.retromusic.interfaces
/**
* @author Aidan Follestad (afollestad)
*/
-interface PaletteColorHolder {
+interface IPaletteColorHolder {
val paletteColor: Int
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/GenreRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/GenreRepository.kt
index 34ce19808..948190438 100644
--- a/app/src/main/java/code/name/monkey/retromusic/repository/GenreRepository.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/repository/GenreRepository.kt
@@ -24,6 +24,7 @@ import code.name.monkey.retromusic.Constants.IS_MUSIC
import code.name.monkey.retromusic.Constants.baseProjection
import code.name.monkey.retromusic.extensions.getLong
import code.name.monkey.retromusic.extensions.getString
+import code.name.monkey.retromusic.extensions.getStringOrNull
import code.name.monkey.retromusic.model.Genre
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PreferenceUtil
@@ -53,9 +54,9 @@ class RealGenreRepository(
private fun getGenreFromCursor(cursor: Cursor): Genre {
val id = cursor.getLong(Genres._ID)
- val name = cursor.getString(Genres.NAME)
+ val name = cursor.getStringOrNull(Genres.NAME)
val songCount = songs(id).size
- return Genre(id, name, songCount)
+ return Genre(id, name ?: "", songCount)
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PlaylistsUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/PlaylistsUtil.java
index cfff22d35..14ee82bd7 100644
--- a/app/src/main/java/code/name/monkey/retromusic/util/PlaylistsUtil.java
+++ b/app/src/main/java/code/name/monkey/retromusic/util/PlaylistsUtil.java
@@ -251,7 +251,7 @@ public class PlaylistsUtil {
return M3UWriter.write(new File(Environment.getExternalStorageDirectory(), "Playlists"), playlist);
}
- public static File savePlaylistWithSongs(Context context, PlaylistWithSongs playlist) throws IOException {
+ public static File savePlaylistWithSongs(PlaylistWithSongs playlist) throws IOException {
return M3UWriter.writeIO(new File(Environment.getExternalStorageDirectory(), "Playlists"), playlist);
}
diff --git a/app/src/main/res/layout/fragment_now_playing_player.xml b/app/src/main/res/layout/fragment_now_playing_player.xml
deleted file mode 100644
index 2b7ec4529..000000000
--- a/app/src/main/res/layout/fragment_now_playing_player.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/sliding_music_panel_layout.xml b/app/src/main/res/layout/sliding_music_panel_layout.xml
index 27f64d37e..43dfbd3cb 100644
--- a/app/src/main/res/layout/sliding_music_panel_layout.xml
+++ b/app/src/main/res/layout/sliding_music_panel_layout.xml
@@ -21,9 +21,8 @@
app:behavior_peekHeight="0dp"
app:layout_behavior="code.name.monkey.retromusic.RetroBottomSheetBehavior">
-
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
index 83b9ea939..fc06a2b58 100644
--- a/app/src/main/res/menu/menu_main.xml
+++ b/app/src/main/res/menu/menu_main.xml
@@ -90,6 +90,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
From caefbbbbadda969d2bff6b9dee69316f3586f4df Mon Sep 17 00:00:00 2001
From: Hemanth S
Date: Thu, 24 Sep 2020 02:40:16 +0530
Subject: [PATCH 15/72] Fixed peak theme
---
.../base/AbsSlidingMusicPanelActivity.kt | 51 ++++++++-----------
.../retromusic/fragments/NowPlayingScreen.kt | 2 +-
.../res/layout/sliding_music_panel_layout.xml | 9 +++-
3 files changed, 30 insertions(+), 32 deletions(-)
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt
index 638118361..fd58e7b7c 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt
@@ -16,6 +16,7 @@ import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.RetroBottomSheetBehavior
import code.name.monkey.retromusic.extensions.hide
+import code.name.monkey.retromusic.extensions.show
import code.name.monkey.retromusic.extensions.whichFragment
import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.MiniPlayerFragment
@@ -34,6 +35,7 @@ import code.name.monkey.retromusic.fragments.player.full.FullPlayerFragment
import code.name.monkey.retromusic.fragments.player.gradient.GradientPlayerFragment
import code.name.monkey.retromusic.fragments.player.material.MaterialFragment
import code.name.monkey.retromusic.fragments.player.normal.PlayerFragment
+import code.name.monkey.retromusic.fragments.player.peak.PeakPlayerFragment
import code.name.monkey.retromusic.fragments.player.plain.PlainPlayerFragment
import code.name.monkey.retromusic.fragments.player.simple.SimplePlayerFragment
import code.name.monkey.retromusic.fragments.player.tiny.TinyPlayerFragment
@@ -68,6 +70,8 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
override fun onSlide(bottomSheet: View, slideOffset: Float) {
setMiniPlayerAlphaProgress(slideOffset)
+ dimBackground.show()
+ dimBackground.alpha = slideOffset
}
override fun onStateChanged(bottomSheet: View, newState: Int) {
@@ -77,6 +81,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
}
STATE_COLLAPSED -> {
onPanelCollapsed()
+ dimBackground.hide()
}
else -> {
println("Do something")
@@ -85,6 +90,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
}
}
+ fun getBottomSheetBehavior() = bottomSheetBehavior
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -94,11 +100,14 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
setupBottomSheet()
updatePanelState()
updateColor()
+
+ val themeColor = ATHUtil.resolveColor(this, android.R.attr.windowBackground, Color.GRAY)
+ dimBackground.setBackgroundColor(ColorUtil.withAlpha(themeColor, 0.5f))
+ dimBackground.setOnClickListener {
+ libraryViewModel.setPanelState(COLLAPSED_WITH)
+ }
}
-
- fun getBottomSheetBehavior() = bottomSheetBehavior
-
private fun setupBottomSheet() {
bottomSheetBehavior = from(slidingPanel) as RetroBottomSheetBehavior
bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallbackList)
@@ -158,6 +167,11 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
slidingPanel.viewTreeObserver.removeOnGlobalLayoutListener(this)
+ if (nowPlayingScreen != Peak) {
+ val params = slidingPanel.layoutParams as ViewGroup.LayoutParams
+ params.height = ViewGroup.LayoutParams.MATCH_PARENT
+ slidingPanel.layoutParams = params
+ }
when (panelState) {
STATE_EXPANDED -> onPanelExpanded()
STATE_COLLAPSED -> onPanelCollapsed()
@@ -173,31 +187,6 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
return bottomNavigationView
}
- fun hideBottomBarVisibility(visible: Boolean) {
- bottomNavigationView.isVisible = visible
- hideBottomBar(MusicPlayerRemote.playingQueue.isEmpty())
- }
-
- private fun hideBottomBar(hide: Boolean) {
- val heightOfBar = bottomNavigationView.height
- val isBottomBarVisible = bottomNavigationView.isVisible
-
- if (hide) {
- bottomSheetBehavior.isHideable = true
- bottomSheetBehavior.peekHeight = 0
- collapsePanel()
- ViewCompat.setElevation(slidingPanel, 0f)
- ViewCompat.setElevation(bottomNavigationView, 10f)
- } else {
- ViewCompat.setElevation(bottomNavigationView, 10f)
- ViewCompat.setElevation(slidingPanel, 10f)
- bottomSheetBehavior.isHideable = false
- bottomSheetBehavior.peekHeight =
- (if (isBottomBarVisible) heightOfBar * 2 else heightOfBar) - 24
- }
- }
-
-
override fun onServiceConnected() {
super.onServiceConnected()
if (MusicPlayerRemote.playingQueue.isNotEmpty()) {
@@ -379,6 +368,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
}
})
}
+
private var playerFragment: AbsPlayerFragment? = null
private fun chooseFragmentForTheme() {
nowPlayingScreen = PreferenceUtil.nowPlayingScreen
@@ -398,7 +388,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
Color -> ColorFragment()
Gradient -> GradientPlayerFragment()
Tiny -> TinyPlayerFragment()
- //PEAK -> PeakPlayerFragment()
+ Peak -> PeakPlayerFragment()
Circle -> CirclePlayerFragment()
else -> PlayerFragment()
} // must implement AbsPlayerFragment
@@ -406,7 +396,8 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
.commit()
supportFragmentManager.executePendingTransactions()
- playerFragment = supportFragmentManager.findFragmentById(R.id.playerFragmentContainer) as AbsPlayerFragment
+ playerFragment =
+ supportFragmentManager.findFragmentById(R.id.playerFragmentContainer) as AbsPlayerFragment
miniPlayerFragment = whichFragment(R.id.miniPlayerFragment)
miniPlayerFragment?.view?.setOnClickListener { expandPanel() }
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/NowPlayingScreen.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/NowPlayingScreen.kt
index 19e085222..522a93291 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/NowPlayingScreen.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/NowPlayingScreen.kt
@@ -24,7 +24,7 @@ enum class NowPlayingScreen constructor(
Gradient(R.string.gradient, R.drawable.np_gradient, 17),
Material(R.string.material, R.drawable.np_material, 11),
Normal(R.string.normal, R.drawable.np_normal, 0),
- //Peak(R.string.peak, R.drawable.np_peak, 14),
+ Peak(R.string.peak, R.drawable.np_peak, 14),
Plain(R.string.plain, R.drawable.np_plain, 3),
Simple(R.string.simple, R.drawable.np_simple, 8),
Tiny(R.string.tiny, R.drawable.np_tiny, 7),
diff --git a/app/src/main/res/layout/sliding_music_panel_layout.xml b/app/src/main/res/layout/sliding_music_panel_layout.xml
index 43dfbd3cb..5a9078614 100644
--- a/app/src/main/res/layout/sliding_music_panel_layout.xml
+++ b/app/src/main/res/layout/sliding_music_panel_layout.xml
@@ -11,12 +11,19 @@
android:layout_width="match_parent"
android:layout_height="match_parent" />
+
From 40da78af8bf5331f234d061c4b699d18227f596f Mon Sep 17 00:00:00 2001
From: Hemanth S
Date: Thu, 24 Sep 2020 04:19:05 +0530
Subject: [PATCH 16/72] Update Code
rolled back to old Icon
Updated pro gaurd rules
---
app/build.gradle | 4 ++--
app/proguard-rules.pro | 9 ++++++++-
app/src/main/ic_launcher-playstore.png | Bin 51780 -> 22855 bytes
.../monkey/retromusic/lyrics/LrcView.java | 7 ++++---
.../retromusic/repository/SongRepository.kt | 7 ++++++-
app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 5096 -> 3517 bytes
.../mipmap-hdpi/ic_launcher_foreground.png | Bin 6059 -> 2256 bytes
.../res/mipmap-hdpi/ic_launcher_round.png | Bin 5096 -> 3517 bytes
app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2974 -> 2205 bytes
.../mipmap-mdpi/ic_launcher_foreground.png | Bin 3461 -> 1394 bytes
.../res/mipmap-mdpi/ic_launcher_round.png | Bin 2974 -> 2205 bytes
app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 7622 -> 5189 bytes
.../mipmap-xhdpi/ic_launcher_foreground.png | Bin 9034 -> 3273 bytes
.../res/mipmap-xhdpi/ic_launcher_round.png | Bin 7622 -> 5189 bytes
.../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 12857 -> 8281 bytes
.../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 16055 -> 5716 bytes
.../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 12857 -> 8281 bytes
.../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 19153 -> 11968 bytes
.../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 23877 -> 8527 bytes
.../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 19153 -> 11968 bytes
gradle.properties | 2 +-
21 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index a75cecfd9..dd90ecf6e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -16,8 +16,8 @@ android {
vectorDrawables.useSupportLibrary = true
applicationId "code.name.monkey.retromusic"
- versionCode 10438
- versionName '3.5.650' + "_" + getDate()
+ versionCode 10442
+ versionName '3.6.000_hot_fix' + "_" + getDate()
multiDexEnabled true
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index a7f474df0..950e401f8 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -51,4 +51,11 @@
# native *** n*(...);
#}
-#-keep class org.jaudiotagger.** { *; }
\ No newline at end of file
+#-keep class org.jaudiotagger.** { *; }
+-keepclassmembers enum * { *; }
+-keepattributes *Annotation*, Signature, Exception
+-keepnames class androidx.navigation.fragment.NavHostFragment
+-keepnames class code.name.monkey.retromusic.model.Home
+-keep class * extends androidx.fragment.app.Fragment{}
+-keepnames class * extends android.os.Parcelable
+-keepnames class * extends java.io.Serializable
\ No newline at end of file
diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png
index a4a872d3443def0ad45eafc7ef0a11464ad9bc26..9fdd702524da1c8b0b57e5f44cef3f4892fa3908 100644
GIT binary patch
literal 22855
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
V3dS@_LI#w)9B}u+J=zm`@n59HOz!{y
literal 51780
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