Skip to content

Commit d985d52

Browse files
0nkoLukasPaczos
andauthored
Split Omnibar: Settings screen (#7002)
Task/Issue URL: https://app.asana.com/1/137249556945/project/488551667048375/task/1211565479656356?focus=true ### Description This PR updates the Appearance settings screen with the new pictograms and includes the split omnibar option. ### Steps to test this PR Figma design for reference: [Figma](https://www.figma.com/design/fE86ubaWKsx4ovs7kSwRtl/%F0%9F%8E%9B%EF%B8%8F-Customisable-options-for-main-browser-UI?node-id=550-23525&t=Uv4osZ9KFZzAZCnE-1) _Old settings_ - [x] Go to Settings -> Appearance - [x] Verify the old omnibar position is displayed _New settings_ - [x] Enable `splitOmnibar` in the feature flags - [x] Go to Settings -> Appearance - [x] Verify the new omnibar type pictograms are displayed - [x] Verify the correct omnibar type is selected - [x] Try changing the current type for each option - [x] Verify the new type is visually selected - [x] Leave the Appearance settings and come back - [x] Verify the previous selection is restored _Dark mode_ - [x] Change the theme to dark mode - [x] Verify new dark pictograms are used - [x] Select each option and verify the dark-mode selection options are show _Omnibar type fallback when feature disabled_ - [x] Go to Settings -> Appearance - [x] Change the omnibar type to Split - [x] Go to the feature flag settings - [x] Disable the `useUnifiedOmnibar` feature - [x] Restart the app - [x] Go to Settings -> Appearance - [x] Verify the omnibar position is set to Top ### UI changes | Before | After | | ------ | ----- | <img width="1080" height="2400" alt="image" src="https://github.com/user-attachments/assets/96bd9072-6b25-43b2-9e80-894540a42e0a" />|<img width="1080" height="2400" alt="image" src="https://github.com/user-attachments/assets/59baa5bb-b2a4-4743-9819-4faeb61c6c8d" />| --------- Co-authored-by: Łukasz Paczos <lpaczos@duckduckgo.com>
1 parent 53709fc commit d985d52

18 files changed

+517
-8
lines changed

app/src/main/java/com/duckduckgo/app/appearance/AppearanceActivity.kt

Lines changed: 112 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,28 @@ import com.duckduckgo.common.ui.DuckDuckGoTheme.DARK
4343
import com.duckduckgo.common.ui.DuckDuckGoTheme.LIGHT
4444
import com.duckduckgo.common.ui.DuckDuckGoTheme.SYSTEM_DEFAULT
4545
import com.duckduckgo.common.ui.sendThemeChangedBroadcast
46+
import com.duckduckgo.common.ui.store.AppTheme
4647
import com.duckduckgo.common.ui.view.dialog.RadioListAlertDialogBuilder
4748
import com.duckduckgo.common.ui.view.dialog.TextAlertDialogBuilder
4849
import com.duckduckgo.common.ui.view.getColorFromAttr
50+
import com.duckduckgo.common.ui.view.gone
51+
import com.duckduckgo.common.ui.view.show
4952
import com.duckduckgo.common.ui.viewbinding.viewBinding
5053
import com.duckduckgo.di.scopes.ActivityScope
5154
import com.duckduckgo.navigation.api.getActivityParams
5255
import kotlinx.coroutines.flow.launchIn
5356
import kotlinx.coroutines.flow.onEach
5457
import logcat.logcat
58+
import javax.inject.Inject
59+
import com.duckduckgo.mobile.android.R as CommonR
5560

5661
@InjectWith(ActivityScope::class)
5762
@ContributeToActivityStarter(Default::class, screenName = "appearance")
5863
@ContributeToActivityStarter(HighlightedItem::class, screenName = "appearance")
5964
class AppearanceActivity : DuckDuckGoActivity() {
65+
@Inject
66+
lateinit var appTheme: AppTheme
67+
6068
private val viewModel: AppearanceViewModel by bindViewModel()
6169
private val binding: ActivityAppearanceBinding by viewBinding()
6270

@@ -110,10 +118,43 @@ class AppearanceActivity : DuckDuckGoActivity() {
110118
scrollToHighlightedItem()
111119
}
112120

121+
private fun configureOmnibarSettings(viewState: AppearanceViewModel.ViewState) {
122+
if (viewState.shouldShowSplitOmnibarSettings) {
123+
configureOmnibarTypeToggle(
124+
top = InputScreenToggleButton.Top(
125+
isActive = viewState.omnibarType == OmnibarType.SINGLE_TOP,
126+
isLightMode = appTheme.isLightModeEnabled(),
127+
),
128+
bottom = InputScreenToggleButton.Bottom(
129+
isActive = viewState.omnibarType == OmnibarType.SINGLE_BOTTOM,
130+
isLightMode = appTheme.isLightModeEnabled(),
131+
),
132+
split = InputScreenToggleButton.Split(
133+
isActive = viewState.omnibarType == OmnibarType.SPLIT,
134+
isLightMode = appTheme.isLightModeEnabled(),
135+
),
136+
)
137+
138+
binding.omnibarTypeSettingsTitle.show()
139+
binding.omnibarTypeToggleContainer.show()
140+
binding.showFullUrlSettingDivider.show()
141+
binding.addressBarPositionSetting.gone()
142+
} else {
143+
updateSelectedOmnibarPosition(viewState.omnibarType)
144+
binding.omnibarTypeSettingsTitle.gone()
145+
binding.omnibarTypeToggleContainer.gone()
146+
binding.showFullUrlSettingDivider.gone()
147+
binding.addressBarPositionSetting.show()
148+
}
149+
}
150+
113151
private fun configureUiEventHandlers() {
114152
binding.selectedThemeSetting.setClickListener { viewModel.userRequestedToChangeTheme() }
115153
binding.changeAppIconSetting.setOnClickListener { viewModel.userRequestedToChangeIcon() }
116154
binding.addressBarPositionSetting.setOnClickListener { viewModel.userRequestedToChangeAddressBarPosition() }
155+
binding.topOmnibarContainer.setOnClickListener { viewModel.onOmnibarTypeSelected(OmnibarType.SINGLE_TOP) }
156+
binding.bottomOmnibarContainer.setOnClickListener { viewModel.onOmnibarTypeSelected(OmnibarType.SINGLE_BOTTOM) }
157+
binding.splitOmnibarContainer.setOnClickListener { viewModel.onOmnibarTypeSelected(OmnibarType.SPLIT) }
117158
}
118159

119160
private fun observeViewModel() {
@@ -127,12 +168,12 @@ class AppearanceActivity : DuckDuckGoActivity() {
127168
binding.experimentalNightMode.quietlySetIsChecked(viewState.forceDarkModeEnabled, forceDarkModeToggleListener)
128169
binding.experimentalNightMode.isEnabled = viewState.canForceDarkMode
129170
binding.experimentalNightMode.isVisible = viewState.supportsForceDarkMode
130-
updateSelectedOmnibarPosition(it.omnibarType)
131171
binding.showFullUrlSetting.quietlySetIsChecked(viewState.isFullUrlEnabled, showFullUrlToggleListener)
132172
binding.showTrackersCountInTabSwitcher.quietlySetIsChecked(
133173
viewState.isTrackersCountInTabSwitcherEnabled,
134174
showTrackersCountInTabSwitcher,
135175
)
176+
configureOmnibarSettings(it)
136177
}
137178
}.launchIn(lifecycleScope)
138179

@@ -159,9 +200,8 @@ class AppearanceActivity : DuckDuckGoActivity() {
159200
val subtitle =
160201
getString(
161202
when (omnibarType) {
162-
OmnibarType.SINGLE_TOP -> R.string.settingsAddressBarPositionTop
203+
OmnibarType.SINGLE_TOP, OmnibarType.SPLIT -> R.string.settingsAddressBarPositionTop
163204
OmnibarType.SINGLE_BOTTOM -> R.string.settingsAddressBarPositionBottom
164-
OmnibarType.SPLIT -> TODO()
165205
},
166206
)
167207
binding.addressBarPositionSetting.setSecondaryText(subtitle)
@@ -224,7 +264,7 @@ class AppearanceActivity : DuckDuckGoActivity() {
224264
object : RadioListAlertDialogBuilder.EventListener() {
225265
override fun onPositiveButtonClicked(selectedItem: Int) {
226266
val newType = OmnibarType.entries[selectedItem - 1]
227-
viewModel.setOmnibarType(newType)
267+
viewModel.onOmnibarTypeSelected(newType)
228268
}
229269
},
230270
).show()
@@ -260,6 +300,74 @@ class AppearanceActivity : DuckDuckGoActivity() {
260300
colorAnimator.start()
261301
}
262302

303+
private fun configureOmnibarTypeToggle(
304+
top: InputScreenToggleButton,
305+
bottom: InputScreenToggleButton,
306+
split: InputScreenToggleButton,
307+
) = with(binding) {
308+
val context = this@AppearanceActivity
309+
topOmnibarToggleImage.setImageDrawable(ContextCompat.getDrawable(context, top.imageRes))
310+
topOmnibarToggleCheck.setImageDrawable(ContextCompat.getDrawable(context, top.checkRes))
311+
312+
bottomOmnibarToggleImage.setImageDrawable(ContextCompat.getDrawable(context, bottom.imageRes))
313+
bottomOmnibarToggleCheck.setImageDrawable(ContextCompat.getDrawable(context, bottom.checkRes))
314+
315+
splitOmnibarToggleImage.setImageDrawable(ContextCompat.getDrawable(context, split.imageRes))
316+
splitOmnibarToggleCheck.setImageDrawable(ContextCompat.getDrawable(context, split.checkRes))
317+
}
318+
319+
private sealed class InputScreenToggleButton(
320+
isActive: Boolean,
321+
) {
322+
abstract val imageRes: Int
323+
324+
val checkRes: Int =
325+
if (isActive) {
326+
CommonR.drawable.ic_check_accent_24
327+
} else {
328+
CommonR.drawable.ic_shape_circle_disabled_24
329+
}
330+
331+
class Top(
332+
isActive: Boolean,
333+
isLightMode: Boolean,
334+
) : InputScreenToggleButton(isActive) {
335+
override val imageRes: Int =
336+
when {
337+
isActive && isLightMode -> R.drawable.mobile_toolbar_top_selected_light
338+
isActive && !isLightMode -> R.drawable.mobile_toolbar_top_selected_dark
339+
!isActive && isLightMode -> R.drawable.mobile_toolbar_top_unselected_light
340+
else -> R.drawable.mobile_toolbar_top_unselected_dark
341+
}
342+
}
343+
344+
class Bottom(
345+
isActive: Boolean,
346+
isLightMode: Boolean,
347+
) : InputScreenToggleButton(isActive) {
348+
override val imageRes: Int =
349+
when {
350+
isActive && isLightMode -> R.drawable.mobile_toolbar_bottom_selected_light
351+
isActive && !isLightMode -> R.drawable.mobile_toolbar_bottom_selected_dark
352+
!isActive && isLightMode -> R.drawable.mobile_toolbar_bottom_unselected_light
353+
else -> R.drawable.mobile_toolbar_bottom_unselected_dark
354+
}
355+
}
356+
357+
class Split(
358+
isActive: Boolean,
359+
isLightMode: Boolean,
360+
) : InputScreenToggleButton(isActive) {
361+
override val imageRes: Int =
362+
when {
363+
isActive && isLightMode -> R.drawable.mobile_toolbar_split_selected_light
364+
isActive && !isLightMode -> R.drawable.mobile_toolbar_split_selected_dark
365+
!isActive && isLightMode -> R.drawable.mobile_toolbar_split_unselected_light
366+
else -> R.drawable.mobile_toolbar_split_unselected_dark
367+
}
368+
}
369+
}
370+
263371
companion object {
264372
private const val ADDRESS_BAR = "addressBar"
265373
private const val FADE_DURATION = 300L

app/src/main/java/com/duckduckgo/app/appearance/AppearanceViewModel.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import androidx.lifecycle.ViewModel
2020
import androidx.lifecycle.viewModelScope
2121
import androidx.webkit.WebViewFeature
2222
import com.duckduckgo.anvil.annotations.ContributesViewModel
23+
import com.duckduckgo.app.browser.omnibar.OmnibarFeatureRepository
2324
import com.duckduckgo.app.icon.api.AppIcon
2425
import com.duckduckgo.app.pixels.AppPixelName
2526
import com.duckduckgo.app.pixels.AppPixelName.SETTINGS_THEME_TOGGLED_DARK
@@ -55,6 +56,7 @@ class AppearanceViewModel @Inject constructor(
5556
private val pixel: Pixel,
5657
private val dispatcherProvider: DispatcherProvider,
5758
private val tabSwitcherDataStore: TabSwitcherDataStore,
59+
omnibarFeatureRepository: OmnibarFeatureRepository,
5860
) : ViewModel() {
5961
data class ViewState(
6062
val theme: DuckDuckGoTheme = DuckDuckGoTheme.LIGHT,
@@ -65,6 +67,7 @@ class AppearanceViewModel @Inject constructor(
6567
val omnibarType: OmnibarType = OmnibarType.SINGLE_TOP,
6668
val isFullUrlEnabled: Boolean = true,
6769
val isTrackersCountInTabSwitcherEnabled: Boolean = true,
70+
val shouldShowSplitOmnibarSettings: Boolean = false,
6871
)
6972

7073
sealed class Command {
@@ -90,6 +93,7 @@ class AppearanceViewModel @Inject constructor(
9093
supportsForceDarkMode = WebViewFeature.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING),
9194
isFullUrlEnabled = settingsDataStore.isFullUrlEnabled,
9295
omnibarType = settingsDataStore.omnibarType,
96+
shouldShowSplitOmnibarSettings = omnibarFeatureRepository.isSplitOmnibarAvailable,
9397
),
9498
)
9599

@@ -145,7 +149,7 @@ class AppearanceViewModel @Inject constructor(
145149
pixel.fire(pixelName)
146150
}
147151

148-
fun setOmnibarType(type: OmnibarType) {
152+
fun onOmnibarTypeSelected(type: OmnibarType) {
149153
viewModelScope.launch(dispatcherProvider.io()) {
150154
settingsDataStore.omnibarType = type
151155
viewState.update { it.copy(omnibarType = type) }

app/src/main/java/com/duckduckgo/app/pixels/remoteconfig/AndroidBrowserConfigFeature.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,5 @@ interface AndroidBrowserConfigFeature {
185185
fun useUnifiedOmnibarLayout(): Toggle
186186

187187
@Toggle.DefaultValue(FALSE)
188-
@Toggle.InternalAlwaysEnabled
189188
fun splitOmnibar(): Toggle
190189
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="60dp"
3+
android:height="100dp"
4+
android:viewportWidth="60"
5+
android:viewportHeight="100">
6+
<path
7+
android:pathData="M0,10C0,4.48 4.48,0 10,0h40c5.52,0 10,4.48 10,10v80c0,5.52 -4.48,10 -10,10H10c-5.52,0 -10,-4.48 -10,-10z"
8+
android:fillColor="#1e294a"/>
9+
<path
10+
android:pathData="M50,98v2L10,100v-2zM58,90L58,10a8,8 0,0 0,-8 -8L10,2a8,8 0,0 0,-7.99 7.59L2,10v80a8,8 0,0 0,8 8v2c-5.35,0 -9.72,-4.2 -9.99,-9.48L0,90L0,10C0,4.48 4.48,0 10,0h40l0.51,0.01C55.8,0.28 60,4.65 60,10v80l-0.01,0.51a10,10 0,0 1,-9.47 9.47L50,100v-2a8,8 0,0 0,8 -8"
11+
android:fillColor="#7295f6"/>
12+
<path
13+
android:pathData="M2,82h56v8a8,8 0,0 1,-8 8H10a8,8 0,0 1,-8 -8z"
14+
android:fillColor="#213469"/>
15+
<path
16+
android:pathData="M2,80h56v2L2,82zM8,90a4,4 0,0 1,4 -4h24a4,4 0,0 1,0 8L12,94a4,4 0,0 1,-4 -4m36,0a4,4 0,1 1,8 0,4 4,0 0,1 -8,0"
17+
android:fillColor="#7295f6"/>
18+
</vector>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="60dp"
3+
android:height="100dp"
4+
android:viewportWidth="60"
5+
android:viewportHeight="100">
6+
<path
7+
android:pathData="M0,10C0,4.48 4.48,0 10,0h40c5.52,0 10,4.48 10,10v80c0,5.52 -4.48,10 -10,10H10c-5.52,0 -10,-4.48 -10,-10z"
8+
android:fillColor="#ccdaff"/>
9+
<path
10+
android:pathData="M50,98v2L10,100v-2zM58,90L58,10a8,8 0,0 0,-8 -8L10,2a8,8 0,0 0,-7.99 7.59L2,10v80a8,8 0,0 0,8 8v2c-5.35,0 -9.72,-4.2 -9.99,-9.48L0,90L0,10C0,4.48 4.48,0 10,0h40l0.51,0.01C55.8,0.28 60,4.65 60,10v80l-0.01,0.51a10,10 0,0 1,-9.47 9.47L50,100v-2a8,8 0,0 0,8 -8"
11+
android:fillColor="#3969ef"/>
12+
<path
13+
android:pathData="M2,82h56v8a8,8 0,0 1,-8 8H10a8,8 0,0 1,-8 -8z"
14+
android:fillColor="#adc2fc"/>
15+
<path
16+
android:pathData="M2,80h56v2L2,82zM8,90a4,4 0,0 1,4 -4h24a4,4 0,0 1,0 8L12,94a4,4 0,0 1,-4 -4m36,0a4,4 0,1 1,8 0,4 4,0 0,1 -8,0"
17+
android:fillColor="#3969ef"/>
18+
</vector>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="60dp"
3+
android:height="100dp"
4+
android:viewportWidth="60"
5+
android:viewportHeight="100">
6+
<path
7+
android:pathData="M0,10C0,4.48 4.48,0 10,0h40c5.52,0 10,4.48 10,10v80c0,5.52 -4.48,10 -10,10H10c-5.52,0 -10,-4.48 -10,-10z"
8+
android:fillColor="#222"/>
9+
<path
10+
android:pathData="M50,98v2L10,100v-2zM58,90L58,10a8,8 0,0 0,-8 -8L10,2a8,8 0,0 0,-7.99 7.59L2,10v80a8,8 0,0 0,8 8v2c-5.35,0 -9.72,-4.2 -9.99,-9.48L0,90L0,10C0,4.48 4.48,0 10,0h40l0.51,0.01C55.8,0.28 60,4.65 60,10v80l-0.01,0.51a10,10 0,0 1,-9.47 9.47L50,100v-2a8,8 0,0 0,8 -8"
11+
android:fillColor="#666"/>
12+
<path
13+
android:pathData="M2,82h56v8a8,8 0,0 1,-8 8H10a8,8 0,0 1,-8 -8z"
14+
android:fillColor="#333"/>
15+
<path
16+
android:pathData="M2,80h56v2L2,82zM8,90a4,4 0,0 1,4 -4h24a4,4 0,0 1,0 8L12,94a4,4 0,0 1,-4 -4m36,0a4,4 0,1 1,8 0,4 4,0 0,1 -8,0"
17+
android:fillColor="#666"/>
18+
</vector>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="60dp"
3+
android:height="100dp"
4+
android:viewportWidth="60"
5+
android:viewportHeight="100">
6+
<path
7+
android:pathData="M0,10C0,4.48 4.48,0 10,0h40c5.52,0 10,4.48 10,10v80c0,5.52 -4.48,10 -10,10H10c-5.52,0 -10,-4.48 -10,-10z"
8+
android:fillColor="#eee"/>
9+
<path
10+
android:pathData="M50,98v2L10,100v-2zM58,90L58,10a8,8 0,0 0,-8 -8L10,2a8,8 0,0 0,-7.99 7.59L2,10v80a8,8 0,0 0,8 8v2c-5.35,0 -9.72,-4.2 -9.99,-9.48L0,90L0,10C0,4.48 4.48,0 10,0h40l0.51,0.01C55.8,0.28 60,4.65 60,10v80l-0.01,0.51a10,10 0,0 1,-9.47 9.47L50,100v-2a8,8 0,0 0,8 -8"
11+
android:fillColor="#888"/>
12+
<path
13+
android:pathData="M2,82h56v8a8,8 0,0 1,-8 8H10a8,8 0,0 1,-8 -8z"
14+
android:fillColor="#ddd"/>
15+
<path
16+
android:pathData="M2,80h56v2L2,82zM8,90a4,4 0,0 1,4 -4h24a4,4 0,0 1,0 8L12,94a4,4 0,0 1,-4 -4m36,0a4,4 0,1 1,8 0,4 4,0 0,1 -8,0"
17+
android:fillColor="#888"/>
18+
</vector>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="60dp"
3+
android:height="100dp"
4+
android:viewportWidth="60"
5+
android:viewportHeight="100">
6+
<path
7+
android:pathData="M0,10C0,4.48 4.48,0 10,0h40c5.52,0 10,4.48 10,10v80c0,5.52 -4.48,10 -10,10H10c-5.52,0 -10,-4.48 -10,-10z"
8+
android:fillColor="#1e294a"/>
9+
<path
10+
android:pathData="M50,98v2L10,100v-2zM58,90L58,10a8,8 0,0 0,-8 -8L10,2a8,8 0,0 0,-7.99 7.59L2,10v80a8,8 0,0 0,8 8v2c-5.35,0 -9.72,-4.2 -9.99,-9.48L0,90L0,10C0,4.48 4.48,0 10,0h40l0.51,0.01C55.8,0.28 60,4.65 60,10v80l-0.01,0.51a10,10 0,0 1,-9.47 9.47L50,100v-2a8,8 0,0 0,8 -8"
11+
android:fillColor="#7295f6"/>
12+
<path
13+
android:pathData="M2,10a8,8 0,0 1,8 -8h40a8,8 0,0 1,8 8v8L2,18zM2,82h56v8a8,8 0,0 1,-8 8L10,98a8,8 0,0 1,-8 -8z"
14+
android:fillColor="#213469"/>
15+
<path
16+
android:pathData="M8,10a4,4 0,0 1,4 -4h36a4,4 0,0 1,0 8L12,14a4,4 0,0 1,-4 -4m-6,8h56v2L2,20zM2,80h56v2L2,82zM44,90a4,4 0,1 1,8 0,4 4,0 0,1 -8,0M8,90a4,4 0,1 1,8 0,4 4,0 0,1 -8,0m12,0a4,4 0,1 1,8 0,4 4,0 0,1 -8,0m12,0a4,4 0,1 1,8 0,4 4,0 0,1 -8,0"
17+
android:fillColor="#7295f6"/>
18+
</vector>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="60dp"
3+
android:height="100dp"
4+
android:viewportWidth="60"
5+
android:viewportHeight="100">
6+
<path
7+
android:pathData="M0,10C0,4.48 4.48,0 10,0h40c5.52,0 10,4.48 10,10v80c0,5.52 -4.48,10 -10,10H10c-5.52,0 -10,-4.48 -10,-10z"
8+
android:fillColor="#ccdaff"/>
9+
<path
10+
android:pathData="M50,98v2L10,100v-2zM58,90L58,10a8,8 0,0 0,-8 -8L10,2a8,8 0,0 0,-7.99 7.59L2,10v80a8,8 0,0 0,8 8v2c-5.35,0 -9.72,-4.2 -9.99,-9.48L0,90L0,10C0,4.48 4.48,0 10,0h40l0.51,0.01C55.8,0.28 60,4.65 60,10v80l-0.01,0.51a10,10 0,0 1,-9.47 9.47L50,100v-2a8,8 0,0 0,8 -8"
11+
android:fillColor="#3969ef"/>
12+
<path
13+
android:pathData="M2,10a8,8 0,0 1,8 -8h40a8,8 0,0 1,8 8v8L2,18zM2,82h56v8a8,8 0,0 1,-8 8L10,98a8,8 0,0 1,-8 -8z"
14+
android:fillColor="#adc2fc"/>
15+
<path
16+
android:pathData="M8,10a4,4 0,0 1,4 -4h36a4,4 0,0 1,0 8L12,14a4,4 0,0 1,-4 -4m-6,8h56v2L2,20zM2,80h56v2L2,82zM44,90a4,4 0,1 1,8 0,4 4,0 0,1 -8,0M8,90a4,4 0,1 1,8 0,4 4,0 0,1 -8,0m12,0a4,4 0,1 1,8 0,4 4,0 0,1 -8,0m12,0a4,4 0,1 1,8 0,4 4,0 0,1 -8,0"
17+
android:fillColor="#3969ef"/>
18+
</vector>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="60dp"
3+
android:height="100dp"
4+
android:viewportWidth="60"
5+
android:viewportHeight="100">
6+
<path
7+
android:pathData="M0,10C0,4.48 4.48,0 10,0h40c5.52,0 10,4.48 10,10v80c0,5.52 -4.48,10 -10,10H10c-5.52,0 -10,-4.48 -10,-10z"
8+
android:fillColor="#222"/>
9+
<path
10+
android:pathData="M50,98v2L10,100v-2zM58,90L58,10a8,8 0,0 0,-8 -8L10,2a8,8 0,0 0,-7.99 7.59L2,10v80a8,8 0,0 0,8 8v2c-5.35,0 -9.72,-4.2 -9.99,-9.48L0,90L0,10C0,4.48 4.48,0 10,0h40l0.51,0.01C55.8,0.28 60,4.65 60,10v80l-0.01,0.51a10,10 0,0 1,-9.47 9.47L50,100v-2a8,8 0,0 0,8 -8"
11+
android:fillColor="#666"/>
12+
<path
13+
android:pathData="M2,10a8,8 0,0 1,8 -8h40a8,8 0,0 1,8 8v8L2,18zM2,82h56v8a8,8 0,0 1,-8 8L10,98a8,8 0,0 1,-8 -8z"
14+
android:fillColor="#333"/>
15+
<path
16+
android:pathData="M8,10a4,4 0,0 1,4 -4h36a4,4 0,0 1,0 8L12,14a4,4 0,0 1,-4 -4m-6,8h56v2L2,20zM2,80h56v2L2,82zM44,90a4,4 0,1 1,8 0,4 4,0 0,1 -8,0M8,90a4,4 0,1 1,8 0,4 4,0 0,1 -8,0m12,0a4,4 0,1 1,8 0,4 4,0 0,1 -8,0m12,0a4,4 0,1 1,8 0,4 4,0 0,1 -8,0"
17+
android:fillColor="#666"/>
18+
</vector>

0 commit comments

Comments
 (0)