Skip to content

Commit 2d4a309

Browse files
authored
Light theme polish (#375)
* Separate application theme init from activity theme selection * Add themed switch background color * Update tabs screen to meet latest design * Use neutral colors on startup and delete redundant themes * Ensure browser toolbar shows on resume * Ensure ripple color shows on toolbar * Remove old home row related variant restrictions
1 parent 5f74578 commit 2d4a309

20 files changed

+74
-87
lines changed

app/src/androidTest/java/com/duckduckgo/app/statistics/ExperimentationVariantManagerTest.kt

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package com.duckduckgo.app.statistics
1818

19-
import android.os.Build
20-
import android.support.test.filters.SdkSuppress
2119
import com.duckduckgo.app.statistics.store.StatisticsDataStore
2220
import com.nhaarman.mockito_kotlin.*
2321
import org.junit.Assert.assertEquals
@@ -95,8 +93,7 @@ class ExperimentationVariantManagerTest {
9593

9694

9795
@Test
98-
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.N)
99-
fun whenNougatOrLaterAndNoVariantPersistedThenNewVariantAllocated() {
96+
fun whenNoVariantPersistedThenNewVariantAllocated() {
10097
activeVariants.add(Variant("foo", 100.0))
10198

10299
testee.getVariant(activeVariants)
@@ -105,30 +102,11 @@ class ExperimentationVariantManagerTest {
105102
}
106103

107104
@Test
108-
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.N)
109-
fun whenNougatOrLaterAndNoVariantPersistedThenNewVariantKeyIsAllocatedAndPersisted() {
105+
fun whenNoVariantPersistedThenNewVariantKeyIsAllocatedAndPersisted() {
110106
activeVariants.add(Variant("foo", 100.0))
111107

112108
testee.getVariant(activeVariants)
113109

114110
verify(mockStore).variant = "foo"
115111
}
116-
117-
@Test
118-
@SdkSuppress(maxSdkVersion = Build.VERSION_CODES.M)
119-
fun whenMarshmallowOrEarlierAndNoVariantPersistedThenDefaultVariantAllocated() {
120-
activeVariants.add(Variant("foo", 100.0))
121-
122-
assertEquals(VariantManager.DEFAULT_VARIANT, testee.getVariant(activeVariants))
123-
}
124-
125-
@Test
126-
@SdkSuppress(maxSdkVersion = Build.VERSION_CODES.M)
127-
fun whenMarshmallowOrEarlierAndNoVariantPersistedThenDefaultVariantKeyIsAllocatedAndPersisted() {
128-
activeVariants.add(Variant("foo", 100.0))
129-
130-
testee.getVariant(activeVariants)
131-
132-
verify(mockStore).variant = VariantManager.DEFAULT_VARIANT.key
133-
}
134112
}

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
android:label="@string/appName"
1616
android:networkSecurityConfig="@xml/network_security_config"
1717
android:supportsRtl="true"
18-
android:theme="@style/AppTheme.Dark"
18+
android:theme="@style/AppTheme"
1919
tools:ignore="GoogleAppIndexingWarning">
2020
<meta-data
2121
android:name="android.webkit.WebView.MetricsOptOut"
@@ -34,7 +34,6 @@
3434
android:label="@string/appName">
3535
<intent-filter>
3636
<action android:name="android.intent.action.MAIN" />
37-
3837
<category android:name="android.intent.category.LAUNCHER" />
3938
</intent-filter>
4039
</activity>
@@ -116,8 +115,7 @@
116115
android:theme="@style/ModalCardTheme" />
117116
<activity
118117
android:name="com.duckduckgo.app.fire.FireActivity"
119-
android:process="@string/fireProcessName"
120-
android:theme="@style/SplashTheme" />
118+
android:process="@string/fireProcessName" />
121119

122120
<service
123121
android:name="com.duckduckgo.app.job.AppConfigurationJobService"

app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class BrowserTabFragment : Fragment(), FindListener {
112112
lateinit var shortcutBuilder: ShortcutBuilder
113113

114114
@Inject
115-
lateinit var clipboardManager: ClipboardManager
115+
lateinit var clipboardManager: ClipboardManager
116116

117117
val tabId get() = arguments!![TAB_ID_ARG] as String
118118

@@ -209,6 +209,7 @@ class BrowserTabFragment : Fragment(), FindListener {
209209
override fun onResume() {
210210
super.onResume()
211211
addTextChangedListeners()
212+
appBarLayout.setExpanded(true)
212213
viewModel.onViewVisible()
213214
}
214215

app/src/main/java/com/duckduckgo/app/browser/BrowserWebViewClient.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ class BrowserWebViewClient @Inject constructor(
181181

182182
private fun reportHttpsUpgradeSiteError(url: Uri, error: String?) {
183183
val params = mapOf(
184-
APP_VERSION to "${BuildConfig.VERSION_NAME}",
184+
APP_VERSION to BuildConfig.VERSION_NAME,
185185
URL to url.simpleUrl,
186186
ERROR_CODE to error
187187
)

app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,17 @@ import android.support.v4.app.Fragment
2828
import com.duckduckgo.app.browser.BuildConfig
2929
import com.duckduckgo.app.di.AppComponent
3030
import com.duckduckgo.app.di.DaggerAppComponent
31-
import com.duckduckgo.app.fire.UnsentForgetAllPixelStore
3231
import com.duckduckgo.app.fire.FireActivity
32+
import com.duckduckgo.app.fire.UnsentForgetAllPixelStore
33+
import com.duckduckgo.app.global.Theming.initializeTheme
3334
import com.duckduckgo.app.global.install.AppInstallStore
3435
import com.duckduckgo.app.global.notification.NotificationRegistrar
3536
import com.duckduckgo.app.global.shortcut.AppShortcutCreator
3637
import com.duckduckgo.app.httpsupgrade.HttpsUpgrader
3738
import com.duckduckgo.app.job.AppConfigurationSyncer
3839
import com.duckduckgo.app.migration.LegacyMigration
40+
import com.duckduckgo.app.settings.db.SettingsDataStore
41+
import com.duckduckgo.app.statistics.VariantManager
3942
import com.duckduckgo.app.statistics.api.StatisticsUpdater
4043
import com.duckduckgo.app.statistics.pixels.Pixel
4144
import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.APP_LAUNCH
@@ -82,9 +85,15 @@ open class DuckDuckGoApplication : HasActivityInjector, HasServiceInjector, HasS
8285
@Inject
8386
lateinit var appInstallStore: AppInstallStore
8487

88+
@Inject
89+
lateinit var settingsDataStore: SettingsDataStore
90+
8591
@Inject
8692
lateinit var notificationRegistrar: NotificationRegistrar
8793

94+
@Inject
95+
lateinit var variantManager: VariantManager
96+
8897
@Inject
8998
lateinit var pixel: Pixel
9099

@@ -118,6 +127,7 @@ open class DuckDuckGoApplication : HasActivityInjector, HasServiceInjector, HasS
118127
}
119128

120129
initializeStatistics()
130+
initializeTheme(settingsDataStore, variantManager.getVariant())
121131
loadTrackerData()
122132
configureDataDownloader()
123133
recordInstallationTimestamp()

app/src/main/java/com/duckduckgo/app/global/Theming.kt

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ import android.content.Intent
2222
import android.content.IntentFilter
2323
import android.support.v4.content.LocalBroadcastManager
2424
import com.duckduckgo.app.browser.R
25-
import com.duckduckgo.app.global.ThemingConstants.BROADCAST_THEME_CHANGED
25+
import com.duckduckgo.app.global.DuckDuckGoTheme.DARK
26+
import com.duckduckgo.app.global.DuckDuckGoTheme.LIGHT
27+
import com.duckduckgo.app.global.Theming.Constants.BROADCAST_THEME_CHANGED
28+
import com.duckduckgo.app.global.Theming.Constants.THEME_MAP
2629
import com.duckduckgo.app.settings.db.SettingsDataStore
2730
import com.duckduckgo.app.statistics.Variant
2831
import com.duckduckgo.app.statistics.VariantManager.VariantFeature.ThemeFeature.LightThemeAsDefault
@@ -33,16 +36,28 @@ enum class DuckDuckGoTheme {
3336
LIGHT;
3437
}
3538

36-
fun DuckDuckGoActivity.applyTheme(settingsDataStore: SettingsDataStore, variant: Variant): BroadcastReceiver? {
39+
object Theming {
3740

38-
if (settingsDataStore.theme == null) {
39-
settingsDataStore.theme = defaultApplicationTheme(variant)
41+
fun initializeTheme(settingsDataStore: SettingsDataStore, variant: Variant) {
42+
if (settingsDataStore.theme == null) {
43+
settingsDataStore.theme = if (variant.hasFeature(LightThemeAsDefault)) LIGHT else DARK
44+
}
4045
}
4146

42-
if (!isThemeConfigurable()) {
43-
return null
47+
object Constants {
48+
49+
const val BROADCAST_THEME_CHANGED = "BROADCAST_THEME_CHANGED"
50+
51+
val THEME_MAP = mapOf(
52+
Pair(R.style.AppTheme, DuckDuckGoTheme.LIGHT) to R.style.AppTheme_Light,
53+
Pair(R.style.AppTheme, DuckDuckGoTheme.DARK) to R.style.AppTheme_Dark
54+
)
4455
}
45-
setTheme(themeId(settingsDataStore, variant))
56+
}
57+
58+
fun DuckDuckGoActivity.applyTheme(settingsDataStore: SettingsDataStore, variant: Variant): BroadcastReceiver? {
59+
val themeId = THEME_MAP[Pair(manifestThemeId(), settingsDataStore.theme)] ?: return null
60+
setTheme(themeId)
4661
return registerForThemeChangeBroadcast()
4762
}
4863

@@ -62,26 +77,6 @@ fun DuckDuckGoActivity.sendThemeChangedBroadcast() {
6277
manager.sendBroadcast(Intent(BROADCAST_THEME_CHANGED))
6378
}
6479

65-
private fun themeId(settingsDataStore: SettingsDataStore, variant: Variant): Int {
66-
val theme = settingsDataStore.theme ?: defaultApplicationTheme(variant)
67-
return when (theme) {
68-
DuckDuckGoTheme.LIGHT -> R.style.AppTheme_Light
69-
DuckDuckGoTheme.DARK -> R.style.AppTheme_Dark
70-
}
71-
}
72-
73-
private fun DuckDuckGoActivity.isThemeConfigurable(): Boolean {
74-
return manifestThemeId() == R.style.AppTheme_Dark || manifestThemeId() == R.style.AppTheme_Light
75-
}
76-
7780
private fun DuckDuckGoActivity.manifestThemeId(): Int {
7881
return packageManager.getActivityInfo(componentName, 0).themeResource
7982
}
80-
81-
private fun defaultApplicationTheme(variant: Variant): DuckDuckGoTheme {
82-
return if (variant.hasFeature(LightThemeAsDefault)) DuckDuckGoTheme.LIGHT else DuckDuckGoTheme.DARK
83-
}
84-
85-
object ThemingConstants {
86-
const val BROADCAST_THEME_CHANGED = "BROADCAST_THEME_CHANGED"
87-
}

app/src/main/java/com/duckduckgo/app/httpsupgrade/api/HttpsUpgradeDataDownloader.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ class HttpsUpgradeDataDownloader @Inject constructor(
122122
return@defer complete()
123123
}
124124
val params = mapOf(
125-
APP_VERSION to "${BuildConfig.VERSION_NAME}",
125+
APP_VERSION to BuildConfig.VERSION_NAME,
126126
TOTAL_COUNT to statisticsDataStore.httpsUpgradesTotal.toString(),
127127
FAILURE_COUNT to statisticsDataStore.httpsUpgradesFailures.toString()
128128
)

app/src/main/java/com/duckduckgo/app/statistics/VariantManager.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,8 @@ class ExperimentationVariantManager(
9696
}
9797

9898
private fun generateVariant(activeVariants: List<Variant>): Variant {
99-
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
100-
Timber.i("No variants available for pre-Nougat devices")
101-
return DEFAULT_VARIANT
102-
}
103-
10499
val randomizedIndex = indexRandomizer.random(activeVariants)
105100
return activeVariants[randomizedIndex]
106-
107101
}
108102
}
109103

app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherAdapter.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ class TabSwitcherAdapter(private val context: Context, private val itemClickList
5353
holder.url.text = tab.displayUrl()
5454
holder.tabUnread.visibility = if (tab.viewed) View.INVISIBLE else View.VISIBLE
5555
holder.root.setBackgroundResource(if (tab.tabId == selectedTab?.tabId) SELECTED_BACKGROUND else DEFAULT_BACKGROUND)
56-
holder.root.alpha = if (tab.tabId == selectedTab?.tabId) SELECTED_ALPHA else DEFAULT_ALPHA
5756

5857
GlideApp.with(holder.root)
5958
.load(tab.favicon())
@@ -103,10 +102,6 @@ class TabSwitcherAdapter(private val context: Context, private val itemClickList
103102
private const val SELECTED_BACKGROUND = R.drawable.tab_background_selected
104103
@DrawableRes
105104
private const val DEFAULT_BACKGROUND = R.drawable.tab_background
106-
107-
private const val SELECTED_ALPHA = 1.0f
108-
private const val DEFAULT_ALPHA = 0.77f
109-
110105
}
111106

112107
}

app/src/main/res/drawable/tab_background_selected.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@
1818
<solid android:color="@color/white" />
1919
<stroke
2020
android:width="2dp"
21-
android:color="@color/skyBlue" />
21+
android:color="?attr/tabSelectedBorderColor" />
2222
<corners android:radius="2dp" />
2323
</shape>

0 commit comments

Comments
 (0)