Skip to content
This repository has been archived by the owner on Jun 20, 2023. It is now read-only.

Trace Location QR Info screen (EXPOSUREAPP-5411) #2708

Merged
merged 22 commits into from
Mar 31, 2021
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e3c8dd8
Added drawables.
SamuraiKek Mar 29, 2021
358ee39
Updated Strings.
SamuraiKek Mar 29, 2021
fee157d
Added QR info screen.
SamuraiKek Mar 29, 2021
5f7e085
Merge branch 'release/2.0.x' into feature/5411-qr-codes-info-screen
SamuraiKek Mar 29, 2021
dfd3b5f
Accounted for all navigation possibilities.
SamuraiKek Mar 29, 2021
48c0ac8
Merge branch 'release/2.0.x' into feature/5411-qr-codes-info-screen
SamuraiKek Mar 29, 2021
c09097d
Ktlin fix.
SamuraiKek Mar 29, 2021
e8faf20
Fixed instrumentation test.
SamuraiKek Mar 29, 2021
aa70c9b
Merge branch 'release/2.0.x' into feature/5411-qr-codes-info-screen
SamuraiKek Mar 30, 2021
e8f6374
Merge branch 'release/2.0.x' into feature/5411-qr-codes-info-screen
ralfgehrer Mar 30, 2021
ed05eb5
Update legal strings
ralfgehrer Mar 30, 2021
6a3fd19
BE to AE English fix
ralfgehrer Mar 30, 2021
bafeb25
Merge branch 'release/2.0.x' into feature/5411-qr-codes-info-screen
harambasicluka Mar 30, 2021
2b538c3
Merge branch 'release/2.0.x' into feature/5411-qr-codes-info-screen
harambasicluka Mar 31, 2021
753b153
Addressed PR comments.
SamuraiKek Mar 31, 2021
5306f53
Merge branch 'release/2.0.x' into feature/5411-qr-codes-info-screen
SamuraiKek Mar 31, 2021
3300812
Now using MoreInformationView for DataPrivacy.
SamuraiKek Mar 31, 2021
aa8d638
Merge branch 'release/2.0.x' into feature/5411-qr-codes-info-screen
harambasicluka Mar 31, 2021
dce654d
Merge branch 'release/2.0.x' into feature/5411-qr-codes-info-screen
SamuraiKek Mar 31, 2021
a91eca4
Merge branch 'release/2.0.x' into feature/5411-qr-codes-info-screen
SamuraiKek Mar 31, 2021
ca5dfb6
Removed duplicate code.
SamuraiKek Mar 31, 2021
2be3942
Merge branch 'release/2.0.x' into feature/5411-qr-codes-info-screen
SamuraiKek Mar 31, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import de.rki.coronawarnapp.tracing.GeneralTracingStatus
import de.rki.coronawarnapp.tracing.states.TracingStateProvider
import de.rki.coronawarnapp.tracing.ui.homecards.TracingStateItem
import de.rki.coronawarnapp.tracing.ui.statusbar.TracingHeaderState
import de.rki.coronawarnapp.ui.eventregistration.organizer.TraceLocationOrganizerSettings
import de.rki.coronawarnapp.ui.main.home.items.FAQCard
import de.rki.coronawarnapp.ui.main.home.items.HomeItem
import de.rki.coronawarnapp.ui.statistics.Statistics
Expand Down Expand Up @@ -71,6 +72,7 @@ class HomeFragmentTest : BaseUITest() {
@MockK lateinit var deadmanNotificationScheduler: DeadmanNotificationScheduler
@MockK lateinit var appShortcutsHelper: AppShortcutsHelper
@MockK lateinit var tracingSettings: TracingSettings
@MockK lateinit var traceLocationOrganizerSettings: TraceLocationOrganizerSettings

private lateinit var homeFragmentViewModel: HomeFragmentViewModel

Expand Down Expand Up @@ -273,7 +275,8 @@ class HomeFragmentTest : BaseUITest() {
statisticsProvider = statisticsProvider,
deadmanNotificationScheduler = deadmanNotificationScheduler,
appShortcutsHelper = appShortcutsHelper,
tracingSettings = tracingSettings
tracingSettings = tracingSettings,
traceLocationOrganizerSettings = traceLocationOrganizerSettings
)
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import de.rki.coronawarnapp.ui.eventregistration.attendee.scan.ScanCheckInQrCode
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.TraceLocationCategoryFragment
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.TraceLocationCategoryFragmentModule
import de.rki.coronawarnapp.ui.eventregistration.organizer.create.TraceLocationCreateFragmentModule
import de.rki.coronawarnapp.ui.eventregistration.organizer.qrinfo.TraceLocationQRInfoFragment
import de.rki.coronawarnapp.ui.eventregistration.organizer.qrinfo.TraceLocationQRInfoFragmentModule
import de.rki.coronawarnapp.ui.eventregistration.organizer.list.TraceLocationsFragment
import de.rki.coronawarnapp.ui.eventregistration.organizer.list.TraceLocationsFragmentModule

Expand All @@ -33,6 +35,9 @@ internal abstract class EventRegistrationUIModule {
@ContributesAndroidInjector(modules = [TraceLocationCreateFragmentModule::class])
abstract fun traceLocationCreateFragment(): TraceLocationCreateFragment

@ContributesAndroidInjector(modules = [TraceLocationQRInfoFragmentModule::class])
abstract fun traceLocationQRInfoFragment(): TraceLocationQRInfoFragment

@ContributesAndroidInjector(modules = [TraceLocationsFragmentModule::class])
abstract fun traceLocationsFragment(): TraceLocationsFragment
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package de.rki.coronawarnapp.ui.eventregistration

import android.content.Context
import de.rki.coronawarnapp.util.di.AppContext
import de.rki.coronawarnapp.util.preferences.clearAndNotify
import de.rki.coronawarnapp.util.preferences.createFlowPreference
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class TraceLocationPreferences @Inject constructor(
@AppContext val context: Context
) {
private val prefs by lazy {
context.getSharedPreferences("trace_location_localdata", Context.MODE_PRIVATE)
}

val qrInfoAcknowledged = prefs.createFlowPreference(
key = "trace_location_qr_info_acknowledged",
defaultValue = false
)

fun clear() {
prefs.clearAndNotify()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package de.rki.coronawarnapp.ui.eventregistration.organizer

import de.rki.coronawarnapp.ui.eventregistration.TraceLocationPreferences
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class TraceLocationOrganizerSettings @Inject constructor(val preferences: TraceLocationPreferences) {

var qrInfoAcknowledged: Boolean
get() {
return preferences.qrInfoAcknowledged.value
}
set(value) = preferences.qrInfoAcknowledged.update { value }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package de.rki.coronawarnapp.ui.eventregistration.organizer.qrinfo

import android.os.Bundle
import android.view.View
import androidx.core.net.toUri
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.TraceLocationOrganizerQrCodeInfoFragmentBinding
import de.rki.coronawarnapp.ui.eventregistration.organizer.TraceLocationOrganizerSettings
import de.rki.coronawarnapp.util.di.AutoInject
import de.rki.coronawarnapp.util.ui.doNavigate
import de.rki.coronawarnapp.util.ui.observe2
import de.rki.coronawarnapp.util.ui.popBackStack
import de.rki.coronawarnapp.util.ui.viewBindingLazy
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
import javax.inject.Inject

class TraceLocationQRInfoFragment : Fragment(R.layout.trace_location_organizer_qr_code_info_fragment), AutoInject {

private val binding: TraceLocationOrganizerQrCodeInfoFragmentBinding by viewBindingLazy()

@Inject lateinit var settings: TraceLocationOrganizerSettings

@Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
private val vm: TraceLocationQRInfoViewModel by cwaViewModels { viewModelFactory }

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.apply {
toolbar.setNavigationOnClickListener { popBackStack() }
privacyInformation.setOnClickListener { vm.openPrivacyCard() }
traceLocationQrInfoUnderstandButton.setOnClickListener { vm.navigateToMyQRCodes() }
}

vm.routeToScreen.observe2(this) {
when (it) {
is TraceLocationQRInfoNavigationEvents.NavigateToDataPrivacy ->
findNavController().navigate("coronawarnapp://contactdiary/dataPrivacy".toUri())
is TraceLocationQRInfoNavigationEvents.NavigateToMyQrCodes -> {
settings.qrInfoAcknowledged = true
doNavigate(
TraceLocationQRInfoFragmentDirections
.actionTraceLocationOrganizerQRInfoFragmentToTraceLocationOrganizerListFragment()
)
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package de.rki.coronawarnapp.ui.eventregistration.organizer.qrinfo

import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelKey

@Module
abstract class TraceLocationQRInfoFragmentModule {

@Binds
@IntoMap
@CWAViewModelKey(TraceLocationQRInfoViewModel::class)
abstract fun traceLocationCreateViewModel(factory: TraceLocationQRInfoViewModel.Factory):
CWAViewModelFactory<out CWAViewModel>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package de.rki.coronawarnapp.ui.eventregistration.organizer.qrinfo

sealed class TraceLocationQRInfoNavigationEvents {
object NavigateToDataPrivacy : TraceLocationQRInfoNavigationEvents()
object NavigateToMyQrCodes : TraceLocationQRInfoNavigationEvents()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package de.rki.coronawarnapp.ui.eventregistration.organizer.qrinfo

import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import de.rki.coronawarnapp.util.ui.SingleLiveEvent
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory

class TraceLocationQRInfoViewModel @AssistedInject constructor() : CWAViewModel() {
val routeToScreen: SingleLiveEvent<TraceLocationQRInfoNavigationEvents> = SingleLiveEvent()

fun openPrivacyCard() {
routeToScreen.postValue(TraceLocationQRInfoNavigationEvents.NavigateToDataPrivacy)
}

fun navigateToMyQRCodes() {
routeToScreen.postValue(TraceLocationQRInfoNavigationEvents.NavigateToMyQrCodes)
}

@AssistedFactory
interface Factory : SimpleCWAViewModelFactory<TraceLocationQRInfoViewModel>
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import android.os.Bundle
import android.view.View
import android.view.accessibility.AccessibilityEvent
import androidx.fragment.app.Fragment
import androidx.navigation.NavGraph
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager
import de.rki.coronawarnapp.R
Expand All @@ -23,6 +25,7 @@ import de.rki.coronawarnapp.util.ui.observe2
import de.rki.coronawarnapp.util.ui.viewBindingLazy
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
import timber.log.Timber
import javax.inject.Inject

/**
Expand Down Expand Up @@ -78,6 +81,20 @@ class HomeFragment : Fragment(R.layout.home_fragment_layout), AutoInject {
ExternalActionHelper.openUrl(this@HomeFragment, getString(R.string.main_about_link))
}

vm.openTraceLocationOrganizerFlow.observe2(this) {
vm.wasQRInfoWasAcknowledged()
val nestedGraph = findNavController().graph.findNode(R.id.trace_location_organizer_nav_graph) as NavGraph

if (vm.wasQRInfoWasAcknowledged()) {
Timber.v("QRInfo aknowledged")
nestedGraph.startDestination = R.id.traceLocationOrganizerListFragment
doNavigate(HomeFragmentDirections.actionMainFragmentToTraceLocationOrganizerNavGraph())
} else {
nestedGraph.startDestination = R.id.traceLocationOrganizerQRInfoFragment
doNavigate(HomeFragmentDirections.actionMainFragmentToTraceLocationOrganizerNavGraph())
ralfgehrer marked this conversation as resolved.
Show resolved Hide resolved
}
}

vm.popupEvents.observe2(this) { event ->
when (event) {
HomeFragmentEvents.ShowErrorResetDialog -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,10 @@ import de.rki.coronawarnapp.tracing.ui.homecards.TracingFailedCard
import de.rki.coronawarnapp.tracing.ui.homecards.TracingProgressCard
import de.rki.coronawarnapp.tracing.ui.statusbar.TracingHeaderState
import de.rki.coronawarnapp.tracing.ui.statusbar.toHeaderState
import de.rki.coronawarnapp.ui.eventregistration.organizer.TraceLocationOrganizerSettings
import de.rki.coronawarnapp.ui.main.home.HomeFragmentEvents.ShowErrorResetDialog
import de.rki.coronawarnapp.ui.main.home.items.CreateTraceLocationCard
import de.rki.coronawarnapp.ui.main.home.HomeFragmentEvents.ShowTracingExplanation
import de.rki.coronawarnapp.ui.main.home.items.CreateTraceLocationCard
import de.rki.coronawarnapp.ui.main.home.items.FAQCard
import de.rki.coronawarnapp.ui.main.home.items.HomeItem
import de.rki.coronawarnapp.ui.main.home.items.ReenableRiskCard
Expand Down Expand Up @@ -83,12 +84,14 @@ class HomeFragmentViewModel @AssistedInject constructor(
private val deadmanNotificationScheduler: DeadmanNotificationScheduler,
private val appShortcutsHelper: AppShortcutsHelper,
private val tracingSettings: TracingSettings,
private val traceLocationOrganizerSettings: TraceLocationOrganizerSettings
) : CWAViewModel(dispatcherProvider = dispatcherProvider) {

private val tracingStateProvider by lazy { tracingStateProviderFactory.create(isDetailsMode = false) }

val routeToScreen = SingleLiveEvent<NavDirections>()
val openFAQUrlEvent = SingleLiveEvent<Unit>()
val openTraceLocationOrganizerFlow = SingleLiveEvent<Unit>()

val tracingHeaderState: LiveData<TracingHeaderState> = tracingStatus.generalStatus
.map { it.toHeaderState() }
Expand Down Expand Up @@ -240,7 +243,7 @@ class HomeFragmentViewModel @AssistedInject constructor(
)
}

add(CreateTraceLocationCard.Item(onClickAction = { /** Todo: Add navigation on click */ }))
add(CreateTraceLocationCard.Item(onClickAction = { openTraceLocationOrganizerFlow.postValue(Unit) }))

add(FAQCard.Item(onClickAction = { openFAQUrlEvent.postValue(Unit) }))
}
Expand Down Expand Up @@ -322,6 +325,8 @@ class HomeFragmentViewModel @AssistedInject constructor(
cwaSettings.wasTracingExplanationDialogShown = true
}

fun wasQRInfoWasAcknowledged() = traceLocationOrganizerSettings.qrInfoAcknowledged

@AssistedFactory
interface Factory : SimpleCWAViewModelFactory<HomeFragmentViewModel>
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,9 @@ class CreateTraceLocationCard(parent: ViewGroup) :
payloads: List<Any>
) -> Unit = { item, payloads ->

itemView.setOnClickListener {
val curItem = payloads.filterIsInstance<Item>().singleOrNull() ?: item
curItem.onClickAction(item)
}
val curItem = payloads.filterIsInstance<Item>().singleOrNull() ?: item
itemView.setOnClickListener { curItem.onClickAction(item) }
createTraceLocationCardButton.setOnClickListener { curItem.onClickAction(item) }
}

data class Item(val onClickAction: (Item) -> Unit) : HomeItem, HasPayloadDiffer {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import de.rki.coronawarnapp.storage.OnboardingSettings
import de.rki.coronawarnapp.storage.TracingSettings
import de.rki.coronawarnapp.submission.SubmissionRepository
import de.rki.coronawarnapp.submission.SubmissionSettings
import de.rki.coronawarnapp.ui.eventregistration.TraceLocationPreferences
import de.rki.coronawarnapp.util.di.AppContext
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
Expand All @@ -43,6 +44,7 @@ class DataReset @Inject constructor(
private val riskLevelStorage: RiskLevelStorage,
private val contactDiaryRepository: ContactDiaryRepository,
private var contactDiaryPreferences: ContactDiaryPreferences,
private var traceLocationPreferences: TraceLocationPreferences,
private val cwaSettings: CWASettings,
private val statisticsProvider: StatisticsProvider,
private val surveySettings: SurveySettings,
Expand Down Expand Up @@ -76,6 +78,7 @@ class DataReset @Inject constructor(
downloadDiagnosisKeysSettings.clear()
riskLevelStorage.clear()
contactDiaryPreferences.clear()
traceLocationPreferences.clear()
cwaSettings.clear()
surveySettings.clear()
analyticsSettings.clear()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp"
android:height="40dp"
android:viewportWidth="40"
android:viewportHeight="40">
<path
android:pathData="M20,40C31.0457,40 40,31.0457 40,20C40,8.9543 31.0457,0 20,0C8.9543,0 0,8.9543 0,20C0,31.0457 8.9543,40 20,40Z"
android:fillColor="#434445"/>
<group>
<clip-path
android:pathData="M10,10h20v20h-20z"/>
<path
android:pathData="M10,18.8892H18.8892V10H10V18.8892ZM12.2223,12.2223H16.6669V16.6669H12.2223V12.2223Z"
android:fillColor="#83D2F2"/>
<path
android:pathData="M10,29.9986H18.8892V21.1094H10V29.9986ZM12.2223,23.3317H16.6669V27.7763H12.2223V23.3317Z"
android:fillColor="#83D2F2"/>
<path
android:pathData="M21.1094,10V18.8892H29.9987V10H21.1094ZM27.7764,16.6669H23.3317V12.2223H27.7764V16.6669Z"
android:fillColor="#83D2F2"/>
<path
android:pathData="M29.9996,27.7773H27.7773V29.9997H29.9996V27.7773Z"
android:fillColor="#83D2F2"/>
<path
android:pathData="M23.3317,21.1094H21.1094V23.3317H23.3317V21.1094Z"
android:fillColor="#83D2F2"/>
<path
android:pathData="M25.5543,23.332H23.332V25.5543H25.5543V23.332Z"
android:fillColor="#83D2F2"/>
<path
android:pathData="M23.3317,25.5547H21.1094V27.777H23.3317V25.5547Z"
android:fillColor="#83D2F2"/>
<path
android:pathData="M25.5543,27.7773H23.332V29.9997H25.5543V27.7773Z"
android:fillColor="#83D2F2"/>
<path
android:pathData="M27.7771,25.5547H25.5547V27.777H27.7771V25.5547Z"
android:fillColor="#83D2F2"/>
<path
android:pathData="M27.7771,21.1094H25.5547V23.3317H27.7771V21.1094Z"
android:fillColor="#83D2F2"/>
<path
android:pathData="M29.9996,23.332H27.7773V25.5543H29.9996V23.332Z"
android:fillColor="#83D2F2"/>
</group>
</vector>
15 changes: 15 additions & 0 deletions Corona-Warn-App/src/main/res/drawable-night/ic_qr_time.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp"
android:height="40dp"
android:viewportWidth="40"
android:viewportHeight="40">
<path
android:pathData="M20,20m-20,0a20,20 0,1 1,40 0a20,20 0,1 1,-40 0"
android:fillColor="#F5F5F5"/>
<path
android:pathData="M20,20m-20,0a20,20 0,1 1,40 0a20,20 0,1 1,-40 0"
android:fillColor="#434445"/>
<path
android:pathData="M25,20C22.24,20 20,22.24 20,25C20,27.76 22.24,30 25,30C27.76,30 30,27.76 30,25C30,22.24 27.76,20 25,20ZM26.65,27.35L24.5,25.2V22H25.5V24.79L27.35,26.64L26.65,27.35ZM26,11H22.82C22.4,9.84 21.3,9 20,9C18.7,9 17.6,9.84 17.18,11H14C12.9,11 12,11.9 12,13V28C12,29.1 12.9,30 14,30H20.11C19.52,29.43 19.04,28.75 18.69,28H14V13H16V16H24V13H26V18.08C26.71,18.18 27.38,18.39 28,18.68V13C28,11.9 27.1,11 26,11ZM20,13C19.45,13 19,12.55 19,12C19,11.45 19.45,11 20,11C20.55,11 21,11.45 21,12C21,12.55 20.55,13 20,13Z"
android:fillColor="#83D2F2"/>
</vector>
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp"
android:height="40dp"
android:viewportWidth="40"
android:viewportHeight="40">
<path
android:pathData="M20,40C31.0457,40 40,31.0457 40,20C40,8.9543 31.0457,0 20,0C8.9543,0 0,8.9543 0,20C0,31.0457 8.9543,40 20,40Z"
android:fillColor="#434445"/>
<path
android:pathData="M11.5137,12.0002L12.5128,12.9993C10.5967,14.9154 9.4116,17.5625 9.4116,20.4864C9.4116,23.3339 10.5388,25.9992 12.5125,27.973L12.5128,27.9733L11.5156,28.9706C9.3435,26.7989 8,23.7986 8,20.4844C8,17.1712 9.3427,14.1717 11.5137,12.0002ZM28.4861,12C30.6572,14.1715 32,17.1712 32,20.4844C32,23.7987 30.6564,26.7991 28.4843,28.9707L27.4869,27.9733C29.4029,26.0572 30.5881,23.4102 30.5881,20.4864C30.5881,17.5625 29.4029,14.9154 27.4868,12.9993L28.4861,12Z"
android:strokeAlpha="0.24"
android:fillColor="#95B9CB"
android:fillType="evenOdd"
android:fillAlpha="0.24"/>
<path
android:pathData="M13.5128,13.9961L14.5103,14.9936C13.1052,16.3988 12.2361,18.3399 12.2361,20.4841C12.2361,22.5723 13.0627,24.5269 14.5101,25.9743L14.5103,25.9746L13.5112,26.9737C11.851,25.3131 10.8242,23.0193 10.8242,20.4857C10.8242,17.9513 11.8517,15.6568 13.5128,13.9961ZM26.4887,13.9962C28.1498,15.6569 29.1772,17.9513 29.1772,20.4857C29.1772,23.0193 28.1504,25.313 26.4903,26.9736L25.4913,25.9746C26.8964,24.5694 27.7655,22.6283 27.7655,20.4841C27.7655,18.3399 26.8964,16.3988 25.4913,14.9936L26.4887,13.9962Z"
android:strokeAlpha="0.6"
android:fillColor="#95B9CB"
android:fillType="evenOdd"
android:fillAlpha="0.6"/>
<path
android:pathData="M13.6484,20.4858C13.6484,16.9771 16.4927,14.1328 20.0014,14.1328C23.51,14.1328 26.3543,16.9771 26.3543,20.4858C26.3543,23.9944 23.51,26.8387 20.0014,26.8387C18.2941,26.8387 16.6922,26.1611 15.509,24.9778C14.3258,23.7945 13.6484,22.1929 13.6484,20.4858ZM24.5495,20.4858C24.5495,17.9739 22.5133,15.9377 20.0014,15.9377C17.4895,15.9377 15.4533,17.9739 15.4533,20.4858C15.4533,21.7089 15.9375,22.8538 16.7852,23.7016C17.6331,24.5495 18.7781,25.0339 20.0014,25.0339C22.5133,25.0339 24.5495,22.9976 24.5495,20.4858Z"
android:fillColor="#83D2F2"
android:fillType="evenOdd"/>
</vector>
Loading