From 7c66bc7ec8c3fffa8a6b62e50d2ee2bf95d0087a Mon Sep 17 00:00:00 2001 From: Nite Date: Fri, 15 Oct 2021 16:26:06 +0200 Subject: [PATCH] Implemented navigation header coloring based on selected server --- ultrasonic/build.gradle | 2 +- .../ultrasonic/activity/NavigationActivity.kt | 48 +++++++++++++++---- .../filepicker/FilePickerAdapter.kt | 23 +++------ .../ultrasonic/imageloader/BitmapUtils.kt | 8 ---- .../org/moire/ultrasonic/util/ServerColor.kt | 10 ++++ .../src/main/res/layout/navigation_header.xml | 30 ++++++++---- .../src/main/res/layout/server_edit.xml | 5 +- 7 files changed, 81 insertions(+), 45 deletions(-) diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index 665c987e..7835f863 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -49,7 +49,7 @@ android { baselineFile file("lint-baseline.xml") ignore 'MissingTranslation' warning 'ImpliedQuantity' - disable 'IconMissingDensityFolder' + disable 'IconMissingDensityFolder', "VectorPath" abortOnError true warningsAsErrors true } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt index 7226c3c4..f50ee015 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt @@ -3,6 +3,7 @@ package org.moire.ultrasonic.activity import android.app.AlertDialog import android.app.SearchManager import android.content.Intent +import android.content.res.ColorStateList import android.content.res.Resources import android.media.AudioManager import android.os.Bundle @@ -12,9 +13,11 @@ import android.view.KeyEvent import android.view.Menu import android.view.MenuItem import android.view.View -import android.widget.Button +import android.widget.ImageView +import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar +import androidx.core.content.ContextCompat import androidx.core.view.GravityCompat import androidx.drawerlayout.widget.DrawerLayout import androidx.fragment.app.FragmentContainerView @@ -27,6 +30,7 @@ import androidx.navigation.ui.onNavDestinationSelected import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupWithNavController import androidx.preference.PreferenceManager +import com.google.android.material.button.MaterialButton import com.google.android.material.navigation.NavigationView import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel @@ -46,6 +50,7 @@ import org.moire.ultrasonic.util.FileUtil import org.moire.ultrasonic.util.NowPlayingEventDistributor import org.moire.ultrasonic.util.NowPlayingEventListener import org.moire.ultrasonic.util.PermissionUtil +import org.moire.ultrasonic.util.ServerColor import org.moire.ultrasonic.util.Settings import org.moire.ultrasonic.util.SubsonicUncaughtExceptionHandler import org.moire.ultrasonic.util.ThemeChangedEventDistributor @@ -66,7 +71,10 @@ class NavigationActivity : AppCompatActivity() { private var navigationView: NavigationView? = null private var drawerLayout: DrawerLayout? = null private var host: NavHostFragment? = null - private var selectServerButton: Button? = null + private var selectServerButton: MaterialButton? = null + private var headerBackgroundImage: ImageView? = null + private var ultrasonicLogoImage: ImageView? = null + private var ultrasonicNameText: TextView? = null private lateinit var appBarConfiguration: AppBarConfiguration private lateinit var nowPlayingEventListener: NowPlayingEventListener @@ -189,17 +197,35 @@ class NavigationActivity : AppCompatActivity() { this, { count -> cachedServerCount = count ?: 0 - setSelectServerButtonText() + updateNavigationHeaderForServer() } ) - ActiveServerProvider.liveActiveServerId.observe(this, { setSelectServerButtonText() }) + ActiveServerProvider.liveActiveServerId.observe(this, { updateNavigationHeaderForServer() }) } - private fun setSelectServerButtonText() { - val activeServerName = activeServerProvider.getActiveServer().name + private fun updateNavigationHeaderForServer() { + val activeServer = activeServerProvider.getActiveServer() + if (cachedServerCount == 0) - selectServerButton?.text = getString(R.string.main_setup_server, activeServerName) - else selectServerButton?.text = activeServerName + selectServerButton?.text = getString(R.string.main_setup_server, activeServer.name) + else selectServerButton?.text = activeServer.name + + val foregroundColor = ServerColor.getForegroundColor(this, activeServer.color) + val backgroundColor = ServerColor.getBackgroundColor(this, activeServer.color) + + if (activeServer.index == 0) + selectServerButton?.icon = + ContextCompat.getDrawable(this, R.drawable.ic_menu_screen_on_off_dark) + else + selectServerButton?.icon = + ContextCompat.getDrawable(this, R.drawable.ic_menu_select_server_dark) + + selectServerButton?.iconTint = ColorStateList.valueOf(foregroundColor) + ultrasonicLogoImage?.imageTintList = ColorStateList.valueOf(foregroundColor) + + selectServerButton?.setTextColor(foregroundColor) + ultrasonicNameText?.setTextColor(foregroundColor) + headerBackgroundImage?.setBackgroundColor(backgroundColor) } override fun onResume() { @@ -260,6 +286,12 @@ class NavigationActivity : AppCompatActivity() { this.drawerLayout?.closeDrawer(GravityCompat.START) navController.navigate(R.id.serverSelectorFragment) } + headerBackgroundImage = + navigationView?.getHeaderView(0)?.findViewById(R.id.img_header_bg) + ultrasonicLogoImage = + navigationView?.getHeaderView(0)?.findViewById(R.id.img_profile) + ultrasonicNameText = + navigationView?.getHeaderView(0)?.findViewById(R.id.name) } private fun setupActionBar(navController: NavController, appBarConfig: AppBarConfiguration) { diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/filepicker/FilePickerAdapter.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/filepicker/FilePickerAdapter.kt index 91ff2c52..4174d63d 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/filepicker/FilePickerAdapter.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/filepicker/FilePickerAdapter.kt @@ -73,10 +73,8 @@ internal class FilePickerAdapter : RecyclerView.Adapter() var storages: List? = null var storagePaths: List? = null - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { - storages = context!!.getExternalFilesDirs(null).filterNotNull() - storagePaths = storages.map { i -> i.absolutePath } - } + storages = context!!.getExternalFilesDirs(null).filterNotNull() + storagePaths = storages.map { i -> i.absolutePath } if (currentDirectory.absolutePath == "/" || currentDirectory.absolutePath == "/storage" || @@ -84,13 +82,8 @@ internal class FilePickerAdapter : RecyclerView.Adapter= android.os.Build.VERSION_CODES.KITKAT - ) { + fileList = getKitKatStorageItems(storages!!) - } else { - getStorageItems() - } } else { isRealDirectory = true val files = currentDirectory.listFiles() @@ -129,14 +122,10 @@ internal class FilePickerAdapter : RecyclerView.Adapter= android.os.Build.VERSION_CODES.KITKAT) { - if (storagePaths!!.indexOf(currentDirectory.absolutePath) > 0) - data.add(0, FileListItem(File("/"), "..", upIcon!!)) - else - data.add(0, FileListItem(selectedDirectory.parentFile!!, "..", upIcon!!)) - } else { + if (storagePaths!!.indexOf(currentDirectory.absolutePath) > 0) + data.add(0, FileListItem(File("/"), "..", upIcon!!)) + else data.add(0, FileListItem(selectedDirectory.parentFile!!, "..", upIcon!!)) - } } notifyDataSetChanged() diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/BitmapUtils.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/BitmapUtils.kt index fddbec66..348e0e6f 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/BitmapUtils.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/BitmapUtils.kt @@ -65,10 +65,6 @@ class BitmapUtils { opt.inPreferQualityOverSpeed = true } - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - opt.inPurgeable = true - } - opt.inSampleSize = Util.calculateInSampleSize( opt, size, @@ -103,10 +99,6 @@ class BitmapUtils { opt.inPreferQualityOverSpeed = true } - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - opt.inPurgeable = true - } - opt.inSampleSize = Util.calculateInSampleSize( opt, size, diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/ServerColor.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/ServerColor.kt index eb3853cc..aa48f383 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/ServerColor.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/ServerColor.kt @@ -1,3 +1,10 @@ +/* + * ServerColor.kt + * Copyright (C) 2009-2021 Ultrasonic developers + * + * Distributed under terms of the GNU GPLv3 license. + */ + package org.moire.ultrasonic.util import android.content.Context @@ -7,6 +14,9 @@ import org.moire.ultrasonic.R private const val LUMINANCE_LIMIT = 0.25 +/** + * Contains functions for computing server display colors + */ object ServerColor { fun getBackgroundColor(context: Context, serverColor: Int?): Int { return serverColor ?: ContextCompat.getColor( diff --git a/ultrasonic/src/main/res/layout/navigation_header.xml b/ultrasonic/src/main/res/layout/navigation_header.xml index bc57c726..c5f9c9fd 100644 --- a/ultrasonic/src/main/res/layout/navigation_header.xml +++ b/ultrasonic/src/main/res/layout/navigation_header.xml @@ -2,6 +2,7 @@ + app:layout_constraintTop_toTopOf="parent" + tools:ignore="ContentDescription" /> + app:layout_constraintTop_toTopOf="parent" + tools:ignore="ContentDescription" /> @@ -53,16 +56,25 @@ a:textSize="14sp" app:icon="@drawable/ic_menu_select_server_dark" app:iconPadding="16dp" - app:iconTint="?attr/colorOnPrimary" - a:paddingTop="16dp" - a:paddingBottom="16dp" - a:paddingStart="22dp" - a:paddingEnd="22dp" + a:paddingHorizontal="22dp" + a:paddingTop="14dp" + a:paddingBottom="14dp" a:text="@string/main.offline" a:textColor="?attr/colorOnPrimary" a:background="@drawable/default_ripple" + tools:iconTint="@color/selected_menu_dark" + tools:textColor="@color/selected_menu_dark" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/img_profile" /> + + \ No newline at end of file diff --git a/ultrasonic/src/main/res/layout/server_edit.xml b/ultrasonic/src/main/res/layout/server_edit.xml index 289b371c..6727d7f9 100644 --- a/ultrasonic/src/main/res/layout/server_edit.xml +++ b/ultrasonic/src/main/res/layout/server_edit.xml @@ -1,9 +1,10 @@ + a:fillViewport="true"> + tools:ignore="ContentDescription" />