From a2200b6335d4462b7b183d4d6ea806ffdc2f607d Mon Sep 17 00:00:00 2001 From: Emily Kager Date: Mon, 1 Apr 2019 17:53:37 -0700 Subject: [PATCH] For #208 - Dark/Night Theme --- CHANGELOG.md | 1 + app/src/main/AndroidManifest.xml | 2 +- .../org/mozilla/fenix/BrowsingModeManager.kt | 2 +- .../org/mozilla/fenix/FenixApplication.kt | 45 +++++++ .../java/org/mozilla/fenix/ThemeManager.kt | 33 ++++- .../fenix/components/toolbar/ToolbarUIView.kt | 3 - .../java/org/mozilla/fenix/home/SearchView.kt | 2 +- .../fenix/home/SessionBottomSheetFragment.kt | 33 +++++ .../org/mozilla/fenix/home/tabs/TabsUIView.kt | 3 +- .../library/bookmarks/BookmarkItemMenu.kt | 9 +- .../fenix/library/history/HistoryItemMenu.kt | 3 +- .../search/awesomebar/AwesomeBarUIView.kt | 55 +++++--- .../fenix/settings/SettingsFragment.kt | 15 +++ .../mozilla/fenix/settings/ThemeFragment.kt | 100 +++++++++++++++ .../java/org/mozilla/fenix/utils/Settings.kt | 33 +++++ .../ic_logo_wordmark.png | Bin 0 -> 67552 bytes ....xml => home_search_background_normal.xml} | 4 +- app/src/main/res/drawable/ic_customize.xml | 13 ++ .../main/res/drawable/ic_drawer_pull_tab.xml | 2 +- .../main/res/drawable/ic_private_browsing.xml | 2 +- app/src/main/res/drawable/ic_settings.xml | 8 +- .../sign_in_preference_background.xml | 2 +- app/src/main/res/layout/bookmark_row.xml | 1 + .../main/res/layout/component_awesomebar.xml | 29 ++--- app/src/main/res/layout/component_history.xml | 2 +- app/src/main/res/layout/component_tabs.xml | 3 +- app/src/main/res/layout/fragment_browser.xml | 2 +- .../res/layout/fragment_crash_reporter.xml | 6 +- .../res/layout/layout_quick_action_sheet.xml | 4 +- .../main/res/layout/session_bottom_sheet.xml | 29 +++-- app/src/main/res/layout/session_item.xml | 6 +- app/src/main/res/layout/tab_list_row.xml | 3 +- app/src/main/res/navigation/nav_graph.xml | 7 ++ app/src/main/res/values-night/bools.xml | 7 ++ app/src/main/res/values-night/colors.xml | 77 ++++++++++++ app/src/main/res/values-v23/styles.xml | 4 +- app/src/main/res/values-v27/styles.xml | 6 +- app/src/main/res/values-v28/bools.xml | 7 ++ app/src/main/res/values/attrs.xml | 4 + app/src/main/res/values/bools.xml | 8 ++ app/src/main/res/values/colors.xml | 117 +++++++++++------- app/src/main/res/values/preference_keys.xml | 5 + app/src/main/res/values/strings.xml | 12 ++ app/src/main/res/values/styles.xml | 83 +++++++------ app/src/main/res/xml/preferences.xml | 5 + app/src/main/res/xml/theme_preferences.xml | 28 +++++ 46 files changed, 659 insertions(+), 166 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/settings/ThemeFragment.kt create mode 100644 app/src/main/res/drawable-night-xxxhdpi/ic_logo_wordmark.png rename app/src/main/res/drawable/{home_search_background_light.xml => home_search_background_normal.xml} (74%) create mode 100644 app/src/main/res/drawable/ic_customize.xml create mode 100644 app/src/main/res/values-night/bools.xml create mode 100644 app/src/main/res/values-night/colors.xml create mode 100644 app/src/main/res/values-v28/bools.xml create mode 100644 app/src/main/res/values/bools.xml create mode 100644 app/src/main/res/xml/theme_preferences.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a06c9425..e3c22f841 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,5 +8,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - #916 - Added the ability to save and delete bookmarks - #356 - Adds the ability to delete history +- #208 - Added normal browsing dark mode (advised to use attrs from now on for most referenced colors) ### Changed ### Removed \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d5896bd37..74faca1db 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,7 +20,7 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:name=".FenixApplication" - android:theme="@style/LightTheme" + android:theme="@style/NormalTheme" android:usesCleartextTraffic="true" tools:ignore="UnusedAttribute"> ThemeManager.Theme.Light + BrowsingModeManager.Mode.Normal -> ThemeManager.Theme.Normal BrowsingModeManager.Mode.Private -> ThemeManager.Theme.Private } setTheme(newTheme) diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index 7c4d407a1..e0e3e883d 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -6,6 +6,8 @@ package org.mozilla.fenix import android.annotation.SuppressLint import android.app.Application +import androidx.appcompat.app.AppCompatDelegate +import androidx.preference.PreferenceManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch @@ -20,6 +22,7 @@ import mozilla.components.support.ktx.android.content.isMainProcess import mozilla.components.support.ktx.android.content.runOnlyInMainProcess import mozilla.components.support.rustlog.RustLog import org.mozilla.fenix.components.Components +import org.mozilla.fenix.utils.Settings import java.io.File @SuppressLint("Registered") @@ -30,6 +33,7 @@ open class FenixApplication : Application() { override fun onCreate() { super.onCreate() + setDayNightTheme() val megazordEnabled = setupMegazord() setupLogging(megazordEnabled) setupCrashReporting() @@ -138,4 +142,45 @@ open class FenixApplication : Application() { components.core.sessionManager.onLowMemory() } } + + private fun setDayNightTheme() { + when { + Settings.getInstance(this).shouldUseLightTheme -> { + AppCompatDelegate.setDefaultNightMode( + AppCompatDelegate.MODE_NIGHT_NO + ) + } + Settings.getInstance(this).shouldUseDarkTheme -> { + AppCompatDelegate.setDefaultNightMode( + AppCompatDelegate.MODE_NIGHT_YES + ) + } + Settings.getInstance(this).shouldUseAutoBatteryTheme -> { + AppCompatDelegate.setDefaultNightMode( + AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY + ) + } + Settings.getInstance(this).shouldFollowDeviceTheme -> { + AppCompatDelegate.setDefaultNightMode( + AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM + ) + } + // First run of app no default set, set the default to Follow System for 28+ and Normal Mode otherwise + else -> { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) { + AppCompatDelegate.setDefaultNightMode( + AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM + ) + PreferenceManager.getDefaultSharedPreferences(this).edit() + .putBoolean(getString(R.string.pref_key_follow_device_theme), true).apply() + } else { + AppCompatDelegate.setDefaultNightMode( + AppCompatDelegate.MODE_NIGHT_NO + ) + PreferenceManager.getDefaultSharedPreferences(this).edit() + .putBoolean(getString(R.string.pref_key_light_theme), true).apply() + } + } + } + } } diff --git a/app/src/main/java/org/mozilla/fenix/ThemeManager.kt b/app/src/main/java/org/mozilla/fenix/ThemeManager.kt index 5ab5da170..252fa6c88 100644 --- a/app/src/main/java/org/mozilla/fenix/ThemeManager.kt +++ b/app/src/main/java/org/mozilla/fenix/ThemeManager.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix import android.app.Activity import android.content.Context +import android.content.res.Configuration import android.util.TypedValue import android.view.View import android.view.Window @@ -13,7 +14,7 @@ import androidx.core.content.ContextCompat interface ThemeManager { enum class Theme { - Light, Private + Normal, Private } val currentTheme: Theme @@ -22,7 +23,7 @@ interface ThemeManager { fun Activity.setTheme(theme: ThemeManager.Theme) { val themeCode = when (theme) { - ThemeManager.Theme.Light -> R.style.LightTheme + ThemeManager.Theme.Normal -> R.style.NormalTheme ThemeManager.Theme.Private -> R.style.PrivateTheme } @@ -31,7 +32,7 @@ fun Activity.setTheme(theme: ThemeManager.Theme) { fun ThemeManager.Theme.isPrivate(): Boolean = this == ThemeManager.Theme.Private -private var temporaryThemeManagerStorage = ThemeManager.Theme.Light +private var temporaryThemeManagerStorage = ThemeManager.Theme.Normal class DefaultThemeManager : ThemeManager { var onThemeChange: ((ThemeManager.Theme) -> Unit)? = null @@ -77,9 +78,29 @@ class DefaultThemeManager : ThemeManager { } when (themeManager.currentTheme) { - ThemeManager.Theme.Light -> { - window.decorView.systemUiVisibility = window.decorView.systemUiVisibility or - View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR + ThemeManager.Theme.Normal -> { + val currentNightMode = + context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK + when (currentNightMode) { + Configuration.UI_MODE_NIGHT_NO -> { + window.decorView.systemUiVisibility = + window.decorView.systemUiVisibility or + View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or + View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR + } + Configuration.UI_MODE_NIGHT_YES -> { + window.decorView.systemUiVisibility = + window.decorView.systemUiVisibility and + View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() and + View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR.inv() + } + Configuration.UI_MODE_NIGHT_UNDEFINED -> { + window.decorView.systemUiVisibility = + window.decorView.systemUiVisibility or + View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or + View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR + } + } } ThemeManager.Theme.Private -> { window.decorView.systemUiVisibility = window.decorView.systemUiVisibility and diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarUIView.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarUIView.kt index 4fa493b55..d1ade5e64 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarUIView.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarUIView.kt @@ -8,7 +8,6 @@ import android.graphics.drawable.BitmapDrawable import android.view.LayoutInflater import android.view.ViewGroup import android.widget.ImageView -import androidx.core.content.ContextCompat import io.reactivex.Observable import io.reactivex.Observer import io.reactivex.functions.Consumer @@ -55,9 +54,7 @@ class ToolbarUIView( browserActionMargin = resources.pxToDp(browserActionMarginDp) urlBoxView = urlBackground - textColor = ContextCompat.getColor(context, R.color.search_text) hint = context.getString(R.string.search_hint) - hintColor = ContextCompat.getColor(context, R.color.search_text) setOnEditListener(object : mozilla.components.concept.toolbar.Toolbar.OnEditListener { override fun onCancelEditing(): Boolean { diff --git a/app/src/main/java/org/mozilla/fenix/home/SearchView.kt b/app/src/main/java/org/mozilla/fenix/home/SearchView.kt index 87fedfab4..0fcef47c5 100644 --- a/app/src/main/java/org/mozilla/fenix/home/SearchView.kt +++ b/app/src/main/java/org/mozilla/fenix/home/SearchView.kt @@ -15,7 +15,7 @@ class SearchView(context: Context, attrs: AttributeSet) : FrameLayout(context, a var isPrivateModeEnabled = false private val lightDrawable = - resources.getDrawable(R.drawable.home_search_background_light, context.theme) + resources.getDrawable(R.drawable.home_search_background_normal, context.theme) private val privateLightDrawable = resources.getDrawable(R.drawable.home_search_background_private, context.theme) private val darkDrawable = diff --git a/app/src/main/java/org/mozilla/fenix/home/SessionBottomSheetFragment.kt b/app/src/main/java/org/mozilla/fenix/home/SessionBottomSheetFragment.kt index 319bf0144..73f476d2a 100644 --- a/app/src/main/java/org/mozilla/fenix/home/SessionBottomSheetFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/SessionBottomSheetFragment.kt @@ -4,13 +4,16 @@ package org.mozilla.fenix.home +import android.graphics.PorterDuff import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.content.ContextCompat import com.google.android.material.bottomsheet.BottomSheetDialogFragment import kotlinx.android.extensions.LayoutContainer import kotlinx.android.synthetic.main.session_bottom_sheet.view.* +import org.mozilla.fenix.DefaultThemeManager import org.mozilla.fenix.utils.ItsNotBrokenSnack import org.mozilla.fenix.R import org.mozilla.fenix.home.sessions.ArchivedSession @@ -41,6 +44,14 @@ class SessionBottomSheetFragment : BottomSheetDialogFragment(), LayoutContainer view.current_session_card_tab_list.text = getTabTitles() view.archive_session_button.apply { visibility = if (sessionType is SessionType.Current) View.VISIBLE else View.GONE + val drawable = ContextCompat.getDrawable(context!!, R.drawable.ic_archive) + drawable?.setColorFilter( + ContextCompat.getColor( + context!!, + DefaultThemeManager.resolveAttribute(R.attr.iconColor, context!!) + ), PorterDuff.Mode.SRC_IN + ) + setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null) setOnClickListener { sessionType?.also { if (it is SessionType.Current) { @@ -52,6 +63,28 @@ class SessionBottomSheetFragment : BottomSheetDialogFragment(), LayoutContainer } } + view.delete_session_button.apply { + val drawable = ContextCompat.getDrawable(context!!, R.drawable.ic_delete) + drawable?.setColorFilter( + ContextCompat.getColor( + context!!, + DefaultThemeManager.resolveAttribute(R.attr.deleteColor, context!!) + ), PorterDuff.Mode.SRC_IN + ) + setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null) + } + + view.send_and_share_session_button.apply { + val drawable = ContextCompat.getDrawable(context!!, R.drawable.ic_share) + drawable?.setColorFilter( + ContextCompat.getColor( + context!!, + DefaultThemeManager.resolveAttribute(R.attr.iconColor, context!!) + ), PorterDuff.Mode.SRC_IN + ) + setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null) + } + view.send_and_share_session_button.setOnClickListener { ItsNotBrokenSnack(context!!).showSnackbar(issueNumber = "244") } diff --git a/app/src/main/java/org/mozilla/fenix/home/tabs/TabsUIView.kt b/app/src/main/java/org/mozilla/fenix/home/tabs/TabsUIView.kt index beaf186aa..3e1f1a4f7 100644 --- a/app/src/main/java/org/mozilla/fenix/home/tabs/TabsUIView.kt +++ b/app/src/main/java/org/mozilla/fenix/home/tabs/TabsUIView.kt @@ -54,8 +54,9 @@ class TabsUIView( actionEmitter.onNext(TabsAction.MenuTapped) } + // Using a color here is fine for now because private browsing does not have this button save_session_button_text.apply { - val color = ContextCompat.getColor(context, R.color.photonWhite) + val color = ContextCompat.getColor(context, R.color.save_session_button_text_color) val drawable = ContextCompat.getDrawable(context, R.drawable.ic_archive) drawable?.setTint(color) this.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null) diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt index ceb7d6cc3..7246014ad 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt @@ -7,6 +7,7 @@ package org.mozilla.fenix.library.bookmarks import android.content.Context import mozilla.components.browser.menu.BrowserMenuBuilder import mozilla.components.browser.menu.item.SimpleBrowserMenuItem +import org.mozilla.fenix.DefaultThemeManager import org.mozilla.fenix.R class BookmarkItemMenu( @@ -46,8 +47,12 @@ class BookmarkItemMenu( SimpleBrowserMenuItem(context.getString(R.string.bookmark_menu_open_in_private_tab_button)) { onItemTapped.invoke(BookmarkItemMenu.Item.OpenInPrivateTab) }, - SimpleBrowserMenuItem(context.getString(R.string.bookmark_menu_delete_button), - textColorResource = R.color.photonRed60 + SimpleBrowserMenuItem( + context.getString(R.string.bookmark_menu_delete_button), + textColorResource = DefaultThemeManager.resolveAttribute( + R.attr.deleteColor, + context + ) ) { onItemTapped.invoke(BookmarkItemMenu.Item.Delete) } diff --git a/app/src/main/java/org/mozilla/fenix/library/history/HistoryItemMenu.kt b/app/src/main/java/org/mozilla/fenix/library/history/HistoryItemMenu.kt index 20727f605..c3076b206 100644 --- a/app/src/main/java/org/mozilla/fenix/library/history/HistoryItemMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/library/history/HistoryItemMenu.kt @@ -7,6 +7,7 @@ package org.mozilla.fenix.library.history import android.content.Context import mozilla.components.browser.menu.BrowserMenuBuilder import mozilla.components.browser.menu.item.SimpleBrowserMenuItem +import org.mozilla.fenix.DefaultThemeManager import org.mozilla.fenix.R class HistoryItemMenu( @@ -23,7 +24,7 @@ class HistoryItemMenu( listOf( SimpleBrowserMenuItem( context.getString(R.string.history_delete_item), - textColorResource = R.color.photonRed60 + textColorResource = DefaultThemeManager.resolveAttribute(R.attr.deleteColor, context) ) { onItemTapped.invoke(Item.Delete) } diff --git a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarUIView.kt b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarUIView.kt index aaf56d0a0..0187a910e 100644 --- a/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarUIView.kt +++ b/app/src/main/java/org/mozilla/fenix/search/awesomebar/AwesomeBarUIView.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.search.awesomebar License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +import android.graphics.PorterDuff import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.content.ContextCompat @@ -19,6 +20,7 @@ import mozilla.components.feature.awesomebar.provider.SessionSuggestionProvider import mozilla.components.feature.search.SearchUseCases import mozilla.components.feature.session.SessionUseCases import mozilla.components.support.ktx.android.graphics.drawable.toBitmap +import org.mozilla.fenix.DefaultThemeManager import org.mozilla.fenix.R import org.mozilla.fenix.ext.components import org.mozilla.fenix.mvi.UIView @@ -76,7 +78,12 @@ class AwesomeBarUIView( private val shortcutSearchUseCase = object : SearchUseCases.SearchUseCase { override fun invoke(searchTerms: String, searchEngine: SearchEngine?) { - actionEmitter.onNext(AwesomeBarAction.SearchTermsTapped(searchTerms, state?.suggestionEngine)) + actionEmitter.onNext( + AwesomeBarAction.SearchTermsTapped( + searchTerms, + state?.suggestionEngine + ) + ) } } @@ -87,7 +94,7 @@ class AwesomeBarUIView( loadUrlUseCase, getDrawable(R.drawable.ic_link)!!.toBitmap(), getString(R.string.awesomebar_clipboard_title) - ) + ) sessionProvider = SessionSuggestionProvider( @@ -105,11 +112,17 @@ class AwesomeBarUIView( if (Settings.getInstance(container.context).showSearchSuggestions()) { val draw = getDrawable(R.drawable.ic_search) - draw?.setTint(ContextCompat.getColor(this, R.color.search_text)) - + draw?.setColorFilter( + ContextCompat.getColor( + this, + DefaultThemeManager.resolveAttribute(R.attr.searchShortcutsTextColor, this) + ), PorterDuff.Mode.SRC_IN + ) defaultSearchSuggestionProvider = SearchSuggestionProvider( - searchEngine = components.search.searchEngineManager.getDefaultSearchEngine(this), + searchEngine = components.search.searchEngineManager.getDefaultSearchEngine( + this + ), searchUseCase = searchUseCase, fetchClient = components.core.client, mode = SearchSuggestionProvider.Mode.MULTIPLE_SUGGESTIONS, @@ -119,11 +132,12 @@ class AwesomeBarUIView( } shortcutsEnginePickerProvider = - ShortcutsSuggestionProvider( - components.search.searchEngineManager, - this, - shortcutEngineManager::selectShortcutEngine, - shortcutEngineManager::selectShortcutEngineSettings) + ShortcutsSuggestionProvider( + components.search.searchEngineManager, + this, + shortcutEngineManager::selectShortcutEngine, + shortcutEngineManager::selectShortcutEngineSettings + ) shortcutEngineManager.shortcutsEnginePickerProvider = shortcutsEnginePickerProvider } @@ -148,16 +162,21 @@ class AwesomeBarUIView( private fun setShortcutEngine(engine: SearchEngine) { with(container.context) { val draw = getDrawable(R.drawable.ic_search) - draw?.setTint(androidx.core.content.ContextCompat.getColor(this, R.color.search_text)) + draw?.setColorFilter( + ContextCompat.getColor( + this, + DefaultThemeManager.resolveAttribute(R.attr.searchShortcutsTextColor, this) + ), PorterDuff.Mode.SRC_IN + ) searchSuggestionFromShortcutProvider = - SearchSuggestionProvider( - components.search.searchEngineManager.getDefaultSearchEngine(this, engine.name), - shortcutSearchUseCase, - components.core.client, - mode = SearchSuggestionProvider.Mode.MULTIPLE_SUGGESTIONS, - icon = draw?.toBitmap() - ) + SearchSuggestionProvider( + components.search.searchEngineManager.getDefaultSearchEngine(this, engine.name), + shortcutSearchUseCase, + components.core.client, + mode = SearchSuggestionProvider.Mode.MULTIPLE_SUGGESTIONS, + icon = draw?.toBitmap() + ) } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index 4b251e97a..cb3f2ca8c 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -43,6 +43,7 @@ import org.mozilla.fenix.R.string.pref_key_language import org.mozilla.fenix.R.string.pref_key_data_choices import org.mozilla.fenix.R.string.pref_key_about import org.mozilla.fenix.R.string.pref_key_sign_in +import org.mozilla.fenix.R.string.pref_key_theme import org.mozilla.fenix.R.string.pref_key_account import org.mozilla.fenix.R.string.pref_key_account_category import org.mozilla.fenix.R.string.pref_key_search_engine_settings @@ -77,6 +78,12 @@ class SettingsFragment : PreferenceFragmentCompat(), CoroutineScope, AccountObse requireComponents.search.searchEngineManager.getDefaultSearchEngine(it).name } + val themesPreference = + findPreference(getString(R.string.pref_key_theme)) + themesPreference?.summary = context?.let { + org.mozilla.fenix.utils.Settings.getInstance(it).themeSettingString + } + val aboutPreference = findPreference(getString(R.string.pref_key_about)) val appName = getString(R.string.app_name) aboutPreference?.title = getString(R.string.preferences_about, appName) @@ -122,6 +129,9 @@ class SettingsFragment : PreferenceFragmentCompat(), CoroutineScope, AccountObse resources.getString(pref_key_account) -> { navigateToAccountSettings() } + resources.getString(pref_key_theme) -> { + navigateToThemeSettings() + } } return super.onPreferenceTreeClick(preference) } @@ -210,6 +220,11 @@ class SettingsFragment : PreferenceFragmentCompat(), CoroutineScope, AccountObse Navigation.findNavController(view!!).navigate(directions) } + private fun navigateToThemeSettings() { + val directions = SettingsFragmentDirections.actionSettingsFragmentToThemeFragment() + Navigation.findNavController(view!!).navigate(directions) + } + private fun navigateToSitePermissions() { val directions = SettingsFragmentDirections.actionSettingsFragmentToSitePermissionsFragment() diff --git a/app/src/main/java/org/mozilla/fenix/settings/ThemeFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/ThemeFragment.kt new file mode 100644 index 000000000..17286db0a --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/settings/ThemeFragment.kt @@ -0,0 +1,100 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.settings + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.app.AppCompatDelegate +import androidx.preference.PreferenceFragmentCompat +import org.mozilla.fenix.R + +class ThemeFragment : PreferenceFragmentCompat() { + private lateinit var radioLightTheme: RadioButtonPreference + private lateinit var radioDarkTheme: RadioButtonPreference + private lateinit var radioAutoBatteryTheme: RadioButtonPreference + private lateinit var radioFollowDeviceTheme: RadioButtonPreference + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + (activity as AppCompatActivity).title = getString(R.string.preferences_theme) + (activity as AppCompatActivity).supportActionBar?.show() + } + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + setPreferencesFromResource(R.xml.theme_preferences, rootKey) + } + + override fun onResume() { + super.onResume() + setupPreferences() + } + + private fun setupPreferences() { + bindFollowDeviceTheme() + bindDarkTheme() + bindLightTheme() + bindAutoBatteryTheme() + setupRadioGroups() + } + + private fun setupRadioGroups() { + radioLightTheme.addToRadioGroup(radioDarkTheme) + radioLightTheme.addToRadioGroup(radioAutoBatteryTheme) + + radioDarkTheme.addToRadioGroup(radioLightTheme) + radioDarkTheme.addToRadioGroup(radioAutoBatteryTheme) + + radioAutoBatteryTheme.addToRadioGroup(radioLightTheme) + radioAutoBatteryTheme.addToRadioGroup(radioDarkTheme) + + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) { + radioLightTheme.addToRadioGroup(radioFollowDeviceTheme) + radioDarkTheme.addToRadioGroup(radioFollowDeviceTheme) + radioAutoBatteryTheme.addToRadioGroup(radioFollowDeviceTheme) + + radioFollowDeviceTheme.addToRadioGroup(radioDarkTheme) + radioFollowDeviceTheme.addToRadioGroup(radioLightTheme) + radioFollowDeviceTheme.addToRadioGroup(radioAutoBatteryTheme) + } + } + + private fun bindLightTheme() { + val keyLightTheme = getString(R.string.pref_key_light_theme) + radioLightTheme = requireNotNull(findPreference(keyLightTheme)) + radioLightTheme.onClickListener { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + activity?.recreate() + } + } + + private fun bindAutoBatteryTheme() { + val keyBatteryTheme = getString(R.string.pref_key_auto_battery_theme) + radioAutoBatteryTheme = requireNotNull(findPreference(keyBatteryTheme)) + radioAutoBatteryTheme.onClickListener { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY) + activity?.recreate() + } + } + + private fun bindDarkTheme() { + val keyDarkTheme = getString(R.string.pref_key_dark_theme) + radioDarkTheme = requireNotNull(findPreference(keyDarkTheme)) + radioDarkTheme.onClickListener { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) + activity?.recreate() + } + } + + private fun bindFollowDeviceTheme() { + val keyDeviceTheme = getString(R.string.pref_key_follow_device_theme) + radioFollowDeviceTheme = requireNotNull(findPreference(keyDeviceTheme)) + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) { + radioFollowDeviceTheme.onClickListener { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) + activity?.recreate() + } + } + } +} diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 84071a983..b09845c82 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -56,6 +56,39 @@ class Settings private constructor(context: Context) { val shouldRecommendedSettingsBeActivated: Boolean get() = preferences.getBoolean(appContext.getPreferenceKey(R.string.pref_key_recommended_settings), true) + val shouldUseLightTheme: Boolean + get() = preferences.getBoolean( + appContext.getPreferenceKey(R.string.pref_key_light_theme), + false + ) + + val shouldUseDarkTheme: Boolean + get() = preferences.getBoolean( + appContext.getPreferenceKey(R.string.pref_key_dark_theme), + false + ) + + val shouldFollowDeviceTheme: Boolean + get() = preferences.getBoolean( + appContext.getPreferenceKey(R.string.pref_key_follow_device_theme), + false + ) + + val shouldUseAutoBatteryTheme: Boolean + get() = preferences.getBoolean( + appContext.getPreferenceKey(R.string.pref_key_auto_battery_theme), + false + ) + + val themeSettingString: String + get() = when { + shouldFollowDeviceTheme -> appContext.getString(R.string.preference_follow_device_theme) + shouldUseAutoBatteryTheme -> appContext.getString(R.string.preference_auto_battery_theme) + shouldUseDarkTheme -> appContext.getString(R.string.preference_dark_theme) + shouldUseLightTheme -> appContext.getString(R.string.preference_light_theme) + else -> appContext.getString(R.string.preference_light_theme) + } + private val autoBounceQuickActionSheetCount: Int get() = (preferences.getInt(appContext.getPreferenceKey(R.string.pref_key_bounce_quick_action), 0)) diff --git a/app/src/main/res/drawable-night-xxxhdpi/ic_logo_wordmark.png b/app/src/main/res/drawable-night-xxxhdpi/ic_logo_wordmark.png new file mode 100644 index 0000000000000000000000000000000000000000..6b11e82ed91c7d9eeaff2d447c1f8b11b128d136 GIT binary patch literal 67552 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/home_search_background_light.xml b/app/src/main/res/drawable/home_search_background_normal.xml similarity index 74% rename from app/src/main/res/drawable/home_search_background_light.xml rename to app/src/main/res/drawable/home_search_background_normal.xml index 9c39c1019..dc41829fe 100644 --- a/app/src/main/res/drawable/home_search_background_light.xml +++ b/app/src/main/res/drawable/home_search_background_normal.xml @@ -3,10 +3,10 @@ - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - + + android:color="@color/search_stroke_normal"/> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_customize.xml b/app/src/main/res/drawable/ic_customize.xml new file mode 100644 index 000000000..78d3ae49b --- /dev/null +++ b/app/src/main/res/drawable/ic_customize.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_drawer_pull_tab.xml b/app/src/main/res/drawable/ic_drawer_pull_tab.xml index ab9f6d465..04a234c92 100644 --- a/app/src/main/res/drawable/ic_drawer_pull_tab.xml +++ b/app/src/main/res/drawable/ic_drawer_pull_tab.xml @@ -7,6 +7,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_private_browsing.xml b/app/src/main/res/drawable/ic_private_browsing.xml index f3ad44d43..223ade8f7 100644 --- a/app/src/main/res/drawable/ic_private_browsing.xml +++ b/app/src/main/res/drawable/ic_private_browsing.xml @@ -9,5 +9,5 @@ android:viewportHeight="24"> + android:fillColor="?attr/privateBrowsingButtonTint" /> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml index 461c9c33b..f84287b39 100644 --- a/app/src/main/res/drawable/ic_settings.xml +++ b/app/src/main/res/drawable/ic_settings.xml @@ -1,4 +1,5 @@ - + android:fillColor="?attr/iconColor" + android:pathData="M20.75,11C21.3023,11 21.75,11.4477 21.75,12C21.75,12.5523 21.3023,13 20.75,13L17.91,13C17.7599,13.8907 17.4094,14.7356 16.885,15.471L18.894,17.48C19.273,17.8724 19.2676,18.4961 18.8818,18.8818C18.4961,19.2676 17.8724,19.273 17.48,18.894L15.471,16.885C14.7356,17.4094 13.8907,17.7599 13,17.91L13,20.75C13,21.3023 12.5523,21.75 12,21.75C11.4477,21.75 11,21.3023 11,20.75L11,17.91C10.0912,17.7564 9.2303,17.3943 8.485,16.852C8.445,16.9354 8.3935,17.0129 8.332,17.082L6.52,18.894C6.2689,19.154 5.8971,19.2582 5.5475,19.1667C5.1979,19.0752 4.9248,18.8021 4.8333,18.4525C4.7418,18.1029 4.846,17.7311 5.106,17.48L6.918,15.668C6.9871,15.6065 7.0646,15.555 7.148,15.515C6.6057,14.7697 6.2436,13.9088 6.09,13L3.25,13C2.6977,13 2.25,12.5523 2.25,12C2.25,11.4477 2.6977,11 3.25,11L6.09,11C6.2401,10.1093 6.5906,9.2644 7.115,8.529L5.106,6.52C4.727,6.1276 4.7324,5.5039 5.1182,5.1182C5.5039,4.7324 6.1276,4.727 6.52,5.106L8.529,7.115C9.2644,6.5906 10.1093,6.2401 11,6.09L11,3.25C11,2.6977 11.4477,2.25 12,2.25C12.5523,2.25 13,2.6977 13,3.25L13,6.09C13.8907,6.2401 14.7356,6.5906 15.471,7.115L17.48,5.106C17.8724,4.727 18.4961,4.7324 18.8818,5.1182C19.2676,5.5039 19.273,6.1276 18.894,6.52L16.885,8.529C17.4094,9.2644 17.7599,10.1093 17.91,11L20.75,11ZM8,12C8,13.0609 8.4214,14.0783 9.1716,14.8284C9.9217,15.5786 10.9391,16 12,16C14.2091,16 16,14.2091 16,12C16,9.7909 14.2091,8 12,8C9.7909,8 8,9.7909 8,12Z" /> diff --git a/app/src/main/res/drawable/sign_in_preference_background.xml b/app/src/main/res/drawable/sign_in_preference_background.xml index c415797bb..bc316be0f 100644 --- a/app/src/main/res/drawable/sign_in_preference_background.xml +++ b/app/src/main/res/drawable/sign_in_preference_background.xml @@ -12,7 +12,7 @@ - + diff --git a/app/src/main/res/layout/bookmark_row.xml b/app/src/main/res/layout/bookmark_row.xml index ff19b38cf..cd5a6c511 100644 --- a/app/src/main/res/layout/bookmark_row.xml +++ b/app/src/main/res/layout/bookmark_row.xml @@ -48,6 +48,7 @@ android:layout_margin="10dp" android:contentDescription="@string/bookmark_menu_content_description" android:src="@drawable/ic_menu" + android:tint="?attr/iconColor" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/component_awesomebar.xml b/app/src/main/res/layout/component_awesomebar.xml index 31d2be151..500e56c0c 100644 --- a/app/src/main/res/layout/component_awesomebar.xml +++ b/app/src/main/res/layout/component_awesomebar.xml @@ -2,19 +2,16 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/component_history.xml b/app/src/main/res/layout/component_history.xml index b322d5336..aefb1be8c 100644 --- a/app/src/main/res/layout/component_history.xml +++ b/app/src/main/res/layout/component_history.xml @@ -28,7 +28,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/history_delete_all" - android:textColor="@color/photonRed60" + android:textColor="?attr/deleteColor" android:drawablePadding="8dp" android:textSize="16sp" android:gravity="center" diff --git a/app/src/main/res/layout/component_tabs.xml b/app/src/main/res/layout/component_tabs.xml index ba7488c2d..b99dd8cef 100644 --- a/app/src/main/res/layout/component_tabs.xml +++ b/app/src/main/res/layout/component_tabs.xml @@ -75,13 +75,14 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:clickable="false" + android:drawableTint="@color/save_session_button_text_color" android:drawableStart="@drawable/ic_archive" android:drawablePadding="8dp" android:focusable="false" android:gravity="center" android:textStyle="bold" android:text="@string/session_save" - android:textColor="@color/photonWhite" /> + android:textColor="@color/save_session_button_text_color" /> + android:background="?attr/quickActionBackgroundColor"> + android:background="?attr/quickActionBackgroundColor"> @@ -45,6 +46,7 @@ android:layout_marginBottom="8dp" android:text="@string/tabs_header_title" android:textAppearance="@style/HeaderTextStyle" + android:textColor="?attr/toolbarTextColor" app:layout_constraintStart_toEndOf="@id/current_session_image" app:layout_constraintTop_toTopOf="parent" /> @@ -58,6 +60,7 @@ android:fadingEdgeLength="48dp" android:requiresFadingEdge="vertical" android:textAppearance="@style/TextAppearance.MaterialComponents.Caption" + android:textColor="?attr/secondaryTextColor" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0" @@ -73,15 +76,15 @@ android:id="@+id/delete_session_button" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?android:attr/colorBackground" + android:background="?attr/sessionBackgroundColor" android:drawableStart="@drawable/ic_delete" android:drawablePadding="14dp" - android:drawableTint="@color/photonRed60" + android:drawableTint="?attr/deleteColor" android:paddingStart="20dp" android:paddingTop="12dp" android:paddingBottom="12dp" android:text="@string/current_session_delete" - android:textColor="@color/photonRed60" + android:textColor="?attr/deleteColor" android:textSize="16sp" tools:targetApi="m" /> @@ -94,29 +97,31 @@ android:id="@+id/archive_session_button" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?android:attr/colorBackground" + android:background="?attr/sessionBackgroundColor" android:drawableStart="@drawable/ic_archive" android:drawablePadding="14dp" + android:drawableTint="?attr/iconColor" android:paddingStart="20dp" android:paddingTop="12dp" android:paddingBottom="12dp" android:text="@string/current_session_save" - android:textColor="@color/light_mode_bottom_sheet_text_color" - android:textSize="16sp" /> + android:textColor="?attr/toolbarTextColor" + android:textSize="16sp" + tools:targetApi="m" /> - + android:textColor="?attr/toolbarTextColor" + android:textSize="16sp" + tools:targetApi="m" /> \ No newline at end of file diff --git a/app/src/main/res/layout/session_item.xml b/app/src/main/res/layout/session_item.xml index 7fe8d50b8..eef05cbcf 100644 --- a/app/src/main/res/layout/session_item.xml +++ b/app/src/main/res/layout/session_item.xml @@ -6,9 +6,9 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="96dp" + app:cardBackgroundColor="@color/sessionBackgroundColor_normal_theme" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" - android:background="@android:color/white" app:cardCornerRadius="10dp" app:cardElevation="5dp"> @@ -35,7 +35,7 @@ android:layout_marginEnd="12dp" android:layout_marginBottom="5dp" android:textAppearance="@style/Header14TextStyle" - android:textColor="@color/photonInk80" + android:textColor="?attr/primaryTextColor" android:textSize="16sp" app:layout_constraintEnd_toStartOf="@id/session_card_overflow_button" app:layout_constraintStart_toEndOf="@+id/session_card_thumbnail" @@ -45,6 +45,7 @@ android:id="@+id/session_card_titles" android:layout_width="0dp" android:layout_height="wrap_content" + android:textColor="?attr/secondaryTextColor" android:textAppearance="@style/TextAppearance.MaterialComponents.Caption" app:layout_constraintEnd_toEndOf="@id/session_card_timestamp" app:layout_constraintStart_toStartOf="@id/session_card_timestamp" @@ -54,6 +55,7 @@ android:id="@+id/session_card_extras" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:textColor="?attr/secondaryTextColor" android:textAppearance="@style/TextAppearance.MaterialComponents.Caption" app:layout_constraintStart_toStartOf="@id/session_card_titles" app:layout_constraintTop_toBottomOf="@+id/session_card_titles" /> diff --git a/app/src/main/res/layout/tab_list_row.xml b/app/src/main/res/layout/tab_list_row.xml index 912253e0d..5193d1a2b 100644 --- a/app/src/main/res/layout/tab_list_row.xml +++ b/app/src/main/res/layout/tab_list_row.xml @@ -8,6 +8,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" + app:cardBackgroundColor="?attr/sessionBackgroundColor" android:clipToPadding="false" app:cardCornerRadius="@dimen/tab_corner_radius" app:cardElevation="5dp"> @@ -34,7 +35,7 @@ android:ellipsize="none" android:requiresFadingEdge="horizontal" android:singleLine="true" - android:textColor="?attr/toolbarTextColor" + android:textColor="?attr/primaryTextColor" android:textSize="16sp" app:layout_constraintEnd_toStartOf="@id/close_tab_button" app:layout_constraintHorizontal_bias="0" diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 2951a2ebd..b78cbf8e0 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -137,6 +137,9 @@ + @@ -175,4 +178,8 @@ + \ No newline at end of file diff --git a/app/src/main/res/values-night/bools.xml b/app/src/main/res/values-night/bools.xml new file mode 100644 index 000000000..73f4a60e8 --- /dev/null +++ b/app/src/main/res/values-night/bools.xml @@ -0,0 +1,7 @@ + + + + false + diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml new file mode 100644 index 000000000..83556834d --- /dev/null +++ b/app/src/main/res/values-night/colors.xml @@ -0,0 +1,77 @@ + + + + @color/secondaryTextColor_dark_theme + @color/off_white + @color/disabled_icons_dark_mode + @color/background_dark_theme + @color/background_dark_theme + @color/background_dark_theme + @color/off_white + @color/foreground_dark_theme + #A374F7 + @color/off_white + + @android:color/transparent + @android:color/transparent + + + @color/background_dark_theme + + + @color/off_white + @color/off_white + @color/off_white + @color/background_dark_theme + @color/background_dark_theme + @color/home_buttons_dark_theme + @color/home_buttons_dark_theme + + + @color/foreground_dark_theme + #27262F + @color/foreground_dark_theme + @color/foreground_dark_theme + + + @color/foreground_dark_theme + + + @color/foreground_dark_theme + #592ACB + #EFEFF2 + #1E1338 + #e5e5ea + #EB5D63 + @color/foreground_dark_theme + @color/off_white + @color/off_white + @color/off_white + + @color/off_white + #E3E3E6 + + + @color/off_white + + + #A374F7 + @color/off_white + @color/foreground_dark_theme + + + @color/background_dark_theme + @color/background_dark_theme + @color/off_white + #202340 + + + @color/off_white + @color/secondaryTextColor_dark_theme + + + @color/secondaryTextColor_dark_theme + @color/background_dark_theme + diff --git a/app/src/main/res/values-v23/styles.xml b/app/src/main/res/values-v23/styles.xml index 63003b0a3..a7600cd56 100644 --- a/app/src/main/res/values-v23/styles.xml +++ b/app/src/main/res/values-v23/styles.xml @@ -3,12 +3,12 @@ - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - - \ No newline at end of file diff --git a/app/src/main/res/values-v28/bools.xml b/app/src/main/res/values-v28/bools.xml new file mode 100644 index 000000000..abc07ff3d --- /dev/null +++ b/app/src/main/res/values-v28/bools.xml @@ -0,0 +1,7 @@ + + + + true + diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 9c288338a..a822adcdd 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -13,6 +13,8 @@ + + @@ -28,6 +30,7 @@ + @@ -43,6 +46,7 @@ + diff --git a/app/src/main/res/values/bools.xml b/app/src/main/res/values/bools.xml new file mode 100644 index 000000000..8aaae0c77 --- /dev/null +++ b/app/src/main/res/values/bools.xml @@ -0,0 +1,8 @@ + + + + true + false + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index adc0c7d55..a49c12f64 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -3,57 +3,92 @@ - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> + #544CD9 #202340 #D81B60 - #F2F2F5 - #DFDFE3 - #20123A - - #212121 - #6b6b6b - #F2F2F5 - #E9E9ED - #4f4e75 - #42416b - #393863 - #c5c8d7 - #0A202340 - #2d2e5f - #0C0C0D #f9f9fa - #E9E9ED + #6b6b6b + #20123A + + + #DFDFE3 + + + #1C1B22 + #32313C + #A2A1A5 + #A4A3AA + + + #696A6A + @color/text_color_normal_theme + #696A6A + #20123A + #8020233E + @color/off_white + @color/off_white + @color/off_white + @color/off_white + #2E0EC1 + @color/off_white + @android:color/transparent + @android:color/transparent + @color/off_white + @color/off_white + @color/menu_button_tint_normal_theme + @color/off_white + + @color/off_white + #c5c8d7 + #0A202340 + + @color/photonGrey30 + @color/photonWhite #592ACB #352F65 - #232749 - - #20123A - #8020233E - - @color/off_white - #80F9F9FA - - @color/off_white - @color/private_browsing_top_gradient - + @color/off_white + #232749 + #F2F2F5 + @color/off_white + @color/photonBlue50 + #202340 #1A665BFD #544CD9 #6D6D6E - #4a4671 + @color/photonInk80 #e5e5ea + @color/photonRed60 + #FAFAFC + #2f2c61 + #202340 + #212121 + #6b6b6b + #0C0C0D + #E9E9ED + #20123A + #F2F2F5 + #E9E9ED - #2E0EC1 - + + #4f4e75 + #42416b + #393863 + #2d2e5f + @color/off_white + #80F9F9FA + @color/private_browsing_top_gradient + #4a4671 #ad3bff #242251 #393862 - - #FAFAFC - #2f2c61 #080639 - #202340 + @color/photonGrey40 + @color/off_white + @color/photonGrey40 + #B9F0FD #0E214A @@ -72,17 +107,11 @@ #FCE98F #8A201F - #696A6A - @color/light_mode_text_color - #696A6A - - @color/photonGrey40 - @color/off_white - @color/photonGrey40 - + #312a65 #efeff2 + #174291 #b9f0fd @@ -90,6 +119,6 @@ #fce98f #2915141A - - #202340 + @color/toolbar_normal_theme + @color/toolbar_dark_mode diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index 3383ac1d3..3282e687d 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -49,4 +49,9 @@ pref_key_phone_feature_notification pref_key_category_phone_feature + + pref_key_light_theme + pref_key_dark_theme + pref_key_auto_battery_theme + pref_key_follow_device_theme diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e18aad9e4..adffb9789 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -119,6 +119,8 @@ Account Sign in + + Theme Sync bookmarks, history, and more with your Firefox Account @@ -168,6 +170,16 @@ Fenix health report + + + Light + + Dark + + Set by Battery Saver + + Follow device theme + Share diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 70f14fddc..0667ecbcc 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -4,68 +4,77 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - - @@ -80,6 +89,8 @@ @color/toolbar_dark_mode @color/private_browsing_primary @color/private_browsing_primary + @color/off_white + @color/photonGrey40 @color/private_browsing_bottom_gradient @@ -98,7 +109,7 @@ @color/search_private_background @color/session_list_private_header @color/private_browsing_primary - @color/off_white + @color/photonRed60 @color/private_browsing_bottom_gradient @@ -114,6 +125,8 @@ @color/private_browsing_top_gradient @color/icons_dark_mode @color/icons_dark_mode + @color/off_white + @color/quick_action_background_private_theme @color/history_title_private_theme @@ -169,7 +182,7 @@