Skip to content

Commit

Permalink
first working version
Browse files Browse the repository at this point in the history
  • Loading branch information
nshuba committed Dec 21, 2024
1 parent 38fc930 commit faa5cbc
Show file tree
Hide file tree
Showing 30 changed files with 799 additions and 2 deletions.
2 changes: 2 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,8 @@ fladle {
}

dependencies {
implementation project(":duckchat-api")
implementation project(":duckchat-impl")
implementation project(":malicious-site-protection-impl")
implementation project(":malicious-site-protection-api")
implementation project(":custom-tabs-impl")
Expand Down
14 changes: 12 additions & 2 deletions app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,7 @@ import com.duckduckgo.autofill.api.emailprotection.EmailInjector
import com.duckduckgo.browser.api.WebViewVersionProvider
import com.duckduckgo.browser.api.brokensite.BrokenSiteData
import com.duckduckgo.browser.api.brokensite.BrokenSiteData.ReportFlow.RELOAD_THREE_TIMES_WITHIN_20_SECONDS
import com.duckduckgo.browser.api.ui.BrowserScreens.WebViewActivityWithParams
import com.duckduckgo.common.ui.DuckDuckGoFragment
import com.duckduckgo.common.ui.store.BrowserAppTheme
import com.duckduckgo.common.ui.view.DaxDialog
Expand Down Expand Up @@ -262,6 +263,7 @@ import com.duckduckgo.downloads.api.DownloadConfirmationDialogListener
import com.duckduckgo.downloads.api.DownloadsFileActions
import com.duckduckgo.downloads.api.FileDownloader
import com.duckduckgo.downloads.api.FileDownloader.PendingFileDownload
import com.duckduckgo.duckchat.api.DuckChat
import com.duckduckgo.duckplayer.api.DuckPlayer
import com.duckduckgo.duckplayer.api.DuckPlayerSettingsNoParams
import com.duckduckgo.js.messaging.api.JsCallbackData
Expand Down Expand Up @@ -1012,6 +1014,9 @@ class BrowserTabFragment :
onMenuItemClicked(newTabMenuItem) {
onOmnibarNewTabRequested()
}
onMenuItemClicked(duckChatMenuItem) {
launchDuckChat()
}
onMenuItemClicked(bookmarksMenuItem) {
browserActivity?.launchBookmarks()
pixel.fire(AppPixelName.MENU_ACTION_BOOKMARKS_PRESSED.pixelName)
Expand Down Expand Up @@ -1140,6 +1145,13 @@ class BrowserTabFragment :
startActivity(TabSwitcherActivity.intent(activity, tabId))
}

private fun launchDuckChat() {
globalActivityStarter.start(requireContext(), WebViewActivityWithParams(
url = DuckChat.DUCK_CHAT_WEB_LINK,
screenTitle = getString(string.duckChatScreenTitle),
))
}

override fun onResume() {
super.onResume()

Expand Down Expand Up @@ -3561,8 +3573,6 @@ class BrowserTabFragment :

private const val AUTOCOMPLETE_PADDING_DP = 6

private const val TOGGLE_REPORT_TOAST_DELAY = 3000L

fun newInstance(
tabId: String,
query: String? = null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,7 @@ import com.duckduckgo.downloads.api.DownloadCommand
import com.duckduckgo.downloads.api.DownloadStateListener
import com.duckduckgo.downloads.api.FileDownloader
import com.duckduckgo.downloads.api.FileDownloader.PendingFileDownload
import com.duckduckgo.duckchat.api.DuckChat
import com.duckduckgo.duckplayer.api.DuckPlayer
import com.duckduckgo.duckplayer.api.DuckPlayer.DuckPlayerState.ENABLED
import com.duckduckgo.history.api.NavigationHistory
Expand Down Expand Up @@ -428,6 +429,7 @@ class BrowserTabViewModel @Inject constructor(
private val newTabPixels: Lazy<NewTabPixels>, // Lazy to construct the instance and deps only when actually sending the pixel
private val httpErrorPixels: Lazy<HttpErrorPixels>,
private val duckPlayer: DuckPlayer,
private val duckChat: DuckChat,
private val duckPlayerJSHelper: DuckPlayerJSHelper,
private val refreshPixelSender: RefreshPixelSender,
private val changeOmnibarPositionFeature: ChangeOmnibarPositionFeature,
Expand Down Expand Up @@ -826,6 +828,7 @@ class BrowserTabViewModel @Inject constructor(
hasQueryChanged = false,
urlLoaded = url ?: "",
),
showDuckChatOption = duckChat.showInBrowserMenu(),
)
viewModelScope.launch {
refreshOnViewVisible.emit(true)
Expand Down Expand Up @@ -2513,12 +2516,14 @@ class BrowserTabViewModel @Inject constructor(
val addToHomeSupported = addToHomeCapabilityDetector.isAddToHomeSupported()
val showAutofill = autofillCapabilityChecker.canAccessCredentialManagementScreen()
val showVoiceSearch = voiceSearchAvailability.shouldShowVoiceSearch()
val showDuckChat = duckChat.showInBrowserMenu()

withContext(dispatchers.main()) {
browserViewState.value = currentBrowserViewState().copy(
addToHomeVisible = addToHomeSupported,
showAutofill = showAutofill,
showVoiceSearch = showVoiceSearch,
showDuckChatOption = showDuckChat,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,13 @@ class BrowserPopupMenu(
}
}

internal val duckChatMenuItem: View by lazy {
when (omnibarPosition) {
TOP -> topBinding.duckChatMenuItem
BOTTOM -> bottomBinding.duckChatMenuItem
}
}

internal val sharePageMenuItem: View by lazy {
when (omnibarPosition) {
TOP -> topBinding.sharePageMenuItem
Expand Down Expand Up @@ -245,6 +252,7 @@ class BrowserPopupMenu(
printPageMenuItem.isEnabled = browserShowing

newTabMenuItem.isVisible = browserShowing && !displayedInCustomTabScreen
duckChatMenuItem.isVisible = viewState.showDuckChatOption && !displayedInCustomTabScreen
sharePageMenuItem.isVisible = viewState.canSharePage

defaultBrowserMenuItem.isVisible = viewState.showSelectDefaultBrowserMenuItem
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ data class BrowserViewState(
val sslError: SSLErrorType = SSLErrorType.NONE,
val privacyProtectionsPopupViewState: PrivacyProtectionsPopupViewState = PrivacyProtectionsPopupViewState.Gone,
val showDuckPlayerIcon: Boolean = false,
val showDuckChatOption: Boolean = false,
)

sealed class HighlightableButton {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import com.duckduckgo.app.settings.NewSettingsViewModel.Command.LaunchAppearance
import com.duckduckgo.app.settings.NewSettingsViewModel.Command.LaunchAutofillSettings
import com.duckduckgo.app.settings.NewSettingsViewModel.Command.LaunchCookiePopupProtectionScreen
import com.duckduckgo.app.settings.NewSettingsViewModel.Command.LaunchDefaultBrowser
import com.duckduckgo.app.settings.NewSettingsViewModel.Command.LaunchDuckChatScreen
import com.duckduckgo.app.settings.NewSettingsViewModel.Command.LaunchEmailProtection
import com.duckduckgo.app.settings.NewSettingsViewModel.Command.LaunchEmailProtectionNotSupported
import com.duckduckgo.app.settings.NewSettingsViewModel.Command.LaunchFeedback
Expand All @@ -76,6 +77,7 @@ import com.duckduckgo.common.ui.view.show
import com.duckduckgo.common.ui.viewbinding.viewBinding
import com.duckduckgo.common.utils.plugins.PluginPoint
import com.duckduckgo.di.scopes.ActivityScope
import com.duckduckgo.duckchat.api.DuckChatSettingsNoParams
import com.duckduckgo.internal.features.api.InternalFeaturePlugin
import com.duckduckgo.mobile.android.app.tracking.ui.AppTrackingProtectionScreens.AppTrackerActivityWithEmptyParams
import com.duckduckgo.mobile.android.app.tracking.ui.AppTrackingProtectionScreens.AppTrackerOnboardingActivityWithEmptyParamsParams
Expand Down Expand Up @@ -190,6 +192,7 @@ class NewSettingsActivity : DuckDuckGoActivity() {
appearanceSetting.setClickListener { viewModel.onAppearanceSettingClicked() }
accessibilitySetting.setClickListener { viewModel.onAccessibilitySettingClicked() }
generalSetting.setClickListener { viewModel.onGeneralSettingClicked() }
duckChatSetting.setOnClickListener { viewModel.onDuckChatSettingClicked() }
}

with(viewsNextSteps) {
Expand Down Expand Up @@ -321,6 +324,7 @@ class NewSettingsActivity : DuckDuckGoActivity() {
is LaunchCookiePopupProtectionScreen -> launchActivity(AutoconsentSettingsActivity.intent(this))
is LaunchFireButtonScreen -> launchScreen(FireButtonScreenNoParams)
is LaunchPermissionsScreen -> launchScreen(PermissionsScreenNoParams)
is LaunchDuckChatScreen -> launchScreen(DuckChatSettingsNoParams)
is LaunchAppearanceScreen -> launchScreen(AppearanceScreen.Default)
is LaunchAboutScreen -> launchScreen(AboutScreenNoParams)
is LaunchGeneralSettingsScreen -> launchScreen(GeneralSettingsScreenNoParams)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ import com.duckduckgo.app.settings.NewSettingsViewModel.Command.LaunchAppearance
import com.duckduckgo.app.settings.NewSettingsViewModel.Command.LaunchAutofillSettings
import com.duckduckgo.app.settings.NewSettingsViewModel.Command.LaunchCookiePopupProtectionScreen
import com.duckduckgo.app.settings.NewSettingsViewModel.Command.LaunchDefaultBrowser
import com.duckduckgo.app.settings.NewSettingsViewModel.Command.LaunchDuckChatScreen
import com.duckduckgo.app.settings.NewSettingsViewModel.Command.LaunchEmailProtection
import com.duckduckgo.app.settings.NewSettingsViewModel.Command.LaunchEmailProtectionNotSupported
import com.duckduckgo.app.settings.NewSettingsViewModel.Command.LaunchFeedback
Expand Down Expand Up @@ -131,6 +132,7 @@ class NewSettingsViewModel @Inject constructor(
data object LaunchCookiePopupProtectionScreen : Command()
data object LaunchFireButtonScreen : Command()
data object LaunchPermissionsScreen : Command()
data object LaunchDuckChatScreen: Command()
data object LaunchAppearanceScreen : Command()
data object LaunchAboutScreen : Command()
data object LaunchGeneralSettingsScreen : Command()
Expand Down Expand Up @@ -304,6 +306,10 @@ class NewSettingsViewModel @Inject constructor(
pixel.fire(SETTINGS_PERMISSIONS_PRESSED)
}

fun onDuckChatSettingClicked() {
viewModelScope.launch { command.send(LaunchDuckChatScreen) }
}

fun onAppearanceSettingClicked() {
viewModelScope.launch { command.send(LaunchAppearanceScreen) }
pixel.fire(SETTINGS_APPEARANCE_PRESSED)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command.Close
import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command.CloseAllTabsRequest
import com.duckduckgo.appbuildconfig.api.AppBuildConfig
import com.duckduckgo.browser.api.ui.BrowserScreens.WebViewActivityWithParams
import com.duckduckgo.common.ui.DuckDuckGoActivity
import com.duckduckgo.common.ui.view.button.ButtonType.DESTRUCTIVE
import com.duckduckgo.common.ui.view.button.ButtonType.GHOST_ALT
Expand All @@ -61,6 +62,8 @@ import com.duckduckgo.common.ui.view.hide
import com.duckduckgo.common.ui.view.show
import com.duckduckgo.common.utils.DispatcherProvider
import com.duckduckgo.di.scopes.ActivityScope
import com.duckduckgo.duckchat.api.DuckChat
import com.duckduckgo.navigation.api.GlobalActivityStarter
import com.google.android.material.snackbar.BaseTransientBottomBar
import com.google.android.material.snackbar.Snackbar
import javax.inject.Inject
Expand Down Expand Up @@ -113,6 +116,12 @@ class TabSwitcherActivity : DuckDuckGoActivity(), TabSwitcherListener, Coroutine
@Inject
lateinit var appBuildConfig: AppBuildConfig

@Inject
lateinit var globalActivityStarter: GlobalActivityStarter

@Inject
lateinit var duckChat: DuckChat

private val viewModel: TabSwitcherViewModel by bindViewModel()

private val tabsAdapter: TabSwitcherAdapter by lazy { TabSwitcherAdapter(this, webViewPreviewPersister, this, faviconManager) }
Expand Down Expand Up @@ -326,6 +335,7 @@ class TabSwitcherActivity : DuckDuckGoActivity(), TabSwitcherListener, Coroutine
R.id.fire -> onFire()
R.id.newTab -> onNewTabRequested(fromOverflowMenu = false)
R.id.newTabOverflow -> onNewTabRequested(fromOverflowMenu = true)
R.id.duckChat -> launchDuckChat()
R.id.closeAllTabs -> closeAllTabs()
R.id.downloads -> showDownloads()
R.id.settings -> showSettings()
Expand All @@ -341,6 +351,8 @@ class TabSwitcherActivity : DuckDuckGoActivity(), TabSwitcherListener, Coroutine
override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
val closeAllTabsMenuItem = menu?.findItem(R.id.closeAllTabs)
closeAllTabsMenuItem?.isVisible = viewModel.tabs.value?.isNotEmpty() == true
val duckChatMenuItem = menu?.findItem(R.id.duckChat)
duckChatMenuItem?.isVisible = duckChat.showInBrowserMenu()
return super.onPrepareOptionsMenu(menu)
}

Expand Down Expand Up @@ -382,6 +394,13 @@ class TabSwitcherActivity : DuckDuckGoActivity(), TabSwitcherListener, Coroutine
launch { viewModel.onTabSelected(tab) }
}

private fun launchDuckChat() {
globalActivityStarter.start(this, WebViewActivityWithParams(
url = DuckChat.DUCK_CHAT_WEB_LINK,
screenTitle = getString(R.string.duckChatScreenTitle),
))
}

private fun updateTabGridItemDecorator(tab: TabEntity) {
tabItemDecorator.selectedTabId = tab.tabId
tabsRecycler.invalidateItemDecorations()
Expand Down
8 changes: 8 additions & 0 deletions app/src/main/res/layout/content_settings_main_settings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
app:primaryText="@string/settingsPasswordsAndAutofillLoginsSetting"
app:leadingIcon="@drawable/ic_key_color_24"/>

<!-- TODO: add DuckChat here as well -->
<com.duckduckgo.common.ui.view.listitem.OneLineListItem
android:id="@+id/accessibilitySetting"
android:layout_width="match_parent"
Expand All @@ -80,6 +81,13 @@
app:primaryText="@string/settingsDataClearing"
app:leadingIcon="@drawable/ic_fire_color_24"/>

<com.duckduckgo.common.ui.view.listitem.OneLineListItem
android:id="@+id/duckChatSetting"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:primaryText="@string/duckChatSetting"
app:leadingIcon="@drawable/ic_ai_chat_24"/>

<LinearLayout
android:id="@+id/settingsSectionDuckPlayer"
android:layout_width="match_parent"
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/res/layout/popup_window_browser_menu.xml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,13 @@
app:iconDrawable="@drawable/ic_add_16"
app:primaryText="@string/newTabMenuItem" />

<com.duckduckgo.common.ui.view.MenuItemView
android:id="@+id/duckChatMenuItem"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:iconDrawable="@drawable/ic_ai_chat_16"
app:primaryText="@string/duckChatMenuItem" />

<com.duckduckgo.common.ui.view.divider.HorizontalDivider
android:id="@+id/siteOptionsMenuDivider"
style="@style/Widget.DuckDuckGo.PopupMenuHorizontalDivider"
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/res/layout/popup_window_browser_menu_bottom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,13 @@
app:iconDrawable="@drawable/ic_add_16"
app:primaryText="@string/newTabMenuItem" />

<com.duckduckgo.common.ui.view.MenuItemView
android:id="@+id/duckChatMenuItem"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:iconDrawable="@drawable/ic_ai_chat_16"
app:primaryText="@string/duckChatMenuItem" />

<com.duckduckgo.common.ui.view.divider.HorizontalDivider
android:id="@+id/siteOptionsMenuDivider"
style="@style/Widget.DuckDuckGo.PopupMenuHorizontalDivider"
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/res/menu/menu_tab_switcher_activity.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@
android:title="@string/newTabMenuItem"
app:showAsAction="never" />

<item
android:id="@+id/duckChat"
android:title="@string/duckChatMenuItem"
app:showAsAction="never" />

<item
android:id="@+id/closeAllTabs"
android:title="@string/closeAllTabsMenuItem"
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -805,4 +805,10 @@
<string name="showOnAppLaunchOptionNewTabPage">New Tab Page</string>
<string name="showOnAppLaunchOptionSpecificPage">Specific Page</string>

<!-- TODO - translations? pixels? -->
<!-- DuckChat -->
<string name="duckChatMenuItem">Chat</string>
<string name="duckChatSetting">AI Chat</string>
<string name="duckChatScreenTitle">DuckDuckGo AI Chat</string>

</resources>
39 changes: 39 additions & 0 deletions common/common-ui/src/main/res/drawable/ic_ai_chat_16.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<!--
~ Copyright (c) 2024 DuckDuckGo
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportWidth="16"
android:viewportHeight="16">
<group>
<clip-path
android:pathData="M0,0h16v16h-16z"/>
<path
android:pathData="M4.25,8.5C4.94,8.5 5.5,7.94 5.5,7.25C5.5,6.56 4.94,6 4.25,6C3.56,6 3,6.56 3,7.25C3,7.94 3.56,8.5 4.25,8.5Z"
android:fillColor="?attr/daxColorPrimaryIcon"/>
<path
android:pathData="M8,8.5C8.69,8.5 9.25,7.94 9.25,7.25C9.25,6.56 8.69,6 8,6C7.31,6 6.75,6.56 6.75,7.25C6.75,7.94 7.31,8.5 8,8.5Z"
android:fillColor="?attr/daxColorPrimaryIcon"/>
<path
android:pathData="M13,7.25C13,7.94 12.44,8.5 11.75,8.5C11.06,8.5 10.5,7.94 10.5,7.25C10.5,6.56 11.06,6 11.75,6C12.44,6 13,6.56 13,7.25Z"
android:fillColor="?attr/daxColorPrimaryIcon"/>
<path
android:pathData="M1.814,15.932C4.47,15.476 9.123,14.595 11.015,13.727C13.939,12.666 16,10.11 16,7.125C16,3.19 12.418,-0 8,-0C3.582,-0 0,3.19 0,7.125C0,9.099 0.902,10.886 2.358,12.176C2.677,12.459 2.737,12.949 2.458,13.272L1.164,14.763C0.723,15.273 1.15,16.047 1.814,15.932ZM10.389,12.363L10.445,12.338L10.503,12.316C12.939,11.433 14.5,9.374 14.5,7.125C14.5,4.177 11.758,1.5 8,1.5C4.242,1.5 1.5,4.177 1.5,7.125C1.5,8.623 2.181,10.015 3.353,11.053C4.159,11.767 4.438,13.063 3.743,14.06C4.594,13.898 5.498,13.715 6.375,13.52C8.117,13.132 9.606,12.722 10.389,12.363Z"
android:fillColor="?attr/daxColorPrimaryIcon"
android:fillType="evenOdd"/>
</group>
</vector>
35 changes: 35 additions & 0 deletions common/common-ui/src/main/res/drawable/ic_ai_chat_24.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M4.837,17.114c0.47,0.43 0.566,1.16 0.154,1.645l-1.236,1.46c-0.654,0.77 0.001,1.923 0.996,1.738 3.402,-0.637 8.855,-1.764 11.073,-2.826C19.45,17.794 22,14.612 22,10.9c0,-4.92 -4.477,-8.907 -10,-8.907S2,5.981 2,10.9c0,2.417 1.081,4.61 2.837,6.214"
android:fillColor="#C7B9EE"
android:fillType="evenOdd"/>
<path
android:pathData="m15.24,17.748 l-0.063,0.03c-0.948,0.454 -2.72,0.97 -4.794,1.467 -1.57,0.375 -3.234,0.72 -4.689,1.004l0.442,-0.52c1.006,-1.188 0.69,-2.829 -0.287,-3.722C4.369,14.655 3.5,12.85 3.5,10.9c0,-3.932 3.638,-7.407 8.5,-7.407 4.863,0 8.5,3.475 8.5,7.407 0,2.98 -2.055,5.666 -5.195,6.824zM15.824,19.131c-2.218,1.062 -7.67,2.19 -11.073,2.826 -0.995,0.185 -1.65,-0.967 -0.996,-1.739L4.99,18.76c0.412,-0.486 0.315,-1.216 -0.154,-1.645C3.08,15.509 2,13.317 2,10.9c0,-4.92 4.477,-8.907 10,-8.907S22,5.981 22,10.9c0,3.712 -2.55,6.894 -6.176,8.231"
android:fillType="evenOdd">
<aapt:attr name="android:fillColor">
<gradient
android:startX="2"
android:startY="1.993"
android:endX="22.053"
android:endY="21.993"
android:type="linear">
<item android:offset="0" android:color="#FF876ECB"/>
<item android:offset="1" android:color="#FF5132A9"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M13.583,11.042c0,0.851 -0.709,1.541 -1.583,1.541 -0.875,0 -1.584,-0.69 -1.584,-1.541 0,-0.852 0.71,-1.542 1.584,-1.542s1.583,0.69 1.583,1.542"
android:fillColor="#6B4EBA"/>
<path
android:pathData="M8.917,11.042c0,0.851 -0.71,1.541 -1.584,1.541s-1.583,-0.69 -1.583,-1.541c0,-0.852 0.709,-1.542 1.583,-1.542 0.875,0 1.584,0.69 1.584,1.542"
android:fillColor="#5132A9"/>
<path
android:pathData="M18.25,11.042a1.542,1.542 0,1 1,-3.083 0,1.542 1.542,0 0,1 3.083,0"
android:fillColor="#876ECB"/>
</vector>
Empty file.
Loading

0 comments on commit faa5cbc

Please sign in to comment.