From 8f850f22882ffcd0338bb2e379b01d9862b03062 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Tue, 1 Sep 2020 07:37:49 -0600 Subject: [PATCH] Add theming system Standardize theming across the app into ThemeUtils. --- app/src/main/AndroidManifest.xml | 2 +- .../java/org/oxycblt/auxio/MainActivity.kt | 13 ++- .../java/org/oxycblt/auxio/MainFragment.kt | 17 ++- .../oxycblt/auxio/recycler/RecyclerUtils.kt | 8 +- .../org/oxycblt/auxio/theme/ThemeUtils.kt | 34 +++++- app/src/main/res/drawable/indicator.xml | 2 +- app/src/main/res/layout/fragment_library.xml | 3 +- app/src/main/res/layout/fragment_loading.xml | 10 +- app/src/main/res/layout/fragment_main.xml | 1 + app/src/main/res/layout/fragment_songs.xml | 2 +- app/src/main/res/values/dimens.xml | 2 +- app/src/main/res/values/styles.xml | 7 +- app/src/main/res/values/themes.xml | 102 ++++++++++++++++++ 13 files changed, 171 insertions(+), 32 deletions(-) create mode 100644 app/src/main/res/values/themes.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7e8d5f311..f82214a58 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,7 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/BaseTheme"> + android:theme="@style/Theme.Base"> diff --git a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt index 6c3992607..27f44b1f5 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt @@ -1,16 +1,27 @@ package org.oxycblt.auxio +import android.content.Context import android.os.Bundle +import android.util.AttributeSet import android.util.Log +import android.view.View import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.app.AppCompatDelegate +import org.oxycblt.auxio.theme.accent class MainActivity : AppCompatActivity() { + override fun onCreateView(name: String, context: Context, attrs: AttributeSet): View? { + setTheme(accent.second) + + return super.onCreateView(name, context, attrs) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - // AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) Log.d(this::class.simpleName, "Activity Created.") } diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index d9cecbd49..bd634358e 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -15,8 +15,9 @@ import com.google.android.material.tabs.TabLayoutMediator import org.oxycblt.auxio.databinding.FragmentMainBinding import org.oxycblt.auxio.library.LibraryFragment import org.oxycblt.auxio.songs.SongsFragment -import org.oxycblt.auxio.theme.getAccentTransparency -import org.oxycblt.auxio.theme.getDeselectedTransparency +import org.oxycblt.auxio.theme.accent +import org.oxycblt.auxio.theme.getInactiveAlpha +import org.oxycblt.auxio.theme.getTransparentAccent import org.oxycblt.auxio.theme.toColor class MainFragment : Fragment() { @@ -27,12 +28,14 @@ class MainFragment : Fragment() { private val songsFragment: SongsFragment by lazy { SongsFragment() } private val colorSelected: Int by lazy { - R.color.blue.toColor(requireContext()) + accent.first.toColor(requireContext()) } private val colorDeselected: Int by lazy { - getAccentTransparency( - requireContext(), R.color.blue, getDeselectedTransparency(R.color.blue) + getTransparentAccent( + requireContext(), + accent.first, + getInactiveAlpha(accent.first) ) } @@ -83,10 +86,6 @@ class MainFragment : Fragment() { } ) - binding.tabs.getTabAt( - binding.viewPager.offscreenPageLimit - ) - Log.d(this::class.simpleName, "Fragment Created.") return binding.root diff --git a/app/src/main/java/org/oxycblt/auxio/recycler/RecyclerUtils.kt b/app/src/main/java/org/oxycblt/auxio/recycler/RecyclerUtils.kt index afd512815..cb52f0525 100644 --- a/app/src/main/java/org/oxycblt/auxio/recycler/RecyclerUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/recycler/RecyclerUtils.kt @@ -4,8 +4,8 @@ import android.graphics.drawable.ColorDrawable import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.RecyclerView import org.oxycblt.auxio.R -import org.oxycblt.auxio.theme.getAccentTransparency -import org.oxycblt.auxio.theme.getDayNightTransparency +import org.oxycblt.auxio.theme.getDayNightAlpha +import org.oxycblt.auxio.theme.getTransparentAccent // Apply a custom vertical divider fun RecyclerView.applyDivider() { @@ -16,8 +16,8 @@ fun RecyclerView.applyDivider() { div.setDrawable( ColorDrawable( - getAccentTransparency( - context, R.color.divider_color, getDayNightTransparency() + getTransparentAccent( + context, R.color.divider_color, getDayNightAlpha() ) ) ) diff --git a/app/src/main/java/org/oxycblt/auxio/theme/ThemeUtils.kt b/app/src/main/java/org/oxycblt/auxio/theme/ThemeUtils.kt index 375da8aa0..286229a9d 100644 --- a/app/src/main/java/org/oxycblt/auxio/theme/ThemeUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/theme/ThemeUtils.kt @@ -6,18 +6,43 @@ import androidx.core.content.ContextCompat import androidx.core.graphics.ColorUtils import org.oxycblt.auxio.R -fun getDayNightTransparency(): Int { +// Pairs of the base accent and its theme +private val ACCENTS = listOf( + Pair(R.color.red, R.style.Theme_Red), + Pair(R.color.pink, R.style.Theme_Pink), + Pair(R.color.purple, R.style.Theme_Purple), + Pair(R.color.deep_purple, R.style.Theme_DeepPurple), + Pair(R.color.indigo, R.style.Theme_Indigo), + Pair(R.color.blue, R.style.Theme_Blue), + Pair(R.color.light_blue, R.style.Theme_Blue), + Pair(R.color.cyan, R.style.Theme_Cyan), + Pair(R.color.teal, R.style.Theme_Teal), + Pair(R.color.green, R.style.Theme_Green), + Pair(R.color.light_green, R.style.Theme_LightGreen), + Pair(R.color.lime, R.style.Theme_Lime), + Pair(R.color.yellow, R.style.Theme_Yellow), + Pair(R.color.amber, R.style.Theme_Amber), + Pair(R.color.orange, R.style.Theme_Orange), + Pair(R.color.deep_orange, R.style.Theme_DeepOrange), + Pair(R.color.brown, R.style.Theme_Brown), + Pair(R.color.grey, R.style.Theme_Gray), + Pair(R.color.blue_grey, R.style.Theme_BlueGrey) +) + +val accent = ACCENTS[5] + +fun getDayNightAlpha(): Int { val isDark = AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES // Depending on the theme use a different opacity for the divider return if (isDark) 45 else 85 } -fun getDeselectedTransparency(color: Int): Int { +fun getInactiveAlpha(color: Int): Int { return if (color == R.color.yellow) 100 else 150 } -fun getAccentTransparency(context: Context, color: Int, alpha: Int): Int { +fun getTransparentAccent(context: Context, color: Int, alpha: Int): Int { return ColorUtils.setAlphaComponent( ContextCompat.getColor(context, color), alpha @@ -28,6 +53,7 @@ fun Int.toColor(context: Context): Int { return try { ContextCompat.getColor(context, this) } catch (e: Exception) { - ContextCompat.getColor(context, android.R.color.white) + // Default to the emergency color [Black] if the loading fails. + ContextCompat.getColor(context, android.R.color.black) } } diff --git a/app/src/main/res/drawable/indicator.xml b/app/src/main/res/drawable/indicator.xml index 962155467..3bc8a98d0 100644 --- a/app/src/main/res/drawable/indicator.xml +++ b/app/src/main/res/drawable/indicator.xml @@ -8,7 +8,7 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml index 4df3c1caa..437ccf841 100644 --- a/app/src/main/res/layout/fragment_library.xml +++ b/app/src/main/res/layout/fragment_library.xml @@ -14,8 +14,7 @@ android:layout_height="?android:attr/actionBarSize" android:background="?android:attr/windowBackground" android:elevation="@dimen/elevation_normal" - app:titleTextAppearance="@style/ToolbarStyle" - app:layout_constraintTop_toTopOf="parent" + app:titleTextAppearance="@style/TextAppearance.Toolbar.Bold" app:title="@string/title_library_fragment" /> + app:layout_constraintVertical_chainStyle="packed" + tools:indeterminateTint="@color/blue" /> + tools:visibility="visible" + tools:textColor="@color/blue" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index 1a3984ce0..5f5699002 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -20,6 +20,7 @@ android:layout_height="@dimen/tab_menu_size" android:layout_gravity="bottom" android:background="?android:attr/windowBackground" + android:elevation="@dimen/elevation_normal" app:tabIndicatorColor="?android:attr/colorPrimary" app:tabGravity="fill" app:tabMode="fixed" diff --git a/app/src/main/res/layout/fragment_songs.xml b/app/src/main/res/layout/fragment_songs.xml index abce1502f..b09a3d8a3 100644 --- a/app/src/main/res/layout/fragment_songs.xml +++ b/app/src/main/res/layout/fragment_songs.xml @@ -14,7 +14,7 @@ android:layout_height="?android:attr/actionBarSize" android:background="?android:attr/windowBackground" android:elevation="@dimen/elevation_normal" - app:titleTextAppearance="@style/ToolbarStyle" + app:titleTextAppearance="@style/TextAppearance.Toolbar.Bold" app:layout_constraintTop_toTopOf="parent" app:title="@string/title_all_songs" /> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index eb898ac5f..322e4da37 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -10,7 +10,7 @@ 44dp 56dp - 38dp + 40dp 4dp \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 30ad6e03f..d977b2ae5 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,15 +1,14 @@ - - \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 000000000..e8977cac7 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file