Skip to content

Commit b877db4

Browse files
committed
Add new drawable and string resources
1 parent e6c1300 commit b877db4

18 files changed

+514
-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: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@ 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
2627
import com.duckduckgo.app.pixels.AppPixelName.SETTINGS_THEME_TOGGLED_LIGHT
2728
import com.duckduckgo.app.pixels.AppPixelName.SETTINGS_THEME_TOGGLED_SYSTEM_DEFAULT
29+
import com.duckduckgo.app.pixels.remoteconfig.AndroidBrowserConfigFeature
2830
import com.duckduckgo.app.settings.db.SettingsDataStore
2931
import com.duckduckgo.app.statistics.pixels.Pixel
3032
import com.duckduckgo.app.tabs.store.TabSwitcherDataStore
@@ -55,6 +57,8 @@ class AppearanceViewModel @Inject constructor(
5557
private val pixel: Pixel,
5658
private val dispatcherProvider: DispatcherProvider,
5759
private val tabSwitcherDataStore: TabSwitcherDataStore,
60+
private val omnibarFeatureRepository: OmnibarFeatureRepository,
61+
browserFeatureFlags: AndroidBrowserConfigFeature,
5862
) : ViewModel() {
5963
data class ViewState(
6064
val theme: DuckDuckGoTheme = DuckDuckGoTheme.LIGHT,
@@ -65,6 +69,7 @@ class AppearanceViewModel @Inject constructor(
6569
val omnibarType: OmnibarType = OmnibarType.SINGLE_TOP,
6670
val isFullUrlEnabled: Boolean = true,
6771
val isTrackersCountInTabSwitcherEnabled: Boolean = true,
72+
val shouldShowSplitOmnibarSettings: Boolean = true,
6873
)
6974

7075
sealed class Command {
@@ -90,6 +95,7 @@ class AppearanceViewModel @Inject constructor(
9095
supportsForceDarkMode = WebViewFeature.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING),
9196
isFullUrlEnabled = settingsDataStore.isFullUrlEnabled,
9297
omnibarType = settingsDataStore.omnibarType,
98+
shouldShowSplitOmnibarSettings = omnibarFeatureRepository.isSplitOmnibarAvailable,
9399
),
94100
)
95101

@@ -145,7 +151,7 @@ class AppearanceViewModel @Inject constructor(
145151
pixel.fire(pixelName)
146152
}
147153

148-
fun setOmnibarType(type: OmnibarType) {
154+
fun onOmnibarTypeSelected(type: OmnibarType) {
149155
viewModelScope.launch(dispatcherProvider.io()) {
150156
settingsDataStore.omnibarType = type
151157
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)