This commit is contained in:
@@ -115,7 +115,11 @@ class BasedBankApp : Application() {
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
DynamicColors.applyToActivitiesIfAvailable(this)
|
||||
// Only apply wallpaper-based dynamic colors in system theme mode.
|
||||
// Light/dark modes use content-based accent colors applied per-activity via ThemeHelper.
|
||||
DynamicColors.applyToActivitiesIfAvailable(this) { _, _ ->
|
||||
getSharedPreferences("prefs", MODE_PRIVATE).getString("theme", "system") == "system"
|
||||
}
|
||||
|
||||
val theme = getSharedPreferences("prefs", MODE_PRIVATE).getString("theme", "system")
|
||||
AppCompatDelegate.setDefaultNightMode(when (theme) {
|
||||
|
||||
@@ -21,6 +21,7 @@ import kotlinx.coroutines.withContext
|
||||
import sh.sar.basedbank.databinding.ActivityLockBinding
|
||||
import sh.sar.basedbank.ui.home.HomeActivity
|
||||
import sh.sar.basedbank.util.CredentialStore
|
||||
import sh.sar.basedbank.util.ThemeHelper
|
||||
import sh.sar.basedbank.BasedBankApp
|
||||
import javax.crypto.SecretKeyFactory
|
||||
import javax.crypto.spec.PBEKeySpec
|
||||
@@ -46,6 +47,7 @@ class LockActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
ThemeHelper.applyAccent(this)
|
||||
super.onCreate(savedInstanceState)
|
||||
WindowCompat.setDecorFitsSystemWindows(window, false)
|
||||
binding = ActivityLockBinding.inflate(layoutInflater)
|
||||
@@ -55,6 +57,9 @@ class LockActivity : AppCompatActivity() {
|
||||
isAppearanceLightStatusBars = isLight
|
||||
isAppearanceLightNavigationBars = isLight
|
||||
}
|
||||
val ta = obtainStyledAttributes(intArrayOf(android.R.attr.colorBackground))
|
||||
window.statusBarColor = ta.getColor(0, if (isLight) android.graphics.Color.WHITE else android.graphics.Color.BLACK)
|
||||
ta.recycle()
|
||||
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, insets ->
|
||||
val bars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
|
||||
view.setPadding(bars.left, bars.top, bars.right, bars.bottom)
|
||||
|
||||
@@ -68,6 +68,7 @@ import sh.sar.basedbank.util.CredentialStore
|
||||
import sh.sar.basedbank.util.CardsCache
|
||||
import sh.sar.basedbank.util.FinancingCache
|
||||
import sh.sar.basedbank.util.ForeignLimitsCache
|
||||
import sh.sar.basedbank.util.ThemeHelper
|
||||
|
||||
class HomeActivity : AppCompatActivity() {
|
||||
|
||||
@@ -106,6 +107,7 @@ class HomeActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
ThemeHelper.applyAccent(this)
|
||||
super.onCreate(savedInstanceState)
|
||||
WindowCompat.setDecorFitsSystemWindows(window, false)
|
||||
binding = ActivityHomeBinding.inflate(layoutInflater)
|
||||
@@ -118,6 +120,9 @@ class HomeActivity : AppCompatActivity() {
|
||||
isAppearanceLightStatusBars = isLight
|
||||
isAppearanceLightNavigationBars = isLight
|
||||
}
|
||||
val ta = obtainStyledAttributes(intArrayOf(android.R.attr.colorBackground))
|
||||
window.statusBarColor = ta.getColor(0, if (isLight) android.graphics.Color.WHITE else android.graphics.Color.BLACK)
|
||||
ta.recycle()
|
||||
// Auth guard: HomeActivity must only be reachable after LockActivity or fresh login.
|
||||
// Using loadSecurityHash() (EncryptedSharedPreferences) instead of plain prefs so
|
||||
// a rooted device cannot bypass this by editing security_method in plain prefs.
|
||||
|
||||
@@ -2,7 +2,9 @@ package sh.sar.basedbank.ui.home
|
||||
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.graphics.Color
|
||||
import android.os.Bundle
|
||||
import android.text.InputType
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
@@ -10,6 +12,7 @@ import android.widget.ImageView
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.ScrollView
|
||||
import android.widget.TextView
|
||||
import android.widget.Toast
|
||||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import androidx.appcompat.app.AppCompatDelegate.setApplicationLocales
|
||||
import androidx.core.os.LocaleListCompat
|
||||
@@ -18,8 +21,11 @@ import androidx.recyclerview.widget.ItemTouchHelper
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.google.android.material.textfield.TextInputEditText
|
||||
import com.google.android.material.textfield.TextInputLayout
|
||||
import sh.sar.basedbank.R
|
||||
import sh.sar.basedbank.databinding.FragmentSettingsAppearanceBinding
|
||||
import sh.sar.basedbank.util.ThemeHelper
|
||||
import java.util.Collections
|
||||
|
||||
class SettingsAppearanceFragment : Fragment() {
|
||||
@@ -103,8 +109,45 @@ class SettingsAppearanceFragment : Fragment() {
|
||||
}
|
||||
prefs.edit().putString("theme", key).apply()
|
||||
AppCompatDelegate.setDefaultNightMode(mode)
|
||||
updateAccentState(key == "system")
|
||||
updatePitchBlackState(key == "dark")
|
||||
}
|
||||
|
||||
// Pitch black
|
||||
binding.switchPitchBlack.isChecked = prefs.getBoolean("pitch_black", false)
|
||||
binding.switchPitchBlack.setOnCheckedChangeListener { _, checked ->
|
||||
prefs.edit().putBoolean("pitch_black", checked).apply()
|
||||
requireActivity().recreate()
|
||||
}
|
||||
val isDark = prefs.getString("theme", "system") == "dark"
|
||||
updatePitchBlackState(isDark)
|
||||
|
||||
// Accent color
|
||||
val savedPreset = prefs.getString("accent_preset", ThemeHelper.PRESET_BLUE)
|
||||
binding.accentToggle.check(when (savedPreset) {
|
||||
ThemeHelper.PRESET_RED -> R.id.btnAccentOrange
|
||||
ThemeHelper.PRESET_GREEN -> R.id.btnAccentGreen
|
||||
ThemeHelper.PRESET_CUSTOM -> R.id.btnAccentCustom
|
||||
else -> R.id.btnAccentBlue
|
||||
})
|
||||
binding.accentToggle.addOnButtonCheckedListener { _, checkedId, isChecked ->
|
||||
if (!isChecked) return@addOnButtonCheckedListener
|
||||
val preset = when (checkedId) {
|
||||
R.id.btnAccentOrange -> ThemeHelper.PRESET_RED
|
||||
R.id.btnAccentGreen -> ThemeHelper.PRESET_GREEN
|
||||
R.id.btnAccentCustom -> ThemeHelper.PRESET_CUSTOM
|
||||
else -> ThemeHelper.PRESET_BLUE
|
||||
}
|
||||
if (preset == ThemeHelper.PRESET_CUSTOM) {
|
||||
showCustomColorPicker()
|
||||
} else {
|
||||
prefs.edit().putString("accent_preset", preset).apply()
|
||||
requireActivity().recreate()
|
||||
}
|
||||
}
|
||||
val isSystem = prefs.getString("theme", "system") == "system"
|
||||
updateAccentState(isSystem)
|
||||
|
||||
// Language
|
||||
val currentLocales = AppCompatDelegate.getApplicationLocales()
|
||||
val currentLang = if (currentLocales.isEmpty) "en" else currentLocales[0]?.language ?: "en"
|
||||
@@ -156,6 +199,68 @@ class SettingsAppearanceFragment : Fragment() {
|
||||
slotAdapter.notifyDataSetChanged()
|
||||
}
|
||||
|
||||
private fun updatePitchBlackState(isDark: Boolean) {
|
||||
binding.rowPitchBlack.alpha = if (isDark) 1f else 0.38f
|
||||
binding.switchPitchBlack.isEnabled = isDark
|
||||
}
|
||||
|
||||
private fun updateAccentState(isSystem: Boolean) {
|
||||
binding.sectionAccentColor.alpha = if (isSystem) 0.38f else 1f
|
||||
for (i in 0 until binding.accentToggle.childCount) {
|
||||
binding.accentToggle.getChildAt(i)?.isEnabled = !isSystem
|
||||
}
|
||||
}
|
||||
|
||||
private fun showCustomColorPicker() {
|
||||
val ctx = requireContext()
|
||||
val currentHex = prefs.getString("accent_custom_color", "") ?: ""
|
||||
val inputLayout = TextInputLayout(ctx).apply {
|
||||
hint = getString(R.string.accent_custom_hint)
|
||||
val pad = (16 * resources.displayMetrics.density).toInt()
|
||||
setPadding(pad, pad / 2, pad, 0)
|
||||
}
|
||||
val input = TextInputEditText(ctx).apply {
|
||||
setText(currentHex)
|
||||
inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS
|
||||
setSingleLine(true)
|
||||
}
|
||||
inputLayout.addView(input)
|
||||
|
||||
val dialog = MaterialAlertDialogBuilder(ctx)
|
||||
.setTitle(R.string.accent_custom_pick)
|
||||
.setView(inputLayout)
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.setNegativeButton(R.string.cancel) { _, _ -> revertAccentToggle() }
|
||||
.setOnCancelListener { revertAccentToggle() }
|
||||
.show()
|
||||
|
||||
dialog.getButton(androidx.appcompat.app.AlertDialog.BUTTON_POSITIVE).setOnClickListener {
|
||||
val raw = input.text.toString().trim()
|
||||
val hex = if (raw.startsWith("#")) raw else "#$raw"
|
||||
try {
|
||||
Color.parseColor(hex)
|
||||
prefs.edit()
|
||||
.putString("accent_preset", ThemeHelper.PRESET_CUSTOM)
|
||||
.putString("accent_custom_color", hex)
|
||||
.apply()
|
||||
dialog.dismiss()
|
||||
requireActivity().recreate()
|
||||
} catch (_: Exception) {
|
||||
Toast.makeText(ctx, R.string.accent_invalid_color, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun revertAccentToggle() {
|
||||
val saved = prefs.getString("accent_preset", ThemeHelper.PRESET_BLUE)
|
||||
binding.accentToggle.check(when (saved) {
|
||||
ThemeHelper.PRESET_RED -> R.id.btnAccentOrange
|
||||
ThemeHelper.PRESET_GREEN -> R.id.btnAccentGreen
|
||||
ThemeHelper.PRESET_CUSTOM -> R.id.btnAccentCustom
|
||||
else -> R.id.btnAccentBlue
|
||||
})
|
||||
}
|
||||
|
||||
private fun showItemPicker(items: MutableList<Int>, slotIndex: Int, adapter: NavItemAdapter) {
|
||||
val isBottom = prefs.getBoolean("bottom_nav", false)
|
||||
if (items === slots && !isBottom) return
|
||||
|
||||
@@ -9,12 +9,14 @@ import sh.sar.basedbank.BasedBankApp
|
||||
import sh.sar.basedbank.LockActivity
|
||||
import sh.sar.basedbank.databinding.ActivityLoginBinding
|
||||
import sh.sar.basedbank.util.CredentialStore
|
||||
import sh.sar.basedbank.util.ThemeHelper
|
||||
|
||||
class LoginActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var binding: ActivityLoginBinding
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
ThemeHelper.applyAccent(this)
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
// If security is configured and the user hasn't unlocked this session,
|
||||
@@ -34,5 +36,8 @@ class LoginActivity : AppCompatActivity() {
|
||||
isAppearanceLightStatusBars = isLight
|
||||
isAppearanceLightNavigationBars = isLight
|
||||
}
|
||||
val ta = obtainStyledAttributes(intArrayOf(android.R.attr.colorBackground))
|
||||
window.statusBarColor = ta.getColor(0, if (isLight) android.graphics.Color.WHITE else android.graphics.Color.BLACK)
|
||||
ta.recycle()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ import sh.sar.basedbank.R
|
||||
import sh.sar.basedbank.databinding.ActivityOnboardingBinding
|
||||
import sh.sar.basedbank.ui.login.LoginActivity
|
||||
import sh.sar.basedbank.util.CredentialStore
|
||||
import sh.sar.basedbank.util.ThemeHelper
|
||||
|
||||
class OnboardingActivity : AppCompatActivity(), SecuritySetupFragment.Callback {
|
||||
|
||||
@@ -27,6 +28,7 @@ class OnboardingActivity : AppCompatActivity(), SecuritySetupFragment.Callback {
|
||||
private var countDownTimer: CountDownTimer? = null
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
ThemeHelper.applyAccent(this)
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
// If security is already configured, onboarding is complete. Redirect to lock screen
|
||||
@@ -45,6 +47,9 @@ class OnboardingActivity : AppCompatActivity(), SecuritySetupFragment.Callback {
|
||||
isAppearanceLightStatusBars = isLight
|
||||
isAppearanceLightNavigationBars = isLight
|
||||
}
|
||||
val ta = obtainStyledAttributes(intArrayOf(android.R.attr.colorBackground))
|
||||
window.statusBarColor = ta.getColor(0, if (isLight) android.graphics.Color.WHITE else android.graphics.Color.BLACK)
|
||||
ta.recycle()
|
||||
prefs = getSharedPreferences("prefs", MODE_PRIVATE)
|
||||
val originalBottomPadding = binding.bottomBar.paddingBottom
|
||||
ViewCompat.setOnApplyWindowInsetsListener(binding.bottomBar) { view, insets ->
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
package sh.sar.basedbank.util
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Color
|
||||
import android.os.Build
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.google.android.material.color.DynamicColors
|
||||
import com.google.android.material.color.DynamicColorsOptions
|
||||
import sh.sar.basedbank.R
|
||||
|
||||
object ThemeHelper {
|
||||
|
||||
const val PRESET_BLUE = "blue"
|
||||
const val PRESET_RED = "red"
|
||||
const val PRESET_GREEN = "green"
|
||||
const val PRESET_CUSTOM = "custom"
|
||||
|
||||
fun isSystemTheme(context: Context): Boolean =
|
||||
context.getSharedPreferences("prefs", Context.MODE_PRIVATE)
|
||||
.getString("theme", "system") == "system"
|
||||
|
||||
fun getAccentPreset(context: Context): String =
|
||||
context.getSharedPreferences("prefs", Context.MODE_PRIVATE)
|
||||
.getString("accent_preset", PRESET_BLUE) ?: PRESET_BLUE
|
||||
|
||||
fun getCustomColor(context: Context): Int? {
|
||||
val hex = context.getSharedPreferences("prefs", Context.MODE_PRIVATE)
|
||||
.getString("accent_custom_color", null) ?: return null
|
||||
return try { Color.parseColor(hex) } catch (_: Exception) { null }
|
||||
}
|
||||
|
||||
fun presetSeedColor(context: Context, preset: String): Int = when (preset) {
|
||||
PRESET_RED -> Color.parseColor("#D32F2F")
|
||||
PRESET_GREEN -> Color.parseColor("#4CAF50")
|
||||
PRESET_CUSTOM -> getCustomColor(context) ?: Color.parseColor("#3F65AD")
|
||||
else -> Color.parseColor("#3F65AD")
|
||||
}
|
||||
|
||||
fun isPitchBlackEnabled(context: Context): Boolean =
|
||||
context.getSharedPreferences("prefs", Context.MODE_PRIVATE)
|
||||
.getBoolean("pitch_black", false)
|
||||
|
||||
/**
|
||||
* Apply the user-chosen accent theme to the given activity.
|
||||
* Must be called BEFORE super.onCreate() so window-level attributes
|
||||
* (status bar color, etc.) are resolved from the correct overlay.
|
||||
* Has no effect when the theme is set to "system" (dynamic colors are
|
||||
* handled by BasedBankApp via DynamicColors.applyToActivitiesIfAvailable).
|
||||
*/
|
||||
fun applyAccent(activity: AppCompatActivity) {
|
||||
if (isSystemTheme(activity)) return
|
||||
val preset = getAccentPreset(activity)
|
||||
val seed = presetSeedColor(activity, preset)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||
val bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
|
||||
bitmap.setPixel(0, 0, seed)
|
||||
DynamicColors.applyToActivityIfAvailable(
|
||||
activity,
|
||||
DynamicColorsOptions.Builder().setContentBasedSource(bitmap).build()
|
||||
)
|
||||
} else {
|
||||
// API < 31: apply a simple style overlay (partial palette, but functional)
|
||||
val styleRes = when (preset) {
|
||||
PRESET_RED -> R.style.ThemeOverlay_Accent_Orange
|
||||
PRESET_GREEN -> R.style.ThemeOverlay_Accent_Green
|
||||
else -> R.style.ThemeOverlay_Accent_Blue
|
||||
}
|
||||
activity.theme.applyStyle(styleRes, true)
|
||||
}
|
||||
|
||||
val prefs = activity.getSharedPreferences("prefs", Context.MODE_PRIVATE)
|
||||
val isDark = prefs.getString("theme", "system") == "dark"
|
||||
if (isDark && prefs.getBoolean("pitch_black", false)) {
|
||||
activity.theme.applyStyle(R.style.ThemeOverlay_PitchBlack, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -156,6 +156,87 @@
|
||||
|
||||
</com.google.android.material.button.MaterialButtonToggleGroup>
|
||||
|
||||
<!-- Pitch black — enabled only in explicit dark mode -->
|
||||
<LinearLayout
|
||||
android:id="@+id/rowPitchBlack"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="@string/settings_pitch_black"
|
||||
android:textAppearance="?attr/textAppearanceBodyLarge" />
|
||||
|
||||
<com.google.android.material.materialswitch.MaterialSwitch
|
||||
android:id="@+id/switchPitchBlack"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- Accent color — always shown, disabled/grayed in system theme mode -->
|
||||
<LinearLayout
|
||||
android:id="@+id/sectionAccentColor"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:layout_marginTop="24dp">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/settings_accent_color"
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium"
|
||||
android:layout_marginBottom="12dp" />
|
||||
|
||||
<com.google.android.material.button.MaterialButtonToggleGroup
|
||||
android:id="@+id/accentToggle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:singleSelection="true"
|
||||
app:selectionRequired="true">
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/btnAccentBlue"
|
||||
style="@style/Widget.Material3.Button.OutlinedButton"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="@string/accent_blue" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/btnAccentOrange"
|
||||
style="@style/Widget.Material3.Button.OutlinedButton"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="@string/accent_orange" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/btnAccentGreen"
|
||||
style="@style/Widget.Material3.Button.OutlinedButton"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="@string/accent_green" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/btnAccentCustom"
|
||||
style="@style/Widget.Material3.Button.OutlinedButton"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="@string/accent_custom" />
|
||||
|
||||
</com.google.android.material.button.MaterialButtonToggleGroup>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
@@ -148,6 +148,15 @@
|
||||
<string name="theme_system">System</string>
|
||||
<string name="theme_light">Light</string>
|
||||
<string name="theme_dark">Dark</string>
|
||||
<string name="settings_pitch_black">Pitch Black</string>
|
||||
<string name="settings_accent_color">Accent Color</string>
|
||||
<string name="accent_blue">Blue</string>
|
||||
<string name="accent_orange">Red</string>
|
||||
<string name="accent_green">Green</string>
|
||||
<string name="accent_custom">Custom</string>
|
||||
<string name="accent_custom_pick">Custom Accent Color</string>
|
||||
<string name="accent_custom_hint">#RRGGBB hex color</string>
|
||||
<string name="accent_invalid_color">Invalid color — enter a valid hex code</string>
|
||||
<string name="language">Language</string>
|
||||
<string name="lang_english">English</string>
|
||||
<string name="lang_dhivehi">ދިވެހި</string>
|
||||
|
||||
@@ -6,4 +6,32 @@
|
||||
<item name="colorSecondary">@color/seed_secondary</item>
|
||||
<item name="android:windowSoftInputMode">adjustResize</item>
|
||||
</style>
|
||||
|
||||
<!-- Accent overlays — applied on API < 31 as fallback when content-based dynamic colors unavailable -->
|
||||
<style name="ThemeOverlay_Accent_Blue" parent="">
|
||||
<item name="colorPrimary">#3F65AD</item>
|
||||
<item name="colorSecondary">#9AD141</item>
|
||||
</style>
|
||||
|
||||
<style name="ThemeOverlay_Accent_Orange" parent="">
|
||||
<item name="colorPrimary">#D32F2F</item>
|
||||
<item name="colorSecondary">#EF9A9A</item>
|
||||
</style>
|
||||
|
||||
<style name="ThemeOverlay_Accent_Green" parent="">
|
||||
<item name="colorPrimary">#4CAF50</item>
|
||||
<item name="colorSecondary">#80CBC4</item>
|
||||
</style>
|
||||
|
||||
<!-- Pitch black overlay — forces pure black surfaces for OLED displays -->
|
||||
<style name="ThemeOverlay_PitchBlack" parent="">
|
||||
<item name="android:colorBackground">#000000</item>
|
||||
<item name="colorSurface">#000000</item>
|
||||
<item name="colorSurfaceVariant">#0d0d0d</item>
|
||||
<item name="colorSurfaceContainer">#0d0d0d</item>
|
||||
<item name="colorSurfaceContainerLow">#000000</item>
|
||||
<item name="colorSurfaceContainerLowest">#000000</item>
|
||||
<item name="colorSurfaceContainerHigh">#1a1a1a</item>
|
||||
<item name="colorSurfaceContainerHighest">#1a1a1a</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
||||
Reference in New Issue
Block a user