Merge branch 'develop' into feature/target-sdk-29

# Conflicts:
#	vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt
This commit is contained in:
onurays 2020-04-14 13:59:54 +03:00
commit 190fbb95ec
109 changed files with 2604 additions and 274 deletions

View File

@ -6,6 +6,7 @@ Features ✨:
- Cross-Signing | Verify new session from existing session (#1134) - Cross-Signing | Verify new session from existing session (#1134)
- Cross-Signing | Bootstraping cross signing with 4S from mobile (#985) - Cross-Signing | Bootstraping cross signing with 4S from mobile (#985)
Improvements 🙌: Improvements 🙌:
- Verification DM / Handle concurrent .start after .ready (#794) - Verification DM / Handle concurrent .start after .ready (#794)
- Reimplementation of multiple attachment picker - Reimplementation of multiple attachment picker
@ -15,6 +16,10 @@ Improvements 🙌:
- Cross-Signing | Complete security new session design update (#1135) - Cross-Signing | Complete security new session design update (#1135)
- Cross-Signing | Setup key backup as part of SSSS bootstrapping (#1201) - Cross-Signing | Setup key backup as part of SSSS bootstrapping (#1201)
- Cross-Signing | Gossip key backup recovery key (#1200) - Cross-Signing | Gossip key backup recovery key (#1200)
- Show room encryption status as a bubble tile (#1078)
- Cross-Signing | Restore history after recover from passphrase (#1214)
- Cross-Sign | QR code scan confirmation screens design update (#1187)
- Emoji Verification | It's not the same butterfly! (#1220)
Bugfix 🐛: Bugfix 🐛:
- Missing avatar/displayname after verification request message (#841) - Missing avatar/displayname after verification request message (#841)
@ -22,6 +27,7 @@ Bugfix 🐛:
- RiotX can't restore cross signing keys saved by web in SSSS (#1174) - RiotX can't restore cross signing keys saved by web in SSSS (#1174)
- Cross- Signing | After signin in new session, verification paper trail in DM is off (#1191) - Cross- Signing | After signin in new session, verification paper trail in DM is off (#1191)
- Failed to encrypt message in room (message stays in red), [thanks to pwr22] (#925) - Failed to encrypt message in room (message stays in red), [thanks to pwr22] (#925)
- Cross-Signing | web <-> riotX After QR code scan, gossiping fails (#1210)
Translations 🗣: Translations 🗣:
- -

View File

@ -282,7 +282,7 @@ class KeyShareTests : InstrumentedTest {
val keysBackupService = aliceSession2.cryptoService().keysBackupService() val keysBackupService = aliceSession2.cryptoService().keysBackupService()
mTestHelper.retryPeriodicallyWithLatch(latch) { mTestHelper.retryPeriodicallyWithLatch(latch) {
Log.d("#TEST", "Recovery :${ keysBackupService.getKeyBackupRecoveryKeyInfo()?.recoveryKey}") Log.d("#TEST", "Recovery :${ keysBackupService.getKeyBackupRecoveryKeyInfo()?.recoveryKey}")
keysBackupService.getKeyBackupRecoveryKeyInfo()?.recoveryKey != creationInfo.recoveryKey keysBackupService.getKeyBackupRecoveryKeyInfo()?.recoveryKey == creationInfo.recoveryKey
} }
} }
} }

View File

@ -16,7 +16,10 @@
package im.vector.matrix.android.api.session.crypto.verification package im.vector.matrix.android.api.session.crypto.verification
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes import androidx.annotation.StringRes
data class EmojiRepresentation(val emoji: String, data class EmojiRepresentation(val emoji: String,
@StringRes val nameResId: Int) @StringRes val nameResId: Int,
@DrawableRes val drawableRes: Int? = null
)

View File

@ -43,6 +43,7 @@ sealed class VerificationTxState {
// Will be used to ask the user if the other user has correctly scanned // Will be used to ask the user if the other user has correctly scanned
object QrScannedByOther : VerificationQrTxState() object QrScannedByOther : VerificationQrTxState()
object WaitingOtherReciprocateConfirm : VerificationQrTxState()
// Terminal states // Terminal states
abstract class TerminalTxState : VerificationTxState() abstract class TerminalTxState : VerificationTxState()

View File

@ -22,6 +22,9 @@ import dagger.Lazy
import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.api.session.crypto.CryptoService import im.vector.matrix.android.api.session.crypto.CryptoService
import im.vector.matrix.android.api.session.crypto.crosssigning.CrossSigningService import im.vector.matrix.android.api.session.crypto.crosssigning.CrossSigningService
import im.vector.matrix.android.api.session.crypto.crosssigning.KEYBACKUP_SECRET_SSSS_NAME
import im.vector.matrix.android.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME
import im.vector.matrix.android.api.session.crypto.crosssigning.USER_SIGNING_KEY_SSSS_NAME
import im.vector.matrix.android.api.session.crypto.verification.CancelCode import im.vector.matrix.android.api.session.crypto.verification.CancelCode
import im.vector.matrix.android.api.session.crypto.verification.PendingVerificationRequest import im.vector.matrix.android.api.session.crypto.verification.PendingVerificationRequest
import im.vector.matrix.android.api.session.crypto.verification.QrCodeVerificationTransaction import im.vector.matrix.android.api.session.crypto.verification.QrCodeVerificationTransaction
@ -60,6 +63,7 @@ import im.vector.matrix.android.internal.crypto.model.MXUsersDevicesMap
import im.vector.matrix.android.internal.crypto.model.event.EncryptedEventContent import im.vector.matrix.android.internal.crypto.model.event.EncryptedEventContent
import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationAccept import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationAccept
import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationCancel import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationCancel
import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationDone
import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationKey import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationKey
import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationMac import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationMac
import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationReady import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationReady
@ -109,6 +113,10 @@ internal class DefaultVerificationService @Inject constructor(
// map [sender : [transaction]] // map [sender : [transaction]]
private val txMap = HashMap<String, HashMap<String, DefaultVerificationTransaction>>() private val txMap = HashMap<String, HashMap<String, DefaultVerificationTransaction>>()
// we need to keep track of finished transaction
// It will be used for gossiping (to send request after request is completed and 'done' by other)
private val pastTransactions = HashMap<String, HashMap<String, DefaultVerificationTransaction>>()
/** /**
* Map [sender: [PendingVerificationRequest]] * Map [sender: [PendingVerificationRequest]]
* For now we keep all requests (even terminated ones) during the lifetime of the app. * For now we keep all requests (even terminated ones) during the lifetime of the app.
@ -137,6 +145,9 @@ internal class DefaultVerificationService @Inject constructor(
EventType.KEY_VERIFICATION_READY -> { EventType.KEY_VERIFICATION_READY -> {
onReadyReceived(event) onReadyReceived(event)
} }
EventType.KEY_VERIFICATION_DONE -> {
onDoneReceived(event)
}
MessageType.MSGTYPE_VERIFICATION_REQUEST -> { MessageType.MSGTYPE_VERIFICATION_REQUEST -> {
onRequestReceived(event) onRequestReceived(event)
} }
@ -635,9 +646,7 @@ internal class DefaultVerificationService @Inject constructor(
)) ))
} }
if (existingTransaction is SASDefaultVerificationTransaction) { existingTransaction?.state = VerificationTxState.Cancelled(safeValueOf(cancelReq.code), false)
existingTransaction.state = VerificationTxState.Cancelled(safeValueOf(cancelReq.code), false)
}
} }
private fun onRoomAcceptReceived(event: Event) { private fun onRoomAcceptReceived(event: Event) {
@ -778,6 +787,58 @@ internal class DefaultVerificationService @Inject constructor(
} }
} }
private fun onDoneReceived(event: Event) {
Timber.v("## onDoneReceived")
val doneReq = event.getClearContent().toModel<KeyVerificationDone>()?.asValidObject()
if (doneReq == null || event.senderId == null) {
// ignore
Timber.e("## SAS Received invalid done request")
return
}
handleDoneReceived(event.senderId, doneReq)
if (event.senderId == userId) {
// We only send gossiping request when the other sent us a done
// We can ask without checking too much thinks (like trust), because we will check validity of secret on reception
getExistingTransaction(userId, doneReq.transactionId)
?: getOldTransaction(userId, doneReq.transactionId)
?.let { vt ->
val otherDeviceId = vt.otherDeviceId
if (!crossSigningService.canCrossSign()) {
outgoingGossipingRequestManager.sendSecretShareRequest(SELF_SIGNING_KEY_SSSS_NAME, mapOf(userId to listOf(otherDeviceId
?: "*")))
outgoingGossipingRequestManager.sendSecretShareRequest(USER_SIGNING_KEY_SSSS_NAME, mapOf(userId to listOf(otherDeviceId
?: "*")))
}
outgoingGossipingRequestManager.sendSecretShareRequest(KEYBACKUP_SECRET_SSSS_NAME, mapOf(userId to listOf(otherDeviceId
?: "*")))
}
}
}
private fun handleDoneReceived(senderId: String, doneReq: ValidVerificationDone) {
Timber.v("## SAS Done receieved $doneReq")
val existing = getExistingTransaction(senderId, doneReq.transactionId)
if (existing == null) {
Timber.e("## SAS Received invalid Done request")
return
}
if (existing is DefaultQrCodeVerificationTransaction) {
existing.onDoneReceived()
} else {
// SAS do not care for now?
}
// Now transactions are udated, let's also update Requests
val existingRequest = getExistingVerificationRequest(senderId)?.find { it.transactionId == doneReq.transactionId }
if (existingRequest == null) {
Timber.e("## SAS Received Done for unknown request txId:${doneReq.transactionId}")
return
}
updatePendingRequest(existingRequest.copy(isSuccessful = true))
}
private fun onRoomDoneReceived(event: Event) { private fun onRoomDoneReceived(event: Event) {
val doneReq = event.getClearContent().toModel<MessageVerificationDoneContent>() val doneReq = event.getClearContent().toModel<MessageVerificationDoneContent>()
?.copy( ?.copy(
@ -957,14 +1018,14 @@ internal class DefaultVerificationService @Inject constructor(
) )
} }
private fun handleDoneReceived(senderId: String, doneInfo: ValidVerificationDone) { // private fun handleDoneReceived(senderId: String, doneInfo: ValidVerificationDone) {
val existingRequest = getExistingVerificationRequest(senderId)?.find { it.transactionId == doneInfo.transactionId } // val existingRequest = getExistingVerificationRequest(senderId)?.find { it.transactionId == doneInfo.transactionId }
if (existingRequest == null) { // if (existingRequest == null) {
Timber.e("## SAS Received Done for unknown request txId:${doneInfo.transactionId}") // Timber.e("## SAS Received Done for unknown request txId:${doneInfo.transactionId}")
return // return
} // }
updatePendingRequest(existingRequest.copy(isSuccessful = true)) // updatePendingRequest(existingRequest.copy(isSuccessful = true))
} // }
// TODO All this methods should be delegated to a TransactionStore // TODO All this methods should be delegated to a TransactionStore
override fun getExistingTransaction(otherUserId: String, tid: String): VerificationTransaction? { override fun getExistingTransaction(otherUserId: String, tid: String): VerificationTransaction? {
@ -1003,7 +1064,11 @@ internal class DefaultVerificationService @Inject constructor(
private fun removeTransaction(otherUser: String, tid: String) { private fun removeTransaction(otherUser: String, tid: String) {
synchronized(txMap) { synchronized(txMap) {
txMap[otherUser]?.remove(tid)?.removeListener(this) txMap[otherUser]?.remove(tid)?.also {
it.removeListener(this)
}
}?.let {
rememberOldTransaction(it)
} }
} }
@ -1016,6 +1081,20 @@ internal class DefaultVerificationService @Inject constructor(
} }
} }
private fun rememberOldTransaction(tx: DefaultVerificationTransaction) {
synchronized(pastTransactions) {
pastTransactions.getOrPut(tx.otherUserId) { HashMap() }[tx.transactionId] = tx
}
}
private fun getOldTransaction(userId: String, tid: String?): DefaultVerificationTransaction? {
return tid?.let {
synchronized(pastTransactions) {
pastTransactions[userId]?.get(it)
}
}
}
override fun beginKeyVerification(method: VerificationMethod, otherUserId: String, otherDeviceId: String, transactionId: String?): String? { override fun beginKeyVerification(method: VerificationMethod, otherUserId: String, otherDeviceId: String, transactionId: String?): String? {
val txID = transactionId?.takeIf { it.isNotEmpty() } ?: createUniqueIDForTransaction(otherUserId, otherDeviceId) val txID = transactionId?.takeIf { it.isNotEmpty() } ?: createUniqueIDForTransaction(otherUserId, otherDeviceId)
// should check if already one (and cancel it) // should check if already one (and cancel it)

View File

@ -17,9 +17,6 @@ package im.vector.matrix.android.internal.crypto.verification
import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.api.session.crypto.crosssigning.CrossSigningService import im.vector.matrix.android.api.session.crypto.crosssigning.CrossSigningService
import im.vector.matrix.android.api.session.crypto.crosssigning.KEYBACKUP_SECRET_SSSS_NAME
import im.vector.matrix.android.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME
import im.vector.matrix.android.api.session.crypto.crosssigning.USER_SIGNING_KEY_SSSS_NAME
import im.vector.matrix.android.api.session.crypto.verification.VerificationTransaction import im.vector.matrix.android.api.session.crypto.verification.VerificationTransaction
import im.vector.matrix.android.api.session.crypto.verification.VerificationTxState import im.vector.matrix.android.api.session.crypto.verification.VerificationTxState
import im.vector.matrix.android.internal.crypto.IncomingGossipingRequestManager import im.vector.matrix.android.internal.crypto.IncomingGossipingRequestManager
@ -60,7 +57,7 @@ internal abstract class DefaultVerificationTransaction(
protected fun trust(canTrustOtherUserMasterKey: Boolean, protected fun trust(canTrustOtherUserMasterKey: Boolean,
toVerifyDeviceIds: List<String>, toVerifyDeviceIds: List<String>,
eventuallyMarkMyMasterKeyAsTrusted: Boolean) { eventuallyMarkMyMasterKeyAsTrusted: Boolean, autoDone : Boolean = true) {
Timber.d("## Verification: trust ($otherUserId,$otherDeviceId) , verifiedDevices:$toVerifyDeviceIds") Timber.d("## Verification: trust ($otherUserId,$otherDeviceId) , verifiedDevices:$toVerifyDeviceIds")
Timber.d("## Verification: trust Mark myMSK trusted $eventuallyMarkMyMasterKeyAsTrusted") Timber.d("## Verification: trust Mark myMSK trusted $eventuallyMarkMyMasterKeyAsTrusted")
@ -100,15 +97,10 @@ internal abstract class DefaultVerificationTransaction(
}) })
} }
transport.done(transactionId) { if (autoDone) {
if (otherUserId == userId && !crossSigningService.canCrossSign()) { state = VerificationTxState.Verified
outgoingGossipingRequestManager.sendSecretShareRequest(SELF_SIGNING_KEY_SSSS_NAME, mapOf(userId to listOf(otherDeviceId ?: "*"))) transport.done(transactionId) {}
outgoingGossipingRequestManager.sendSecretShareRequest(USER_SIGNING_KEY_SSSS_NAME, mapOf(userId to listOf(otherDeviceId ?: "*")))
outgoingGossipingRequestManager.sendSecretShareRequest(KEYBACKUP_SECRET_SSSS_NAME, mapOf(userId to listOf(otherDeviceId ?: "*")))
}
} }
state = VerificationTxState.Verified
} }
private fun setDeviceVerified(userId: String, deviceId: String) { private fun setDeviceVerified(userId: String, deviceId: String) {

View File

@ -15,7 +15,6 @@
*/ */
package im.vector.matrix.android.internal.crypto.verification package im.vector.matrix.android.internal.crypto.verification
import android.os.Build
import im.vector.matrix.android.api.extensions.orFalse import im.vector.matrix.android.api.extensions.orFalse
import im.vector.matrix.android.api.session.crypto.crosssigning.CrossSigningService import im.vector.matrix.android.api.session.crypto.crosssigning.CrossSigningService
import im.vector.matrix.android.api.session.crypto.verification.CancelCode import im.vector.matrix.android.api.session.crypto.verification.CancelCode
@ -74,13 +73,9 @@ internal abstract class SASDefaultVerificationTransaction(
// ordered by preferred order // ordered by preferred order
val KNOWN_MACS = listOf(SAS_MAC_SHA256, SAS_MAC_SHA256_LONGKDF) val KNOWN_MACS = listOf(SAS_MAC_SHA256, SAS_MAC_SHA256_LONGKDF)
// older devices have limited support of emoji, so reply with decimal // older devices have limited support of emoji but SDK offers images for the 64 verification emojis
val KNOWN_SHORT_CODES = // so always send that we support EMOJI
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val KNOWN_SHORT_CODES = listOf(SasMode.EMOJI, SasMode.DECIMAL)
listOf(SasMode.EMOJI, SasMode.DECIMAL)
} else {
listOf(SasMode.DECIMAL)
}
} }
override var state: VerificationTxState = VerificationTxState.None override var state: VerificationTxState = VerificationTxState.None

View File

@ -20,69 +20,69 @@ import im.vector.matrix.android.api.session.crypto.verification.EmojiRepresentat
internal fun getEmojiForCode(code: Int): EmojiRepresentation { internal fun getEmojiForCode(code: Int): EmojiRepresentation {
return when (code % 64) { return when (code % 64) {
0 -> EmojiRepresentation("🐶", R.string.verification_emoji_dog) 0 -> EmojiRepresentation("🐶", R.string.verification_emoji_dog, R.drawable.ic_verification_dog)
1 -> EmojiRepresentation("🐱", R.string.verification_emoji_cat) 1 -> EmojiRepresentation("🐱", R.string.verification_emoji_cat, R.drawable.ic_verification_cat)
2 -> EmojiRepresentation("🦁", R.string.verification_emoji_lion) 2 -> EmojiRepresentation("🦁", R.string.verification_emoji_lion, R.drawable.ic_verification_lion)
3 -> EmojiRepresentation("🐎", R.string.verification_emoji_horse) 3 -> EmojiRepresentation("🐎", R.string.verification_emoji_horse, R.drawable.ic_verification_horse)
4 -> EmojiRepresentation("🦄", R.string.verification_emoji_unicorn) 4 -> EmojiRepresentation("🦄", R.string.verification_emoji_unicorn, R.drawable.ic_verification_unicorn)
5 -> EmojiRepresentation("🐷", R.string.verification_emoji_pig) 5 -> EmojiRepresentation("🐷", R.string.verification_emoji_pig, R.drawable.ic_verification_pig)
6 -> EmojiRepresentation("🐘", R.string.verification_emoji_elephant) 6 -> EmojiRepresentation("🐘", R.string.verification_emoji_elephant, R.drawable.ic_verification_elephant)
7 -> EmojiRepresentation("🐰", R.string.verification_emoji_rabbit) 7 -> EmojiRepresentation("🐰", R.string.verification_emoji_rabbit, R.drawable.ic_verification_rabbit)
8 -> EmojiRepresentation("🐼", R.string.verification_emoji_panda) 8 -> EmojiRepresentation("🐼", R.string.verification_emoji_panda, R.drawable.ic_verification_panda)
9 -> EmojiRepresentation("🐓", R.string.verification_emoji_rooster) 9 -> EmojiRepresentation("🐓", R.string.verification_emoji_rooster, R.drawable.ic_verification_rooster)
10 -> EmojiRepresentation("🐧", R.string.verification_emoji_penguin) 10 -> EmojiRepresentation("🐧", R.string.verification_emoji_penguin, R.drawable.ic_verification_penguin)
11 -> EmojiRepresentation("🐢", R.string.verification_emoji_turtle) 11 -> EmojiRepresentation("🐢", R.string.verification_emoji_turtle, R.drawable.ic_verification_turtle)
12 -> EmojiRepresentation("🐟", R.string.verification_emoji_fish) 12 -> EmojiRepresentation("🐟", R.string.verification_emoji_fish, R.drawable.ic_verification_fish)
13 -> EmojiRepresentation("🐙", R.string.verification_emoji_octopus) 13 -> EmojiRepresentation("🐙", R.string.verification_emoji_octopus, R.drawable.ic_verification_octopus)
14 -> EmojiRepresentation("🦋", R.string.verification_emoji_butterfly) 14 -> EmojiRepresentation("🦋", R.string.verification_emoji_butterfly, R.drawable.ic_verification_butterfly)
15 -> EmojiRepresentation("🌷", R.string.verification_emoji_flower) 15 -> EmojiRepresentation("🌷", R.string.verification_emoji_flower, R.drawable.ic_verification_flower)
16 -> EmojiRepresentation("🌳", R.string.verification_emoji_tree) 16 -> EmojiRepresentation("🌳", R.string.verification_emoji_tree, R.drawable.ic_verification_tree)
17 -> EmojiRepresentation("🌵", R.string.verification_emoji_cactus) 17 -> EmojiRepresentation("🌵", R.string.verification_emoji_cactus, R.drawable.ic_verification_cactus)
18 -> EmojiRepresentation("🍄", R.string.verification_emoji_mushroom) 18 -> EmojiRepresentation("🍄", R.string.verification_emoji_mushroom, R.drawable.ic_verification_mushroom)
19 -> EmojiRepresentation("🌏", R.string.verification_emoji_globe) 19 -> EmojiRepresentation("🌏", R.string.verification_emoji_globe, R.drawable.ic_verification_globe)
20 -> EmojiRepresentation("🌙", R.string.verification_emoji_moon) 20 -> EmojiRepresentation("🌙", R.string.verification_emoji_moon, R.drawable.ic_verification_moon)
21 -> EmojiRepresentation("☁️", R.string.verification_emoji_cloud) 21 -> EmojiRepresentation("☁️", R.string.verification_emoji_cloud, R.drawable.ic_verification_cloud)
22 -> EmojiRepresentation("🔥", R.string.verification_emoji_fire) 22 -> EmojiRepresentation("🔥", R.string.verification_emoji_fire, R.drawable.ic_verification_fire)
23 -> EmojiRepresentation("🍌", R.string.verification_emoji_banana) 23 -> EmojiRepresentation("🍌", R.string.verification_emoji_banana, R.drawable.ic_verification_banana)
24 -> EmojiRepresentation("🍎", R.string.verification_emoji_apple) 24 -> EmojiRepresentation("🍎", R.string.verification_emoji_apple, R.drawable.ic_verification_apple)
25 -> EmojiRepresentation("🍓", R.string.verification_emoji_strawberry) 25 -> EmojiRepresentation("🍓", R.string.verification_emoji_strawberry, R.drawable.ic_verification_strawberry)
26 -> EmojiRepresentation("🌽", R.string.verification_emoji_corn) 26 -> EmojiRepresentation("🌽", R.string.verification_emoji_corn, R.drawable.ic_verification_corn)
27 -> EmojiRepresentation("🍕", R.string.verification_emoji_pizza) 27 -> EmojiRepresentation("🍕", R.string.verification_emoji_pizza, R.drawable.ic_verification_pizza)
28 -> EmojiRepresentation("🎂", R.string.verification_emoji_cake) 28 -> EmojiRepresentation("🎂", R.string.verification_emoji_cake, R.drawable.ic_verification_cake)
29 -> EmojiRepresentation("❤️", R.string.verification_emoji_heart) 29 -> EmojiRepresentation("❤️", R.string.verification_emoji_heart, R.drawable.ic_verification_heart)
30 -> EmojiRepresentation("😀", R.string.verification_emoji_smiley) 30 -> EmojiRepresentation("🙂", R.string.verification_emoji_smiley, R.drawable.ic_verification_smiley)
31 -> EmojiRepresentation("🤖", R.string.verification_emoji_robot) 31 -> EmojiRepresentation("🤖", R.string.verification_emoji_robot, R.drawable.ic_verification_robot)
32 -> EmojiRepresentation("🎩", R.string.verification_emoji_hat) 32 -> EmojiRepresentation("🎩", R.string.verification_emoji_hat, R.drawable.ic_verification_hat)
33 -> EmojiRepresentation("👓", R.string.verification_emoji_glasses) 33 -> EmojiRepresentation("👓", R.string.verification_emoji_glasses, R.drawable.ic_verification_glasses)
34 -> EmojiRepresentation("🔧", R.string.verification_emoji_wrench) 34 -> EmojiRepresentation("🔧", R.string.verification_emoji_wrench, R.drawable.ic_verification_wrench)
35 -> EmojiRepresentation("🎅", R.string.verification_emoji_santa) 35 -> EmojiRepresentation("🎅", R.string.verification_emoji_santa, R.drawable.ic_verification_santa)
36 -> EmojiRepresentation("👍", R.string.verification_emoji_thumbsup) 36 -> EmojiRepresentation("👍", R.string.verification_emoji_thumbsup, R.drawable.ic_verification_thumbs_up)
37 -> EmojiRepresentation("☂️", R.string.verification_emoji_umbrella) 37 -> EmojiRepresentation("☂️", R.string.verification_emoji_umbrella, R.drawable.ic_verification_umbrella)
38 -> EmojiRepresentation("", R.string.verification_emoji_hourglass) 38 -> EmojiRepresentation("", R.string.verification_emoji_hourglass, R.drawable.ic_verification_hourglass)
39 -> EmojiRepresentation("", R.string.verification_emoji_clock) 39 -> EmojiRepresentation("", R.string.verification_emoji_clock, R.drawable.ic_verification_clock)
40 -> EmojiRepresentation("🎁", R.string.verification_emoji_gift) 40 -> EmojiRepresentation("🎁", R.string.verification_emoji_gift, R.drawable.ic_verification_gift)
41 -> EmojiRepresentation("💡", R.string.verification_emoji_lightbulb) 41 -> EmojiRepresentation("💡", R.string.verification_emoji_lightbulb, R.drawable.ic_verification_light_bulb)
42 -> EmojiRepresentation("📕", R.string.verification_emoji_book) 42 -> EmojiRepresentation("📕", R.string.verification_emoji_book, R.drawable.ic_verification_book)
43 -> EmojiRepresentation("✏️", R.string.verification_emoji_pencil) 43 -> EmojiRepresentation("✏️", R.string.verification_emoji_pencil, R.drawable.ic_verification_pencil)
44 -> EmojiRepresentation("📎", R.string.verification_emoji_paperclip) 44 -> EmojiRepresentation("📎", R.string.verification_emoji_paperclip, R.drawable.ic_verification_paperclip)
45 -> EmojiRepresentation("✂️", R.string.verification_emoji_scissors) 45 -> EmojiRepresentation("✂️", R.string.verification_emoji_scissors, R.drawable.ic_verification_scissors)
46 -> EmojiRepresentation("🔒", R.string.verification_emoji_lock) 46 -> EmojiRepresentation("🔒", R.string.verification_emoji_lock, R.drawable.ic_verification_lock)
47 -> EmojiRepresentation("🔑", R.string.verification_emoji_key) 47 -> EmojiRepresentation("🔑", R.string.verification_emoji_key, R.drawable.ic_verification_key)
48 -> EmojiRepresentation("🔨", R.string.verification_emoji_hammer) 48 -> EmojiRepresentation("🔨", R.string.verification_emoji_hammer, R.drawable.ic_verification_hammer)
49 -> EmojiRepresentation("☎️", R.string.verification_emoji_telephone) 49 -> EmojiRepresentation("☎️", R.string.verification_emoji_telephone, R.drawable.ic_verification_phone)
50 -> EmojiRepresentation("🏁", R.string.verification_emoji_flag) 50 -> EmojiRepresentation("🏁", R.string.verification_emoji_flag, R.drawable.ic_verification_flag)
51 -> EmojiRepresentation("🚂", R.string.verification_emoji_train) 51 -> EmojiRepresentation("🚂", R.string.verification_emoji_train, R.drawable.ic_verification_train)
52 -> EmojiRepresentation("🚲", R.string.verification_emoji_bicycle) 52 -> EmojiRepresentation("🚲", R.string.verification_emoji_bicycle, R.drawable.ic_verification_bicycle)
53 -> EmojiRepresentation("✈️", R.string.verification_emoji_airplane) 53 -> EmojiRepresentation("✈️", R.string.verification_emoji_airplane, R.drawable.ic_verification_airplane)
54 -> EmojiRepresentation("🚀", R.string.verification_emoji_rocket) 54 -> EmojiRepresentation("🚀", R.string.verification_emoji_rocket, R.drawable.ic_verification_rocket)
55 -> EmojiRepresentation("🏆", R.string.verification_emoji_trophy) 55 -> EmojiRepresentation("🏆", R.string.verification_emoji_trophy, R.drawable.ic_verification_trophy)
56 -> EmojiRepresentation("", R.string.verification_emoji_ball) 56 -> EmojiRepresentation("", R.string.verification_emoji_ball, R.drawable.ic_verification_ball)
57 -> EmojiRepresentation("🎸", R.string.verification_emoji_guitar) 57 -> EmojiRepresentation("🎸", R.string.verification_emoji_guitar, R.drawable.ic_verification_guitar)
58 -> EmojiRepresentation("🎺", R.string.verification_emoji_trumpet) 58 -> EmojiRepresentation("🎺", R.string.verification_emoji_trumpet, R.drawable.ic_verification_trumpet)
59 -> EmojiRepresentation("🔔", R.string.verification_emoji_bell) 59 -> EmojiRepresentation("🔔", R.string.verification_emoji_bell, R.drawable.ic_verification_bell)
60 -> EmojiRepresentation("", R.string.verification_emoji_anchor) 60 -> EmojiRepresentation("", R.string.verification_emoji_anchor, R.drawable.ic_verification_anchor)
61 -> EmojiRepresentation("🎧", R.string.verification_emoji_headphone) 61 -> EmojiRepresentation("🎧", R.string.verification_emoji_headphone, R.drawable.ic_verification_headphone)
62 -> EmojiRepresentation("📁", R.string.verification_emoji_folder) 62 -> EmojiRepresentation("📁", R.string.verification_emoji_folder, R.drawable.ic_verification_folder)
/* 63 */ else -> EmojiRepresentation("📌", R.string.verification_emoji_pin) /* 63 */ else -> EmojiRepresentation("📌", R.string.verification_emoji_pin, R.drawable.ic_verification_pin)
} }
} }

View File

@ -15,14 +15,12 @@
*/ */
package im.vector.matrix.android.internal.crypto.verification package im.vector.matrix.android.internal.crypto.verification
internal interface VerificationInfoDone : VerificationInfo<ValidVerificationInfoDone> { import im.vector.matrix.android.api.session.room.model.message.ValidVerificationDone
override fun asValidObject(): ValidVerificationInfoDone? { internal interface VerificationInfoDone : VerificationInfo<ValidVerificationDone> {
if (transactionId.isNullOrEmpty()) {
return null override fun asValidObject(): ValidVerificationDone? {
} val validTransactionId = transactionId?.takeIf { it.isNotEmpty() } ?: return null
return ValidVerificationInfoDone return ValidVerificationDone(validTransactionId)
} }
} }
internal object ValidVerificationInfoDone

View File

@ -187,9 +187,12 @@ internal class DefaultQrCodeVerificationTransaction(
// qrCodeData.sharedSecret will be used to send the start request // qrCodeData.sharedSecret will be used to send the start request
start(otherQrCodeData.sharedSecret) start(otherQrCodeData.sharedSecret)
trust(canTrustOtherUserMasterKey, trust(
toVerifyDeviceIds.distinct(), canTrustOtherUserMasterKey = canTrustOtherUserMasterKey,
eventuallyMarkMyMasterKeyAsTrusted = true) toVerifyDeviceIds = toVerifyDeviceIds.distinct(),
eventuallyMarkMyMasterKeyAsTrusted = true,
autoDone = false
)
} }
private fun start(remoteSecret: String, onDone: (() -> Unit)? = null) { private fun start(remoteSecret: String, onDone: (() -> Unit)? = null) {
@ -199,6 +202,7 @@ internal class DefaultQrCodeVerificationTransaction(
throw IllegalStateException("Interactive Key verification already started") throw IllegalStateException("Interactive Key verification already started")
} }
state = VerificationTxState.Started
val startMessage = transport.createStartForQrCode( val startMessage = transport.createStartForQrCode(
deviceId, deviceId,
transactionId, transactionId,
@ -208,7 +212,7 @@ internal class DefaultQrCodeVerificationTransaction(
transport.sendToOther( transport.sendToOther(
EventType.KEY_VERIFICATION_START, EventType.KEY_VERIFICATION_START,
startMessage, startMessage,
VerificationTxState.Started, VerificationTxState.WaitingOtherReciprocateConfirm,
CancelCode.User, CancelCode.User,
onDone onDone
) )
@ -244,6 +248,15 @@ internal class DefaultQrCodeVerificationTransaction(
} }
} }
fun onDoneReceived() {
if (state != VerificationTxState.WaitingOtherReciprocateConfirm) {
cancel(CancelCode.UnexpectedMessage)
return
}
state = VerificationTxState.Verified
transport.done(transactionId) {}
}
override fun otherUserScannedMyQrCode() { override fun otherUserScannedMyQrCode() {
when (qrCodeData) { when (qrCodeData) {
is QrCodeData.VerifyingAnotherUser -> { is QrCodeData.VerifyingAnotherUser -> {
@ -265,6 +278,6 @@ internal class DefaultQrCodeVerificationTransaction(
override fun otherUserDidNotScannedMyQrCode() { override fun otherUserDidNotScannedMyQrCode() {
// What can I do then? // What can I do then?
// At least remove the transaction... // At least remove the transaction...
state = VerificationTxState.Cancelled(CancelCode.MismatchedKeys, true) cancel(CancelCode.MismatchedKeys)
} }
} }

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M30,23.828c-0.391,0.392 -1.023,0.392 -1.414,0l-1.414,-1.414c-0.392,-0.391 -0.392,-1.024 0,-1.414L30,18.172c0.391,-0.391 1.023,-0.391 1.414,0l1.414,1.414c0.392,0.391 0.392,1.024 0,1.414L30,23.828zM15,8.828c-0.391,0.392 -1.023,0.392 -1.414,0l-1.414,-1.414c-0.392,-0.391 -0.392,-1.023 0,-1.414L15,3.172c0.391,-0.391 1.023,-0.391 1.414,0l1.414,1.414c0.392,0.391 0.392,1.023 0,1.414L15,8.828z"
android:fillColor="#66757F"/>
<path
android:pathData="M2,22c2,0 11,1 11,1s1,9 1,11 -2,2 -3,1 -4,-6 -4,-6 -5,-3 -6,-4 -1,-3 1,-3zM4,6.039C7,6 29,7 29,7s0.924,22 0.962,25c0.038,3 -2.763,4.002 -3.862,0.001S21,15 21,15 7.045,10.583 3.995,9.898C0,9 0.999,6.077 4,6.039z"
android:fillColor="#55ACEE"/>
<path
android:pathData="M27,3c2,-2 7,-3 8,-2s0,6 -2,8 -19,18 -19,18 -6.5,4.5 -8,3 3,-8 3,-8S25,5 27,3z"
android:fillColor="#CCD6DD"/>
<path
android:pathData="M14,22s0.5,0.5 -4,5 -5,4 -5,4 -0.5,-0.5 4,-5 5,-4 5,-4zM29,4c1.657,0 3,1.343 3,3h0.805c0.114,-0.315 0.195,-0.645 0.195,-1 0,-1.657 -1.343,-3 -3,-3 -0.355,0 -0.685,0.081 -1,0.195V4z"
android:fillColor="#66757F"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M30.5,18.572L26,25h2.575c-1.13,3.988 -4.445,7.05 -8.575,7.81V17h3c1.104,0 2,-0.896 2,-2s-0.896,-2 -2,-2h-3v-1.349h-4V13h-3c-1.104,0 -2,0.896 -2,2s0.896,2 2,2h3v15.81c-4.13,-0.76 -7.445,-3.821 -8.575,-7.81H10l-4.5,-6.428L1,25h3.33C5.705,31.289 11.299,36 18,36s12.295,-4.711 13.67,-11H35l-4.5,-6.428z"
android:fillColor="#269"/>
<path
android:pathData="M18,0c-3.314,0 -6,2.686 -6,6s2.686,6 6,6 6,-2.686 6,-6 -2.686,-6 -6,-6zM18,9c-1.657,0 -3,-1.343 -3,-3s1.343,-3 3,-3 3,1.343 3,3 -1.343,3 -3,3z"
android:fillColor="#269"/>
</vector>

View File

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M24,7c-3,0 -3,1 -6,1s-3,-1 -6,-1c-4,0 -9,2 -9,9 0,11 6,20 10,20 3,0 3,-1 5,-1s2,1 5,1c4,0 10,-9 10,-20 0,-7.001 -5,-9 -9,-9z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M19,7s3,-4 8,-4c4,0 6,2 6,2s-4,3 -7,3 -7,-1 -7,-1z"
android:fillColor="#77B255"/>
<path
android:pathData="M18,10c-0.552,0 -1,-0.448 -1,-1 0,-3.441 1.2,-6.615 3.293,-8.707 0.391,-0.391 1.023,-0.391 1.414,0s0.391,1.024 0,1.414C19.986,3.427 19,6.085 19,9c0,0.552 -0.448,1 -1,1z"
android:fillColor="#662113"/>
</vector>

View File

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M18,18m-18,0a18,18 0,1 1,36 0a18,18 0,1 1,-36 0"
android:fillColor="#F5F8FA"/>
<path
android:pathData="M18,11c-0.552,0 -1,-0.448 -1,-1L17,3c0,-0.552 0.448,-1 1,-1s1,0.448 1,1v7c0,0.552 -0.448,1 -1,1zM11.417,15.5c-0.1,0 -0.202,-0.015 -0.302,-0.047l-8.041,-2.542c-0.527,-0.167 -0.819,-0.728 -0.652,-1.255 0.166,-0.527 0.73,-0.818 1.255,-0.652l8.042,2.542c0.527,0.167 0.819,0.729 0.652,1.255 -0.136,0.426 -0.53,0.699 -0.954,0.699zM25.042,15.209c-0.434,0 -0.833,-0.285 -0.96,-0.722 -0.154,-0.531 0.151,-1.085 0.682,-1.239l6.75,-1.958c0.531,-0.153 1.085,0.153 1.238,0.682 0.154,0.531 -0.151,1.085 -0.682,1.239l-6.75,1.958c-0.092,0.027 -0.186,0.04 -0.278,0.04zM27.043,30.167c-0.306,0 -0.606,-0.14 -0.803,-0.403l-5.459,-7.333c-0.33,-0.442 -0.238,-1.069 0.205,-1.399 0.442,-0.331 1.069,-0.238 1.399,0.205l5.459,7.333c0.33,0.442 0.238,1.069 -0.205,1.399 -0.179,0.134 -0.389,0.198 -0.596,0.198zM8.749,30.084c-0.197,0 -0.395,-0.058 -0.57,-0.179 -0.454,-0.316 -0.565,-0.938 -0.25,-1.392l5.125,-7.375c0.315,-0.454 0.938,-0.566 1.392,-0.251 0.454,0.315 0.565,0.939 0.25,1.392l-5.125,7.375c-0.194,0.281 -0.506,0.43 -0.822,0.43zM3.5,27.062c-0.44,0 -0.844,-0.293 -0.965,-0.738L0.347,18.262c-0.145,-0.533 0.17,-1.082 0.704,-1.227 0.535,-0.141 1.083,0.171 1.227,0.704l2.188,8.062c0.145,0.533 -0.17,1.082 -0.704,1.226 -0.088,0.025 -0.176,0.035 -0.262,0.035zM22,34h-9c-0.552,0 -1,-0.447 -1,-1s0.448,-1 1,-1h9c0.553,0 1,0.447 1,1s-0.447,1 -1,1zM32.126,27.125c-0.079,0 -0.16,-0.009 -0.24,-0.029 -0.536,-0.132 -0.864,-0.674 -0.731,-1.21l2.125,-8.625c0.133,-0.536 0.679,-0.862 1.21,-0.732 0.536,0.132 0.864,0.674 0.731,1.211l-2.125,8.625c-0.113,0.455 -0.521,0.76 -0.97,0.76zM30.312,7.688c-0.17,0 -0.342,-0.043 -0.5,-0.134L22.25,3.179c-0.478,-0.277 -0.642,-0.888 -0.364,-1.367 0.275,-0.478 0.886,-0.643 1.366,-0.365l7.562,4.375c0.478,0.277 0.642,0.888 0.364,1.367 -0.185,0.32 -0.521,0.499 -0.866,0.499zM5.501,7.688c-0.312,0 -0.618,-0.145 -0.813,-0.417 -0.322,-0.45 -0.22,-1.074 0.229,-1.396l6.188,-4.438c0.449,-0.322 1.074,-0.219 1.396,0.229 0.322,0.449 0.219,1.074 -0.229,1.396L6.083,7.5c-0.177,0.126 -0.38,0.188 -0.582,0.188z"
android:fillColor="#CCD6DD"/>
<path
android:pathData="M25.493,13.516l-7.208,-5.083c-0.348,-0.245 -0.814,-0.243 -1.161,0.006l-7.167,5.167c-0.343,0.248 -0.494,0.684 -0.375,1.091l2.5,8.583c0.124,0.426 0.515,0.72 0.96,0.72L22,24c0.43,0 0.81,-0.274 0.948,-0.681l2.917,-8.667c0.141,-0.419 -0.011,-0.881 -0.372,-1.136zM1.292,19.542c0.058,0 0.117,-0.005 0.175,-0.016 0.294,-0.052 0.55,-0.233 0.697,-0.494l3.375,-6c0.051,-0.091 0.087,-0.188 0.108,-0.291L6.98,6.2c0.06,-0.294 -0.016,-0.6 -0.206,-0.832C6.584,5.135 6.3,5 6,5h-0.428C2.145,8.277 0,12.884 0,18c0,0.266 0.028,0.525 0.04,0.788l0.602,0.514c0.182,0.156 0.413,0.24 0.65,0.24zM10.617,2.995c0.106,0.219 0.313,0.373 0.553,0.412l6.375,1.042c0.04,0.006 0.081,0.01 0.121,0.01 0.04,0 0.081,-0.003 0.122,-0.01l6.084,-1c0.2,-0.033 0.38,-0.146 0.495,-0.314 0.116,-0.168 0.158,-0.375 0.118,-0.575l-0.292,-1.443C22.26,0.407 20.18,0 18,0c-2.425,0 -4.734,0.486 -6.845,1.356l-0.521,0.95c-0.117,0.213 -0.123,0.47 -0.017,0.689zM31.134,5.719l-1.504,-0.095c-0.228,-0.013 -0.455,0.076 -0.609,0.249 -0.152,0.173 -0.218,0.402 -0.175,0.63l1.167,6.198c0.017,0.086 0.048,0.148 0.093,0.224 1.492,2.504 3.152,5.301 3.381,5.782 0.024,0.084 0.062,0.079 0.114,0.151 0.14,0.195 0.372,0.142 0.612,0.142h0.007c0.198,0 0.323,0.094 1.768,-0.753 0.001,-0.083 0.012,-0.164 0.012,-0.247 0,-4.753 -1.856,-9.064 -4.866,-12.281zM14.541,33.376c0.011,-0.199 -0.058,-0.395 -0.191,-0.544l-4.5,-5c-0.06,-0.066 -0.131,-0.122 -0.211,-0.163 -5.885,-3.069 -5.994,-3.105 -6.066,-3.13 -0.078,-0.025 -0.161,-0.039 -0.242,-0.039 -0.537,0 -0.695,0.065 -1.185,2.024 2.236,4.149 6.053,7.316 10.644,8.703l1.5,-1.333c0.149,-0.132 0.239,-0.319 0.251,-0.518zM32.374,24.809c-0.189,-0.08 -0.405,-0.078 -0.592,0.005l-6.083,2.667c-0.106,0.046 -0.2,0.116 -0.274,0.205l-4.25,5.083c-0.129,0.154 -0.19,0.352 -0.172,0.552 0.02,0.2 0.117,0.384 0.272,0.51 0.683,0.559 1.261,1.03 1.767,1.44 4.437,-1.294 8.154,-4.248 10.454,-8.146l-0.712,-1.889c-0.072,-0.193 -0.221,-0.347 -0.41,-0.427z"
android:fillColor="#31373D"/>
</vector>

View File

@ -0,0 +1,36 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M28,2c2.684,-1.342 5,4 3,13 -1.106,4.977 -5,9 -9,12s-11,-1 -7,-5 8,-7 10,-13c1.304,-3.912 1,-6 3,-7z"
android:fillColor="#FFE8B6"/>
<path
android:pathData="M31,8c0,3 -1,9 -4,13s-7,5 -4,1 5,-7 6,-11 2,-7 2,-3z"
android:fillColor="#FFD983"/>
<path
android:pathData="M22,20c-0.296,0.592 1.167,-3.833 -3,-6 -1.984,-1.032 -10,1 -4,1 3,0 4,2 2,4 -0.291,0.292 -0.489,0.603 -0.622,0.912 -0.417,0.346 -0.873,0.709 -1.378,1.088 -2.263,1.697 -5.84,4.227 -10,7 -3,2 -4,3 -4,4 0,3 9,3 14,1s10,-7 10,-7l4,-4c-3,-4 -7,-2 -7,-2z"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M22,20s1.792,-4.729 -3,-7c-4.042,-1.916 -8,-1 -11,1s-2,4 -3,5 1,2 3,0 8.316,-4.895 11,-4c3,1 2,2.999 3,5z"
android:fillColor="#FFE8B6"/>
<path
android:pathData="M26,35h-4c-2,0 -3,1 -4,1s-2,-2 0,-2 4,0 5,-1 5,2 3,2z"
android:fillColor="#A6D388"/>
<path
android:pathData="M18,35m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#3E721D"/>
<path
android:pathData="M32.208,28S28,35 26,35h-4c-2,0 0,-1 1,-2s5,0 5,-6c0,-3 4.208,1 4.208,1z"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M26,19c3,0 8,3 7,9s-5,7 -7,7h-2c-2,0 -1,-1 0,-2s4,0 4,-6c0,-3 -4,-7 -6,-7 0,0 2,-1 4,-1z"
android:fillColor="#FFE8B6"/>
<path
android:pathData="M17,21c3,0 5,1 3,3 -1.581,1.581 -6,5 -10,6s-8,1 -5,-1 9.764,-8 12,-8z"
android:fillColor="#FFD983"/>
<path
android:pathData="M2,31c1,0 1,0 1,0.667C3,32.333 3,33 2,33s-1,-1.333 -1,-1.333S1,31 2,31z"
android:fillColor="#C1694F"/>
</vector>

View File

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M28,13c0,11 5,10 5,15 0,0 0,2 -2,2H5c-2,0 -2,-2 -2,-2 0,-5 5,-4 5,-15C8,7.478 12.477,3 18,3s10,4.478 10,10z"
android:fillColor="#FFAC33"/>
<path
android:pathData="M18,3m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0"
android:fillColor="#FFAC33"/>
<path
android:pathData="M18,36c2.209,0 4,-1.791 4,-4h-8c0,2.209 1.791,4 4,4z"
android:fillColor="#FFAC33"/>
</vector>

View File

@ -0,0 +1,27 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M7,24c1.957,0 3.633,1.135 4.455,2.772l3.477,-1.739C13.488,22.058 10.446,20 6.916,20c-1.301,0 -2.534,0.285 -3.649,0.787l1.668,3.67C5.566,24.17 6.262,24 7,24zM29,24c1.467,0 2.772,0.643 3.688,1.648l2.897,-2.635C33.952,21.169 31.573,20 28.916,20c-3.576,0 -6.652,2.111 -8.073,5.15l3.648,1.722C25.293,25.18 27.003,24 29,24z"
android:fillColor="#EA596E"/>
<path
android:pathData="M7,22c-3.866,0 -7,3.134 -7,7s3.134,7 7,7 7,-3.134 7,-7 -3.133,-7 -7,-7zM7,34c-2.761,0 -5,-2.238 -5,-5s2.239,-5 5,-5 5,2.238 5,5 -2.238,5 -5,5zM29,22c-3.865,0 -7,3.134 -7,7s3.135,7 7,7c3.867,0 7,-3.134 7,-7s-3.133,-7 -7,-7zM29,34c-2.761,0 -5,-2.238 -5,-5s2.239,-5 5,-5c2.762,0 5,2.238 5,5s-2.238,5 -5,5z"
android:fillColor="#292F33"/>
<path
android:pathData="M29.984,28.922c-0.005,-0.067 -0.021,-0.132 -0.04,-0.198 -0.019,-0.065 -0.04,-0.126 -0.071,-0.186 -0.013,-0.024 -0.015,-0.052 -0.029,-0.075l-7,-11c-0.297,-0.466 -0.914,-0.604 -1.381,-0.307 -0.299,0.19 -0.444,0.513 -0.445,0.843H12c-0.552,0 -1,0.447 -1,1 0,0.553 0.448,1 1,1h10c0.027,0 0.05,-0.014 0.077,-0.016L27.178,28H18c-0.552,0 -1,0.447 -1,1s0.448,1 1,1h11.001c0.116,0 0.23,-0.028 0.343,-0.069 0.034,-0.013 0.064,-0.027 0.097,-0.043 0.031,-0.017 0.066,-0.024 0.097,-0.044 0.03,-0.02 0.048,-0.051 0.075,-0.072 0.055,-0.044 0.103,-0.089 0.147,-0.143 0.041,-0.049 0.074,-0.099 0.104,-0.154 0.03,-0.056 0.055,-0.11 0.075,-0.172 0.021,-0.066 0.033,-0.132 0.04,-0.201 0.004,-0.036 0.021,-0.066 0.021,-0.102 0,-0.027 -0.014,-0.051 -0.016,-0.078z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M21.581,16l-2.899,8.117 -5.929,-6.775c-0.364,-0.415 -0.996,-0.459 -1.411,-0.094 -0.415,0.364 -0.457,0.995 -0.094,1.411l6.664,7.615 -0.854,2.39c-0.185,0.519 0.086,1.092 0.606,1.277 0.111,0.04 0.224,0.059 0.336,0.059 0.411,0 0.796,-0.255 0.942,-0.664L23.705,16h-2.124z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M7,30c-0.15,0 -0.303,-0.034 -0.446,-0.105 -0.494,-0.247 -0.694,-0.848 -0.447,-1.342l3.062,-6.106C9.186,22.419 11,19.651 11,17c0,-3.242 -2.293,-4.043 -2.316,-4.051 -0.524,-0.175 -0.807,-0.741 -0.632,-1.265 0.174,-0.524 0.739,-0.81 1.265,-0.632C9.467,11.102 13,12.333 13,17c0,3.068 -1.836,6.042 -2.131,6.497l-2.974,5.949C7.72,29.798 7.367,30 7,30z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M14.612,13.663c-0.054,0 -0.11,-0.004 -0.165,-0.014l-6,-1c-0.544,-0.091 -0.913,-0.606 -0.822,-1.151 0.091,-0.544 0.601,-0.913 1.151,-0.822l6,1c0.544,0.091 0.913,0.606 0.822,1.151 -0.082,0.489 -0.506,0.836 -0.986,0.836zM26.383,17c-0.03,0 -0.059,-0.002 -0.089,-0.006l-5.672,-0.708c-0.372,-0.046 -0.644,-0.374 -0.62,-0.748 0.023,-0.374 0.333,-0.665 0.707,-0.665 0.041,0 4.067,-0.018 5.989,-1.299 0.25,-0.167 0.582,-0.157 0.824,0.026 0.239,0.185 0.337,0.501 0.241,0.788l-0.709,2.127c-0.096,0.293 -0.369,0.485 -0.671,0.485z"
android:fillColor="#292F33"/>
<path
android:pathData="M20,29c0,1.104 -0.895,2 -2,2 -1.104,0 -2,-0.896 -2,-2s0.896,-2 2,-2c1.105,0 2,0.896 2,2z"
android:fillColor="#66757F"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M35,26c0,2.209 -1.791,4 -4,4H5c-2.209,0 -4,-1.791 -4,-4V6.313C1,4.104 6.791,0 9,0h20.625C32.719,0 35,2.312 35,5.375V26z"
android:fillColor="#A0041E"/>
<path
android:pathData="M33,30c0,2.209 -1.791,4 -4,4H7c-2.209,0 -4,-1.791 -4,-4V6c0,-4.119 -0.021,-4 5,-4h21c2.209,0 4,1.791 4,4v24z"
android:fillColor="#CCD6DD"/>
<path
android:pathData="M31,31c0,1.657 -1.343,3 -3,3H4c-1.657,0 -3,-1.343 -3,-3V7c0,-1.657 1.343,-3 3,-3h24c1.657,0 3,1.343 3,3v24z"
android:fillColor="#E1E8ED"/>
<path
android:pathData="M31,32c0,2.209 -1.791,4 -4,4H6c-2.209,0 -4,-1.791 -4,-4V10c0,-2.209 1.791,-4 4,-4h21c2.209,0 4,1.791 4,4v22z"
android:fillColor="#BE1931"/>
<path
android:pathData="M29,32c0,2.209 -1.791,4 -4,4H6c-2.209,0 -4,-1.791 -4,-4V12c0,-2.209 1.791,-4 4,-4h19.335C27.544,8 29,9.456 29,11.665V32z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M6,6C4.312,6 4.269,4.078 5,3.25 5.832,2.309 7.125,2 9.438,2H11V0H8.281C4.312,0 1,2.5 1,5.375V32c0,2.209 1.791,4 4,4h2V6H6z"
android:fillColor="#A0041E"/>
</vector>

View File

@ -0,0 +1,39 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M20.004,20.243c-0.426,0 -0.858,0.01 -1.294,0.031 -0.436,1.268 -0.468,2.747 0,5.097 0.328,1.646 2.659,6.299 4.584,7.933 0.683,0.58 1.638,0.884 2.69,0.884 2.144,0 4.691,-1.265 6.157,-4.034 3.001,-5.671 -3.474,-9.911 -12.137,-9.911z"
android:fillColor="#1C6399"/>
<path
android:pathData="M33.666,1.973c-0.204,0 -0.425,0.021 -0.663,0.066 -3.182,0.601 -9.302,5.126 -14.287,11.771 0,0 -0.789,5.16 -0.789,6.194 0,0.336 1.264,0.5 3.058,0.5 3.717,0 9.709,-0.705 11.424,-2.041 1.898,-1.479 3.65,-9.804 3.488,-14.079 -0.046,-1.175 -0.662,-2.411 -2.231,-2.411z"
android:fillColor="#1C6399"/>
<path
android:pathData="M27.098,13.936l6.629,-0.436s-1.055,3.619 -3.102,4.656 -7.719,1.5 -7.719,1.5 2.33,-4.261 3.286,-5.29c0.237,-0.256 0.559,-0.408 0.906,-0.43zM27.618,11.984l7.526,-8.151s0.002,5.365 -1.206,8.635c0,0 -5.383,0.379 -5.914,0.391 -0.703,0.016 -0.969,-0.265 -0.406,-0.875zM21.55,19.656l5.5,-8.547c0.188,-0.22 0.253,-0.52 0.171,-0.798l-0.968,-3.233 -6.722,6.609 -0.844,6.031 2.863,-0.062zM27.862,8.88c0.172,0.406 0.516,0.5 0.938,0.125s6.074,-6.094 6,-6.218c0,0 -2.832,-1.194 -7.8,3.463 0,0 0.69,2.224 0.862,2.63zM18.937,20.979l5.373,5.228c0.203,0.178 0.255,0.473 0.125,0.709L22.06,31.25s-4.187,-5.479 -3.123,-10.271zM26.219,27.28l5.549,0.741s-1.058,3.845 -3.394,4.854c-3.906,1.688 -5.312,-0.625 -5.312,-0.625l2.352,-4.562c0.151,-0.298 0.477,-0.463 0.805,-0.408zM20.269,20.854l5.375,4.958c0.077,0.066 0.169,0.11 0.269,0.129l6.119,0.903s-1.219,-3.031 -4.429,-4.531c-3.71,-1.733 -7.334,-1.459 -7.334,-1.459z"
android:fillColor="#55ACEE"/>
<path
android:pathData="M20.004,20.243c-0.426,0 -0.858,0.01 -1.294,0.031 -0.436,1.268 -0.468,2.747 0,5.097 0.328,1.646 2.659,6.299 4.584,7.933 0.683,0.58 1.638,0.884 2.69,0.884 2.144,0 4.691,-1.265 6.157,-4.034 3.001,-5.671 -3.474,-9.911 -12.137,-9.911zM30.541,29.569c-1.316,2.486 -3.05,3.473 -4.558,3.473 -0.767,0 -1.704,-0.313 -2.15,-0.691 -1.695,-1.439 -3.437,-4.58 -4.25,-7.224 -0.465,-1.513 -0.354,-4.022 -0.354,-4.022l0.667,-0.021c5.168,0 9.249,2.058 10.726,4.512 0.714,1.186 0.687,2.523 -0.081,3.973z"
android:fillColor="#292F33"/>
<path
android:pathData="M33.666,3.223c0.231,0 0.935,0 0.981,1.208 0.102,2.681 -0.594,6.061 -1.397,8.882 -0.541,1.901 -1.586,3.292 -2.094,3.687 -0.56,0.436 -1.863,1.238 -3.719,1.563 -2.03,0.355 -4.207,0.833 -6.456,0.833 -0.827,0 -1.433,0.019 -1.794,-0.021 0.131,-1.218 0.489,-3.551 0.717,-5.064 3.768,-4.94 9.711,-10.361 13.331,-11.044 0.155,-0.029 0.3,-0.044 0.431,-0.044m0,-1.25c-0.204,0 -0.425,0.021 -0.663,0.066 -3.182,0.601 -9.302,5.126 -14.287,11.771 0,0 -0.789,5.16 -0.789,6.194 0,0.336 1.264,0.5 3.058,0.5 3.717,0 9.709,-0.705 11.424,-2.041 1.898,-1.479 3.65,-9.804 3.488,-14.079 -0.046,-1.175 -0.662,-2.411 -2.231,-2.411z"
android:fillColor="#292F33"/>
<path
android:pathData="M3.902,30.154c1.466,2.769 4.012,4.034 6.157,4.034 1.052,0 2.007,-0.304 2.69,-0.884 1.925,-1.633 4.256,-6.286 4.584,-7.933 0.468,-2.35 0.436,-3.828 0,-5.097 -0.436,-0.021 -0.868,-0.031 -1.294,-0.031 -8.665,0 -15.139,4.24 -12.137,9.911z"
android:fillColor="#1C6399"/>
<path
android:pathData="M2.376,1.973C0.807,1.973 0.19,3.209 0.146,4.383c-0.162,4.275 1.59,12.601 3.488,14.079 1.715,1.336 7.706,2.041 11.424,2.041 1.794,0 3.058,-0.164 3.058,-0.5 0,-1.033 -0.789,-6.194 -0.789,-6.194C12.341,7.165 6.22,2.64 3.039,2.039c-0.238,-0.045 -0.459,-0.066 -0.663,-0.066z"
android:fillColor="#1C6399"/>
<path
android:pathData="M8.943,13.936L2.315,13.5s1.055,3.619 3.102,4.656 7.719,1.5 7.719,1.5 -2.33,-4.261 -3.286,-5.29c-0.237,-0.256 -0.559,-0.408 -0.907,-0.43zM8.424,11.984L0.898,3.833s-0.002,5.365 1.206,8.635c0,0 5.383,0.379 5.914,0.391 0.703,0.016 0.969,-0.265 0.406,-0.875zM14.492,19.656l-5.5,-8.547c-0.188,-0.22 -0.253,-0.52 -0.171,-0.798l0.968,-3.233 6.722,6.609 0.844,6.031 -2.863,-0.062zM8.179,8.88c-0.172,0.406 -0.516,0.5 -0.938,0.125s-6.074,-6.094 -6,-6.218c0,0 2.832,-1.194 7.8,3.463 0.001,0 -0.69,2.224 -0.862,2.63zM17.105,20.979l-5.373,5.228c-0.203,0.178 -0.255,0.473 -0.125,0.709l2.375,4.333c-0.001,0.001 4.187,-5.478 3.123,-10.27zM9.822,27.28l-5.549,0.741s1.058,3.845 3.394,4.854c3.906,1.688 5.312,-0.625 5.312,-0.625l-2.352,-4.562c-0.15,-0.298 -0.476,-0.463 -0.805,-0.408zM15.773,20.854l-5.375,4.958c-0.077,0.066 -0.169,0.11 -0.269,0.129l-6.119,0.903s1.219,-3.031 4.429,-4.531c3.709,-1.733 7.334,-1.459 7.334,-1.459z"
android:fillColor="#55ACEE"/>
<path
android:pathData="M3.902,30.154c1.466,2.769 4.012,4.034 6.157,4.034 1.052,0 2.007,-0.304 2.69,-0.884 1.925,-1.633 4.256,-6.286 4.584,-7.933 0.468,-2.35 0.436,-3.828 0,-5.097 -0.436,-0.021 -0.868,-0.031 -1.294,-0.031 -8.665,0 -15.139,4.24 -12.137,9.911zM5.42,25.595c1.477,-2.454 5.558,-4.512 10.726,-4.512l0.667,0.021s0.111,2.51 -0.354,4.022c-0.813,2.644 -2.555,5.785 -4.25,7.224 -0.446,0.379 -1.383,0.691 -2.15,0.691 -1.508,0 -3.242,-0.986 -4.558,-3.473 -0.768,-1.449 -0.795,-2.786 -0.081,-3.973z"
android:fillColor="#292F33"/>
<path
android:pathData="M2.376,3.223c0.131,0 0.276,0.015 0.431,0.044 3.619,0.683 9.563,6.104 13.331,11.044 0.228,1.513 0.586,3.846 0.717,5.064 -0.361,0.04 -0.967,0.021 -1.794,0.021 -2.249,0 -4.426,-0.478 -6.456,-0.833 -1.856,-0.325 -3.159,-1.127 -3.719,-1.563 -0.508,-0.396 -1.553,-1.786 -2.094,-3.687 -0.803,-2.821 -1.499,-6.201 -1.397,-8.882 0.046,-1.208 0.749,-1.208 0.981,-1.208m0,-1.25C0.807,1.973 0.19,3.209 0.146,4.383c-0.162,4.275 1.59,12.601 3.488,14.079 1.715,1.336 7.706,2.041 11.424,2.041 1.794,0 3.058,-0.164 3.058,-0.5 0,-1.033 -0.789,-6.194 -0.789,-6.194C12.341,7.165 6.22,2.64 3.039,2.039c-0.238,-0.045 -0.459,-0.066 -0.663,-0.066z"
android:fillColor="#292F33"/>
<path
android:pathData="M21.887,4.762c-0.25,-0.138 -0.563,-0.047 -0.701,0.203l-2.74,4.98c-0.018,0.033 -0.022,0.068 -0.032,0.102 -0.127,-0.007 -0.244,-0.018 -0.393,-0.018 -0.148,0 -0.266,0.01 -0.392,0.018 -0.01,-0.034 -0.014,-0.069 -0.032,-0.102l-2.74,-4.98c-0.138,-0.25 -0.452,-0.341 -0.702,-0.203 -0.25,0.137 -0.341,0.451 -0.203,0.701l2.655,4.826c-1.179,0.784 1.15,3.438 0.381,9.204 -1.033,7.75 1.033,9.817 1.033,9.817s2.067,-2.067 1.033,-9.817c-0.769,-5.766 1.56,-8.42 0.381,-9.204l2.656,-4.826c0.137,-0.25 0.046,-0.564 -0.204,-0.701z"
android:fillColor="#292F33"/>
</vector>

View File

@ -0,0 +1,51 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M30,4c-2.209,0 -4,1.791 -4,4v9.125c0,1.086 -0.887,1.96 -2,2.448V6c0,-3.313 -2.687,-6 -6,-6s-6,2.687 -6,6v17.629c-1.122,-0.475 -2,-1.371 -2,-2.504V16c0,-2.209 -1.791,-4 -4,-4s-4,1.791 -4,4v7c0,2.209 1.75,3.875 3.375,4.812 1.244,0.718 4.731,1.6 6.625,1.651V33c0,3.313 12,3.313 12,0v-7.549c1.981,-0.119 5.291,-0.953 6.479,-1.639C32.104,22.875 34,21.209 34,19V8c0,-2.209 -1.791,-4 -4,-4z"
android:fillColor="#77B255"/>
<path
android:pathData="M12,6m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#3E721D"/>
<path
android:pathData="M23,3m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#3E721D"/>
<path
android:pathData="M21,9m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#3E721D"/>
<path
android:pathData="M14,16m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#3E721D"/>
<path
android:pathData="M20,20m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#3E721D"/>
<path
android:pathData="M13,26m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#3E721D"/>
<path
android:pathData="M5,27m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#3E721D"/>
<path
android:pathData="M9,20m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#3E721D"/>
<path
android:pathData="M2,18m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#3E721D"/>
<path
android:pathData="M34,8m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#3E721D"/>
<path
android:pathData="M28,11m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#3E721D"/>
<path
android:pathData="M32,16m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#3E721D"/>
<path
android:pathData="M29,24m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#3E721D"/>
<path
android:pathData="M22,30m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#3E721D"/>
</vector>

View File

@ -0,0 +1,42 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M0,26a18,10 0,1 0,36 0a18,10 0,1 0,-36 0z"
android:fillColor="#8899A6"/>
<path
android:pathData="M0,24.25a18,10 0,1 0,36 0a18,10 0,1 0,-36 0z"
android:fillColor="#CCD6DD"/>
<path
android:pathData="M32.675,23.685c0,4.26 -6.57,7.712 -14.675,7.712S3.325,27.945 3.325,23.685c0,-4.258 6.57,-7.711 14.675,-7.711 8.104,0 14.675,3.453 14.675,7.711z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M32.233,22.543c0,9.854 -28.466,9.854 -28.466,0v-8.759h28.466v8.759z"
android:fillColor="#F4ABBA"/>
<path
android:pathData="M17.984,18.166c-8.984,0 -14.218,-4.132 -14.218,-4.132s-0.016,0.924 -0.016,1.685c0,0 0.032,4.898 2.572,4.898 2.459,0 2.28,2.348 3.834,2.591 1.541,0.241 1.712,-0.938 3.625,-0.938s2.25,2.106 4.203,2.106c2.289,0 2.477,-2.106 4.389,-2.106s2.132,1.224 3.386,0.885c1.507,-0.408 0.814,-2.537 3.887,-2.537 2.54,0 2.603,-4.648 2.603,-4.648 0,-0.76 -0.017,-1.935 -0.017,-1.935s-5.263,4.131 -14.248,4.131z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M32.675,12.737c0,4.259 -6.57,7.712 -14.675,7.712S3.325,16.996 3.325,12.737 9.895,5.025 18,5.025c8.104,0 14.675,3.453 14.675,7.712z"
android:fillColor="#EA596E"/>
<path
android:pathData="M25.664,13.784c-0.605,0 -1.095,-0.49 -1.095,-1.095V5.025c0,-0.605 0.49,-1.095 1.095,-1.095s1.095,0.49 1.095,1.095v7.664c0,0.605 -0.49,1.095 -1.095,1.095z"
android:fillColor="#FFF8E8"/>
<path
android:pathData="M25.664,6.667c-1.162,0 -2.076,-0.532 -2.445,-1.423 -0.32,-0.773 -0.479,-2.45 2.058,-4.986 0.214,-0.214 0.56,-0.214 0.774,0 2.537,2.537 2.378,4.213 2.058,4.986 -0.369,0.891 -1.283,1.423 -2.445,1.423z"
android:fillColor="#FAAA35"/>
<path
android:pathData="M18,17.068c-0.605,0 -1.095,-0.49 -1.095,-1.095V8.31c0,-0.605 0.49,-1.095 1.095,-1.095s1.095,0.49 1.095,1.095v7.664c0,0.604 -0.49,1.094 -1.095,1.094z"
android:fillColor="#FFF8E8"/>
<path
android:pathData="M18,9.952c-1.162,0 -2.076,-0.532 -2.445,-1.423 -0.321,-0.773 -0.479,-2.45 2.058,-4.986 0.214,-0.214 0.56,-0.214 0.774,0 2.537,2.537 2.378,4.213 2.058,4.986 -0.369,0.891 -1.283,1.423 -2.445,1.423z"
android:fillColor="#FAAA35"/>
<path
android:pathData="M10.336,13.784c-0.605,0 -1.095,-0.49 -1.095,-1.095V5.025c0,-0.605 0.49,-1.095 1.095,-1.095s1.095,0.49 1.095,1.095v7.664c0,0.605 -0.49,1.095 -1.095,1.095z"
android:fillColor="#FFF8E8"/>
<path
android:pathData="M10.336,6.667c-1.162,0 -2.076,-0.532 -2.445,-1.423 -0.321,-0.773 -0.479,-2.45 2.058,-4.986 0.214,-0.214 0.56,-0.214 0.774,0 2.537,2.537 2.378,4.213 2.058,4.986 -0.369,0.891 -1.283,1.423 -2.445,1.423z"
android:fillColor="#FAAA35"/>
</vector>

View File

@ -0,0 +1,36 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M32.348,13.999s3.445,-8.812 1.651,-11.998c-0.604,-1.073 -8,1.998 -10.723,5.442 0,0 -2.586,-0.86 -5.276,-0.86s-5.276,0.86 -5.276,0.86C10.001,3.999 2.605,0.928 2.001,2.001 0.207,5.187 3.652,13.999 3.652,13.999c-0.897,1.722 -1.233,4.345 -1.555,7.16 -0.354,3.086 0.35,5.546 0.658,6.089 0.35,0.617 2.123,2.605 4.484,4.306 3.587,2.583 8.967,3.445 10.761,3.445s7.174,-0.861 10.761,-3.445c2.361,-1.701 4.134,-3.689 4.484,-4.306 0.308,-0.543 1.012,-3.003 0.659,-6.089 -0.324,-2.814 -0.659,-5.438 -1.556,-7.16z"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M2.359,2.971c0.2,-0.599 5.348,2.173 6.518,5.404 0,0 -3.808,2.624 -4.528,4.624 0,0 -2.99,-7.028 -1.99,-10.028z"
android:fillColor="#F18F26"/>
<path
android:pathData="M5.98,7.261c0,-1.414 5.457,2.733 4.457,3.733s-1.255,0.72 -2.255,1.72S5.98,8.261 5.98,7.261z"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M33.641,2.971c-0.2,-0.599 -5.348,2.173 -6.518,5.404 0,0 3.808,2.624 4.528,4.624 0,0 2.99,-7.028 1.99,-10.028z"
android:fillColor="#F18F26"/>
<path
android:pathData="M30.02,7.261c0,-1.414 -5.457,2.733 -4.457,3.733s1.255,0.72 2.255,1.72 2.202,-4.453 2.202,-5.453z"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M14.001,20.001c0,1.105 -0.896,1.999 -2,1.999s-2,-0.894 -2,-1.999c0,-1.104 0.896,-1.999 2,-1.999s2,0.896 2,1.999zM25.999,20.001c0,1.105 -0.896,1.999 -2,1.999 -1.105,0 -2,-0.894 -2,-1.999 0,-1.104 0.895,-1.999 2,-1.999s2,0.896 2,1.999z"
android:fillColor="#292F33"/>
<path
android:pathData="M2.201,30.458c-0.148,0 -0.294,-0.065 -0.393,-0.19 -0.171,-0.217 -0.134,-0.531 0.083,-0.702 0.162,-0.127 4.02,-3.12 10.648,-2.605 0.275,0.021 0.481,0.261 0.46,0.536 -0.021,0.275 -0.257,0.501 -0.537,0.46 -6.233,-0.474 -9.915,2.366 -9.951,2.395 -0.093,0.07 -0.202,0.106 -0.31,0.106zM11.069,25.795c-0.049,0 -0.1,-0.007 -0.149,-0.022 -4.79,-1.497 -8.737,-0.347 -8.777,-0.336 -0.265,0.081 -0.543,-0.07 -0.623,-0.335 -0.079,-0.265 0.071,-0.543 0.335,-0.622 0.173,-0.052 4.286,-1.247 9.362,0.338 0.264,0.083 0.411,0.363 0.328,0.627 -0.066,0.213 -0.263,0.35 -0.476,0.35zM33.799,30.458c0.148,0 0.294,-0.065 0.393,-0.19 0.171,-0.217 0.134,-0.531 -0.083,-0.702 -0.162,-0.127 -4.02,-3.12 -10.648,-2.605 -0.275,0.021 -0.481,0.261 -0.46,0.536 0.022,0.275 0.257,0.501 0.537,0.46 6.233,-0.474 9.915,2.366 9.951,2.395 0.093,0.07 0.202,0.106 0.31,0.106zM24.931,25.795c0.049,0 0.1,-0.007 0.149,-0.022 4.79,-1.497 8.737,-0.347 8.777,-0.336 0.265,0.081 0.543,-0.07 0.623,-0.335 0.079,-0.265 -0.071,-0.543 -0.335,-0.622 -0.173,-0.052 -4.286,-1.247 -9.362,0.338 -0.264,0.083 -0.411,0.363 -0.328,0.627 0.066,0.213 0.263,0.35 0.476,0.35z"
android:fillColor="#FEE7B8"/>
<path
android:pathData="M24.736,30.898c-0.097,-0.258 -0.384,-0.392 -0.643,-0.294 -0.552,0.206 -1.076,0.311 -1.559,0.311 -1.152,0 -1.561,-0.306 -2.033,-0.659 -0.451,-0.338 -0.956,-0.715 -1.99,-0.803v-2.339c0,-0.276 -0.224,-0.5 -0.5,-0.5s-0.5,0.224 -0.5,0.5v2.373c-0.81,0.115 -1.346,0.439 -1.816,0.743 -0.568,0.367 -1.059,0.685 -2.083,0.685 -0.482,0 -1.006,-0.104 -1.558,-0.311 -0.258,-0.095 -0.547,0.035 -0.643,0.294 -0.097,0.259 0.035,0.547 0.293,0.644 0.664,0.247 1.306,0.373 1.907,0.373 1.319,0 2.014,-0.449 2.627,-0.845 0.524,-0.339 0.98,-0.631 1.848,-0.635 0.992,0.008 1.358,0.278 1.815,0.621 0.538,0.403 1.147,0.859 2.633,0.859 0.601,0 1.244,-0.126 1.908,-0.373 0.259,-0.097 0.391,-0.385 0.294,-0.644z"
android:fillColor="#67757F"/>
<path
android:pathData="M19.4,24.807h-2.8c-0.64,0 -1.163,0.523 -1.163,1.163 0,0.639 0.523,1.163 1.163,1.163h0.237v0.345c0,0.639 0.523,1.163 1.163,1.163s1.163,-0.523 1.163,-1.163v-0.345h0.237c0.639,0 1.163,-0.523 1.163,-1.163s-0.524,-1.163 -1.163,-1.163z"
android:fillColor="#E75A70"/>
<path
android:pathData="M18.022,17.154c-0.276,0 -0.5,-0.224 -0.5,-0.5L17.522,8.37c0,-0.276 0.224,-0.5 0.5,-0.5s0.5,0.224 0.5,0.5v8.284c0,0.277 -0.223,0.5 -0.5,0.5zM21,15.572c-0.276,0 -0.5,-0.224 -0.5,-0.5 0,-2.882 1.232,-5.21 1.285,-5.308 0.13,-0.244 0.435,-0.334 0.677,-0.204 0.243,0.13 0.334,0.433 0.204,0.677 -0.012,0.021 -1.166,2.213 -1.166,4.835 0,0.276 -0.224,0.5 -0.5,0.5zM15,15.572c-0.276,0 -0.5,-0.224 -0.5,-0.5 0,-2.623 -1.155,-4.814 -1.167,-4.835 -0.13,-0.244 -0.038,-0.546 0.205,-0.677 0.242,-0.131 0.545,-0.039 0.676,0.204 0.053,0.098 1.285,2.426 1.285,5.308 0.001,0.276 -0.223,0.5 -0.499,0.5z"
android:fillColor="#F18F26"/>
</vector>

View File

@ -0,0 +1,27 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M20,6.042c0,1.112 -0.903,2.014 -2,2.014s-2,-0.902 -2,-2.014V2.014C16,0.901 16.903,0 18,0s2,0.901 2,2.014v4.028z"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M9.18,36c-0.224,0 -0.452,-0.052 -0.666,-0.159 -0.736,-0.374 -1.035,-1.28 -0.667,-2.027l8.94,-18.127c0.252,-0.512 0.768,-0.835 1.333,-0.835s1.081,0.323 1.333,0.835l8.941,18.127c0.368,0.747 0.07,1.653 -0.666,2.027 -0.736,0.372 -1.631,0.07 -1.999,-0.676L18.121,19.74l-7.607,15.425c-0.262,0.529 -0.788,0.835 -1.334,0.835z"
android:fillColor="#FFAC33"/>
<path
android:pathData="M18.121,20.392c-0.263,0 -0.516,-0.106 -0.702,-0.295L3.512,5.998c-0.388,-0.394 -0.388,-1.031 0,-1.424s1.017,-0.393 1.404,0L18.121,17.96 31.324,4.573c0.389,-0.393 1.017,-0.393 1.405,0 0.388,0.394 0.388,1.031 0,1.424l-13.905,14.1c-0.187,0.188 -0.439,0.295 -0.703,0.295z"
android:fillColor="#58595B"/>
<path
android:pathData="M34.015,19.385c0,8.898 -7.115,16.111 -15.894,16.111 -8.777,0 -15.893,-7.213 -15.893,-16.111 0,-8.9 7.116,-16.113 15.893,-16.113 8.778,-0.001 15.894,7.213 15.894,16.113z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M30.041,19.385c0,6.674 -5.335,12.084 -11.92,12.084 -6.583,0 -11.919,-5.41 -11.919,-12.084C6.202,12.71 11.538,7.3 18.121,7.3c6.585,-0.001 11.92,5.41 11.92,12.085z"
android:fillColor="#E6E7E8"/>
<path
android:pathData="M30.04,1.257c-1.646,0 -3.135,0.676 -4.214,1.77l8.429,8.544C35.333,10.478 36,8.968 36,7.299c0,-3.336 -2.669,-6.042 -5.96,-6.042zM5.96,1.257c1.645,0 3.135,0.676 4.214,1.77l-8.429,8.544C0.667,10.478 0,8.968 0,7.299c0,-3.336 2.668,-6.042 5.96,-6.042z"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M23,20h-5c-0.552,0 -1,-0.447 -1,-1v-9c0,-0.552 0.448,-1 1,-1s1,0.448 1,1v8h4c0.553,0 1,0.448 1,1 0,0.553 -0.447,1 -1,1z"
android:fillColor="#414042"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M27,8c-0.701,0 -1.377,0.106 -2.015,0.298 0.005,-0.1 0.015,-0.197 0.015,-0.298 0,-3.313 -2.687,-6 -6,-6 -2.769,0 -5.093,1.878 -5.785,4.427C12.529,6.154 11.783,6 11,6c-3.314,0 -6,2.686 -6,6 0,3.312 2.686,6 6,6 2.769,0 5.093,-1.878 5.785,-4.428 0.686,0.273 1.432,0.428 2.215,0.428 0.375,0 0.74,-0.039 1.096,-0.104 -0.058,0.36 -0.096,0.727 -0.096,1.104 0,3.865 3.135,7 7,7s7,-3.135 7,-7c0,-3.866 -3.135,-7 -7,-7z"
android:fillColor="#CCD6DD"/>
<path
android:pathData="M31,22c-0.467,0 -0.91,0.085 -1.339,0.204 0.216,-0.526 0.339,-1.1 0.339,-1.704 0,-2.485 -2.015,-4.5 -4.5,-4.5 -1.019,0 -1.947,0.351 -2.701,0.921C22.093,14.096 19.544,12 16.5,12c-2.838,0 -5.245,1.822 -6.131,4.357C9.621,16.125 8.825,16 8,16c-4.418,0 -8,3.582 -8,8 0,4.419 3.582,8 8,8h23c2.762,0 5,-2.238 5,-5s-2.238,-5 -5,-5z"
android:fillColor="#E1E8ED"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M15.373,1.022C13.71,2.686 8.718,9.34 11.214,15.164c2.495,5.823 5.909,2.239 7.486,-2.495 0.832,-2.496 0.832,-5.824 -0.831,-10.815 -0.832,-2.496 -2.496,-0.832 -2.496,-0.832zM34.677,20.326c-1.663,1.663 -8.319,6.655 -14.142,4.159 -5.824,-2.496 -2.241,-5.909 2.495,-7.486 2.497,-0.832 5.823,-0.833 10.814,0.832 2.496,0.831 0.833,2.495 0.833,2.495z"
android:fillColor="#5C913B"/>
<path
android:pathData="M32.314,6.317s-0.145,-1.727 -0.781,-2.253c-0.435,-0.546 -2.018,-0.546 -2.018,-0.546 -1.664,0 -20.798,2.496 -24.125,19.133 -0.595,2.973 4.627,8.241 7.638,7.638C29.667,26.963 32.313,7.98 32.314,6.317z"
android:fillColor="#F4900C"/>
<path
android:pathData="M24.769,8.816l-1.617,-1.617c-0.446,-0.446 -1.172,-0.446 -1.618,0 -0.446,0.447 -0.446,1.171 0,1.617l1.618,1.618c0.445,0.446 1.171,0.446 1.617,0 0.446,-0.446 0.446,-1.17 0,-1.618zM15.064,10.435c0.446,0.446 1.171,0.446 1.617,0 0.447,-0.447 0.447,-1.171 0,-1.618l-0.77,-0.77c-0.654,0.398 -1.302,0.829 -1.938,1.297l1.091,1.091zM17.49,8.008c0.447,0.447 1.17,0.447 1.617,0 0.446,-0.446 0.446,-1.17 0,-1.617l-0.025,-0.025c-0.711,0.325 -1.431,0.688 -2.149,1.086l0.557,0.556zM12.637,12.861c0.447,0.446 1.171,0.446 1.619,0 0.446,-0.447 0.446,-1.171 0,-1.618l-1.198,-1.196c-0.586,0.474 -1.156,0.985 -1.707,1.528l1.286,1.286zM23.96,4.773c-0.447,0.447 -0.447,1.17 0,1.617l1.617,1.617c0.447,0.447 1.171,0.447 1.617,0 0.446,-0.446 0.446,-1.17 0,-1.617l-1.617,-1.617c-0.447,-0.446 -1.17,-0.446 -1.617,0zM26.368,3.977c0.006,0.007 0.008,0.016 0.015,0.023L28,5.617c0.447,0.447 1.171,0.447 1.617,0 0.446,-0.446 0.446,-1.17 0,-1.617l-0.462,-0.462c-0.54,0.044 -1.516,0.172 -2.787,0.439zM22.343,12.861c0.446,-0.447 0.446,-1.171 0,-1.618l-1.618,-1.617c-0.446,-0.447 -1.171,-0.447 -1.617,0 -0.447,0.446 -0.447,1.17 0,1.617l1.617,1.618c0.446,0.446 1.171,0.446 1.618,0zM19.915,15.287c0.447,-0.447 0.447,-1.171 0,-1.618l-1.617,-1.617c-0.446,-0.447 -1.17,-0.447 -1.617,0 -0.446,0.447 -0.446,1.171 0,1.617l1.617,1.618c0.447,0.446 1.172,0.446 1.617,0zM15.064,20.139c0.447,-0.447 0.446,-1.17 0,-1.618l-1.618,-1.617c-0.446,-0.446 -1.169,-0.447 -1.617,0 -0.446,0.447 -0.446,1.171 0,1.617l1.617,1.618c0.447,0.446 1.171,0.446 1.618,0zM14.256,14.478c-0.447,0.446 -0.447,1.171 0,1.618l1.617,1.617c0.447,0.446 1.17,0.446 1.618,0 0.447,-0.447 0.447,-1.171 0,-1.617l-1.618,-1.618c-0.447,-0.447 -1.171,-0.447 -1.617,0z"
android:fillColor="#F7B82D"/>
<path
android:pathData="M27.866,23.574c-7.125,-2.374 -15.097,0.652 -19.418,3.576 2.925,-4.321 5.95,-12.294 3.576,-19.418 -0.934,-2.8 -5.602,-5.601 -8.402,-2.801 -0.934,0.934 -1.867,1.868 0,1.868s4.667,2.8 3.735,5.601c-0.835,2.505 -6.889,8.742 -4.153,15.375 -0.27,0.115 -0.523,0.279 -0.744,0.499l-0.715,0.714c-0.919,0.919 -0.919,2.409 0,3.329l0.716,0.716c0.919,0.92 2.409,0.92 3.328,0l0.715,-0.716c0.123,-0.123 0.227,-0.258 0.316,-0.398 6.999,3.84 13.747,-2.799 16.379,-3.677 2.8,-0.933 5.6,1.868 5.6,3.734 0,1.867 0.934,0.934 1.867,0 2.801,-2.8 -0.001,-7.47 -2.8,-8.402z"
android:fillColor="#77B255"/>
</vector>

View File

@ -0,0 +1,45 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M15,27v6s0,3 3,3 3,-3 3,-3v-6h-6z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M15,33l0.001,0.037c1.041,-0.035 2.016,-0.274 2.632,-1.286 0.171,-0.281 0.563,-0.281 0.735,0 0.616,1.011 1.591,1.251 2.632,1.286V27h-6v6z"
android:fillColor="#BE1931"/>
<path
android:pathData="M31.954,21.619c0,6.276 -5,6.276 -5,6.276h-18s-5,0 -5,-6.276c0,-6.724 5,-18.619 14,-18.619s14,12.895 14,18.619z"
android:fillColor="#D99E82"/>
<path
android:pathData="M18,20c-7,0 -10,3.527 -10,6.395 0,3.037 2.462,5.5 5.5,5.5 1.605,0 3.042,-0.664 4.049,-2.767 0.185,-0.386 0.716,-0.386 0.901,0 1.007,2.103 2.445,2.767 4.049,2.767 3.038,0 5.5,-2.463 5.5,-5.5C28,23.527 25,20 18,20z"
android:fillColor="#F4C7B5"/>
<path
android:pathData="M15,22.895c-1,1 2,4 3,4s4,-3 3,-4 -5,-1 -6,0zM13,19c-1.1,0 -2,-0.9 -2,-2v-2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2v2c0,1.1 -0.9,2 -2,2zM23,19c-1.1,0 -2,-0.9 -2,-2v-2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2v2c0,1.1 -0.9,2 -2,2z"
android:fillColor="#292F33"/>
<path
android:pathData="M15,3.608C13.941,2.199 11.681,0.881 2.828,4.2 -1.316,5.754 0.708,17.804 3.935,18.585c1.106,0 4.426,0 4.426,-8.852 0,-0.22 -0.002,-0.423 -0.005,-0.625C10.35,6.298 12.5,4.857 15,3.608zM33.172,4.2C24.319,0.881 22.059,2.199 21,3.608c2.5,1.25 4.65,2.691 6.644,5.501 -0.003,0.201 -0.005,0.404 -0.005,0.625 0,8.852 3.319,8.852 4.426,8.852 3.227,-0.782 5.251,-12.832 1.107,-14.386z"
android:fillColor="#662113"/>
<path
android:pathData="M23.5,25.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0"
android:fillColor="#D99E82"/>
<path
android:pathData="M11.5,25.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0"
android:fillColor="#D99E82"/>
<path
android:pathData="M25.5,27.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0"
android:fillColor="#D99E82"/>
<path
android:pathData="M10.5,27.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0"
android:fillColor="#D99E82"/>
<path
android:pathData="M23,28m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#D99E82"/>
<path
android:pathData="M13,28m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#D99E82"/>
<path
android:pathData="M9.883,7.232c-0.259,-0.673 -0.634,-1.397 -1.176,-1.939 -0.391,-0.391 -1.023,-0.391 -1.414,0s-0.391,1.023 0,1.414c0.57,0.57 1.066,1.934 1.068,2.346 0.145,-0.404 0.839,-1.15 1.522,-1.821zM26.1,7.232c0.259,-0.672 0.634,-1.397 1.176,-1.939 0.391,-0.391 1.023,-0.391 1.414,0s0.391,1.023 0,1.414c-0.57,0.57 -1.066,1.934 -1.068,2.346 -0.145,-0.404 -0.839,-1.15 -1.522,-1.821z"
android:fillColor="#380F09"/>
</vector>

View File

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M34.453,15.573c-0.864,-7.3 -5.729,-10.447 -13.93,-10.447 -0.391,0 -0.763,0.017 -1.139,0.031 -0.013,-0.01 -0.022,-0.021 -0.035,-0.031C14.655,1.605 4.091,2.779 1.745,6.3c-3.255,4.883 -1.174,22.3 0,24.646 1.173,2.35 4.694,3.521 5.868,2.35 1.174,-1.176 0,-1.176 -1.173,-3.521 -0.85,-1.701 -0.466,-5.859 0.255,-8.471 0.028,0.168 0.068,0.322 0.1,0.486 0.39,2.871 1.993,7.412 1.993,9.744 0,3.564 2.102,4.107 4.694,4.107 2.593,0 4.695,-0.543 4.695,-4.107 0,-0.24 -0.008,-0.463 -0.012,-0.695 0.757,0.064 1.535,0.107 2.359,0.107 0.497,0 0.977,-0.016 1.448,-0.039 -0.004,0.209 -0.013,0.41 -0.013,0.627 0,3.564 2.103,4.107 4.694,4.107 2.593,0 4.695,-0.543 4.695,-4.107 0,-1.801 1.192,-4.625 2.039,-6.982 0.159,-0.354 0.291,-0.732 0.42,-1.117 0.118,1.307 0.193,2.706 0.193,4.206 0,0.553 0.447,1 1,1s1,-0.447 1,-1c0,-5.153 -0.771,-9.248 -1.547,-12.068z"
android:fillColor="#99AAB5"/>
<path
android:pathData="M19.35,5.126S23,10.641 20,15.641c-3,5 -7.838,5 -11,5 -2,0 -1,2 0,2 1.414,0 8.395,1.211 12,-6 3,-6 -1.65,-11.515 -1.65,-11.515z"
android:fillColor="#66757F"/>
<path
android:pathData="M6.5,14.141m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"
android:fillColor="#292F33"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M35,19c0,-2.062 -0.367,-4.039 -1.04,-5.868 -0.46,5.389 -3.333,8.157 -6.335,6.868 -2.812,-1.208 -0.917,-5.917 -0.777,-8.164 0.236,-3.809 -0.012,-8.169 -6.931,-11.794 2.875,5.5 0.333,8.917 -2.333,9.125 -2.958,0.231 -5.667,-2.542 -4.667,-7.042 -3.238,2.386 -3.332,6.402 -2.333,9 1.042,2.708 -0.042,4.958 -2.583,5.208 -2.84,0.28 -4.418,-3.041 -2.963,-8.333C2.52,10.965 1,14.805 1,19c0,9.389 7.611,17 17,17s17,-7.611 17,-17z"
android:fillColor="#F4900C"/>
<path
android:pathData="M28.394,23.999c0.148,3.084 -2.561,4.293 -4.019,3.709 -2.106,-0.843 -1.541,-2.291 -2.083,-5.291s-2.625,-5.083 -5.708,-6c2.25,6.333 -1.247,8.667 -3.08,9.084 -1.872,0.426 -3.753,-0.001 -3.968,-4.007C7.352,23.668 6,26.676 6,30c0,0.368 0.023,0.73 0.055,1.09C9.125,34.124 13.342,36 18,36s8.875,-1.876 11.945,-4.91c0.032,-0.36 0.055,-0.722 0.055,-1.09 0,-2.187 -0.584,-4.236 -1.606,-6.001z"
android:fillColor="#FFCC4D"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M32.153,24c0,-1 1.523,-6.212 3.047,-7.735 1.522,-1.523 0,-3.166 -1.523,-3.166 -3.405,0 -9.139,6.901 -9.139,10.901 0,5 5.733,10.424 9.139,10.424 1.523,0 3.046,-1.404 1.523,-2.928C33.677,29.974 32.153,26 32.153,24z"
android:fillColor="#3B88C3"/>
<path
android:pathData="M9.021,14.384c0,-3.046 1.497,-6.093 3.02,-6.093 4.569,0 13.322,4.823 14.845,12.439 1.524,7.616 -17.865,-6.346 -17.865,-6.346zM13.875,32.662c1.523,1.523 4.57,3.047 7.617,3.047 3.046,0 -3.111,-4.189 -1.523,-6.092 2.18,-2.617 -6.094,3.045 -6.094,3.045z"
android:fillColor="#3B88C3"/>
<path
android:fillColor="#FF000000"
android:pathData="M2.071,28.727c0.761,-2.285 0.19,-3.935 -1.143,-5.584 -1.333,-1.651 3.872,-1.904 5.585,0.381s5.713,6.281 2.158,6.22c-3.553,-0.065 -6.6,-1.017 -6.6,-1.017z"/>
<path
android:pathData="M0.168,23.488c0.959,0.874 7.223,4.309 7.165,5.137 -0.058,0.828 -2.279,-0.088 -3.105,-0.279 -1.485,-0.342 -1.905,-0.598 -2.317,-0.526 -0.84,0.321 -0.554,1.201 -0.242,1.704 1.498,2.61 7.286,4.662 12.16,4.662 8.412,0 16.802,-7.615 16.802,-10.662 0,-3.046 -9.345,-10.663 -17.757,-10.663C4.483,12.86 0.18,18.922 0.168,23.488z"
android:fillColor="#55ACEE"/>
<path
android:fillColor="#FF000000"
android:pathData="M7,17c1.104,0 2,0.894 2,2 0,1.105 -0.896,2 -2,2 -1.105,0 -2,-0.896 -2,-2 0,-1.106 0.895,-2 2,-2z"/>
<path
android:pathData="M15.08,29.98c-0.156,0 -0.314,-0.036 -0.462,-0.113 -0.49,-0.256 -0.679,-0.86 -0.423,-1.35 1.585,-3.034 2.218,-5.768 0.154,-9.243 -0.282,-0.475 -0.126,-1.088 0.349,-1.371 0.475,-0.283 1.088,-0.124 1.371,0.349 2.693,4.535 1.46,8.202 -0.102,11.191 -0.178,0.342 -0.527,0.537 -0.887,0.537z"
android:fillColor="#269"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M5,36c-1.104,0 -2,-0.896 -2,-2V3c0,-1.104 0.896,-2 2,-2s2,0.896 2,2v31c0,1.104 -0.896,2 -2,2z"
android:fillColor="#8899A6"/>
<path
android:pathData="M5,1c-1.105,0 -2,0.895 -2,2v31c0,0.276 0.224,0.5 0.5,0.5s0.5,-0.224 0.5,-0.5V4.414C4,3.633 4.633,3 5.414,3H7c0,-1.105 -0.895,-2 -2,-2z"
android:fillColor="#AAB8C2"/>
<path
android:pathData="M5,36c-1.104,0 -2,-0.896 -2,-2V3c0,-1.104 0.896,-2 2,-2s2,0.896 2,2v31c0,1.104 -0.896,2 -2,2z"
android:fillColor="#8899A6"/>
<path
android:pathData="M5,1c-1.105,0 -2,0.895 -2,2v31c0,0.276 0.224,0.5 0.5,0.5s0.5,-0.224 0.5,-0.5V4.414C4,3.633 4.633,3 5.414,3H7c0,-1.105 -0.895,-2 -2,-2z"
android:fillColor="#AAB8C2"/>
<path
android:pathData="M32.396,3.082C30.732,2.363 28.959,2.006 27,1.974l-1.375,0.38L21,3l-1,-0.128c-0.237,0.051 -0.476,0.099 -0.711,0.15 -2.169,0.469 -4.23,0.894 -6.289,0.982L12,5 6,4v19h6l1,2h0.077c2.244,-0.096 4.472,-0.556 6.633,-1.022l0.29,-0.061 0.646,-0.645 5.438,-0.708 0.916,0.41c1.68,0.032 3.193,0.335 4.604,0.944 0.309,0.133 0.665,0.103 0.945,-0.082 0.282,-0.186 0.451,-0.499 0.451,-0.836V4c0,-0.399 -0.237,-0.76 -0.604,-0.918z"
android:fillColor="#31373D"/>
<path
android:pathData="M13,4.004c-0.239,0.01 -0.478,0.035 -0.717,0.035 -1.797,0 -3.396,-0.313 -4.887,-0.957 -0.308,-0.135 -0.665,-0.103 -0.945,0.083C6.169,3.349 6,3.664 6,4v6s3.292,1 7,1L13,4.004zM20,10s-3.75,1 -7,1v7c3,0 7,-1 7,-1v-7zM27,9L27,1.974c-0.096,-0.002 -0.186,-0.013 -0.283,-0.013 -2.267,0 -4.521,0.442 -6.717,0.911L20,10s2.167,-1 7,-1zM6.604,23.918c1.5,0.648 3.09,0.993 4.82,1.082L13,25v-7c-4.167,0 -7,-1 -7,-1v6c0,0.399 0.237,0.76 0.604,0.918zM20,17v6.916c2.313,-0.499 4.511,-0.955 6.717,-0.955 0.097,0 0.187,0.011 0.283,0.013L27,16c-4.5,0 -7,1 -7,1zM27,16c2.676,0 4.82,0.56 6,0.954L33,9.908C31.853,9.527 29.769,9 27,9v7z"
android:fillColor="#E1E8ED"/>
</vector>

View File

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M34.751,22c-3.382,0 -11.9,3.549 -15.751,7.158V17c0,-0.553 -0.447,-1 -1,-1 -0.552,0 -1,0.447 -1,1v12.341C13.247,25.669 4.491,22 1.052,22 0.123,22 11.913,35.992 17,34.599V35c0,0.553 0.448,1 1,1 0.553,0 1,-0.447 1,-1v-0.356C24.188,35.638 35.668,22 34.751,22z"
android:fillColor="#77B255"/>
<path
android:pathData="M25,13.417C25,19.768 23.293,23 18,23s-7,-3.232 -7,-9.583S16,0 18,0s7,7.066 7,13.417z"
android:fillColor="#EA596E"/>
<path
android:pathData="M22.795,2c-0.48,0 -4.106,14.271 -4.803,19.279C17.246,16.271 13.481,2 13,2c-1,0 -6,9 -6,13s5.707,8 11,8 10.795,-4 10.795,-8 -5,-13 -6,-13z"
android:fillColor="#F4ABBA"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M0,29c0,2.209 1.791,4 4,4h24c2.209,0 4,-1.791 4,-4V12c0,-2.209 -1.791,-4 -4,-4h-9c-3.562,0 -3,-5 -8.438,-5H4C1.791,3 0,4.791 0,7v22z"
android:fillColor="#269"/>
<path
android:pathData="M30,10h-6.562C18,10 18.562,15 15,15H6c-2.209,0 -4,1.791 -4,4v10c0,0.553 -0.448,1 -1,1s-1,-0.447 -1,-1c0,2.209 1.791,4 4,4h26c2.209,0 4,-1.791 4,-4V14c0,-2.209 -1.791,-4 -4,-4z"
android:fillColor="#55ACEE"/>
</vector>

View File

@ -0,0 +1,21 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M33,31c0,2.2 -1.8,4 -4,4H7c-2.2,0 -4,-1.8 -4,-4V14c0,-2.2 1.8,-4 4,-4h22c2.2,0 4,1.8 4,4v17z"
android:fillColor="#FDD888"/>
<path
android:pathData="M36,11c0,2.2 -1.8,4 -4,4H4c-2.2,0 -4,-1.8 -4,-4s1.8,-4 4,-4h28c2.2,0 4,1.8 4,4z"
android:fillColor="#FDD888"/>
<path
android:pathData="M3,15h30v2H3z"
android:fillColor="#FCAB40"/>
<path
android:pathData="M19,3h-2c-1.657,0 -3,1.343 -3,3v29h8V6c0,-1.656 -1.343,-3 -3,-3z"
android:fillColor="#DA2F47"/>
<path
android:pathData="M16,7c1.1,0 1.263,-0.516 0.361,-1.147L9.639,1.147c-0.902,-0.631 -2.085,-0.366 -2.631,0.589L4.992,5.264C4.446,6.219 4.9,7 6,7h10zM20,7c-1.1,0 -1.263,-0.516 -0.361,-1.147l6.723,-4.706c0.901,-0.631 2.085,-0.366 2.631,0.589l2.016,3.527C31.554,6.219 31.1,7 30,7L20,7z"
android:fillColor="#DA2F47"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M35.686,11.931c-0.507,-0.522 -6.83,-1.094 -13.263,-0.369 -1.283,0.144 -1.363,0.51 -4.425,0.63 -3.061,-0.119 -3.141,-0.485 -4.425,-0.63C7.14,10.837 0.817,11.41 0.31,11.931c-0.252,0.261 -0.252,2.077 0,2.338 0.254,0.261 1.035,0.606 1.403,1.827 0.237,0.787 0.495,5.864 2.281,7.377 1.768,1.498 7.462,1.217 9.326,0.262 2.536,-1.298 2.892,-5.785 3.292,-7.639 0.203,-0.939 1.162,-1.016 1.385,-1.016s1.182,0.077 1.385,1.016c0.401,1.853 0.757,6.34 3.292,7.639 1.865,0.955 7.558,1.236 9.326,-0.262 1.786,-1.513 2.044,-6.59 2.281,-7.377 0.368,-1.22 1.149,-1.566 1.403,-1.827 0.254,-0.26 0.254,-2.077 0.002,-2.338z"
android:fillColor="#31373D"/>
<path
android:pathData="M14.644,15.699c-0.098,1.255 -0.521,4.966 -1.757,6.083 -1.376,1.243 -6.25,1.568 -7.79,0.044 -0.808,-0.799 -1.567,-4.018 -1.503,-6.816 0.038,-1.679 2.274,-2.02 5.462,-2.02 3.148,0 5.763,0.468 5.588,2.709zM21.351,15.699c0.098,1.255 0.521,4.966 1.757,6.083 1.376,1.243 6.25,1.568 7.79,0.044 0.808,-0.799 1.567,-4.018 1.503,-6.816 -0.038,-1.679 -2.274,-2.02 -5.462,-2.02 -3.147,0 -5.763,0.468 -5.588,2.709z"
android:fillColor="#55ACEE"/>
</vector>

View File

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M18,18m-18,0a18,18 0,1 1,36 0a18,18 0,1 1,-36 0"
android:fillColor="#88C9F9"/>
<path
android:pathData="M2.812,25.375c-0.062,-1 -0.062,-1.187 -0.062,-2.375s0.562,-1 1.125,-1.562 0.438,-0.625 1.375,-1.241 0.438,-1.321 0.375,-1.696 -0.625,-0.063 -1.563,0.061 -0.624,-0.312 -1.187,-0.562 -0.812,-0.625 -1.188,-1.75 -0.438,-1.438 -0.312,-2.375 0.563,-0.063 0.625,0.937 0.938,0.625 0.938,1.25 1.25,1.312 1.562,1.5 1.188,-0.938 1.5,-1.25 0.688,-0.75 0.812,-1 1.688,-0.438 2,-0.438 1.062,0.938 1.062,1.375 0.375,1.625 0.688,2.312 1,0.812 1.625,1.312 0.938,0.062 0.938,0.062 -0.25,-1.062 -0.25,-1.938 0.75,-1.625 0.75,-1.625 1.188,0.875 1.25,1.125 1,1.125 1.062,1.562 0.562,1 1.483,1.125 0.267,-1.062 0.579,-1.875 0.75,-0.938 1.312,-1.062 1,-0.625 1.375,-1.125 1.062,-1.188 1,-1.75 -0.25,-0.938 -0.5,-1.625 0.75,-0.938 1.188,-1.75 0,0 1,-0.25 0.562,-0.25 0.75,-0.625 0.312,-0.75 0.125,-1.438 -0.875,0 -1.562,0S22.938,7.75 23,7s0.938,-0.562 1.562,-0.625 0.812,0.812 1,1 2.125,-1.25 2.625,-1.938 -0.437,-0.499 -0.187,-0.789 -1.5,-0.349 -2.188,-0.46 -2.437,-0.188 -3.124,-0.612 -3.312,-0.104 -4,0.237 -1.125,-0.029 -1.438,-0.5 -1.625,-0.235 -2,-0.5 -0.75,0.437 -1.25,0.625 -0.688,0.25 -1.312,-0.125 0.187,-0.813 -0.688,-1.125c-0.586,-0.209 -1.288,-0.087 -2.38,-0.111C3.902,5.092 0,11.087 0,18c0,3.42 0.971,6.605 2.627,9.327 0.308,-0.518 0.231,-1.217 0.185,-1.952zM17.312,24.188c0.438,0.062 1.688,0 0.688,-0.812s-1.562,-0.188 -1.438,-1.125 -0.625,-0.938 -0.625,-0.938c0,0.688 -0.5,1.438 0,2.125s0.938,0.687 1.375,0.75z"
android:fillColor="#5C913B"/>
<path
android:pathData="M23.688,13.75c-1,-0.812 -0.25,-0.562 -0.125,-1.5s-0.625,-0.938 -0.625,-0.938c0,0.688 -0.5,1.438 0,2.125s-1,1.25 -0.562,1.312 2.312,-0.187 1.312,-0.999zM19.808,23.5c0.62,0.688 0.38,0 1.192,-0.312s-0.688,-1 -1.188,-1.375 -0.997,-0.389 -1.434,0.438c-0.496,0.937 0.81,0.561 1.43,1.249zM27.125,24.75c-0.312,-0.375 -1,-0.562 -1.75,-0.545 -0.75,0.018 -0.688,-0.83 -1.438,-0.768s-1.286,-0.504 -1.625,-0.679c-0.737,-0.38 -0.25,0.491 0,1.446s1.188,0.232 2.062,0.732 0.938,-0.188 1.75,0.062 1.125,0.812 1.904,0.75 -0.59,-0.623 -0.903,-0.998zM25.5,27.5c-0.312,-0.625 -1.226,-1.188 -1.601,-1.505s-0.962,-0.424 -1.462,-0.24 -0.812,0 -1.062,-0.495 -0.688,-0.322 -1.062,-0.26 -1.875,0.688 -2.75,1.125 -1.273,0.817 -1.847,1.375c-0.898,0.874 -0.403,0.312 0,0.875 0.403,0.562 -0.442,2.312 -0.504,3.312s1.602,-0.312 2.227,-0.438 0.441,-0.5 0.941,-0.875 0.825,-0.463 1.374,0.037c0.549,0.5 1.268,0.963 1.268,1.525s1.979,1.5 2.729,1.125 1.188,-1.125 1.875,-1.75 0.438,-1.812 0.625,-2.562 -0.439,-0.624 -0.751,-1.249z"
android:fillColor="#5C913B"/>
</vector>

View File

@ -0,0 +1,51 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M21.828,20.559C19.707,21.266 19,17.731 19,17.731s0.965,-0.968 0.235,-1.829c1.138,-1.137 0.473,-1.707 0.473,-1.707 -1.954,-1.953 -5.119,-1.953 -7.071,0 -0.246,0.246 -0.414,0.467 -0.553,0.678 -0.061,0.086 -0.115,0.174 -0.17,0.262l-0.014,0.027c-0.285,0.475 -0.491,0.982 -0.605,1.509 -0.156,0.319 -0.379,0.659 -0.779,1.06 -1.414,1.414 -4.949,-0.707 -7.778,2.121 -0.029,0.029 -0.045,0.069 -0.069,0.104 -0.094,0.084 -0.193,0.158 -0.284,0.25 -3.319,3.319 -3.003,9.018 0.708,12.728 3.524,3.525 8.84,3.979 12.209,1.17 0.058,-0.031 0.117,-0.061 0.165,-0.109 0.071,-0.072 0.126,-0.14 0.193,-0.21 0.053,-0.049 0.109,-0.093 0.161,-0.143 1.693,-1.694 2.342,-3.73 2.086,-5.811 -0.068,-0.99 -0.165,-1.766 0.39,-2.321 0.707,-0.707 2.828,0 4.242,-1.414 2.117,-2.122 0.631,-3.983 -0.711,-3.537z"
android:fillColor="#BB1A34"/>
<path
android:pathData="M14.987,18.91L30.326,3.572l2.121,2.122 -15.339,15.339z"
android:fillColor="#292F33"/>
<path
android:pathData="M10.001,29.134c1.782,1.277 1.959,3.473 1.859,4.751 -0.042,0.528 0.519,0.898 0.979,0.637 2.563,-1.456 4.602,-3.789 4.038,-7.853 -0.111,-0.735 0.111,-2.117 2.272,-2.406 2.161,-0.29 2.941,-1.099 3.208,-1.485 0.153,-0.221 0.29,-0.832 -0.312,-0.854 -0.601,-0.022 -2.094,0.446 -3.431,-1.136 -1.337,-1.582 -1.559,-2.228 -1.604,-2.473 -0.045,-0.245 -1.409,-3.694 -2.525,-1.864 -0.927,1.521 -1.958,4.509 -5.287,5.287 -1.355,0.316 -3.069,1.005 -3.564,1.96 -0.832,1.604 0.46,2.725 1.574,3.483 1.115,0.757 2.793,1.953 2.793,1.953z"
android:fillColor="#F5F8FA"/>
<path
android:pathData="M13.072,19.412l1.414,-1.415 3.536,3.535 -1.414,1.414zM8.597,23.886l1.415,-1.414 3.535,3.535 -1.414,1.414z"
android:fillColor="#292F33"/>
<path
android:pathData="M7.396,27.189L29.198,5.427l0.53,0.531L7.927,27.72zM8.265,28.057L30.067,6.296l0.53,0.531L8.796,28.59z"
android:fillColor="#CCD6DD"/>
<path
android:pathData="M9.815,28.325c0.389,0.389 0.389,1.025 0,1.414s-1.025,0.389 -1.414,0l-2.122,-2.121c-0.389,-0.389 -0.389,-1.025 0,-1.414h0.001c0.389,-0.389 1.025,-0.389 1.414,0l2.121,2.121z"
android:fillColor="#292F33"/>
<path
android:pathData="M13.028,29.556m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#292F33"/>
<path
android:pathData="M14.445,31.881c0,0.379 -0.307,0.686 -0.686,0.686 -0.379,0 -0.686,-0.307 -0.686,-0.686 0,-0.379 0.307,-0.686 0.686,-0.686 0.379,0 0.686,0.307 0.686,0.686z"
android:fillColor="#292F33"/>
<path
android:pathData="M35.088,4.54c0.415,0.415 0.415,1.095 -0.001,1.51l-4.362,3.02c-0.416,0.415 -1.095,0.415 -1.51,0L26.95,6.804c-0.415,-0.415 -0.415,-1.095 0.001,-1.51l3.02,-4.361c0.416,-0.415 1.095,-0.415 1.51,0l3.607,3.607z"
android:fillColor="#BB1A34"/>
<path
android:pathData="M32.123,9.402m-0.625,0a0.625,0.625 0,1 1,1.25 0a0.625,0.625 0,1 1,-1.25 0"
android:fillColor="#66757F"/>
<path
android:pathData="M33.381,8.557m-0.625,0a0.625,0.625 0,1 1,1.25 0a0.625,0.625 0,1 1,-1.25 0"
android:fillColor="#66757F"/>
<path
android:pathData="M34.64,7.712m-0.625,0a0.625,0.625 0,1 1,1.25 0a0.625,0.625 0,1 1,-1.25 0"
android:fillColor="#66757F"/>
<path
android:pathData="M26.712,3.811m-0.625,0a0.625,0.625 0,1 1,1.25 0a0.625,0.625 0,1 1,-1.25 0"
android:fillColor="#66757F"/>
<path
android:pathData="M27.555,2.571m-0.625,0a0.625,0.625 0,1 1,1.25 0a0.625,0.625 0,1 1,-1.25 0"
android:fillColor="#66757F"/>
<path
android:pathData="M28.398,1.332m-0.625,0a0.625,0.625 0,1 1,1.25 0a0.625,0.625 0,1 1,-1.25 0"
android:fillColor="#66757F"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M29.879,33.879C31.045,35.045 32.9,35.1 34,34s1.045,-2.955 -0.121,-4.121L12.121,8.121C10.955,6.955 9.1,6.9 8,8s-1.045,2.955 0.121,4.121l21.758,21.758z"
android:fillColor="#F4900C"/>
<path
android:pathData="M22,3s-6,-3 -11,2l-7,7s-1,-1 -2,0l-1,1s-1,1 0,2l4,4s1,1 2,0l1,-1s1,-1 0,-2l-0.078,-0.078c0.77,-0.743 1.923,-1.5 3.078,-0.922l4,-4s-1,-3 1,-5 3,-2 5,-2 1,-1 1,-1z"
android:fillColor="#66757F"/>
</vector>

View File

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M30.198,27.385L32,3.816c0,-0.135 -0.008,-0.263 -0.021,-0.373 0.003,-0.033 0.021,-0.075 0.021,-0.11C32,1.529 25.731,0.066 18,0.066c-7.732,0 -14,1.462 -14,3.267 0,0.035 0.017,0.068 0.022,0.102 -0.014,0.11 -0.022,0.23 -0.022,0.365l1.802,23.585C2.298,28.295 0,29.576 0,31c0,2.762 8.611,5 18,5s18,-2.238 18,-5c0,-1.424 -2.298,-2.705 -5.802,-3.615z"
android:fillColor="#31373D"/>
<path
android:pathData="M17.536,6.595c-4.89,0 -8.602,-0.896 -10.852,-1.646 -0.524,-0.175 -0.808,-0.741 -0.633,-1.265 0.175,-0.524 0.739,-0.808 1.265,-0.633 2.889,0.963 10.762,2.891 21.421,-0.016 0.529,-0.142 1.082,0.168 1.227,0.702 0.146,0.533 -0.169,1.083 -0.702,1.228 -4.406,1.202 -8.347,1.63 -11.726,1.63z"
android:fillColor="#66757F"/>
<path
android:pathData="M30.198,27.385l0.446,-5.829c-7.705,2.157 -17.585,2.207 -25.316,-0.377l0.393,5.142c0.069,0.304 0.113,0.65 0.113,1.076 0,1.75 1.289,2.828 2.771,3.396 4.458,1.708 13.958,1.646 18.807,0.149 1.467,-0.453 2.776,-1.733 2.776,-3.191 0,-0.119 0.015,-0.241 0.024,-0.361l-0.014,-0.005z"
android:fillColor="#744EAA"/>
</vector>

View File

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M18,0C9.716,0 3,6.716 3,15v9h3v-9C6,8 11.269,2.812 18,2.812 24.73,2.812 30,8 30,15v10l3,-1v-9c0,-8.284 -6.716,-15 -15,-15z"
android:fillColor="#66757F"/>
<path
android:pathData="M6,27c0,1.104 -0.896,2 -2,2L2,29c-1.104,0 -2,-0.896 -2,-2v-9c0,-1.104 0.896,-2 2,-2h2c1.104,0 2,0.896 2,2v9zM36,27c0,1.104 -0.896,2 -2,2h-2c-1.104,0 -2,-0.896 -2,-2v-9c0,-1.104 0.896,-2 2,-2h2c1.104,0 2,0.896 2,2v9z"
android:fillColor="#31373D"/>
<path
android:pathData="M19.182,10.016l-6.364,1.313c-0.45,0.093 -0.818,0.544 -0.818,1.004v16.185c-0.638,-0.227 -1.341,-0.36 -2.087,-0.36 -2.785,0 -5.042,1.755 -5.042,3.922 0,2.165 2.258,3.827 5.042,3.827C12.649,35.905 14.922,34 15,32L15,16.39l4.204,-0.872c0.449,-0.093 0.796,-0.545 0.796,-1.004v-3.832c0,-0.458 -0.368,-0.759 -0.818,-0.666zM27.182,13.167l-4.297,0.865c-0.45,0.093 -0.885,0.544 -0.885,1.003L22,26.44c0,-0.152 -0.878,-0.24 -1.4,-0.24 -2.024,0 -3.633,1.276 -3.633,2.852 0,1.574 1.658,2.851 3.683,2.851s3.677,-1.277 3.677,-2.851l-0.014,-11.286 2.869,-0.598c0.45,-0.093 0.818,-0.544 0.818,-1.003v-2.33c0,-0.459 -0.368,-0.76 -0.818,-0.668z"
android:fillColor="#55ACEE"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M35.885,11.833c0,-5.45 -4.418,-9.868 -9.867,-9.868 -3.308,0 -6.227,1.633 -8.018,4.129 -1.791,-2.496 -4.71,-4.129 -8.017,-4.129 -5.45,0 -9.868,4.417 -9.868,9.868 0,0.772 0.098,1.52 0.266,2.241C1.751,22.587 11.216,31.568 18,34.034c6.783,-2.466 16.249,-11.447 17.617,-19.959 0.17,-0.721 0.268,-1.469 0.268,-2.242z"
android:fillColor="#DD2E44"/>
</vector>

View File

@ -0,0 +1,33 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M28.721,12.849s3.809,1.643 5.532,0.449c1.723,-1.193 2.11,-2.773 1.159,-4.736 -0.951,-1.961 -3.623,-2.732 -3.712,-5.292 0,0 -0.298,4.141 1.513,5.505 2.562,1.933 -0.446,4.21 -3.522,3.828 -3.078,-0.382 -0.97,0.246 -0.97,0.246z"
android:fillColor="#292F33"/>
<path
android:pathData="M23.875,19.375s-0.628,2.542 0.187,5.03c0.145,0.341 0.049,0.556 -0.208,0.678 -0.256,0.122 -4.294,1.542 -4.729,1.771 -0.396,0.208 -1.142,1.78 -1.208,2.854 0.844,0.218 1.625,0.104 1.625,0.104s0.025,-1.915 0.208,-2.042c0.183,-0.127 5.686,-1.048 6.062,-1.771s1.611,-3.888 0.812,-5.292c-0.225,-0.395 -0.637,-1.15 -0.637,-1.15l-2.112,-0.182z"
android:fillColor="#8A4B38"/>
<path
android:pathData="M17.917,29.708s-0.616,1.993 0.008,2.138c0.605,0.141 1.694,-0.388 1.755,-0.646 0.081,-0.343 0.216,-1.179 0.098,-1.366 -0.118,-0.186 -1.861,-0.126 -1.861,-0.126z"
android:fillColor="#292F33"/>
<path
android:pathData="M11.812,21.875l-0.75,-2.562s-2.766,2.105 -3.938,3.594c-0.344,0.437 -1.847,3.198 -1.722,4.413 0.05,0.488 0.474,2.583 0.474,2.583l1.651,-0.465s-1.312,-1.896 -1.021,-2.562c1.428,-3.263 5.306,-5.001 5.306,-5.001z"
android:fillColor="#8A4B38"/>
<path
android:pathData="M7.679,29.424c-0.172,-0.139 -1.803,0.479 -1.803,0.479s0.057,2.085 0.695,2.022c0.618,-0.061 1.48,-0.912 1.455,-1.175 -0.034,-0.351 -0.175,-1.187 -0.347,-1.326z"
android:fillColor="#292F33"/>
<path
android:pathData="M27.188,11.188c-3.437,0.156 -7.207,0.438 -9.5,0.438 -3.655,0 -5.219,-1.428 -6.562,-2.625C8.838,6.964 8.167,4.779 6,5.501c0,0 -0.632,-0.411 -1.247,-0.778l-0.261,-0.152c-0.256,-0.148 -0.492,-0.276 -0.656,-0.347 -0.164,-0.072 -0.258,-0.087 -0.228,-0.01 0.019,0.051 0.093,0.143 0.236,0.286 0.472,0.472 0.675,0.95 0.728,1.395 -2.01,1.202 -2.093,2.276 -2.871,3.552 -0.492,0.807 -1.36,2.054 -1.56,2.515 -0.412,0.948 1.024,2.052 1.706,1.407 0.893,-0.845 0.961,-1.122 2.032,-1.744 0.983,-0.016 1.975,-0.416 2.308,-1.02 0,0 0.938,2.083 1.938,3.583s2.5,3.125 2.5,3.125c-0.131,1.227 0.12,2.176 0.549,2.922 -0.385,0.757 -0.924,1.807 -1.417,2.745 -0.656,1.245 -1.473,3.224 -1.208,3.618 0.534,0.798 2.719,2.926 4.137,3.311 1.03,0.28 2.14,0.437 2.14,0.437l-0.193,-1.574s-1.343,0.213 -1.875,-0.083c-1.427,-0.795 -2.666,-2.248 -2.708,-2.542 -0.07,-0.487 3.841,-2.868 5.14,-3.645 2.266,0.097 6.022,-0.369 8.626,-1.702 0.958,1.86 2.978,2.513 2.978,2.513s0.667,2.208 1.375,4.125c-1.017,0.533 -4.468,3.254 -4.975,3.854 -0.456,0.54 -0.856,2.49 -0.856,2.49 0.82,0.375 1.57,0.187 1.57,0.187s0.039,-1.562 0.385,-2.073c0.346,-0.511 4.701,-2.559 5.958,-3.458 0.492,-0.352 0.404,-0.903 0.262,-1.552 -0.321,-1.471 -0.97,-4.781 -0.971,-4.782 5.146,-2.979 6.458,-11.316 -2.354,-10.916z"
android:fillColor="#C1694F"/>
<path
android:pathData="M22.336,33.782s-0.616,1.993 0.008,2.138c0.605,0.141 1.694,-0.388 1.755,-0.646 0.081,-0.343 0.216,-1.179 0.098,-1.366 -0.118,-0.187 -1.861,-0.126 -1.861,-0.126zM14.66,28.486c-0.167,0.146 0.164,1.859 0.164,1.859s2.064,0.299 2.111,-0.34c0.045,-0.62 -0.647,-1.614 -0.91,-1.634 -0.351,-0.027 -1.198,-0.031 -1.365,0.115z"
android:fillColor="#292F33"/>
<path
android:pathData="M4.25,8.047m-0.349,0a0.349,0.349 0,1 1,0.698 0a0.349,0.349 0,1 1,-0.698 0"
android:fillColor="#292F33"/>
<path
android:pathData="M12.655,9.07c1.773,1.446 3.147,0.322 3.147,0.322 -1.295,-0.271 -2.056,-0.867 -2.708,-1.562 0.835,-0.131 1.287,-0.666 1.287,-0.666 -1.061,-0.013 -1.824,-0.3 -2.485,-0.699 -0.565,-0.614 -1.233,-1.202 -2.254,-1.631 -0.294,-0.125 -0.606,-0.21 -0.922,-0.276 -0.086,-0.025 -0.178,-0.063 -0.258,-0.073 -0.906,-0.114 -1.845,0.051 -2.737,0.603 -0.322,0.2 -0.214,0.639 0.117,0.623 1.741,-0.085 2.866,0.582 3.47,1.633 2.169,3.772 5.344,3.875 5.344,3.875s-1.29,-0.688 -2.001,-2.149z"
android:fillColor="#292F33"/>
</vector>

View File

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M21,18c0,-2.001 3.246,-3.369 5,-6 2,-3 2,-10 2,-10H8s0,7 2,10c1.754,2.631 5,3.999 5,6s-3.246,3.369 -5,6c-2,3 -2,10 -2,10h20s0,-7 -2,-10c-1.754,-2.631 -5,-3.999 -5,-6z"
android:fillColor="#FFE8B6"/>
<path
android:pathData="M20.999,24c-0.999,0 -2.057,-1 -2.057,-2C19,20.287 19,19.154 19,18c0,-3.22 3.034,-4.561 4.9,-7H12.1c1.865,2.439 4.9,3.78 4.9,7 0,1.155 0,2.289 0.058,4 0,1 -1.058,2 -2.058,2 -2,0 -3.595,1.784 -4,3 -1,3 -1,7 -1,7h16s0,-4 -1,-7c-0.405,-1.216 -2.001,-3 -4.001,-3z"
android:fillColor="#FFAC33"/>
<path
android:pathData="M30,34c0,1.104 -0.896,2 -2,2L8,36c-1.104,0 -2,-0.896 -2,-2s0.896,-2 2,-2h20c1.104,0 2,0.896 2,2zM30,2c0,1.104 -0.896,2 -2,2L8,4c-1.104,0 -2,-0.896 -2,-2s0.896,-2 2,-2h20c1.104,0 2,0.896 2,2z"
android:fillColor="#3B88C3"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M32.614,3.414C28.31,-0.89 21.332,-0.89 17.027,3.414c-3.391,3.392 -4.098,8.439 -2.144,12.535l-3.916,3.915c-0.64,0.641 -0.841,1.543 -0.625,2.359l-1.973,1.972c-0.479,-0.48 -1.252,-0.48 -1.731,0l-1.731,1.732c-0.479,0.479 -0.479,1.253 0,1.732l-0.867,0.864c-0.479,-0.478 -1.253,-0.478 -1.731,0l-0.866,0.867c-0.479,0.479 -0.479,1.253 0,1.732 0.015,0.016 0.036,0.02 0.051,0.033 -0.794,1.189 -0.668,2.812 0.382,3.863 1.195,1.195 3.134,1.195 4.329,0L20.08,21.144c4.097,1.955 9.144,1.247 12.535,-2.146 4.302,-4.302 4.302,-11.28 -0.001,-15.584zM30.883,8.609c-0.957,0.956 -2.509,0.956 -3.464,0 -0.956,-0.956 -0.956,-2.507 0,-3.464 0.955,-0.956 2.507,-0.956 3.464,0 0.956,0.957 0.956,2.508 0,3.464z"
android:fillColor="#C1694F"/>
</vector>

View File

@ -0,0 +1,21 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M29,11.06c0,6.439 -5,7.439 -5,13.44 0,3.098 -3.123,3.359 -5.5,3.359 -2.053,0 -6.586,-0.779 -6.586,-3.361C11.914,18.5 7,17.5 7,11.06 7,5.029 12.285,0.14 18.083,0.14 23.883,0.14 29,5.029 29,11.06z"
android:fillColor="#FFD983"/>
<path
android:pathData="M22.167,32.5c0,0.828 -2.234,2.5 -4.167,2.5 -1.933,0 -4.167,-1.672 -4.167,-2.5 0,-0.828 2.233,-0.5 4.167,-0.5 1.933,0 4.167,-0.328 4.167,0.5z"
android:fillColor="#CCD6DD"/>
<path
android:pathData="M22.707,10.293c-0.391,-0.391 -1.023,-0.391 -1.414,0L18,13.586l-3.293,-3.293c-0.391,-0.391 -1.023,-0.391 -1.414,0s-0.391,1.023 0,1.414L17,15.414V26c0,0.553 0.448,1 1,1s1,-0.447 1,-1V15.414l3.707,-3.707c0.391,-0.391 0.391,-1.023 0,-1.414z"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M24,31c0,1.104 -0.896,2 -2,2h-8c-1.104,0 -2,-0.896 -2,-2v-6h12v6z"
android:fillColor="#99AAB5"/>
<path
android:pathData="M11.999,32c-0.48,0 -0.904,-0.347 -0.985,-0.836 -0.091,-0.544 0.277,-1.06 0.822,-1.15l12,-2c0.544,-0.098 1.06,0.277 1.15,0.822 0.091,0.544 -0.277,1.06 -0.822,1.15l-12,2c-0.055,0.01 -0.111,0.014 -0.165,0.014zM11.999,28c-0.48,0 -0.904,-0.347 -0.985,-0.836 -0.091,-0.544 0.277,-1.06 0.822,-1.15l12,-2c0.544,-0.097 1.06,0.277 1.15,0.822 0.091,0.544 -0.277,1.06 -0.822,1.15l-12,2c-0.055,0.01 -0.111,0.014 -0.165,0.014z"
android:fillColor="#CCD6DD"/>
</vector>

View File

@ -0,0 +1,54 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M32.325,10.958s2.315,0.024 3.511,1.177c-0.336,-4.971 -2.104,-8.249 -5.944,-10.13 -3.141,-1.119 -6.066,1.453 -6.066,1.453s0.862,-1.99 2.19,-2.746C23.789,0.236 21.146,0 18,0c-3.136,0 -5.785,0.227 -8.006,0.701 1.341,0.745 2.215,2.758 2.215,2.758S9.194,0.803 6,2.053C2.221,3.949 0.481,7.223 0.158,12.174c1.183,-1.19 3.55,-1.215 3.55,-1.215S-0.105,13.267 0.282,16.614c0.387,2.947 1.394,5.967 2.879,8.722C3.039,22.15 5.917,20 5.917,20s-2.492,5.96 -0.581,8.738c1.935,2.542 4.313,4.641 6.976,5.916 -0.955,-1.645 -0.136,-3.044 -0.103,-2.945 0.042,0.125 0.459,3.112 2.137,3.743 1.178,0.356 2.4,0.548 3.654,0.548 1.292,0 2.55,-0.207 3.761,-0.583 1.614,-0.691 2.024,-3.585 2.064,-3.708 0.032,-0.098 0.843,1.287 -0.09,2.921 2.706,-1.309 5.118,-3.463 7.064,-6.073 1.699,-2.846 -0.683,-8.557 -0.683,-8.557s2.85,2.13 2.757,5.288c1.556,-2.906 2.585,-6.104 2.911,-9.2 -0.035,-3.061 -3.459,-5.13 -3.459,-5.13z"
android:fillColor="#662113"/>
<path
android:pathData="M13.859,9.495c0.596,2.392 0.16,4.422 -2.231,5.017 -2.392,0.596 -6.363,0.087 -6.958,-2.304 -0.596,-2.392 0.469,-5.39 1.81,-5.724 1.341,-0.334 6.784,0.62 7.379,3.011zM22.963,27.927c0,2.74 -2.222,4.963 -4.963,4.963s-4.963,-2.223 -4.963,-4.963c0,-2.741 2.223,-4.964 4.963,-4.964 2.741,0 4.963,2.222 4.963,4.964z"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M21.309,27.927c0,1.827 -1.481,3.309 -3.309,3.309s-3.309,-1.481 -3.309,-3.309c0,-1.827 1.481,-3.31 3.309,-3.31s3.309,1.483 3.309,3.31z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M11.052,8.997c0.871,1.393 0.447,3.229 -0.946,4.1 -1.394,0.871 -2.608,0.797 -3.479,-0.596 -0.871,-1.394 -0.186,-4.131 0.324,-4.45 0.51,-0.319 3.23,-0.448 4.101,0.946z"
android:fillColor="#E6AAAA"/>
<path
android:pathData="M22.141,9.495c-0.596,2.392 -0.159,4.422 2.232,5.017 2.392,0.596 6.363,0.087 6.959,-2.304 0.596,-2.392 -0.47,-5.39 -1.811,-5.724 -1.342,-0.334 -6.786,0.62 -7.38,3.011z"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M24.948,8.997c-0.871,1.393 -0.447,3.229 0.945,4.1 1.394,0.871 2.608,0.797 3.479,-0.596 0.871,-1.394 0.185,-4.131 -0.324,-4.45 -0.51,-0.319 -3.229,-0.448 -4.1,0.946z"
android:fillColor="#E6AAAA"/>
<path
android:pathData="M18,7.125h-0.002C5.167,7.126 7.125,12.083 8.5,18.667 9.875,25.25 10.384,27 10.384,27h15.228s0.51,-1.75 1.885,-8.333C28.872,12.083 30.829,7.126 18,7.125z"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M12,16s0,-1.5 1.5,-1.5S15,16 15,16v1.5s0,1.5 -1.5,1.5 -1.5,-1.5 -1.5,-1.5L12,16zM21,16s0,-1.5 1.5,-1.5S24,16 24,16v1.5s0,1.5 -1.5,1.5 -1.5,-1.5 -1.5,-1.5L21,16z"
android:fillColor="#272B2B"/>
<path
android:pathData="M20.168,21.521c-1.598,0 -1.385,0.848 -2.168,2.113 -0.783,-1.266 -0.571,-2.113 -2.168,-2.113 -6.865,0 -6.837,0.375 -6.865,2.828 -0.058,4.986 2.802,6.132 5.257,6.06 1.597,-0.048 2.994,-0.88 3.777,-2.131 0.783,1.251 2.179,2.083 3.776,2.131 2.455,0.072 5.315,-1.073 5.257,-6.06 -0.029,-2.453 -0.001,-2.828 -6.866,-2.828z"
android:fillColor="#FFE8B6"/>
<path
android:pathData="M14.582,21.411c-1.14,0.233 2.279,4.431 3.418,4.431s4.559,-4.198 3.419,-4.431c-1.14,-0.232 -5.698,-0.232 -6.837,0z"
android:fillColor="#272B2B"/>
<path
android:pathData="M11.5,24.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0"
android:fillColor="#D99E82"/>
<path
android:pathData="M10.5,26.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0"
android:fillColor="#D99E82"/>
<path
android:pathData="M12.5,27.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0"
android:fillColor="#D99E82"/>
<path
android:pathData="M24.5,24.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0"
android:fillColor="#D99E82"/>
<path
android:pathData="M25.5,26.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0"
android:fillColor="#D99E82"/>
<path
android:pathData="M23.5,27.5m-0.5,0a0.5,0.5 0,1 1,1 0a0.5,0.5 0,1 1,-1 0"
android:fillColor="#D99E82"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M18,3C12.477,3 8,7.477 8,13v10h4V13c0,-3.313 2.686,-6 6,-6s6,2.687 6,6v10h4V13c0,-5.523 -4.477,-10 -10,-10z"
android:fillColor="#AAB8C2"/>
<path
android:pathData="M31,32c0,2.209 -1.791,4 -4,4H9c-2.209,0 -4,-1.791 -4,-4V20c0,-2.209 1.791,-4 4,-4h18c2.209,0 4,1.791 4,4v12z"
android:fillColor="#FFAC33"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M30.312,0.776C32,19 20,32 0.776,30.312c8.199,7.717 21.091,7.588 29.107,-0.429C37.9,21.867 38.03,8.975 30.312,0.776z"
android:fillColor="#FFD983"/>
<path
android:pathData="M30.705,15.915c-0.453,0.454 -0.453,1.189 0,1.644 0.454,0.453 1.189,0.453 1.643,0 0.454,-0.455 0.455,-1.19 0,-1.644 -0.453,-0.454 -1.189,-0.454 -1.643,0zM14.683,30.295c-0.682,0.681 -0.682,1.783 0,2.465 0.68,0.682 1.784,0.682 2.464,0 0.681,-0.682 0.681,-1.784 0,-2.465 -0.68,-0.682 -1.784,-0.682 -2.464,0zM28.651,28.148c-1.135,1.135 -2.974,1.135 -4.108,0 -1.135,-1.135 -1.135,-2.975 0,-4.107 1.135,-1.136 2.974,-1.136 4.108,0 1.135,1.133 1.135,2.973 0,4.107z"
android:fillColor="#FFCC4D"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M27,33c0,2.209 -1.791,3 -4,3H13c-2.209,0 -4,-0.791 -4,-3s3,-7 3,-13 12,-6 12,0 3,10.791 3,13z"
android:fillColor="#99AAB5"/>
<path
android:pathData="M34.666,11.189l-0.001,-0.002c-0.96,-2.357 -2.404,-4.453 -4.208,-6.182h-0.003C27.222,1.904 22.839,0 18,0 13.638,0 9.639,1.541 6.524,4.115c-2.19,1.809 -3.941,4.13 -5.076,6.785C0.518,13.075 0,15.473 0,18c0,2.209 1.791,4 4,4h28c2.209,0 4,-1.791 4,-4 0,-2.417 -0.48,-4.713 -1.334,-6.811z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M7.708,16.583c3.475,0 6.292,-2.817 6.292,-6.292S11.184,4 7.708,4c-0.405,0 -0.8,0.042 -1.184,0.115 -2.19,1.809 -3.941,4.13 -5.076,6.785 0.306,3.189 2.991,5.683 6.26,5.683z"
android:fillColor="#F4ABBA"/>
<path
android:pathData="M7.708,4.25c3.331,0 6.041,2.71 6.041,6.042s-2.71,6.042 -6.041,6.042c-3.107,0 -5.678,-2.314 -6.006,-5.394 1.097,-2.541 2.8,-4.817 4.931,-6.59 0.364,-0.067 0.726,-0.1 1.075,-0.1m0,-0.25c-0.405,0 -0.8,0.042 -1.184,0.115 -2.19,1.809 -3.941,4.13 -5.076,6.785 0.306,3.189 2.992,5.683 6.261,5.683 3.475,0 6.291,-2.817 6.291,-6.292S11.184,4 7.708,4zM26,9.5c0,2.485 2.015,4.5 4.5,4.5 1.887,0 3.497,-1.164 4.166,-2.811l-0.001,-0.002c-0.96,-2.357 -2.404,-4.453 -4.208,-6.182C27.992,5.028 26,7.029 26,9.5z"
android:fillColor="#F4ABBA"/>
<path
android:pathData="M21.5,16m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
android:fillColor="#F4ABBA"/>
<path
android:pathData="M20,5m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0"
android:fillColor="#F4ABBA"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M10,12c3,5 0,10.692 -3,9.692s-4,2 -1,3 9.465,-0.465 13,-4c1,-1 2,-1 2,-1L10,12z"
android:fillColor="#553788"/>
<path
android:pathData="M26,12c-3,5 0,10.692 3,9.692s4,2 1,3 -9.465,-0.465 -13,-4c-1,-1 -2,-1 -2,-1L26,12z"
android:fillColor="#553788"/>
<path
android:pathData="M30.188,16c-3,5 0,10.692 3,9.692s4,2 1,3 -9.465,-0.465 -13,-4c-1,-1 -2,-1 -2,-1l11,-7.692zM5.812,16c3,5 0,10.692 -3,9.692s-4,2 -1,3 9.465,-0.465 13,-4c1,-1 2,-1 2,-1L5.812,16z"
android:fillColor="#744EAA"/>
<path
android:pathData="M33.188,31.375c-2.729,0.91 -6.425,-5.626 -4.812,-10.578C30.022,17.554 31,13.94 31,11c0,-7.18 -5.82,-11 -13,-11S5,3.82 5,11c0,2.94 0.978,6.554 2.624,9.797 1.613,4.952 -2.083,11.488 -4.812,10.578 -3,-1 -4,3 -1,4s8.31,-0.627 12,-4c2.189,-2 4.189,-2 4.189,-2s2,0 4.188,2c3.69,3.373 9,5 12,4s1.999,-5 -1.001,-4z"
android:fillColor="#9266CC"/>
<path
android:pathData="M14,21m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0"
android:fillColor="#292F33"/>
<path
android:pathData="M22,21m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0"
android:fillColor="#292F33"/>
</vector>

View File

@ -0,0 +1,42 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M7,6m-6,0a6,6 0,1 1,12 0a6,6 0,1 1,-12 0"
android:fillColor="#272B2B"/>
<path
android:pathData="M29,6m-6,0a6,6 0,1 1,12 0a6,6 0,1 1,-12 0"
android:fillColor="#272B2B"/>
<path
android:pathData="M7,6m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0"
android:fillColor="#66757F"/>
<path
android:pathData="M29,6m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0"
android:fillColor="#66757F"/>
<path
android:pathData="M35,22c0,7 -6.375,12 -17,12S1,29 1,22C1,22 2.308,0 18,0s17,22 17,22z"
android:fillColor="#EEE"/>
<path
android:pathData="M18,30m-6,0a6,6 0,1 1,12 0a6,6 0,1 1,-12 0"
android:fillColor="#CCD6DD"/>
<path
android:pathData="M18,30m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0"
android:fillColor="#DD2E44"/>
<path
android:pathData="M20.709,12.654C25.163,9.878 32,17 26.952,22.67 23.463,26.591 20,25 20,25s-2.636,-10.26 0.709,-12.346zM15.267,12.665C10.813,9.888 3.976,17.01 9.023,22.681c3.49,3.92 6.953,2.329 6.953,2.329s2.636,-10.26 -0.709,-12.345z"
android:fillColor="#272B2B"/>
<path
android:pathData="M11,17s0,-2 2,-2 2,2 2,2v2s0,2 -2,2 -2,-2 -2,-2v-2z"
android:fillColor="#66757F"/>
<path
android:pathData="M18,20S7,23.687 7,27s2.687,6 6,6c2.088,0 3.925,-1.067 5,-2.685C19.074,31.933 20.912,33 23,33c3.313,0 6,-2.687 6,-6s-11,-7 -11,-7z"
android:fillColor="#FFF"/>
<path
android:pathData="M21,17s0,-2 2,-2 2,2 2,2v2s0,2 -2,2 -2,-2 -2,-2v-2z"
android:fillColor="#66757F"/>
<path
android:pathData="M13.125,25c-1.624,1 3.25,4 4.875,4s6.499,-3 4.874,-4 -8.124,-1 -9.749,0z"
android:fillColor="#272B2B"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M35.354,25.254c0.217,-2.391 -0.513,-4.558 -2.057,-6.102L17.033,2.89c-0.391,-0.391 -1.024,-0.391 -1.414,0 -0.391,0.391 -0.391,1.024 0,1.414l16.264,16.263c1.116,1.117 1.642,2.717 1.479,4.506 -0.159,1.748 -0.957,3.456 -2.188,4.686 -1.23,1.23 -2.938,2.027 -4.685,2.187 -1.781,0.161 -3.39,-0.362 -4.506,-1.479L3.598,12.082c-0.98,-0.98 -1.059,-2.204 -0.953,-3.058 0.15,-1.196 0.755,-2.401 1.66,-3.307 1.7,-1.7 4.616,-2.453 6.364,-0.707l14.85,14.849c1.119,1.12 0.026,2.803 -0.708,3.536 -0.733,0.735 -2.417,1.826 -3.535,0.707L9.962,12.789c-0.391,-0.391 -1.024,-0.39 -1.414,0 -0.391,0.391 -0.391,1.023 0,1.414l11.313,11.314c1.859,1.858 4.608,1.05 6.363,-0.707 1.758,-1.757 2.565,-4.507 0.708,-6.364L12.083,3.597c-2.62,-2.62 -6.812,-1.673 -9.192,0.706C1.677,5.517 0.864,7.147 0.661,8.775c-0.229,1.833 0.312,3.509 1.523,4.721l18.384,18.385c1.365,1.365 3.218,2.094 5.281,2.094 0.27,0 0.544,-0.013 0.82,-0.037 2.206,-0.201 4.362,-1.209 5.918,-2.765 1.558,-1.556 2.565,-3.713 2.767,-5.919z"
android:fillColor="#99AAB5"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M35.222,33.598c-0.647,-2.101 -1.705,-6.059 -2.325,-7.566 -0.501,-1.216 -0.969,-2.438 -1.544,-3.014 -0.575,-0.575 -1.553,-0.53 -2.143,0.058 0,0 -2.469,1.675 -3.354,2.783 -1.108,0.882 -2.785,3.357 -2.785,3.357 -0.59,0.59 -0.635,1.567 -0.06,2.143 0.576,0.575 1.798,1.043 3.015,1.544 1.506,0.62 5.465,1.676 7.566,2.325 0.359,0.11 1.74,-1.271 1.63,-1.63z"
android:fillColor="#D99E82"/>
<path
android:pathData="M13.643,5.308c1.151,1.151 1.151,3.016 0,4.167l-4.167,4.168c-1.151,1.15 -3.018,1.15 -4.167,0L1.141,9.475c-1.15,-1.151 -1.15,-3.016 0,-4.167l4.167,-4.167c1.15,-1.151 3.016,-1.151 4.167,0l4.168,4.167z"
android:fillColor="#EA596E"/>
<path
android:pathData="M31.353,23.018l-4.17,4.17 -4.163,4.165L7.392,15.726l8.335,-8.334 15.626,15.626z"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M32.078,34.763s2.709,1.489 3.441,0.757c0.732,-0.732 -0.765,-3.435 -0.765,-3.435s-2.566,0.048 -2.676,2.678z"
android:fillColor="#292F33"/>
<path
android:pathData="M2.183,10.517l8.335,-8.335 5.208,5.209 -8.334,8.335z"
android:fillColor="#CCD6DD"/>
<path
android:pathData="M3.225,11.558l8.334,-8.334 1.042,1.042L4.267,12.6zM5.308,13.644l8.335,-8.335 1.042,1.042 -8.335,8.334z"
android:fillColor="#99AAB5"/>
</vector>

View File

@ -0,0 +1,21 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M28.068,31.355c-2.229,0 -8.468,0.785 -10.068,1.832 -1.601,-1.047 -7.84,-1.832 -10.069,-1.832 -2.564,0 -1.161,1.039 -1.161,2.322C6.77,34.96 5.367,36 7.931,36c2.229,0 8.468,-0.785 10.069,-1.832C19.601,35.215 25.84,36 28.068,36c2.565,0 1.161,-1.04 1.161,-2.322 0,-1.283 1.405,-2.323 -1.161,-2.323z"
android:fillColor="#FFAC33"/>
<path
android:pathData="M31.73,15.866c-1.25,-2.499 -3.152,-4.995 -4.942,-6.723C24.337,3.711 20.759,0 18,0s-6.337,3.71 -8.788,9.143c-1.791,1.729 -3.693,4.224 -4.943,6.724 -2.438,4.876 -3.116,11.426 -2.078,11.944 0.873,0.437 2.324,-1.552 4.208,-5.082C6.667,33.604 13.446,33.678 18,33.678c4.553,0 11.333,-0.073 11.601,-10.947 1.884,3.528 3.335,5.517 4.207,5.08 1.038,-0.519 0.361,-7.069 -2.078,-11.945z"
android:fillColor="#292F33"/>
<path
android:pathData="M21.675,6.943c-0.85,0.607 -2.172,1.186 -3.675,1.186s-2.825,-0.578 -3.675,-1.185c-3.302,2.137 -5.615,7.06 -5.615,12.798 0,7.695 4.159,13.936 9.29,13.936 5.132,0 9.291,-6.24 9.291,-13.936 0,-5.738 -2.313,-10.662 -5.616,-12.799z"
android:fillColor="#F5F8FA"/>
<path
android:pathData="M28.452,6h-5.808C18.797,6 18,5.22 18,4.257c0,-0.962 -0.364,-1.742 3.483,-1.742C27.291,2.516 29.613,6 28.452,6z"
android:fillColor="#FFAC33"/>
<path
android:pathData="M16.839,3.483c0,0.642 -0.52,1.162 -1.161,1.162 -0.642,0 -1.161,-0.521 -1.161,-1.162 0,-0.641 0.52,-1.161 1.161,-1.161s1.161,0.52 1.161,1.161z"
android:fillColor="#F5F8FA"/>
</vector>

View File

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M36,11.5C36,8.462 33,4 18,4S0,8.462 0,11.5c0,0.045 0.019,0.076 0.022,0.119 -0.012,0.196 -0.022,0.402 -0.022,0.631C0,14.873 2.239,16 5,16s5,-1.127 5,-3.75c0,-0.218 -0.021,-0.412 -0.051,-0.597C12.374,11.302 15.102,11 18,11s5.626,0.302 8.051,0.653c-0.03,0.185 -0.051,0.379 -0.051,0.597 0,2.623 2.238,3.75 5,3.75s5,-1.127 5,-3.75c0,-0.225 -0.009,-0.429 -0.024,-0.621 0.004,-0.046 0.024,-0.08 0.024,-0.129z"
android:fillColor="#BE1931"/>
<path
android:pathData="M34.934,23c-0.482,-1.031 -2.31,-4.19 -3.968,-7.007C29.408,13.346 27,11 25,11V9c0,-1.104 -0.896,-2 -2,-2s-2,0.896 -2,2v2h-6V9c0,-1.104 -0.896,-2 -2,-2s-2,0.896 -2,2v2c-2,0 -4.41,2.351 -5.97,5 -1.657,2.815 -3.483,5.97 -3.964,7C0.488,24.239 0,25 0,27s1.791,5 4,5h28c2.209,0 4,-3 4,-5s-0.448,-2.676 -1.066,-4z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M20.046,14.818c0,0.452 -0.916,0.818 -2.046,0.818s-2.045,-0.366 -2.045,-0.818c0,-0.452 0.915,-0.818 2.045,-0.818s2.046,0.366 2.046,0.818zM15.136,14.818c0,0.452 -0.915,0.818 -2.045,0.818s-2.045,-0.366 -2.045,-0.818c0,-0.452 0.916,-0.818 2.045,-0.818s2.045,0.366 2.045,0.818zM24.954,14.818c0,0.452 -0.915,0.818 -2.045,0.818s-2.046,-0.366 -2.046,-0.818c0,-0.452 0.916,-0.818 2.046,-0.818s2.045,0.366 2.045,0.818zM20.454,17.682c0,0.679 -1.099,1.228 -2.454,1.228s-2.455,-0.549 -2.455,-1.228c0,-0.677 1.099,-1.227 2.455,-1.227s2.454,0.549 2.454,1.227zM26.182,17.682c0,0.679 -1.1,1.228 -2.454,1.228 -1.355,0 -2.455,-0.549 -2.455,-1.228 0,-0.677 1.1,-1.227 2.455,-1.227 1.354,0 2.454,0.549 2.454,1.227zM14.727,17.682c0,0.679 -1.099,1.228 -2.454,1.228 -1.355,0 -2.455,-0.549 -2.455,-1.228 0,-0.677 1.099,-1.227 2.455,-1.227 1.355,0 2.454,0.549 2.454,1.227zM21.272,21.363C21.272,22.269 19.807,23 18,23c-1.807,0 -3.273,-0.731 -3.273,-1.637 0,-0.903 1.466,-1.636 3.273,-1.636 1.807,0.001 3.272,0.733 3.272,1.636zM28.637,21.363c0,0.905 -1.467,1.637 -3.273,1.637 -1.807,0 -3.273,-0.731 -3.273,-1.637 0,-0.903 1.466,-1.636 3.273,-1.636 1.806,0.001 3.273,0.733 3.273,1.636zM13.909,21.363c0,0.905 -1.466,1.637 -3.273,1.637 -1.807,0 -3.272,-0.731 -3.272,-1.637 0,-0.903 1.465,-1.636 3.272,-1.636 1.807,0.001 3.273,0.733 3.273,1.636z"
android:fillColor="#FFF"/>
</vector>

View File

@ -0,0 +1,21 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M34.193,13.329c0.387,-0.371 0.733,-0.795 1.019,-1.28 1.686,-2.854 0.27,-10.292 -0.592,-10.8 -0.695,-0.411 -5.529,1.05 -8.246,3.132C23.876,2.884 21.031,2 18,2c-3.021,0 -5.856,0.879 -8.349,2.367C6.93,2.293 2.119,0.839 1.424,1.249c-0.861,0.508 -2.276,7.947 -0.592,10.8 0.278,0.471 0.615,0.884 0.989,1.249C0.666,15.85 0,18.64 0,21.479 0,31.468 8.011,34 18,34s18,-2.532 18,-12.521c0,-2.828 -0.66,-5.606 -1.807,-8.15z"
android:fillColor="#F4ABBA"/>
<path
android:pathData="M7.398,5.965c-2.166,-1.267 -4.402,-2.08 -4.8,-1.845 -0.57,0.337 -1.083,4.998 -0.352,8.265 1.273,-2.483 3.04,-4.682 5.152,-6.42zM33.753,12.384c0.733,-3.267 0.219,-7.928 -0.351,-8.265 -0.398,-0.235 -2.635,0.578 -4.801,1.845 2.114,1.739 3.88,3.938 5.152,6.42zM28,23.125c0,4.487 -3.097,9.375 -10,9.375 -6.904,0 -10,-4.888 -10,-9.375S11.096,17.5 18,17.5c6.903,0 10,1.138 10,5.625z"
android:fillColor="#EA596E"/>
<path
android:pathData="M15,24.6c0,1.857 -0.34,2.4 -1.5,2.4s-1.5,-0.543 -1.5,-2.4c0,-1.856 0.34,-2.399 1.5,-2.399s1.5,0.542 1.5,2.399zM24,24.6c0,1.857 -0.34,2.4 -1.5,2.4s-1.5,-0.543 -1.5,-2.4c0,-1.856 0.34,-2.399 1.5,-2.399s1.5,0.542 1.5,2.399z"
android:fillColor="#662113"/>
<path
android:pathData="M7,17m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0"
android:fillColor="#292F33"/>
<path
android:pathData="M29,17m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0"
android:fillColor="#292F33"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M23.651,23.297L12.702,12.348l9.386,-7.821 9.385,9.385z"
android:fillColor="#BE1931"/>
<path
android:pathData="M34.6,13.912c-1.727,1.729 -4.528,1.729 -6.255,0l-6.257,-6.256c-1.729,-1.727 -1.729,-4.53 0,-6.258 1.726,-1.727 4.528,-1.727 6.257,0L34.6,7.656c1.728,1.727 1.728,4.529 0,6.256z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M14,17.823S-0.593,35.029 0.188,35.813C0.97,36.596 18.177,22 18.177,22L14,17.823z"
android:fillColor="#99AAB5"/>
<path
android:pathData="M25.215,27.991c-1.726,1.729 -4.528,1.729 -6.258,0L8.009,17.041c-1.727,-1.728 -1.727,-4.528 0,-6.256 1.728,-1.729 4.53,-1.729 6.258,0l10.948,10.949c1.728,1.729 1.728,4.528 0,6.257z"
android:fillColor="#DD2E44"/>
</vector>

View File

@ -0,0 +1,21 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M18,4c7.257,0 13,4 14.699,2 0.197,-0.323 0.301,-0.657 0.301,-1 0,-2 -6.716,-5 -15,-5C9.716,0 3,3 3,5c0,0.343 0.104,0.677 0.301,1C5,8 10.743,4 18,4z"
android:fillColor="#F4900C"/>
<path
android:pathData="M18,3C11.787,3 7.384,4.81 5.727,5.618c-0.477,0.233 -0.539,0.84 -0.415,1.278S16,34 16,34s0.896,2 2,2 2,-2 2,-2L30.704,6.779s0.213,-0.842 -0.569,-1.229C28.392,4.689 24.047,3 18,3z"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M18,31c0,-2.208 -1.791,-4 -4,-4 -0.254,0 -0.5,0.029 -0.741,0.075L16,34s0.071,0.14 0.19,0.342C17.279,33.627 18,32.399 18,31zM17,20c0,-2.209 -1.792,-4 -4,-4 -1.426,0 -2.67,0.752 -3.378,1.876l2.362,5.978c0.327,0.086 0.663,0.146 1.016,0.146 2.208,0 4,-1.792 4,-4z"
android:fillColor="#BE1931"/>
<path
android:pathData="M16,8m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0"
android:fillColor="#BE1931"/>
<path
android:pathData="M25,9c-2.208,0 -4,1.791 -4,4s1.792,4 4,4c0.682,0 1.315,-0.187 1.877,-0.488l1.89,-4.806C28.227,10.135 26.752,9 25,9zM19,25c0,1.868 1.288,3.425 3.019,3.864l2.893,-7.357C24.342,21.194 23.697,21 23,21c-2.208,0 -4,1.792 -4,4zM10,12c0,-2.209 -1.791,-4 -4,-4 -0.087,0 -0.169,0.02 -0.255,0.026 0.55,1.412 1.575,4.016 2.775,7.057C9.416,14.349 10,13.248 10,12z"
android:fillColor="#BE1931"/>
</vector>

View File

@ -0,0 +1,27 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M33.799,0.005c-0.467,-0.178 -7.998,3.971 -9.969,9.131 -1.166,3.052 -1.686,6.058 -1.652,8.112C20.709,16.459 19.257,16 18,16s-2.709,0.458 -4.178,1.249c0.033,-2.055 -0.486,-5.061 -1.652,-8.112C10.2,3.977 2.668,-0.173 2.201,0.005c-0.455,0.174 4.268,16.044 7.025,20.838C6.805,23.405 5,26.661 5,29.828c0,3.234 1.635,5.14 4,5.94 2.531,0.857 5,-0.94 9,-0.94s6.469,1.798 9,0.94c2.365,-0.801 4,-2.706 4,-5.94 0,-3.166 -1.805,-6.423 -4.225,-8.984C29.53,16.049 34.255,0.179 33.799,0.005z"
android:fillColor="#99AAB5"/>
<path
android:pathData="M12.692,17.922c-0.178,-1.54 -0.68,-3.55 -1.457,-5.584 -1.534,-4.016 -5.686,-7.245 -6.049,-7.107 -0.319,0.122 2.627,10.14 4.783,14.863 0.866,-0.824 1.786,-1.563 2.723,-2.172zM26.03,20.094c2.156,-4.723 5.102,-14.741 4.784,-14.862 -0.363,-0.139 -4.516,3.091 -6.05,7.107 -0.777,2.034 -1.279,4.043 -1.457,5.583 0.937,0.609 1.857,1.348 2.723,2.172z"
android:fillColor="#F4ABBA"/>
<path
android:pathData="M25,30c0,2.762 -3.06,5 -6.834,5 -3.773,0 -6.833,-2.238 -6.833,-5s3.06,-5 6.833,-5C21.94,25 25,27.238 25,30z"
android:fillColor="#CCD6DD"/>
<path
android:pathData="M21,30.578c0,2.762 -0.238,3 -3,3 -2.761,0 -3,-0.238 -3,-3 0,-1 6,-1 6,0z"
android:fillColor="#FFF"/>
<path
android:pathData="M12.5,24.328m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"
android:fillColor="#292F33"/>
<path
android:pathData="M23.5,24.328m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"
android:fillColor="#292F33"/>
<path
android:pathData="M21,25.828c0,1.657 -2,3 -3,3s-3,-1.343 -3,-3 6,-1.657 6,0z"
android:fillColor="#F4ABBA"/>
</vector>

View File

@ -0,0 +1,48 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M31,14.5a2.5,3.5 0,1 0,5 0a2.5,3.5 0,1 0,-5 0z"
android:fillColor="#F4900C"/>
<path
android:pathData="M0,14.5a2.5,3.5 0,1 0,5 0a2.5,3.5 0,1 0,-5 0z"
android:fillColor="#F4900C"/>
<path
android:pathData="M34,19c0,0.553 -0.447,1 -1,1h-3c-0.553,0 -1,-0.447 -1,-1v-9c0,-0.552 0.447,-1 1,-1h3c0.553,0 1,0.448 1,1v9zM7,19c0,0.553 -0.448,1 -1,1H3c-0.552,0 -1,-0.447 -1,-1v-9c0,-0.552 0.448,-1 1,-1h3c0.552,0 1,0.448 1,1v9z"
android:fillColor="#FFAC33"/>
<path
android:pathData="M28,5c0,2.761 -4.478,4 -10,4C12.477,9 8,7.761 8,5s4.477,-5 10,-5c5.522,0 10,2.239 10,5z"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M25,4.083C25,5.694 21.865,7 18,7c-3.866,0 -7,-1.306 -7,-2.917 0,-1.611 3.134,-2.917 7,-2.917 3.865,0 7,1.306 7,2.917z"
android:fillColor="#F4900C"/>
<path
android:pathData="M30,5.5C30,6.881 28.881,7 27.5,7h-19C7.119,7 6,6.881 6,5.5S7.119,3 8.5,3h19C28.881,3 30,4.119 30,5.5z"
android:fillColor="#269"/>
<path
android:pathData="M30,6H6c-1.104,0 -2,0.896 -2,2v26h28V8c0,-1.104 -0.896,-2 -2,-2z"
android:fillColor="#55ACEE"/>
<path
android:pathData="M35,33v-1c0,-1.104 -0.896,-2 -2,-2H22.071l-3.364,3.364c-0.391,0.391 -1.023,0.391 -1.414,0L13.929,30H3c-1.104,0 -2,0.896 -2,2v1c0,1.104 -0.104,2 1,2h32c1.104,0 1,-0.896 1,-2z"
android:fillColor="#3B88C3"/>
<path
android:pathData="M24.5,14.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
android:fillColor="#FFF"/>
<path
android:pathData="M24.5,14.5m-2.721,0a2.721,2.721 0,1 1,5.442 0a2.721,2.721 0,1 1,-5.442 0"
android:fillColor="#DD2E44"/>
<path
android:pathData="M11.5,14.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
android:fillColor="#FFF"/>
<path
android:pathData="M29,25.5c0,1.381 -1.119,2.5 -2.5,2.5h-17C8.119,28 7,26.881 7,25.5S8.119,23 9.5,23h17c1.381,0 2.5,1.119 2.5,2.5z"
android:fillColor="#F5F8FA"/>
<path
android:pathData="M17,23h2v5h-2zM12,23h2v5h-2zM22,23h2v5h-2zM7,25.5c0,1.21 0.859,2.218 2,2.45v-4.9c-1.141,0.232 -2,1.24 -2,2.45zM27,23.05v4.899c1.141,-0.232 2,-1.24 2,-2.45s-0.859,-2.217 -2,-2.449z"
android:fillColor="#CCD6DD"/>
<path
android:pathData="M11.5,14.5m-2.721,0a2.721,2.721 0,1 1,5.442 0a2.721,2.721 0,1 1,-5.442 0"
android:fillColor="#DD2E44"/>
</vector>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M1,17l8,-7 16,1 1,16 -7,8s0.001,-5.999 -6,-12 -12,-6 -12,-6z"
android:fillColor="#A0041E"/>
<path
android:pathData="M0.973,35s-0.036,-7.979 2.985,-11S15,21.187 15,21.187 14.999,29 11.999,32c-3,3 -11.026,3 -11.026,3z"
android:fillColor="#FFAC33"/>
<path
android:pathData="M8.999,27m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M35.999,0s-10,0 -22,10c-6,5 -6,14 -4,16s11,2 16,-4c10,-12 10,-22 10,-22z"
android:fillColor="#55ACEE"/>
<path
android:fillColor="#FF000000"
android:pathData="M26.999,5c-1.623,0 -3.013,0.971 -3.641,2.36 0.502,-0.227 1.055,-0.36 1.641,-0.36 2.209,0 4,1.791 4,4 0,0.586 -0.133,1.139 -0.359,1.64 1.389,-0.627 2.359,-2.017 2.359,-3.64 0,-2.209 -1.791,-4 -4,-4z"/>
<path
android:pathData="M8,28s0,-4 1,-5 13.001,-10.999 14,-10 -9.001,13 -10.001,14S8,28 8,28z"
android:fillColor="#A0041E"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M24.88,33.097c-0.098,-0.18 -0.25,-0.302 -0.418,-0.391C22.865,31 24,28.999 24,28.999c0,-0.553 1,-2 0,-2l-1,1c-1,1 -1,4 -1,4h-2c-0.553,0 -1,0.447 -1,1 0,0.553 0.447,1 1,1h1.107l-0.222,0.12c-0.486,0.263 -0.667,0.869 -0.404,1.355s0.869,0.667 1.356,0.404l2.639,-1.427c0.486,-0.262 0.667,-0.868 0.404,-1.354zM17.88,33.097c-0.097,-0.18 -0.25,-0.302 -0.417,-0.391C15.866,31 17,28.999 17,28.999c0,-0.553 1,-2 0,-2l-1,1c-1,1 -1,4 -1,4h-2c-0.553,0 -1,0.447 -1,1 0,0.553 0.447,1 1,1h1.108l-0.222,0.12c-0.486,0.263 -0.667,0.869 -0.404,1.355s0.869,0.667 1.356,0.404l2.639,-1.427c0.485,-0.262 0.666,-0.868 0.403,-1.354zM7.516,10c0,1.104 -1.119,2 -2.5,2s-3.5,-1 -3.5,-2 2.119,-2 3.5,-2c1.38,0 2.5,0.896 2.5,2z"
android:fillColor="#FFAC33"/>
<path
android:pathData="M13.516,2c-2,-1 -3,1 -3,1s0,-3 -3,-3 -3,3 -3,3 -3,-0.938 -3,2c0,1.482 1.101,2.411 2.484,2.387V12c0,1 0.263,3 -0.737,4s-2.484,4 0.516,4 3,-4 3,-7c1,1 4,1 4,-4 0,-0.867 -0.213,-1.512 -0.55,-2h1.287c4,0 4,-4 2,-5z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M32.516,9c4,10 0,22 -13,22 -7.732,0 -13,-6 -14,-11 -1.177,-5.883 -1,-8 -1,-12 0,-2.738 2.118,-4.824 5,-4 7,2 5,10 12,10 10,0 8.23,-11.923 11,-5z"
android:fillColor="#E1E8ED"/>
<path
android:pathData="M7.516,8m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#292F33"/>
</vector>

View File

@ -0,0 +1,42 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M5,21c0,2.209 -1.119,4 -2.5,4S0,23.209 0,21s1.119,-4 2.5,-4S5,18.791 5,21z"
android:fillColor="#FFDC5D"/>
<path
android:pathData="M3,18.562C3,10.037 8.373,3.125 15,3.125s12,6.912 12,15.438C27,27.088 21.627,34 15,34S3,27.088 3,18.562z"
android:fillColor="#FFDC5D"/>
<path
android:pathData="M20,0c-0.249,0 -0.478,0.007 -0.713,0.012C19.19,0.01 19.097,0 19,0 9,0 2,4.582 2,9s6.373,4 13,4c4.442,0 7.648,0 9.966,-0.086L25,13l6,15h2s0.343,-3.055 1,-7c1,-6 0.533,-21 -14,-21z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M30,21c0,2.209 -1.119,4 -2.5,4S25,23.209 25,21s1.119,-4 2.5,-4 2.5,1.791 2.5,4z"
android:fillColor="#FFDC5D"/>
<path
android:pathData="M10,21c-0.552,0 -1,-0.447 -1,-1v-2c0,-0.552 0.448,-1 1,-1s1,0.448 1,1v2c0,0.553 -0.448,1 -1,1zM20,21c-0.553,0 -1,-0.447 -1,-1v-2c0,-0.552 0.447,-1 1,-1s1,0.448 1,1v2c0,0.553 -0.447,1 -1,1z"
android:fillColor="#662113"/>
<path
android:pathData="M16,26h-2c-0.552,0 -1,-0.447 -1,-1s0.448,-1 1,-1h2c0.552,0 1,0.447 1,1s-0.448,1 -1,1z"
android:fillColor="#B7755E"/>
<path
android:pathData="M27,25c0,-2 -2.293,-0.707 -3,0 -1,1 -3,3 -5,2 -2.828,-1.414 -4,-1 -4,-1s-1.171,-0.414 -4,1c-2,1 -4,-1 -5,-2 -0.707,-0.707 -3,-2 -3,0s1,2 1,2c-1,2 1,3 1,3 0,3 3,3 3,3 0,3 4,2 4,2 1,1 3,1 3,1s2,0 3,-1c0,0 4,1 4,-2 0,0 3,0 3,-3 0,0 2,-1 1,-3 0,0 1,0 1,-2z"
android:fillColor="#E6E7E8"/>
<path
android:pathData="M15,28c7,0 4,2 0,2s-7,-2 0,-2z"
android:fillColor="#FFDC5D"/>
<path
android:pathData="M1,14a2,4 0,1 0,4 0a2,4 0,1 0,-4 0z"
android:fillColor="#D1D3D4"/>
<path
android:pathData="M24,14a2,4 0,1 0,4 0a2,4 0,1 0,-4 0z"
android:fillColor="#D1D3D4"/>
<path
android:pathData="M32,29m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0"
android:fillColor="#F1F2F2"/>
<path
android:pathData="M29,12c0,1.104 -0.896,2 -2,2H2c-1.104,0 -2,-0.896 -2,-2v-1c0,-1.104 0.896,-2 2,-2h25c1.104,0 2,0.896 2,2v1z"
android:fillColor="#F1F2F2"/>
</vector>

View File

@ -0,0 +1,21 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M16.806,10.675c-0.92,-2.047 -2.003,-4.066 -3.026,-6.26 -0.028,-0.068 -0.051,-0.138 -0.082,-0.206 -0.064,-0.142 -0.137,-0.277 -0.208,-0.413l-0.052,-0.111 -0.002,0.003C11.798,0.698 8.343,-0.674 5.46,0.621 2.414,1.988 1.164,5.813 2.67,9.163c1.505,3.351 5.194,4.957 8.24,3.589 0.106,-0.047 0.205,-0.105 0.306,-0.159 1.935,0.438 1.994,1.877 1.994,1.877s4.618,-1.521 3.596,-3.795zM4.876,8.173c-0.958,-2.133 -0.252,-4.527 1.575,-5.347 1.826,-0.822 4.084,0.242 5.042,2.374 0.958,2.132 0.253,4.526 -1.573,5.346 -1.828,0.821 -4.087,-0.241 -5.044,-2.373z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M26.978,34.868c1.163,-0.657 2.187,-2.474 1.529,-3.638L16.754,10.559c-1.103,0.496 -2.938,2.313 -3.544,3.912l13.768,20.397z"
android:fillColor="#99AAB5"/>
<path
android:pathData="M30.54,0.62c-2.882,-1.295 -6.338,0.077 -7.976,3.067l-0.003,-0.003 -0.053,0.112c-0.071,0.135 -0.145,0.27 -0.208,0.412 -0.03,0.068 -0.053,0.137 -0.081,0.206 -1.023,2.194 -2.107,4.213 -3.026,6.26 -1.021,2.274 3.597,3.796 3.597,3.796s0.059,-1.439 1.993,-1.877c0.102,0.054 0.2,0.111 0.307,0.159 3.045,1.368 6.733,-0.238 8.24,-3.589 1.505,-3.35 0.255,-7.175 -2.79,-8.543zM31.124,8.173c-0.959,2.132 -3.216,3.194 -5.044,2.373 -1.826,-0.82 -2.531,-3.214 -1.572,-5.346 0.956,-2.132 3.214,-3.195 5.041,-2.374 1.827,0.82 2.532,3.214 1.575,5.347z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M9.022,34.868c-1.163,-0.657 -2.187,-2.474 -1.529,-3.638l11.753,-20.671c1.103,0.496 2.938,2.313 3.544,3.912L9.022,34.868z"
android:fillColor="#CCD6DD"/>
<path
android:pathData="M19.562,17.396c0,0.863 -0.701,1.562 -1.562,1.562 -0.863,0 -1.562,-0.699 -1.562,-1.562 0,-0.863 0.699,-1.562 1.562,-1.562 0.862,0 1.562,0.699 1.562,1.562z"
android:fillColor="#99AAB5"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M18,18m-18,0a18,18 0,1 1,36 0a18,18 0,1 1,-36 0"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M10.515,23.621C10.56,23.8 11.683,28 18,28c6.318,0 7.44,-4.2 7.485,-4.379 0.055,-0.217 -0.043,-0.442 -0.237,-0.554 -0.195,-0.111 -0.439,-0.078 -0.6,0.077C24.629,23.163 22.694,25 18,25s-6.63,-1.837 -6.648,-1.855C11.256,23.05 11.128,23 11,23c-0.084,0 -0.169,0.021 -0.246,0.064 -0.196,0.112 -0.294,0.339 -0.239,0.557z"
android:fillColor="#664500"/>
<path
android:pathData="M9.5,13.5a2.5,3.5 0,1 0,5 0a2.5,3.5 0,1 0,-5 0z"
android:fillColor="#664500"/>
<path
android:pathData="M21.5,13.5a2.5,3.5 0,1 0,5 0a2.5,3.5 0,1 0,-5 0z"
android:fillColor="#664500"/>
</vector>

View File

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M22.614,34.845c3.462,-1.154 6.117,-3.034 6.12,-9.373C28.736,21.461 33,17 32.999,12.921 32.998,9 28.384,2.537 17.899,3.635 7.122,4.764 3,8 2.999,15.073c0,4.927 5.304,8.381 8.127,13.518C13,32 18.551,38.187 22.614,34.845z"
android:fillColor="#BE1931"/>
<path
android:pathData="M26.252,3.572c-1.278,-1.044 -3.28,-1.55 -5.35,-1.677 0.273,-0.037 0.542,-0.076 0.82,-0.094 0.973,-0.063 3.614,-1.232 1.4,-1.087 -0.969,0.063 -1.901,0.259 -2.837,0.423 0.237,-0.154 0.479,-0.306 0.74,-0.442C21,0 17,0 14.981,1.688 14.469,1.576 14,1 11,1c-2,0 -4.685,0.926 -3,1 0.917,0.041 2,0 1.858,0.365C9.203,2.425 6,3 6,4c0,0.353 2.76,-0.173 3,0 -1.722,0.644 -3,2 -3,3 0,0.423 2.211,-0.825 3,-1 -1,1 -1.4,1.701 -1.342,2.427 0.038,0.475 2.388,-0.09 2.632,-0.169 0.822,-0.27 3.71,-1.258 4.6,-2.724 0.117,0.285 2.963,1.341 4.11,1.466 0.529,0.058 2.62,0.274 2.141,-0.711C21,6 20,5 19.695,4.025c0.446,-0.019 8.305,0.975 6.557,-0.453z"
android:fillColor="#77B255"/>
<path
android:pathData="M9.339,17.306c-0.136,-1.46 -2.54,-3.252 -2.331,-1 0.136,1.46 2.54,3.252 2.331,1zM16.797,17.859c-0.069,-0.622 -0.282,-1.191 -0.687,-1.671 -0.466,-0.55 -1.075,-0.362 -1.234,0.316 -0.187,0.799 0.082,1.752 0.606,2.372l0.041,0.048c-0.213,-0.525 -0.427,-1.05 -0.642,-1.574l0.006,0.047c0.071,0.64 0.397,1.73 1.136,1.906 0.754,0.182 0.826,-0.988 0.774,-1.444zM22.549,13.018c0.476,-0.955 0.17,-3.962 -0.831,-1.954 -0.476,0.954 -0.171,3.962 0.831,1.954zM29.76,11.561c-0.03,-0.357 -0.073,-0.78 -0.391,-1.01 -1.189,-0.858 -2.381,2.359 -1.385,3.08 0.02,0.012 0.036,0.025 0.055,0.039l-0.331,-0.919c0,0.018 0.001,0.035 0.003,0.052 0.049,0.564 0.376,1.377 1.084,0.948 0.667,-0.406 1.028,-1.444 0.965,-2.19zM28.415,20.128c1.016,-1.569 -0.545,-3.451 -1.78,-1.542 -1.016,1.568 0.546,3.45 1.78,1.542zM22.667,23.022c0.173,-1.938 -2.309,-2.752 -2.51,-0.496 -0.173,1.938 2.309,2.752 2.51,0.496zM12.771,21.81l-0.049,0.004 1.362,0.715c-0.006,-0.004 -0.011,-0.011 -0.018,-0.017 -0.306,-0.28 -1.353,-1.083 -1.788,-0.592 -0.44,0.497 0.498,1.421 0.804,1.703 0.342,0.314 0.928,0.763 1.429,0.73 1.437,-0.093 -0.783,-2.605 -1.74,-2.543zM25.998,27.717c0.969,-1.066 0.725,-4.05 -0.798,-2.376 -0.969,1.066 -0.724,4.05 0.798,2.376zM12.599,13.753c0.093,-0.005 0.187,-0.012 0.28,-0.019 0.703,-0.046 1.004,-1.454 1.042,-1.952 0.044,-0.571 -0.043,-1.456 -0.785,-1.407l-0.281,0.019c-0.702,0.047 -1.004,1.454 -1.042,1.952 -0.044,0.571 0.044,1.457 0.786,1.407zM20.445,29.01c0.395,0.764 0.252,1.623 -0.32,1.919s-1.357,-0.081 -1.753,-0.844c-0.395,-0.764 -0.252,-1.623 0.32,-1.919 0.573,-0.296 1.357,0.081 1.753,0.844z"
android:fillColor="#F4ABBA"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M34.956,17.916c0,-0.503 -0.12,-0.975 -0.321,-1.404 -1.341,-4.326 -7.619,-4.01 -16.549,-4.221 -1.493,-0.035 -0.639,-1.798 -0.115,-5.668 0.341,-2.517 -1.282,-6.382 -4.01,-6.382 -4.498,0 -0.171,3.548 -4.148,12.322 -2.125,4.688 -6.875,2.062 -6.875,6.771v10.719c0,1.833 0.18,3.595 2.758,3.885C8.195,34.219 7.633,36 11.238,36h18.044c1.838,0 3.333,-1.496 3.333,-3.334 0,-0.762 -0.267,-1.456 -0.698,-2.018 1.02,-0.571 1.72,-1.649 1.72,-2.899 0,-0.76 -0.266,-1.454 -0.696,-2.015 1.023,-0.57 1.725,-1.649 1.725,-2.901 0,-0.909 -0.368,-1.733 -0.961,-2.336 0.757,-0.611 1.251,-1.535 1.251,-2.581z"
android:fillColor="#FFDB5E"/>
<path
android:pathData="M23.02,21.249h8.604c1.17,0 2.268,-0.626 2.866,-1.633 0.246,-0.415 0.109,-0.952 -0.307,-1.199 -0.415,-0.247 -0.952,-0.108 -1.199,0.307 -0.283,0.479 -0.806,0.775 -1.361,0.775h-8.81c-0.873,0 -1.583,-0.71 -1.583,-1.583s0.71,-1.583 1.583,-1.583H28.7c0.483,0 0.875,-0.392 0.875,-0.875s-0.392,-0.875 -0.875,-0.875h-5.888c-1.838,0 -3.333,1.495 -3.333,3.333 0,1.025 0.475,1.932 1.205,2.544 -0.615,0.605 -0.998,1.445 -0.998,2.373 0,1.028 0.478,1.938 1.212,2.549 -0.611,0.604 -0.99,1.441 -0.99,2.367 0,1.12 0.559,2.108 1.409,2.713 -0.524,0.589 -0.852,1.356 -0.852,2.204 0,1.838 1.495,3.333 3.333,3.333h5.484c1.17,0 2.269,-0.625 2.867,-1.632 0.247,-0.415 0.11,-0.952 -0.305,-1.199 -0.416,-0.245 -0.953,-0.11 -1.199,0.305 -0.285,0.479 -0.808,0.776 -1.363,0.776h-5.484c-0.873,0 -1.583,-0.71 -1.583,-1.583s0.71,-1.583 1.583,-1.583h6.506c1.17,0 2.27,-0.626 2.867,-1.633 0.247,-0.416 0.11,-0.953 -0.305,-1.199 -0.419,-0.251 -0.954,-0.11 -1.199,0.305 -0.289,0.487 -0.799,0.777 -1.363,0.777h-7.063c-0.873,0 -1.583,-0.711 -1.583,-1.584s0.71,-1.583 1.583,-1.583h8.091c1.17,0 2.269,-0.625 2.867,-1.632 0.247,-0.415 0.11,-0.952 -0.305,-1.199 -0.417,-0.246 -0.953,-0.11 -1.199,0.305 -0.289,0.486 -0.799,0.776 -1.363,0.776H23.02c-0.873,0 -1.583,-0.71 -1.583,-1.583s0.709,-1.584 1.583,-1.584z"
android:fillColor="#EE9547"/>
</vector>

View File

@ -0,0 +1,72 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M0,34h36v2H0z"
android:fillColor="#939598"/>
<path
android:pathData="M6,27h29v5H6z"
android:fillColor="#231F20"/>
<path
android:pathData="M6.999,32m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0"
android:fillColor="#58595B"/>
<path
android:pathData="M12.999,32m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0"
android:fillColor="#58595B"/>
<path
android:pathData="M6.999,32m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"
android:fillColor="#A0041E"/>
<path
android:pathData="M12.999,32m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"
android:fillColor="#A0041E"/>
<path
android:pathData="M5,33H1c-1,0 -1.5,-0.5 0,-2l4,-4c1,-1 2,-2.001 2,0v4c0,2 -0.001,2 -2,2z"
android:fillColor="#DD2E44"/>
<path
android:pathData="M8,20c0,3.313 -1.343,6 -3,6s-3,-2.687 -3,-6c0,-3.314 1.343,-6 3,-6s3,2.686 3,6z"
android:fillColor="#231F20"/>
<path
android:pathData="M11,15H7L5,7h8z"
android:fillColor="#6D6E71"/>
<path
android:pathData="M26,25c0,1.104 -0.896,2 -2,2H6c-1.104,0 -2,-0.896 -2,-2V15c0,-1.104 0.896,-2 2,-2h18c1.104,0 2,0.896 2,2v10z"
android:fillColor="#414042"/>
<path
android:pathData="M13,26c0,0.553 -0.448,1 -1,1s-1,-0.447 -1,-1L11,13c0,-0.552 0.448,-1 1,-1s1,0.448 1,1v13zM19,26c0,0.553 -0.447,1 -1,1 -0.553,0 -1,-0.447 -1,-1L17,13c0,-0.552 0.447,-1 1,-1 0.553,0 1,0.448 1,1v13z"
android:fillColor="#C1694F"/>
<path
android:pathData="M36,26c0,0.553 -0.447,1 -1,1H7c-0.552,0 -1,-0.447 -1,-1 0,-0.553 0.448,-1 1,-1h28c0.553,0 1,0.447 1,1z"
android:fillColor="#808285"/>
<path
android:pathData="M29.999,31m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0"
android:fillColor="#58595B"/>
<path
android:pathData="M21.999,31m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0"
android:fillColor="#58595B"/>
<path
android:pathData="M29.999,31m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0"
android:fillColor="#A0041E"/>
<path
android:pathData="M21.999,31m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0"
android:fillColor="#A0041E"/>
<path
android:pathData="M12,3H6c-0.552,0 -1,0.448 -1,1v3h8V4c0,-0.552 -0.448,-1 -1,-1z"
android:fillColor="#414042"/>
<path
android:pathData="M23,7h12v18H23z"
android:fillColor="#BE1931"/>
<path
android:pathData="M36,6c0,0.552 -0.447,1 -1,1H23c-0.553,0 -1,-0.448 -1,-1s0.447,-1 1,-1h12c0.553,0 1,0.448 1,1z"
android:fillColor="#A0041E"/>
<path
android:pathData="M25,18h8v5h-8z"
android:fillColor="#EA596E"/>
<path
android:pathData="M30,32h-8c-0.127,0 -0.253,-0.024 -0.371,-0.071L16.807,30H10c-0.552,0 -1,-0.447 -1,-1s0.448,-1 1,-1h7c0.128,0 0.253,0.024 0.372,0.071L22.192,30H30c0.553,0 1,0.447 1,1s-0.447,1 -1,1z"
android:fillColor="#F4900C"/>
<path
android:pathData="M33,10c0,-0.552 -0.447,-1 -1,-1h-6c-0.553,0 -1,0.448 -1,1v5c0,0.552 0.447,1 1,1h6c0.553,0 1,-0.448 1,-1v-5z"
android:fillColor="#55ACEE"/>
</vector>

View File

@ -0,0 +1,54 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M22,33c0,2.209 -1.791,3 -4,3s-4,-0.791 -4,-3l1,-9c0,-2.209 0.791,-2 3,-2s3,-0.209 3,2l1,9z"
android:fillColor="#662113"/>
<path
android:pathData="M34,17c0,8.837 -7.163,12 -16,12 -8.836,0 -16,-3.163 -16,-12C2,8.164 11,0 18,0s16,8.164 16,17z"
android:fillColor="#5C913B"/>
<path
android:pathData="M4,21a2,1 0,1 0,4 0a2,1 0,1 0,-4 0z"
android:fillColor="#3E721D"/>
<path
android:pathData="M28,21a2,1 0,1 0,4 0a2,1 0,1 0,-4 0z"
android:fillColor="#3E721D"/>
<path
android:pathData="M8,25a2,1 0,1 0,4 0a2,1 0,1 0,-4 0z"
android:fillColor="#3E721D"/>
<path
android:pathData="M12,22a2,1 0,1 0,4 0a2,1 0,1 0,-4 0z"
android:fillColor="#3E721D"/>
<path
android:pathData="M8,16a2,1 0,1 0,4 0a2,1 0,1 0,-4 0z"
android:fillColor="#3E721D"/>
<path
android:pathData="M5,12a2,1 0,1 0,4 0a2,1 0,1 0,-4 0z"
android:fillColor="#3E721D"/>
<path
android:pathData="M27,12a2,1 0,1 0,4 0a2,1 0,1 0,-4 0z"
android:fillColor="#3E721D"/>
<path
android:pathData="M12,10a2,1 0,1 0,4 0a2,1 0,1 0,-4 0z"
android:fillColor="#3E721D"/>
<path
android:pathData="M20,10a2,1 0,1 0,4 0a2,1 0,1 0,-4 0z"
android:fillColor="#3E721D"/>
<path
android:pathData="M24,16a2,1 0,1 0,4 0a2,1 0,1 0,-4 0z"
android:fillColor="#3E721D"/>
<path
android:pathData="M16,17a2,1 0,1 0,4 0a2,1 0,1 0,-4 0z"
android:fillColor="#3E721D"/>
<path
android:pathData="M20,22a2,1 0,1 0,4 0a2,1 0,1 0,-4 0z"
android:fillColor="#3E721D"/>
<path
android:pathData="M16,26a2,1 0,1 0,4 0a2,1 0,1 0,-4 0z"
android:fillColor="#3E721D"/>
<path
android:pathData="M24,25a2,1 0,1 0,4 0a2,1 0,1 0,-4 0z"
android:fillColor="#3E721D"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M5.123,5h6C12.227,5 13,4.896 13,6L13,4c0,-1.104 -0.773,-2 -1.877,-2h-8c-2,0 -3.583,2.125 -3,5 0,0 1.791,9.375 1.917,9.958C2.373,18.5 4.164,20 6.081,20h6.958c1.105,0 -0.039,-1.896 -0.039,-3v-2c0,1.104 -0.773,2 -1.877,2h-4c-1.104,0 -1.833,-1.042 -2,-2S3.539,7.667 3.539,7.667C3.206,5.75 4.018,5 5.123,5zM30.935,5h-6C23.831,5 22,4.896 22,6L22,4c0,-1.104 1.831,-2 2.935,-2h8c2,0 3.584,2.125 3,5 0,0 -1.633,9.419 -1.771,10 -0.354,1.5 -2.042,3 -4,3h-7.146C21.914,20 22,18.104 22,17v-2c0,1.104 1.831,2 2.935,2h4c1.104,0 1.834,-1.042 2,-2s1.584,-7.333 1.584,-7.333C32.851,5.75 32.04,5 30.935,5zM20.832,22c0,-6.958 -2.709,0 -2.709,0s-3,-6.958 -3,0 -3.291,10 -3.291,10h12.292c-0.001,0 -3.292,-3.042 -3.292,-10z"
android:fillColor="#FFAC33"/>
<path
android:pathData="M29.123,6.577c0,6.775 -6.77,18.192 -11,18.192 -4.231,0 -11,-11.417 -11,-18.192 0,-5.195 1,-6.319 3,-6.319 1.374,0 6.025,-0.027 8,-0.027l7,-0.001c2.917,-0.001 4,0.684 4,6.347z"
android:fillColor="#FFCC4D"/>
<path
android:pathData="M27,33c0,1.104 0.227,2 -0.877,2h-16C9.018,35 9,34.104 9,33v-1c0,-1.104 1.164,-2 2.206,-2h13.917c1.042,0 1.877,0.896 1.877,2v1z"
android:fillColor="#C1694F"/>
<path
android:pathData="M29,34.625c0,0.76 0.165,1.375 -1.252,1.375H8.498C7.206,36 7,35.385 7,34.625v-0.25C7,33.615 7.738,33 8.498,33h19.25c0.759,0 1.252,0.615 1.252,1.375v0.25z"
android:fillColor="#C1694F"/>
</vector>

View File

@ -0,0 +1,21 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M5.622,33.051l-2.674,-2.673L23.337,9.987c3.344,-3.343 1.337,-8.021 2.007,-8.689 0.666,-0.67 1.335,-0.002 1.335,-0.002l8.023,8.023c0.668,0.668 0,1.336 0,1.336 -0.669,0.67 -5.778,-0.908 -8.692,2.006L5.622,33.051z"
android:fillColor="#FCAB40"/>
<path
android:pathData="M5.457,33.891c0.925,-0.925 0.925,-2.424 0,-3.35 -0.924,-0.924 -2.424,-0.924 -3.349,0l0.087,0.087c-0.371,-0.334 -0.938,-0.331 -1.296,0.027 -0.369,0.368 -0.369,0.968 0,1.336L4.008,35.1c0.37,0.369 0.968,0.369 1.337,0 0.355,-0.356 0.36,-0.919 0.032,-1.29l0.08,0.081z"
android:fillColor="#CCD6DD"/>
<path
android:pathData="M13.31,33.709c-1.516,0 -2.939,-0.59 -4.011,-1.661 -1.071,-1.07 -1.661,-2.495 -1.661,-4.011 0,-1.515 0.59,-2.939 1.661,-4.011L19.995,13.33c1.071,-1.071 2.496,-1.661 4.012,-1.661 1.515,0 2.94,0.59 4.011,1.661 2.211,2.212 2.211,5.811 0,8.022L17.322,32.047c-1.072,1.071 -2.496,1.662 -4.012,1.662zM24.007,15.45c-0.506,0 -0.98,0.197 -1.338,0.554L11.974,26.7c-0.357,0.357 -0.554,0.832 -0.554,1.337 0,0.506 0.197,0.979 0.553,1.336 0.358,0.357 0.832,0.555 1.337,0.555s0.98,-0.197 1.337,-0.555l10.696,-10.695c0.737,-0.737 0.736,-1.937 -0.001,-2.674 -0.356,-0.357 -0.83,-0.554 -1.335,-0.554z"
android:fillColor="#FCAB40"/>
<path
android:pathData="M25.344,24.026c0.736,0.738 1.936,0.738 2.674,0 0.738,-0.739 0.738,-1.937 0,-2.674l-8.022,-8.023c-0.739,-0.738 -1.935,-0.738 -2.673,0 -0.739,0.739 -0.739,1.937 0,2.675l8.021,8.022zM21.332,28.037c0.738,0.738 1.937,0.738 2.674,0 0.738,-0.739 0.738,-1.936 0.002,-2.674l-8.023,-8.023c-0.739,-0.738 -1.936,-0.738 -2.675,0 -0.738,0.738 -0.738,1.936 0,2.675l8.022,8.022zM17.322,32.048c0.738,0.738 1.934,0.738 2.673,0 0.738,-0.738 0.738,-1.937 0,-2.674l-8.021,-8.022c-0.739,-0.738 -1.936,-0.738 -2.675,0 -0.738,0.737 -0.738,1.935 0,2.674l8.023,8.022z"
android:fillColor="#FCAB40"/>
<path
android:pathData="M14.648,13.329c0.369,0.369 0.968,0.369 1.337,0l1.337,-1.336c0.369,-0.369 0.369,-0.968 0,-1.338 -0.37,-0.369 -0.968,-0.369 -1.337,0l-1.337,1.338c-0.37,0.369 -0.37,0.967 0,1.336zM10.637,17.341c0.37,0.371 0.967,0.37 1.337,0l1.336,-1.337c0.37,-0.37 0.371,-0.967 0,-1.337 -0.369,-0.37 -0.967,-0.37 -1.337,0l-1.337,1.337c-0.369,0.37 -0.369,0.968 0.001,1.337zM6.625,21.353c0.37,0.37 0.967,0.37 1.337,0l1.337,-1.338c0.37,-0.369 0.37,-0.967 0,-1.337 -0.369,-0.369 -0.967,-0.369 -1.336,0l-1.337,1.338c-0.37,0.369 -0.37,0.967 -0.001,1.337z"
android:fillColor="#CCD6DD"/>
</vector>

View File

@ -0,0 +1,21 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M9.842,19.922c0,9.842 6.575,9.673 5.158,10.078 -7,2 -8.803,-7.618 -9.464,-7.618 -2.378,0 -5.536,-0.423 -5.536,-2.46C0,17.883 2.46,15 6.151,15c2.379,0 3.691,2.883 3.691,4.922zM36,28.638c0,1.104 -3.518,-0.741 -5,0 -2,1 -2,-0.896 -2,-2s1.343,-1 3,-1 4,1.895 4,3z"
android:fillColor="#77B255"/>
<path
android:pathData="M16.715,33.143c0,2.761 -1.279,2.857 -2.857,2.857S11,35.903 11,33.143c0,-0.489 0.085,-1.029 0.234,-1.587 0.69,-2.59 2.754,-5.556 4.052,-5.556 1.578,0 1.429,4.382 1.429,7.143zM25.286,33.143c0,2.761 1.278,2.857 2.856,2.857C29.721,36 31,35.903 31,33.143c0,-0.489 -0.085,-1.029 -0.234,-1.587 -0.691,-2.59 -2.754,-5.556 -4.052,-5.556 -1.578,0 -1.428,4.382 -1.428,7.143z"
android:fillColor="#77B255"/>
<path
android:pathData="M32,27c0,4 -5.149,4 -11.5,4S9,31 9,27c0,-6.627 5.149,-12 11.5,-12S32,20.373 32,27z"
android:fillColor="#3E721D"/>
<path
android:pathData="M5,18m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"
android:fillColor="#292F33"/>
<path
android:pathData="M23.667,25.1c0,3.591 -1.418,3.9 -3.167,3.9s-3.167,-0.31 -3.167,-3.9S18.75,17 20.5,17s3.167,4.51 3.167,8.1zM30,24c0.871,3.482 -0.784,4 -2.533,4 -1.749,0 -2.533,0.69 -2.533,-2.9s-1.116,-6.5 0.633,-6.5C27.315,18.6 29,20 30,24zM16.067,25.1c0,3.591 -0.785,2.9 -2.534,2.9s-3.404,-0.518 -2.533,-4c1,-4 3.251,-5.4 5,-5.4 1.75,0 0.067,2.91 0.067,6.5z"
android:fillColor="#5C913B"/>
</vector>

View File

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M9,28.5c0,-0.828 0.672,-1.5 1.5,-1.5s1.5,0.672 1.5,1.5v0.5s0,3 3,3 3,-3 3,-3V3.5c0,-0.829 0.671,-1.5 1.5,-1.5s1.5,0.671 1.5,1.5V29s0,6 -6,6 -6,-6 -6,-6v-0.5z"
android:fillColor="#66757F"/>
<path
android:pathData="M19.5,4C28.612,4 36,9.82 36,17c0,0 0,2 -1,2s-3,-2 -3,-2H7s-2,2 -3,2 -1,-2 -1,-2C3,9.82 10.387,4 19.5,4z"
android:fillColor="#744EAA"/>
<path
android:pathData="M19.5,4C26.403,4 32,9.82 32,17c0,0 0,2 -2,2s-5,-2 -5,-2H14s-3,2 -5,2 -2,-2 -2,-2C7,9.82 12.596,4 19.5,4z"
android:fillColor="#9266CC"/>
<path
android:pathData="M19.5,4C23.09,4 25,9.82 25,17c0,0 -3,2 -5,2h-1c-2,0 -5,-2 -5,-2 0,-7.18 1.91,-13 5.5,-13z"
android:fillColor="#744EAA"/>
</vector>

View File

@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M36,19.854C33.518,9.923 25.006,1.909 16.031,6.832c0,0 -4.522,-1.496 -5.174,-1.948 -0.635,-0.44 -1.635,-0.904 -0.912,0.436 0.423,0.782 0.875,1.672 2.403,3.317C8,12.958 9.279,18.262 7.743,21.75c-1.304,2.962 -2.577,4.733 -1.31,6.976 1.317,2.33 4.729,3.462 7.018,1.06 1.244,-1.307 0.471,-1.937 3.132,-4.202 2.723,-0.543 4.394,-1.791 4.394,-4.375 0,0 0.795,-0.382 1.826,6.009 0.456,2.818 -0.157,5.632 -0.039,8.783H36V19.854z"
android:fillColor="#C1CDD5"/>
<path
android:pathData="M31.906,6.062c0.531,1.312 0.848,3.71 0.595,5.318 -0.15,-3.923 -3.188,-6.581 -4.376,-7.193 -2.202,-1.137 -4.372,-0.979 -6.799,-0.772 0.111,0.168 0.403,0.814 0.32,1.547 -0.479,-0.875 -1.604,-1.42 -2.333,-1.271 -1.36,0.277 -2.561,0.677 -3.475,1.156 -0.504,0.102 -1.249,0.413 -2.372,1.101 -1.911,1.171 -4.175,4.338 -6.737,3.511 1.042,2.5 3.631,1.845 3.631,1.845 1.207,-1.95 4.067,-3.779 6.168,-4.452 7.619,-1.745 12.614,3.439 15.431,9.398 0.768,1.625 2.611,7.132 4.041,10.292V10.956c-0.749,-1.038 -1.281,-3.018 -4.094,-4.894z"
android:fillColor="#60379A"/>
<path
android:pathData="M13.789,3.662c0.573,0.788 3.236,0.794 4.596,3.82 1.359,3.026 -1.943,2.63 -3.14,1.23 -1.334,-1.561 -1.931,-2.863 -2.165,-3.992 -0.124,-0.596 -0.451,-2.649 0.709,-1.058z"
android:fillColor="#C1CDD5"/>
<path
android:pathData="M14.209,4.962c0.956,0.573 2.164,1.515 2.517,2.596 0.351,1.081 -0.707,0.891 -1.349,-0.042 -0.641,-0.934 -0.94,-1.975 -1.285,-2.263 -0.346,-0.289 0.117,-0.291 0.117,-0.291z"
android:fillColor="#758795"/>
<path
android:pathData="M15.255,14.565m-0.946,0a0.946,0.946 0,1 1,1.892 0a0.946,0.946 0,1 1,-1.892 0"
android:fillColor="#292F33"/>
<path
android:pathData="M8.63,26.877c0.119,0.658 -0.181,1.263 -0.67,1.351 -0.49,0.089 -0.984,-0.372 -1.104,-1.03 -0.119,-0.659 0.182,-1.265 0.671,-1.354 0.49,-0.088 0.984,0.373 1.103,1.033z"
android:fillColor="#53626C"/>
<path
android:pathData="M13.844,8.124l0.003,-0.002 -0.005,-0.007 -0.016,-0.014c-0.008,-0.007 -0.011,-0.019 -0.019,-0.025 -0.009,-0.007 -0.021,-0.011 -0.031,-0.018C12.621,7.078 0.933,-0.495 0.219,0.219 -0.51,0.948 10.443,9.742 11.149,10.28l0.011,0.006 0.541,0.439c0.008,0.007 0.01,0.018 0.018,0.024 0.013,0.01 0.028,0.015 0.042,0.024l0.047,0.038 -0.009,-0.016c0.565,0.361 1.427,0.114 1.979,-0.592 0.559,-0.715 0.577,-1.625 0.066,-2.079z"
android:fillColor="#EE7C0E"/>
<path
android:pathData="M4.677,2.25l0.009,-0.025c-0.301,-0.174 -0.594,-0.341 -0.878,-0.5 -0.016,0.038 -0.022,0.069 -0.041,0.11 -0.112,0.243 -0.256,0.484 -0.429,0.716 -0.166,0.224 -0.349,0.424 -0.541,0.595 -0.02,0.018 -0.036,0.026 -0.056,0.043 0.238,0.22 0.489,0.446 0.745,0.676 0.234,-0.21 0.456,-0.449 0.654,-0.717 0.214,-0.287 0.395,-0.589 0.537,-0.898zM6.952,5.195c0.306,-0.41 0.521,-0.822 0.66,-1.212 -0.292,-0.181 -0.584,-0.36 -0.876,-0.538 -0.076,0.298 -0.247,0.699 -0.586,1.152 -0.31,0.417 -0.613,0.681 -0.864,0.845 0.259,0.223 0.52,0.445 0.779,0.665 0.314,-0.244 0.619,-0.552 0.887,-0.912zM9.87,7.32c0.365,-0.49 0.609,-0.983 0.734,-1.437l-0.906,-0.586c-0.023,0.296 -0.172,0.81 -0.631,1.425 -0.412,0.554 -0.821,0.847 -1.1,0.978l0.814,0.671c0.381,-0.256 0.761,-0.611 1.089,-1.051z"
android:fillColor="#C43512"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36">
<path
android:pathData="M27.989,19.977c-0.622,0 -1.225,0.078 -1.806,0.213L15.811,9.818c0.134,-0.581 0.212,-1.184 0.212,-1.806C16.023,3.587 12.436,0 8.012,0 7.11,0 5.91,0.916 6.909,1.915l2.997,2.997s0.999,1.998 -0.999,3.995 -3.996,0.998 -3.996,0.998L1.915,6.909C0.916,5.91 0,7.105 0,8.012c0,4.425 3.587,8.012 8.012,8.012 0.622,0 1.225,-0.078 1.806,-0.212l10.371,10.371c-0.135,0.581 -0.213,1.184 -0.213,1.806 0,4.425 3.588,8.011 8.012,8.011 0.901,0 2.101,-0.916 1.102,-1.915l-2.997,-2.997s-0.999,-1.998 0.999,-3.995 3.995,-0.999 3.995,-0.999l2.997,2.997c1,0.999 1.916,-0.196 1.916,-1.102 0,-4.425 -3.587,-8.012 -8.011,-8.012z"
android:fillColor="#8899A6"/>
</vector>

View File

@ -18,11 +18,14 @@ package im.vector.riotx.features.debug.sas
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.widget.TextView import android.widget.TextView
import androidx.core.content.ContextCompat
import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyAttribute
import com.airbnb.epoxy.EpoxyModelClass import com.airbnb.epoxy.EpoxyModelClass
import im.vector.matrix.android.api.session.crypto.verification.EmojiRepresentation import im.vector.matrix.android.api.session.crypto.verification.EmojiRepresentation
import im.vector.riotx.core.epoxy.VectorEpoxyHolder import im.vector.riotx.core.epoxy.VectorEpoxyHolder
import im.vector.riotx.core.epoxy.VectorEpoxyModel import im.vector.riotx.core.epoxy.VectorEpoxyModel
import me.gujun.android.span.image
import me.gujun.android.span.span
@EpoxyModelClass(layout = im.vector.riotx.R.layout.item_sas_emoji) @EpoxyModelClass(layout = im.vector.riotx.R.layout.item_sas_emoji)
abstract class SasEmojiItem : VectorEpoxyModel<SasEmojiItem.Holder>() { abstract class SasEmojiItem : VectorEpoxyModel<SasEmojiItem.Holder>() {
@ -36,7 +39,12 @@ abstract class SasEmojiItem : VectorEpoxyModel<SasEmojiItem.Holder>() {
override fun bind(holder: Holder) { override fun bind(holder: Holder) {
super.bind(holder) super.bind(holder)
holder.indexView.text = "$index:" holder.indexView.text = "$index:"
holder.emojiView.text = emojiRepresentation.emoji holder.emojiView.text = span {
+emojiRepresentation.emoji
emojiRepresentation.drawableRes?.let {
image(ContextCompat.getDrawable(holder.view.context, it)!!)
}
}
holder.textView.setText(emojiRepresentation.nameResId) holder.textView.setText(emojiRepresentation.nameResId)
holder.idView.text = holder.idView.resources.getResourceEntryName(emojiRepresentation.nameResId) holder.idView.text = holder.idView.resources.getResourceEntryName(emojiRepresentation.nameResId)
} }

View File

@ -23,6 +23,7 @@
} }
</style> </style>
</head> </head>
<body> <body>
@ -566,5 +567,13 @@ Apache License
of your accepting any such warranty or additional liability. of your accepting any such warranty or additional liability.
</pre> </pre>
<pre>
CC-BY 4.0
<li>
<b>Twitter/twemoji Graphics</b>
<br/>
</li>
</pre>
</body> </body>
</html> </html>

View File

@ -37,6 +37,7 @@ import im.vector.riotx.features.crypto.verification.cancel.VerificationNotMeFrag
import im.vector.riotx.features.crypto.verification.choose.VerificationChooseMethodFragment import im.vector.riotx.features.crypto.verification.choose.VerificationChooseMethodFragment
import im.vector.riotx.features.crypto.verification.conclusion.VerificationConclusionFragment import im.vector.riotx.features.crypto.verification.conclusion.VerificationConclusionFragment
import im.vector.riotx.features.crypto.verification.emoji.VerificationEmojiCodeFragment import im.vector.riotx.features.crypto.verification.emoji.VerificationEmojiCodeFragment
import im.vector.riotx.features.crypto.verification.qrconfirmation.VerificationQRWaitingFragment
import im.vector.riotx.features.crypto.verification.qrconfirmation.VerificationQrScannedByOtherFragment import im.vector.riotx.features.crypto.verification.qrconfirmation.VerificationQrScannedByOtherFragment
import im.vector.riotx.features.crypto.verification.request.VerificationRequestFragment import im.vector.riotx.features.crypto.verification.request.VerificationRequestFragment
import im.vector.riotx.features.grouplist.GroupListFragment import im.vector.riotx.features.grouplist.GroupListFragment
@ -339,6 +340,11 @@ interface FragmentModule {
@FragmentKey(VerificationQrScannedByOtherFragment::class) @FragmentKey(VerificationQrScannedByOtherFragment::class)
fun bindVerificationQrScannedByOtherFragment(fragment: VerificationQrScannedByOtherFragment): Fragment fun bindVerificationQrScannedByOtherFragment(fragment: VerificationQrScannedByOtherFragment): Fragment
@Binds
@IntoMap
@FragmentKey(VerificationQRWaitingFragment::class)
fun bindVerificationQRWaitingFragment(fragment: VerificationQRWaitingFragment): Fragment
@Binds @Binds
@IntoMap @IntoMap
@FragmentKey(VerificationConclusionFragment::class) @FragmentKey(VerificationConclusionFragment::class)

View File

@ -192,6 +192,6 @@ fun Context.toast(resId: Int) {
} }
// Not in KTX anymore // Not in KTX anymore
fun Context.toast(message: String?) { fun Context.toast(message: String) {
Toast.makeText(this, message ?: getString(R.string.generic_exception_error), Toast.LENGTH_SHORT).show() Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
} }

View File

@ -16,6 +16,7 @@
package im.vector.riotx.features.crypto.quads package im.vector.riotx.features.crypto.quads
import androidx.lifecycle.viewModelScope
import com.airbnb.mvrx.MvRx import com.airbnb.mvrx.MvRx
import com.airbnb.mvrx.MvRxState import com.airbnb.mvrx.MvRxState
import com.airbnb.mvrx.MvRxViewModelFactory import com.airbnb.mvrx.MvRxViewModelFactory
@ -34,9 +35,9 @@ import im.vector.riotx.core.platform.VectorViewModel
import im.vector.riotx.core.platform.WaitingViewData import im.vector.riotx.core.platform.WaitingViewData
import im.vector.riotx.core.resources.StringProvider import im.vector.riotx.core.resources.StringProvider
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import timber.log.Timber
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
data class SharedSecureStorageViewState( data class SharedSecureStorageViewState(
@ -77,7 +78,7 @@ class SharedSecureStorageViewModel @AssistedInject constructor(
private fun handleSubmitPassphrase(action: SharedSecureStorageAction.SubmitPassphrase) { private fun handleSubmitPassphrase(action: SharedSecureStorageAction.SubmitPassphrase) {
val decryptedSecretMap = HashMap<String, String>() val decryptedSecretMap = HashMap<String, String>()
GlobalScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
runCatching { runCatching {
_viewEvents.post(SharedSecureStorageViewEvent.ShowModalLoading) _viewEvents.post(SharedSecureStorageViewEvent.ShowModalLoading)
val passphrase = action.passphrase val passphrase = action.passphrase
@ -116,14 +117,18 @@ class SharedSecureStorageViewModel @AssistedInject constructor(
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
args.requestedSecrets.forEach { args.requestedSecrets.forEach {
val res = awaitCallback<String> { callback -> if (session.getAccountDataEvent(it) != null) {
session.sharedSecretStorageService.getSecret( val res = awaitCallback<String> { callback ->
name = it, session.sharedSecretStorageService.getSecret(
keyId = keyInfo.id, name = it,
secretKey = keySpec, keyId = keyInfo.id,
callback = callback) secretKey = keySpec,
callback = callback)
}
decryptedSecretMap[it] = res
} else {
Timber.w("## Cannot find secret $it in SSSS, skip")
} }
decryptedSecretMap[it] = res
} }
} }
}.fold({ }.fold({

View File

@ -32,6 +32,7 @@ import com.airbnb.mvrx.MvRx
import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.fragmentViewModel
import com.airbnb.mvrx.withState import com.airbnb.mvrx.withState
import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.Session
import im.vector.matrix.android.api.session.crypto.crosssigning.KEYBACKUP_SECRET_SSSS_NAME
import im.vector.matrix.android.api.session.crypto.crosssigning.MASTER_KEY_SSSS_NAME import im.vector.matrix.android.api.session.crypto.crosssigning.MASTER_KEY_SSSS_NAME
import im.vector.matrix.android.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME import im.vector.matrix.android.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME
import im.vector.matrix.android.api.session.crypto.crosssigning.USER_SIGNING_KEY_SSSS_NAME import im.vector.matrix.android.api.session.crypto.crosssigning.USER_SIGNING_KEY_SSSS_NAME
@ -49,6 +50,7 @@ import im.vector.riotx.features.crypto.verification.cancel.VerificationNotMeFrag
import im.vector.riotx.features.crypto.verification.choose.VerificationChooseMethodFragment import im.vector.riotx.features.crypto.verification.choose.VerificationChooseMethodFragment
import im.vector.riotx.features.crypto.verification.conclusion.VerificationConclusionFragment import im.vector.riotx.features.crypto.verification.conclusion.VerificationConclusionFragment
import im.vector.riotx.features.crypto.verification.emoji.VerificationEmojiCodeFragment import im.vector.riotx.features.crypto.verification.emoji.VerificationEmojiCodeFragment
import im.vector.riotx.features.crypto.verification.qrconfirmation.VerificationQRWaitingFragment
import im.vector.riotx.features.crypto.verification.qrconfirmation.VerificationQrScannedByOtherFragment import im.vector.riotx.features.crypto.verification.qrconfirmation.VerificationQrScannedByOtherFragment
import im.vector.riotx.features.crypto.verification.request.VerificationRequestFragment import im.vector.riotx.features.crypto.verification.request.VerificationRequestFragment
import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.home.AvatarRenderer
@ -108,7 +110,7 @@ class VerificationBottomSheet : VectorBaseBottomSheetDialogFragment() {
startActivityForResult(SharedSecureStorageActivity.newIntent( startActivityForResult(SharedSecureStorageActivity.newIntent(
requireContext(), requireContext(),
null, // use default key null, // use default key
listOf(MASTER_KEY_SSSS_NAME, USER_SIGNING_KEY_SSSS_NAME, SELF_SIGNING_KEY_SSSS_NAME), listOf(MASTER_KEY_SSSS_NAME, USER_SIGNING_KEY_SSSS_NAME, SELF_SIGNING_KEY_SSSS_NAME, KEYBACKUP_SECRET_SSSS_NAME),
SharedSecureStorageActivity.DEFAULT_RESULT_KEYSTORE_ALIAS SharedSecureStorageActivity.DEFAULT_RESULT_KEYSTORE_ALIAS
), SECRET_REQUEST_CODE) ), SECRET_REQUEST_CODE)
} }
@ -243,6 +245,13 @@ class VerificationBottomSheet : VectorBaseBottomSheetDialogFragment() {
showFragment(VerificationQrScannedByOtherFragment::class, Bundle()) showFragment(VerificationQrScannedByOtherFragment::class, Bundle())
return@withState return@withState
} }
is VerificationTxState.Started,
is VerificationTxState.WaitingOtherReciprocateConfirm -> {
showFragment(VerificationQRWaitingFragment::class, Bundle().apply {
putParcelable(MvRx.KEY_ARG, VerificationQRWaitingFragment.Args(state.isMe, state.otherUserMxItem?.getBestName() ?: ""))
})
return@withState
}
is VerificationTxState.Verified -> { is VerificationTxState.Verified -> {
showFragment(VerificationConclusionFragment::class, Bundle().apply { showFragment(VerificationConclusionFragment::class, Bundle().apply {
putParcelable(MvRx.KEY_ARG, VerificationConclusionFragment.Args(true, null, state.isMe)) putParcelable(MvRx.KEY_ARG, VerificationConclusionFragment.Args(true, null, state.isMe))

View File

@ -15,6 +15,7 @@
*/ */
package im.vector.riotx.features.crypto.verification package im.vector.riotx.features.crypto.verification
import androidx.lifecycle.viewModelScope
import com.airbnb.mvrx.Async import com.airbnb.mvrx.Async
import com.airbnb.mvrx.Fail import com.airbnb.mvrx.Fail
import com.airbnb.mvrx.FragmentViewModelContext import com.airbnb.mvrx.FragmentViewModelContext
@ -28,6 +29,7 @@ import com.squareup.inject.assisted.Assisted
import com.squareup.inject.assisted.AssistedInject import com.squareup.inject.assisted.AssistedInject
import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.Session
import im.vector.matrix.android.api.session.crypto.crosssigning.KEYBACKUP_SECRET_SSSS_NAME
import im.vector.matrix.android.api.session.crypto.crosssigning.MASTER_KEY_SSSS_NAME import im.vector.matrix.android.api.session.crypto.crosssigning.MASTER_KEY_SSSS_NAME
import im.vector.matrix.android.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME import im.vector.matrix.android.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME
import im.vector.matrix.android.api.session.crypto.crosssigning.USER_SIGNING_KEY_SSSS_NAME import im.vector.matrix.android.api.session.crypto.crosssigning.USER_SIGNING_KEY_SSSS_NAME
@ -46,10 +48,15 @@ import im.vector.matrix.android.api.util.MatrixItem
import im.vector.matrix.android.api.util.toMatrixItem import im.vector.matrix.android.api.util.toMatrixItem
import im.vector.matrix.android.internal.crypto.crosssigning.fromBase64 import im.vector.matrix.android.internal.crypto.crosssigning.fromBase64
import im.vector.matrix.android.internal.crypto.crosssigning.isVerified import im.vector.matrix.android.internal.crypto.crosssigning.isVerified
import im.vector.matrix.android.internal.crypto.keysbackup.model.rest.KeysVersionResult
import im.vector.matrix.android.internal.crypto.keysbackup.util.computeRecoveryKey
import im.vector.matrix.android.internal.crypto.model.ImportRoomKeysResult
import im.vector.matrix.android.internal.util.awaitCallback
import im.vector.riotx.R import im.vector.riotx.R
import im.vector.riotx.core.extensions.exhaustive import im.vector.riotx.core.extensions.exhaustive
import im.vector.riotx.core.platform.VectorViewModel import im.vector.riotx.core.platform.VectorViewModel
import im.vector.riotx.core.resources.StringProvider import im.vector.riotx.core.resources.StringProvider
import kotlinx.coroutines.launch
import timber.log.Timber import timber.log.Timber
data class VerificationBottomSheetViewState( data class VerificationBottomSheetViewState(
@ -337,40 +344,83 @@ class VerificationBottomSheetViewModel @AssistedInject constructor(
_viewEvents.post(VerificationBottomSheetViewEvents.AccessSecretStore) _viewEvents.post(VerificationBottomSheetViewEvents.AccessSecretStore)
} }
is VerificationAction.GotResultFromSsss -> { is VerificationAction.GotResultFromSsss -> {
try { handleSecretBackFromSSSS(action)
action.cypherData.fromBase64().inputStream().use { ins ->
val res = session.loadSecureSecret<Map<String, String>>(ins, action.alias)
val trustResult = session.cryptoService().crossSigningService().checkTrustFromPrivateKeys(
res?.get(MASTER_KEY_SSSS_NAME),
res?.get(USER_SIGNING_KEY_SSSS_NAME),
res?.get(SELF_SIGNING_KEY_SSSS_NAME)
)
if (trustResult.isVerified()) {
// Sign this device and upload the signature
session.sessionParams.credentials.deviceId?.let { deviceId ->
session.cryptoService()
.crossSigningService().trustDevice(deviceId, object : MatrixCallback<Unit> {
override fun onFailure(failure: Throwable) {
Timber.w(failure, "Failed to sign my device after recovery")
}
})
}
setState {
copy(verifiedFromPrivateKeys = true)
}
} else {
// POP UP something
_viewEvents.post(VerificationBottomSheetViewEvents.ModalError("Failed to import keys"))
}
}
} catch (failure: Throwable) {
_viewEvents.post(VerificationBottomSheetViewEvents.ModalError(failure.localizedMessage ?: stringProvider.getString(R.string.unexpected_error)))
}
} }
}.exhaustive }.exhaustive
} }
private fun handleSecretBackFromSSSS(action: VerificationAction.GotResultFromSsss) {
try {
action.cypherData.fromBase64().inputStream().use { ins ->
val res = session.loadSecureSecret<Map<String, String>>(ins, action.alias)
val trustResult = session.cryptoService().crossSigningService().checkTrustFromPrivateKeys(
res?.get(MASTER_KEY_SSSS_NAME),
res?.get(USER_SIGNING_KEY_SSSS_NAME),
res?.get(SELF_SIGNING_KEY_SSSS_NAME)
)
if (trustResult.isVerified()) {
// Sign this device and upload the signature
session.sessionParams.credentials.deviceId?.let { deviceId ->
session.cryptoService()
.crossSigningService().trustDevice(deviceId, object : MatrixCallback<Unit> {
override fun onFailure(failure: Throwable) {
Timber.w(failure, "Failed to sign my device after recovery")
}
})
}
setState {
copy(verifiedFromPrivateKeys = true)
}
// try to get keybackup key
} else {
// POP UP something
_viewEvents.post(VerificationBottomSheetViewEvents.ModalError(stringProvider.getString(R.string.error_failed_to_import_keys)))
}
// try the keybackup
tentativeRestoreBackup(res)
Unit
}
} catch (failure: Throwable) {
_viewEvents.post(
VerificationBottomSheetViewEvents.ModalError(failure.localizedMessage ?: stringProvider.getString(R.string.unexpected_error)))
}
}
private fun tentativeRestoreBackup(res: Map<String, String>?) {
viewModelScope.launch {
try {
val secret = res?.get(KEYBACKUP_SECRET_SSSS_NAME) ?: return@launch Unit.also {
Timber.v("## Keybackup secret not restored from SSSS")
}
val version = awaitCallback<KeysVersionResult?> {
session.cryptoService().keysBackupService().getCurrentVersion(it)
} ?: return@launch
awaitCallback<ImportRoomKeysResult> {
session.cryptoService().keysBackupService().restoreKeysWithRecoveryKey(
version,
computeRecoveryKey(secret.fromBase64()),
null,
null,
null,
it
)
}
awaitCallback<Unit> {
session.cryptoService().keysBackupService().trustKeysBackupVersion(version, true, it)
}
} catch (failure: Throwable) {
// Just ignore for now
Timber.v("## Failed to restore backup after SSSS recovery")
}
}
}
override fun transactionCreated(tx: VerificationTransaction) { override fun transactionCreated(tx: VerificationTransaction) {
transactionUpdated(tx) transactionUpdated(tx)
} }

View File

@ -16,14 +16,21 @@
*/ */
package im.vector.riotx.features.crypto.verification.epoxy package im.vector.riotx.features.crypto.verification.epoxy
import android.content.Context
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyAttribute
import com.airbnb.epoxy.EpoxyModelClass import com.airbnb.epoxy.EpoxyModelClass
import im.vector.matrix.android.api.session.crypto.verification.EmojiRepresentation import im.vector.matrix.android.api.session.crypto.verification.EmojiRepresentation
import im.vector.riotx.R import im.vector.riotx.R
import im.vector.riotx.core.epoxy.VectorEpoxyHolder import im.vector.riotx.core.epoxy.VectorEpoxyHolder
import im.vector.riotx.core.epoxy.VectorEpoxyModel import im.vector.riotx.core.epoxy.VectorEpoxyModel
import me.gujun.android.span.Span
import me.gujun.android.span.image
import me.gujun.android.span.span
/** /**
* A emoji list for bottom sheet. * A emoji list for bottom sheet.
@ -40,26 +47,36 @@ abstract class BottomSheetVerificationEmojisItem : VectorEpoxyModel<BottomSheetV
@EpoxyAttribute lateinit var emojiRepresentation6: EmojiRepresentation @EpoxyAttribute lateinit var emojiRepresentation6: EmojiRepresentation
override fun bind(holder: Holder) { override fun bind(holder: Holder) {
holder.emoji0View.findViewById<TextView>(R.id.item_emoji_tv).text = emojiRepresentation0.emoji bindEmojiView(holder.emoji0View, emojiRepresentation0)
holder.emoji0View.findViewById<TextView>(R.id.item_emoji_name_tv).setText(emojiRepresentation0.nameResId) bindEmojiView(holder.emoji1View, emojiRepresentation1)
bindEmojiView(holder.emoji2View, emojiRepresentation2)
bindEmojiView(holder.emoji3View, emojiRepresentation3)
bindEmojiView(holder.emoji4View, emojiRepresentation4)
bindEmojiView(holder.emoji5View, emojiRepresentation5)
bindEmojiView(holder.emoji6View, emojiRepresentation6)
}
holder.emoji1View.findViewById<TextView>(R.id.item_emoji_tv).text = emojiRepresentation1.emoji private fun spanForRepresentation(context: Context, rep: EmojiRepresentation): Span {
holder.emoji1View.findViewById<TextView>(R.id.item_emoji_name_tv).setText(emojiRepresentation1.nameResId) return span {
if (rep.drawableRes != null) {
ContextCompat.getDrawable(context, rep.drawableRes!!)?.let { image(it) }
} else {
+rep.emoji
}
}
}
holder.emoji2View.findViewById<TextView>(R.id.item_emoji_tv).text = emojiRepresentation2.emoji private fun bindEmojiView(view: ViewGroup, rep: EmojiRepresentation) {
holder.emoji2View.findViewById<TextView>(R.id.item_emoji_name_tv).setText(emojiRepresentation2.nameResId) rep.drawableRes?.let {
view.findViewById<TextView>(R.id.item_emoji_tv).isVisible = false
holder.emoji3View.findViewById<TextView>(R.id.item_emoji_tv).text = emojiRepresentation3.emoji view.findViewById<ImageView>(R.id.item_emoji_image).isVisible = true
holder.emoji3View.findViewById<TextView>(R.id.item_emoji_name_tv)?.setText(emojiRepresentation3.nameResId) view.findViewById<ImageView>(R.id.item_emoji_image).setImageDrawable(ContextCompat.getDrawable(view.context, it))
} ?: kotlin.run {
holder.emoji4View.findViewById<TextView>(R.id.item_emoji_tv).text = emojiRepresentation4.emoji view.findViewById<TextView>(R.id.item_emoji_tv).isVisible = true
holder.emoji4View.findViewById<TextView>(R.id.item_emoji_name_tv).setText(emojiRepresentation4.nameResId) view.findViewById<ImageView>(R.id.item_emoji_image).isVisible = false
view.findViewById<TextView>(R.id.item_emoji_tv).text = rep.emoji
holder.emoji5View.findViewById<TextView>(R.id.item_emoji_tv).text = emojiRepresentation5.emoji }
holder.emoji5View.findViewById<TextView>(R.id.item_emoji_name_tv).setText(emojiRepresentation5.nameResId) view.findViewById<TextView>(R.id.item_emoji_name_tv).setText(rep.nameResId)
holder.emoji6View.findViewById<TextView>(R.id.item_emoji_tv).text = emojiRepresentation6.emoji
holder.emoji6View.findViewById<TextView>(R.id.item_emoji_name_tv).setText(emojiRepresentation6.nameResId)
} }
class Holder : VectorEpoxyHolder() { class Holder : VectorEpoxyHolder() {

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2020 New Vector Ltd
*
* 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.
*/
package im.vector.riotx.features.crypto.verification.qrconfirmation
import com.airbnb.epoxy.EpoxyController
import im.vector.riotx.R
import im.vector.riotx.core.resources.ColorProvider
import im.vector.riotx.core.resources.StringProvider
import im.vector.riotx.features.crypto.verification.epoxy.bottomSheetVerificationBigImageItem
import im.vector.riotx.features.crypto.verification.epoxy.bottomSheetVerificationNoticeItem
import im.vector.riotx.features.crypto.verification.epoxy.bottomSheetVerificationWaitingItem
import javax.inject.Inject
class VerificationQRWaitingController @Inject constructor(
private val stringProvider: StringProvider,
private val colorProvider: ColorProvider
) : EpoxyController() {
private var args: VerificationQRWaitingFragment.Args? = null
fun update(args: VerificationQRWaitingFragment.Args) {
this.args = args
requestModelBuild()
}
override fun buildModels() {
val params = args ?: return
bottomSheetVerificationNoticeItem {
id("notice")
apply {
notice(stringProvider.getString(R.string.qr_code_scanned_verif_waiting_notice))
}
}
bottomSheetVerificationBigImageItem {
id("image")
imageRes(R.drawable.ic_shield_trusted)
}
bottomSheetVerificationWaitingItem {
id("waiting")
title(stringProvider.getString(R.string.qr_code_scanned_verif_waiting, params.otherUserName))
}
}
}

View File

@ -0,0 +1,59 @@
/*
* Copyright (c) 2020 New Vector Ltd
*
* 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.
*/
package im.vector.riotx.features.crypto.verification.qrconfirmation
import android.os.Bundle
import android.os.Parcelable
import android.view.View
import com.airbnb.mvrx.MvRx
import im.vector.riotx.R
import im.vector.riotx.core.extensions.cleanup
import im.vector.riotx.core.extensions.configureWith
import im.vector.riotx.core.platform.VectorBaseFragment
import kotlinx.android.parcel.Parcelize
import kotlinx.android.synthetic.main.bottom_sheet_verification_child_fragment.*
import javax.inject.Inject
class VerificationQRWaitingFragment @Inject constructor(
val controller: VerificationQRWaitingController
) : VectorBaseFragment() {
@Parcelize
data class Args(
val isMe: Boolean,
val otherUserName: String
) : Parcelable
override fun getLayoutResId() = R.layout.bottom_sheet_verification_child_fragment
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupRecyclerView()
(arguments?.getParcelable(MvRx.KEY_ARG) as? Args)?.let {
controller.update(it)
}
}
override fun onDestroyView() {
bottomSheetVerificationRecyclerView.cleanup()
super.onDestroyView()
}
private fun setupRecyclerView() {
bottomSheetVerificationRecyclerView.configureWith(controller, hasFixedSize = false, disableItemAnimation = true)
}
}

View File

@ -21,7 +21,9 @@ import im.vector.riotx.R
import im.vector.riotx.core.epoxy.dividerItem import im.vector.riotx.core.epoxy.dividerItem
import im.vector.riotx.core.resources.ColorProvider import im.vector.riotx.core.resources.ColorProvider
import im.vector.riotx.core.resources.StringProvider import im.vector.riotx.core.resources.StringProvider
import im.vector.riotx.features.crypto.verification.VerificationBottomSheetViewState
import im.vector.riotx.features.crypto.verification.epoxy.bottomSheetVerificationActionItem import im.vector.riotx.features.crypto.verification.epoxy.bottomSheetVerificationActionItem
import im.vector.riotx.features.crypto.verification.epoxy.bottomSheetVerificationBigImageItem
import im.vector.riotx.features.crypto.verification.epoxy.bottomSheetVerificationNoticeItem import im.vector.riotx.features.crypto.verification.epoxy.bottomSheetVerificationNoticeItem
import javax.inject.Inject import javax.inject.Inject
@ -32,33 +34,37 @@ class VerificationQrScannedByOtherController @Inject constructor(
var listener: Listener? = null var listener: Listener? = null
init { private var viewState: VerificationBottomSheetViewState? = null
fun update(viewState: VerificationBottomSheetViewState) {
this.viewState = viewState
requestModelBuild() requestModelBuild()
} }
override fun buildModels() { override fun buildModels() {
val state = viewState ?: return
bottomSheetVerificationNoticeItem { bottomSheetVerificationNoticeItem {
id("notice") id("notice")
notice(stringProvider.getString(R.string.qr_code_scanned_by_other_notice)) apply {
if (state.isMe) {
notice(stringProvider.getString(R.string.qr_code_scanned_self_verif_notice))
} else {
val name = state.otherUserMxItem?.getBestName() ?: ""
notice(stringProvider.getString(R.string.qr_code_scanned_by_other_notice, name))
}
}
}
bottomSheetVerificationBigImageItem {
id("image")
imageRes(R.drawable.ic_shield_trusted)
} }
dividerItem { dividerItem {
id("sep0") id("sep0")
} }
bottomSheetVerificationActionItem {
id("confirm")
title(stringProvider.getString(R.string.qr_code_scanned_by_other_yes))
titleColor(colorProvider.getColor(R.color.riotx_accent))
iconRes(R.drawable.ic_check_on)
iconColor(colorProvider.getColor(R.color.riotx_accent))
listener { listener?.onUserConfirmsQrCodeScanned() }
}
dividerItem {
id("sep1")
}
bottomSheetVerificationActionItem { bottomSheetVerificationActionItem {
id("deny") id("deny")
title(stringProvider.getString(R.string.qr_code_scanned_by_other_no)) title(stringProvider.getString(R.string.qr_code_scanned_by_other_no))
@ -67,6 +73,19 @@ class VerificationQrScannedByOtherController @Inject constructor(
iconColor(colorProvider.getColor(R.color.vector_error_color)) iconColor(colorProvider.getColor(R.color.vector_error_color))
listener { listener?.onUserDeniesQrCodeScanned() } listener { listener?.onUserDeniesQrCodeScanned() }
} }
dividerItem {
id("sep1")
}
bottomSheetVerificationActionItem {
id("confirm")
title(stringProvider.getString(R.string.qr_code_scanned_by_other_yes))
titleColor(colorProvider.getColor(R.color.riotx_accent))
iconRes(R.drawable.ic_check_on)
iconColor(colorProvider.getColor(R.color.riotx_accent))
listener { listener?.onUserConfirmsQrCodeScanned() }
}
} }
interface Listener { interface Listener {

View File

@ -18,6 +18,7 @@ package im.vector.riotx.features.crypto.verification.qrconfirmation
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import com.airbnb.mvrx.parentFragmentViewModel import com.airbnb.mvrx.parentFragmentViewModel
import com.airbnb.mvrx.withState
import im.vector.riotx.R import im.vector.riotx.R
import im.vector.riotx.core.extensions.cleanup import im.vector.riotx.core.extensions.cleanup
import im.vector.riotx.core.extensions.configureWith import im.vector.riotx.core.extensions.configureWith
@ -37,10 +38,13 @@ class VerificationQrScannedByOtherFragment @Inject constructor(
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setupRecyclerView() setupRecyclerView()
} }
override fun invalidate() = withState(sharedViewModel) { state ->
controller.update(state)
}
override fun onDestroyView() { override fun onDestroyView() {
bottomSheetVerificationRecyclerView.cleanup() bottomSheetVerificationRecyclerView.cleanup()
controller.listener = null controller.listener = null

View File

@ -47,9 +47,9 @@ import im.vector.riotx.features.home.room.detail.timeline.helper.TimelineEventVi
import im.vector.riotx.features.home.room.detail.timeline.helper.TimelineMediaSizeProvider import im.vector.riotx.features.home.room.detail.timeline.helper.TimelineMediaSizeProvider
import im.vector.riotx.features.home.room.detail.timeline.helper.nextOrNull import im.vector.riotx.features.home.room.detail.timeline.helper.nextOrNull
import im.vector.riotx.features.home.room.detail.timeline.item.BaseEventItem import im.vector.riotx.features.home.room.detail.timeline.item.BaseEventItem
import im.vector.riotx.features.home.room.detail.timeline.item.BasedMergedItem
import im.vector.riotx.features.home.room.detail.timeline.item.DaySeparatorItem import im.vector.riotx.features.home.room.detail.timeline.item.DaySeparatorItem
import im.vector.riotx.features.home.room.detail.timeline.item.DaySeparatorItem_ import im.vector.riotx.features.home.room.detail.timeline.item.DaySeparatorItem_
import im.vector.riotx.features.home.room.detail.timeline.item.MergedHeaderItem
import im.vector.riotx.features.home.room.detail.timeline.item.MessageInformationData import im.vector.riotx.features.home.room.detail.timeline.item.MessageInformationData
import im.vector.riotx.features.home.room.detail.timeline.item.ReadReceiptData import im.vector.riotx.features.home.room.detail.timeline.item.ReadReceiptData
import im.vector.riotx.features.home.room.detail.timeline.item.TimelineReadMarkerItem_ import im.vector.riotx.features.home.room.detail.timeline.item.TimelineReadMarkerItem_
@ -373,7 +373,7 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec
val localId: Long, val localId: Long,
val eventId: String?, val eventId: String?,
val eventModel: EpoxyModel<*>? = null, val eventModel: EpoxyModel<*>? = null,
val mergedHeaderModel: MergedHeaderItem? = null, val mergedHeaderModel: BasedMergedItem<*>? = null,
val formattedDayModel: DaySeparatorItem? = null val formattedDayModel: DaySeparatorItem? = null
) { ) {
fun shouldTriggerBuild(): Boolean { fun shouldTriggerBuild(): Boolean {

View File

@ -0,0 +1,80 @@
/*
* Copyright (c) 2020 New Vector Ltd
*
* 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.
*/
package im.vector.riotx.features.home.room.detail.timeline.factory
import im.vector.matrix.android.api.session.events.model.toModel
import im.vector.matrix.android.api.session.room.timeline.TimelineEvent
import im.vector.matrix.android.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM
import im.vector.matrix.android.internal.crypto.model.event.EncryptionEventContent
import im.vector.riotx.R
import im.vector.riotx.core.resources.StringProvider
import im.vector.riotx.features.home.room.detail.timeline.MessageColorProvider
import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController
import im.vector.riotx.features.home.room.detail.timeline.helper.AvatarSizeProvider
import im.vector.riotx.features.home.room.detail.timeline.helper.MessageInformationDataFactory
import im.vector.riotx.features.home.room.detail.timeline.helper.MessageItemAttributesFactory
import im.vector.riotx.features.home.room.detail.timeline.item.StatusTileTimelineItem
import im.vector.riotx.features.home.room.detail.timeline.item.StatusTileTimelineItem_
import javax.inject.Inject
class EncryptionItemFactory @Inject constructor(
private val messageItemAttributesFactory: MessageItemAttributesFactory,
private val messageColorProvider: MessageColorProvider,
private val stringProvider: StringProvider,
private val informationDataFactory: MessageInformationDataFactory,
private val avatarSizeProvider: AvatarSizeProvider) {
fun create(event: TimelineEvent,
highlight: Boolean,
callback: TimelineEventController.Callback?): StatusTileTimelineItem? {
val algorithm = event.root.getClearContent().toModel<EncryptionEventContent>()?.algorithm
val informationData = informationDataFactory.create(event, null)
val attributes = messageItemAttributesFactory.create(null, informationData, callback)
val isSafeAlgorithm = algorithm == MXCRYPTO_ALGORITHM_MEGOLM
val title: String
val description: String
val shield: StatusTileTimelineItem.ShieldUIState
if (isSafeAlgorithm) {
title = stringProvider.getString(R.string.encryption_enabled)
description = stringProvider.getString(R.string.encryption_enabled_tile_description)
shield = StatusTileTimelineItem.ShieldUIState.BLACK
} else {
title = stringProvider.getString(R.string.encryption_not_enabled)
description = stringProvider.getString(R.string.encryption_unknown_algorithm_tile_description)
shield = StatusTileTimelineItem.ShieldUIState.RED
}
return StatusTileTimelineItem_()
.attributes(
StatusTileTimelineItem.Attributes(
title = title,
description = description,
shieldUIState = shield,
informationData = informationData,
avatarRenderer = attributes.avatarRenderer,
messageColorProvider = messageColorProvider,
emojiTypeFace = attributes.emojiTypeFace,
itemClickListener = attributes.itemClickListener,
itemLongClickListener = attributes.itemLongClickListener,
reactionPillCallback = attributes.reactionPillCallback,
readReceiptsCallback = attributes.readReceiptsCallback
)
)
.highlighted(highlight)
.leftGuideline(avatarSizeProvider.leftGuideline)
}
}

View File

@ -16,16 +16,24 @@
package im.vector.riotx.features.home.room.detail.timeline.factory package im.vector.riotx.features.home.room.detail.timeline.factory
import im.vector.matrix.android.api.session.events.model.EventType
import im.vector.matrix.android.api.session.events.model.toModel
import im.vector.matrix.android.api.session.room.timeline.TimelineEvent import im.vector.matrix.android.api.session.room.timeline.TimelineEvent
import im.vector.matrix.android.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM
import im.vector.matrix.android.internal.crypto.model.event.EncryptionEventContent
import im.vector.riotx.core.di.ActiveSessionHolder import im.vector.riotx.core.di.ActiveSessionHolder
import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.home.AvatarRenderer
import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController
import im.vector.riotx.features.home.room.detail.timeline.helper.AvatarSizeProvider import im.vector.riotx.features.home.room.detail.timeline.helper.AvatarSizeProvider
import im.vector.riotx.features.home.room.detail.timeline.helper.MergedTimelineEventVisibilityStateChangedListener import im.vector.riotx.features.home.room.detail.timeline.helper.MergedTimelineEventVisibilityStateChangedListener
import im.vector.riotx.features.home.room.detail.timeline.helper.canBeMerged import im.vector.riotx.features.home.room.detail.timeline.helper.canBeMerged
import im.vector.riotx.features.home.room.detail.timeline.helper.isRoomConfiguration
import im.vector.riotx.features.home.room.detail.timeline.helper.prevSameTypeEvents import im.vector.riotx.features.home.room.detail.timeline.helper.prevSameTypeEvents
import im.vector.riotx.features.home.room.detail.timeline.item.MergedHeaderItem import im.vector.riotx.features.home.room.detail.timeline.item.BasedMergedItem
import im.vector.riotx.features.home.room.detail.timeline.item.MergedHeaderItem_ import im.vector.riotx.features.home.room.detail.timeline.item.MergedMembershipEventsItem
import im.vector.riotx.features.home.room.detail.timeline.item.MergedMembershipEventsItem_
import im.vector.riotx.features.home.room.detail.timeline.item.MergedRoomCreationItem
import im.vector.riotx.features.home.room.detail.timeline.item.MergedRoomCreationItem_
import javax.inject.Inject import javax.inject.Inject
class MergedHeaderItemFactory @Inject constructor(private val sessionHolder: ActiveSessionHolder, class MergedHeaderItemFactory @Inject constructor(private val sessionHolder: ActiveSessionHolder,
@ -43,8 +51,12 @@ class MergedHeaderItemFactory @Inject constructor(private val sessionHolder: Act
eventIdToHighlight: String?, eventIdToHighlight: String?,
callback: TimelineEventController.Callback?, callback: TimelineEventController.Callback?,
requestModelBuild: () -> Unit) requestModelBuild: () -> Unit)
: MergedHeaderItem? { : BasedMergedItem<*>? {
return if (!event.canBeMerged() || (nextEvent?.root?.getClearType() == event.root.getClearType() && !addDaySeparator)) { return if (nextEvent?.root?.getClearType() == EventType.STATE_ROOM_CREATE && event.isRoomConfiguration()) {
// It's the first item before room.create
// Collapse all room configuration events
buildRoomCreationMergedSummary(currentPosition, items, event, eventIdToHighlight, requestModelBuild, callback)
} else if (!event.canBeMerged() || (nextEvent?.root?.getClearType() == event.root.getClearType() && !addDaySeparator)) {
null null
} else { } else {
val prevSameTypeEvents = items.prevSameTypeEvents(currentPosition, 2) val prevSameTypeEvents = items.prevSameTypeEvents(currentPosition, 2)
@ -53,14 +65,14 @@ class MergedHeaderItemFactory @Inject constructor(private val sessionHolder: Act
} else { } else {
var highlighted = false var highlighted = false
val mergedEvents = (prevSameTypeEvents + listOf(event)).asReversed() val mergedEvents = (prevSameTypeEvents + listOf(event)).asReversed()
val mergedData = ArrayList<MergedHeaderItem.Data>(mergedEvents.size) val mergedData = ArrayList<BasedMergedItem.Data>(mergedEvents.size)
mergedEvents.forEach { mergedEvent -> mergedEvents.forEach { mergedEvent ->
if (!highlighted && mergedEvent.root.eventId == eventIdToHighlight) { if (!highlighted && mergedEvent.root.eventId == eventIdToHighlight) {
highlighted = true highlighted = true
} }
val senderAvatar = mergedEvent.senderAvatar val senderAvatar = mergedEvent.senderAvatar
val senderName = mergedEvent.getDisambiguatedDisplayName() val senderName = mergedEvent.getDisambiguatedDisplayName()
val data = MergedHeaderItem.Data( val data = BasedMergedItem.Data(
userId = mergedEvent.root.senderId ?: "", userId = mergedEvent.root.senderId ?: "",
avatarUrl = senderAvatar, avatarUrl = senderAvatar,
memberName = senderName, memberName = senderName,
@ -82,7 +94,7 @@ class MergedHeaderItemFactory @Inject constructor(private val sessionHolder: Act
collapsedEventIds.removeAll(mergedEventIds) collapsedEventIds.removeAll(mergedEventIds)
} }
val mergeId = mergedEventIds.joinToString(separator = "_") { it.toString() } val mergeId = mergedEventIds.joinToString(separator = "_") { it.toString() }
val attributes = MergedHeaderItem.Attributes( val attributes = MergedMembershipEventsItem.Attributes(
isCollapsed = isCollapsed, isCollapsed = isCollapsed,
mergeData = mergedData, mergeData = mergedData,
avatarRenderer = avatarRenderer, avatarRenderer = avatarRenderer,
@ -92,7 +104,7 @@ class MergedHeaderItemFactory @Inject constructor(private val sessionHolder: Act
}, },
readReceiptsCallback = callback readReceiptsCallback = callback
) )
MergedHeaderItem_() MergedMembershipEventsItem_()
.id(mergeId) .id(mergeId)
.leftGuideline(avatarSizeProvider.leftGuideline) .leftGuideline(avatarSizeProvider.leftGuideline)
.highlighted(isCollapsed && highlighted) .highlighted(isCollapsed && highlighted)
@ -104,6 +116,81 @@ class MergedHeaderItemFactory @Inject constructor(private val sessionHolder: Act
} }
} }
private fun buildRoomCreationMergedSummary(currentPosition: Int,
items: List<TimelineEvent>,
event: TimelineEvent,
eventIdToHighlight: String?,
requestModelBuild: () -> Unit,
callback: TimelineEventController.Callback?): MergedRoomCreationItem_? {
var prevEvent = if (currentPosition > 0) items[currentPosition - 1] else null
var tmpPos = currentPosition - 1
val mergedEvents = ArrayList<TimelineEvent>().also { it.add(event) }
var hasEncryption = false
var encryptionAlgorithm: String? = null
while (prevEvent != null && prevEvent.isRoomConfiguration()) {
if (prevEvent.root.getClearType() == EventType.STATE_ROOM_ENCRYPTION) {
hasEncryption = true
encryptionAlgorithm = prevEvent.root.getClearContent()?.toModel<EncryptionEventContent>()?.algorithm
}
mergedEvents.add(prevEvent)
tmpPos--
prevEvent = if (tmpPos >= 0) items[tmpPos] else null
}
return if (mergedEvents.size > 2) {
var highlighted = false
val mergedData = ArrayList<BasedMergedItem.Data>(mergedEvents.size)
mergedEvents.reversed()
.forEach { mergedEvent ->
if (!highlighted && mergedEvent.root.eventId == eventIdToHighlight) {
highlighted = true
}
val senderAvatar = mergedEvent.senderAvatar
val senderName = mergedEvent.getDisambiguatedDisplayName()
val data = BasedMergedItem.Data(
userId = mergedEvent.root.senderId ?: "",
avatarUrl = senderAvatar,
memberName = senderName,
localId = mergedEvent.localId,
eventId = mergedEvent.root.eventId ?: ""
)
mergedData.add(data)
}
val mergedEventIds = mergedEvents.map { it.localId }
// We try to find if one of the item id were used as mergeItemCollapseStates key
// => handle case where paginating from mergeable events and we get more
val previousCollapseStateKey = mergedEventIds.intersect(mergeItemCollapseStates.keys).firstOrNull()
val initialCollapseState = mergeItemCollapseStates.remove(previousCollapseStateKey)
?: true
val isCollapsed = mergeItemCollapseStates.getOrPut(event.localId) { initialCollapseState }
if (isCollapsed) {
collapsedEventIds.addAll(mergedEventIds)
} else {
collapsedEventIds.removeAll(mergedEventIds)
}
val mergeId = mergedEventIds.joinToString(separator = "_") { it.toString() }
val attributes = MergedRoomCreationItem.Attributes(
isCollapsed = isCollapsed,
mergeData = mergedData,
avatarRenderer = avatarRenderer,
onCollapsedStateChanged = {
mergeItemCollapseStates[event.localId] = it
requestModelBuild()
},
hasEncryptionEvent = hasEncryption,
isEncryptionAlgorithmSecure = encryptionAlgorithm == MXCRYPTO_ALGORITHM_MEGOLM,
readReceiptsCallback = callback
)
MergedRoomCreationItem_()
.id(mergeId)
.leftGuideline(avatarSizeProvider.leftGuideline)
.highlighted(isCollapsed && highlighted)
.attributes(attributes)
.also {
it.setOnVisibilityStateChanged(MergedTimelineEventVisibilityStateChangedListener(callback, mergedEvents))
}
} else null
}
fun isCollapsed(localId: Long): Boolean { fun isCollapsed(localId: Long): Boolean {
return collapsedEventIds.contains(localId) return collapsedEventIds.contains(localId)
} }

View File

@ -29,6 +29,7 @@ class TimelineItemFactory @Inject constructor(private val messageItemFactory: Me
private val encryptedItemFactory: EncryptedItemFactory, private val encryptedItemFactory: EncryptedItemFactory,
private val noticeItemFactory: NoticeItemFactory, private val noticeItemFactory: NoticeItemFactory,
private val defaultItemFactory: DefaultItemFactory, private val defaultItemFactory: DefaultItemFactory,
private val encryptionItemFactory: EncryptionItemFactory,
private val roomCreateItemFactory: RoomCreateItemFactory, private val roomCreateItemFactory: RoomCreateItemFactory,
private val verificationConclusionItemFactory: VerificationItemFactory, private val verificationConclusionItemFactory: VerificationItemFactory,
private val userPreferencesProvider: UserPreferencesProvider) { private val userPreferencesProvider: UserPreferencesProvider) {
@ -57,8 +58,10 @@ class TimelineItemFactory @Inject constructor(private val messageItemFactory: Me
EventType.CALL_HANGUP, EventType.CALL_HANGUP,
EventType.CALL_ANSWER, EventType.CALL_ANSWER,
EventType.REACTION, EventType.REACTION,
EventType.REDACTION, EventType.REDACTION -> noticeItemFactory.create(event, highlight, callback)
EventType.STATE_ROOM_ENCRYPTION -> noticeItemFactory.create(event, highlight, callback) EventType.STATE_ROOM_ENCRYPTION -> {
encryptionItemFactory.create(event, highlight, callback)
}
// State room create // State room create
EventType.STATE_ROOM_CREATE -> roomCreateItemFactory.create(event, callback) EventType.STATE_ROOM_CREATE -> roomCreateItemFactory.create(event, callback)
// Crypto // Crypto

View File

@ -25,15 +25,17 @@ import im.vector.matrix.android.api.session.room.model.message.MessageRelationCo
import im.vector.matrix.android.api.session.room.model.message.MessageVerificationCancelContent import im.vector.matrix.android.api.session.room.model.message.MessageVerificationCancelContent
import im.vector.matrix.android.api.session.room.timeline.TimelineEvent import im.vector.matrix.android.api.session.room.timeline.TimelineEvent
import im.vector.matrix.android.internal.session.room.VerificationState import im.vector.matrix.android.internal.session.room.VerificationState
import im.vector.riotx.R
import im.vector.riotx.core.epoxy.VectorEpoxyModel import im.vector.riotx.core.epoxy.VectorEpoxyModel
import im.vector.riotx.core.resources.StringProvider
import im.vector.riotx.core.resources.UserPreferencesProvider import im.vector.riotx.core.resources.UserPreferencesProvider
import im.vector.riotx.features.home.room.detail.timeline.MessageColorProvider import im.vector.riotx.features.home.room.detail.timeline.MessageColorProvider
import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController
import im.vector.riotx.features.home.room.detail.timeline.helper.AvatarSizeProvider import im.vector.riotx.features.home.room.detail.timeline.helper.AvatarSizeProvider
import im.vector.riotx.features.home.room.detail.timeline.helper.MessageInformationDataFactory import im.vector.riotx.features.home.room.detail.timeline.helper.MessageInformationDataFactory
import im.vector.riotx.features.home.room.detail.timeline.helper.MessageItemAttributesFactory import im.vector.riotx.features.home.room.detail.timeline.helper.MessageItemAttributesFactory
import im.vector.riotx.features.home.room.detail.timeline.item.VerificationRequestConclusionItem import im.vector.riotx.features.home.room.detail.timeline.item.StatusTileTimelineItem
import im.vector.riotx.features.home.room.detail.timeline.item.VerificationRequestConclusionItem_ import im.vector.riotx.features.home.room.detail.timeline.item.StatusTileTimelineItem_
import javax.inject.Inject import javax.inject.Inject
/** /**
@ -48,6 +50,7 @@ class VerificationItemFactory @Inject constructor(
private val avatarSizeProvider: AvatarSizeProvider, private val avatarSizeProvider: AvatarSizeProvider,
private val noticeItemFactory: NoticeItemFactory, private val noticeItemFactory: NoticeItemFactory,
private val userPreferencesProvider: UserPreferencesProvider, private val userPreferencesProvider: UserPreferencesProvider,
private val stringProvider: StringProvider,
private val session: Session private val session: Session
) { ) {
@ -88,12 +91,12 @@ class VerificationItemFactory @Inject constructor(
CancelCode.MismatchedKeys, CancelCode.MismatchedKeys,
CancelCode.MismatchedSas -> { CancelCode.MismatchedSas -> {
// We should display these bad conclusions // We should display these bad conclusions
return VerificationRequestConclusionItem_() return StatusTileTimelineItem_()
.attributes( .attributes(
VerificationRequestConclusionItem.Attributes( StatusTileTimelineItem.Attributes(
toUserId = informationData.senderId, title = stringProvider.getString(R.string.verification_conclusion_warning),
toUserName = informationData.memberName.toString(), description = "${informationData.memberName} (${informationData.senderId})",
isPositive = false, shieldUIState = StatusTileTimelineItem.ShieldUIState.RED,
informationData = informationData, informationData = informationData,
avatarRenderer = attributes.avatarRenderer, avatarRenderer = attributes.avatarRenderer,
messageColorProvider = messageColorProvider, messageColorProvider = messageColorProvider,
@ -121,12 +124,12 @@ class VerificationItemFactory @Inject constructor(
// We only display the done sent by the other user, the done send by me is ignored // We only display the done sent by the other user, the done send by me is ignored
return ignoredConclusion(event, highlight, callback) return ignoredConclusion(event, highlight, callback)
} }
return VerificationRequestConclusionItem_() return StatusTileTimelineItem_()
.attributes( .attributes(
VerificationRequestConclusionItem.Attributes( StatusTileTimelineItem.Attributes(
toUserId = informationData.senderId, title = stringProvider.getString(R.string.sas_verified),
toUserName = informationData.memberName.toString(), description = "${informationData.memberName} (${informationData.senderId})",
isPositive = true, shieldUIState = StatusTileTimelineItem.ShieldUIState.GREEN,
informationData = informationData, informationData = informationData,
avatarRenderer = attributes.avatarRenderer, avatarRenderer = attributes.avatarRenderer,
messageColorProvider = messageColorProvider, messageColorProvider = messageColorProvider,

View File

@ -50,6 +50,18 @@ fun TimelineEvent.canBeMerged(): Boolean {
return root.getClearType() == EventType.STATE_ROOM_MEMBER return root.getClearType() == EventType.STATE_ROOM_MEMBER
} }
fun TimelineEvent.isRoomConfiguration(): Boolean {
return when (root.getClearType()) {
EventType.STATE_ROOM_GUEST_ACCESS,
EventType.STATE_ROOM_HISTORY_VISIBILITY,
EventType.STATE_ROOM_JOIN_RULES,
EventType.STATE_ROOM_MEMBER,
EventType.STATE_ROOM_NAME,
EventType.STATE_ROOM_ENCRYPTION -> true
else -> false
}
}
fun List<TimelineEvent>.nextSameTypeEvents(index: Int, minSize: Int): List<TimelineEvent> { fun List<TimelineEvent>.nextSameTypeEvents(index: Int, minSize: Int): List<TimelineEvent> {
if (index >= size - 1) { if (index >= size - 1) {
return emptyList() return emptyList()

View File

@ -0,0 +1,82 @@
/*
* Copyright (c) 2020 New Vector Ltd
*
* 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.
*/
package im.vector.riotx.features.home.room.detail.timeline.item
import android.view.View
import android.widget.TextView
import androidx.annotation.IdRes
import androidx.core.view.isVisible
import im.vector.matrix.android.api.util.MatrixItem
import im.vector.riotx.R
import im.vector.riotx.features.home.AvatarRenderer
import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController
abstract class BasedMergedItem<H : BasedMergedItem.Holder> : BaseEventItem<H>() {
abstract val attributes: Attributes
override fun bind(holder: H) {
super.bind(holder)
holder.expandView.setOnClickListener {
attributes.onCollapsedStateChanged(!attributes.isCollapsed)
}
if (attributes.isCollapsed) {
holder.separatorView.visibility = View.GONE
holder.expandView.setText(R.string.merged_events_expand)
} else {
holder.separatorView.visibility = View.VISIBLE
holder.expandView.setText(R.string.merged_events_collapse)
}
// No read receipt for this item
holder.readReceiptsView.isVisible = false
}
protected val distinctMergeData by lazy {
attributes.mergeData.distinctBy { it.userId }
}
override fun getEventIds(): List<String> {
return if (attributes.isCollapsed) {
attributes.mergeData.map { it.eventId }
} else {
emptyList()
}
}
data class Data(
val localId: Long,
val eventId: String,
val userId: String,
val memberName: String,
val avatarUrl: String?
)
fun Data.toMatrixItem() = MatrixItem.UserItem(userId, memberName, avatarUrl)
interface Attributes {
val isCollapsed: Boolean
val mergeData: List<Data>
val avatarRenderer: AvatarRenderer
val readReceiptsCallback: TimelineEventController.ReadReceiptsCallback?
val onCollapsedStateChanged: (Boolean) -> Unit
}
abstract class Holder(@IdRes stubId: Int) : BaseEventItem.BaseHolder(stubId) {
val expandView by bind<TextView>(R.id.itemMergedExpandTextView)
val separatorView by bind<View>(R.id.itemMergedSeparatorView)
}
}

View File

@ -24,28 +24,20 @@ import androidx.core.view.children
import androidx.core.view.isVisible import androidx.core.view.isVisible
import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyAttribute
import com.airbnb.epoxy.EpoxyModelClass import com.airbnb.epoxy.EpoxyModelClass
import im.vector.matrix.android.api.util.MatrixItem
import im.vector.riotx.R import im.vector.riotx.R
import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.home.AvatarRenderer
import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController
@EpoxyModelClass(layout = R.layout.item_timeline_event_base_noinfo) @EpoxyModelClass(layout = R.layout.item_timeline_event_base_noinfo)
abstract class MergedHeaderItem : BaseEventItem<MergedHeaderItem.Holder>() { abstract class MergedMembershipEventsItem : BasedMergedItem<MergedMembershipEventsItem.Holder>() {
@EpoxyAttribute
lateinit var attributes: Attributes
private val distinctMergeData by lazy {
attributes.mergeData.distinctBy { it.userId }
}
override fun getViewType() = STUB_ID override fun getViewType() = STUB_ID
@EpoxyAttribute
override lateinit var attributes: Attributes
override fun bind(holder: Holder) { override fun bind(holder: Holder) {
super.bind(holder) super.bind(holder)
holder.expandView.setOnClickListener {
attributes.onCollapsedStateChanged(!attributes.isCollapsed)
}
if (attributes.isCollapsed) { if (attributes.isCollapsed) {
val summary = holder.expandView.resources.getQuantityString(R.plurals.membership_changes, attributes.mergeData.size, attributes.mergeData.size) val summary = holder.expandView.resources.getQuantityString(R.plurals.membership_changes, attributes.mergeData.size, attributes.mergeData.size)
holder.summaryView.text = summary holder.summaryView.text = summary
@ -60,52 +52,28 @@ abstract class MergedHeaderItem : BaseEventItem<MergedHeaderItem.Holder>() {
view.visibility = View.GONE view.visibility = View.GONE
} }
} }
holder.separatorView.visibility = View.GONE
holder.expandView.setText(R.string.merged_events_expand)
} else { } else {
holder.avatarListView.visibility = View.INVISIBLE holder.avatarListView.visibility = View.INVISIBLE
holder.summaryView.visibility = View.GONE holder.summaryView.visibility = View.GONE
holder.separatorView.visibility = View.VISIBLE
holder.expandView.setText(R.string.merged_events_collapse)
} }
// No read receipt for this item // No read receipt for this item
holder.readReceiptsView.isVisible = false holder.readReceiptsView.isVisible = false
} }
override fun getEventIds(): List<String> { class Holder : BasedMergedItem.Holder(STUB_ID) {
return if (attributes.isCollapsed) {
attributes.mergeData.map { it.eventId }
} else {
emptyList()
}
}
data class Data(
val localId: Long,
val eventId: String,
val userId: String,
val memberName: String,
val avatarUrl: String?
)
fun Data.toMatrixItem() = MatrixItem.UserItem(userId, memberName, avatarUrl)
data class Attributes(
val isCollapsed: Boolean,
val mergeData: List<Data>,
val avatarRenderer: AvatarRenderer,
val readReceiptsCallback: TimelineEventController.ReadReceiptsCallback? = null,
val onCollapsedStateChanged: (Boolean) -> Unit
)
class Holder : BaseHolder(STUB_ID) {
val expandView by bind<TextView>(R.id.itemMergedExpandTextView)
val summaryView by bind<TextView>(R.id.itemMergedSummaryTextView) val summaryView by bind<TextView>(R.id.itemMergedSummaryTextView)
val separatorView by bind<View>(R.id.itemMergedSeparatorView)
val avatarListView by bind<ViewGroup>(R.id.itemMergedAvatarListView) val avatarListView by bind<ViewGroup>(R.id.itemMergedAvatarListView)
} }
companion object { companion object {
private const val STUB_ID = R.id.messageContentMergedHeaderStub private const val STUB_ID = R.id.messageContentMergedHeaderStub
} }
data class Attributes(
override val isCollapsed: Boolean,
override val mergeData: List<Data>,
override val avatarRenderer: AvatarRenderer,
override val readReceiptsCallback: TimelineEventController.ReadReceiptsCallback? = null,
override val onCollapsedStateChanged: (Boolean) -> Unit
) : BasedMergedItem.Attributes
} }

View File

@ -0,0 +1,115 @@
/*
* Copyright (c) 2020 New Vector Ltd
*
* 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.
*/
package im.vector.riotx.features.home.room.detail.timeline.item
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import com.airbnb.epoxy.EpoxyAttribute
import com.airbnb.epoxy.EpoxyModelClass
import im.vector.riotx.R
import im.vector.riotx.features.home.AvatarRenderer
import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController
@EpoxyModelClass(layout = R.layout.item_timeline_event_base_noinfo)
abstract class MergedRoomCreationItem : BasedMergedItem<MergedRoomCreationItem.Holder>() {
@EpoxyAttribute
override lateinit var attributes: Attributes
override fun getViewType() = STUB_ID
override fun bind(holder: Holder) {
super.bind(holder)
if (attributes.isCollapsed) {
val data = distinctMergeData.firstOrNull()
val summary = holder.expandView.resources.getString(R.string.room_created_summary_item,
data?.memberName ?: data?.userId ?: "")
holder.summaryView.text = summary
holder.summaryView.visibility = View.VISIBLE
holder.avatarView.visibility = View.VISIBLE
if (data != null) {
holder.avatarView.visibility = View.VISIBLE
attributes.avatarRenderer.render(data.toMatrixItem(), holder.avatarView)
} else {
holder.avatarView.visibility = View.GONE
}
if (attributes.hasEncryptionEvent) {
holder.encryptionTile.isVisible = true
holder.encryptionTile.updateLayoutParams<RelativeLayout.LayoutParams> {
this.marginEnd = leftGuideline
}
if (attributes.isEncryptionAlgorithmSecure) {
holder.e2eTitleTextView.text = holder.expandView.resources.getString(R.string.encryption_enabled)
holder.e2eTitleDescriptionView.text = holder.expandView.resources.getString(R.string.encryption_enabled_tile_description)
holder.e2eTitleDescriptionView.textAlignment = View.TEXT_ALIGNMENT_CENTER
holder.e2eTitleTextView.setCompoundDrawablesWithIntrinsicBounds(
ContextCompat.getDrawable(holder.view.context, R.drawable.ic_shield_black),
null, null, null
)
} else {
holder.e2eTitleTextView.text = holder.expandView.resources.getString(R.string.encryption_not_enabled)
holder.e2eTitleDescriptionView.text = holder.expandView.resources.getString(R.string.encryption_unknown_algorithm_tile_description)
holder.e2eTitleTextView.setCompoundDrawablesWithIntrinsicBounds(
ContextCompat.getDrawable(holder.view.context, R.drawable.ic_shield_warning),
null, null, null
)
}
} else {
holder.encryptionTile.isVisible = false
}
} else {
holder.avatarView.visibility = View.INVISIBLE
holder.summaryView.visibility = View.GONE
holder.encryptionTile.isGone = true
}
// No read receipt for this item
holder.readReceiptsView.isVisible = false
}
class Holder : BasedMergedItem.Holder(STUB_ID) {
val summaryView by bind<TextView>(R.id.itemNoticeTextView)
val avatarView by bind<ImageView>(R.id.itemNoticeAvatarView)
val encryptionTile by bind<ViewGroup>(R.id.creationEncryptionTile)
val e2eTitleTextView by bind<TextView>(R.id.itemVerificationDoneTitleTextView)
val e2eTitleDescriptionView by bind<TextView>(R.id.itemVerificationDoneDetailTextView)
}
companion object {
private const val STUB_ID = R.id.messageContentMergedCreationStub
}
data class Attributes(
override val isCollapsed: Boolean,
override val mergeData: List<Data>,
override val avatarRenderer: AvatarRenderer,
override val readReceiptsCallback: TimelineEventController.ReadReceiptsCallback? = null,
override val onCollapsedStateChanged: (Boolean) -> Unit,
val hasEncryptionEvent : Boolean,
val isEncryptionAlgorithmSecure: Boolean
) : BasedMergedItem.Attributes
}

View File

@ -31,7 +31,7 @@ import im.vector.riotx.features.home.room.detail.timeline.MessageColorProvider
import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController import im.vector.riotx.features.home.room.detail.timeline.TimelineEventController
@EpoxyModelClass(layout = R.layout.item_timeline_event_base_state) @EpoxyModelClass(layout = R.layout.item_timeline_event_base_state)
abstract class VerificationRequestConclusionItem : AbsBaseMessageItem<VerificationRequestConclusionItem.Holder>() { abstract class StatusTileTimelineItem : AbsBaseMessageItem<StatusTileTimelineItem.Holder>() {
override val baseAttributes: AbsBaseMessageItem.Attributes override val baseAttributes: AbsBaseMessageItem.Attributes
get() = attributes get() = attributes
@ -47,11 +47,17 @@ abstract class VerificationRequestConclusionItem : AbsBaseMessageItem<Verificati
holder.endGuideline.updateLayoutParams<RelativeLayout.LayoutParams> { holder.endGuideline.updateLayoutParams<RelativeLayout.LayoutParams> {
this.marginEnd = leftGuideline this.marginEnd = leftGuideline
} }
val title = if (attributes.isPositive) R.string.sas_verified else R.string.verification_conclusion_warning
holder.titleView.text = holder.view.context.getString(title)
holder.descriptionView.text = "${attributes.informationData.memberName} (${attributes.informationData.senderId})"
val startDrawable = if (attributes.isPositive) R.drawable.ic_shield_trusted else R.drawable.ic_shield_warning holder.titleView.text = attributes.title
holder.descriptionView.text = attributes.description
holder.descriptionView.textAlignment = View.TEXT_ALIGNMENT_CENTER
val startDrawable = when (attributes.shieldUIState) {
ShieldUIState.GREEN -> R.drawable.ic_shield_trusted
ShieldUIState.BLACK -> R.drawable.ic_shield_black
ShieldUIState.RED -> R.drawable.ic_shield_warning
}
holder.titleView.setCompoundDrawablesWithIntrinsicBounds( holder.titleView.setCompoundDrawablesWithIntrinsicBounds(
ContextCompat.getDrawable(holder.view.context, startDrawable), ContextCompat.getDrawable(holder.view.context, startDrawable),
null, null, null null, null, null
@ -75,9 +81,9 @@ abstract class VerificationRequestConclusionItem : AbsBaseMessageItem<Verificati
* This class holds all the common attributes for timeline items. * This class holds all the common attributes for timeline items.
*/ */
data class Attributes( data class Attributes(
val toUserId: String, val shieldUIState: ShieldUIState,
val toUserName: String, val title: CharSequence,
val isPositive: Boolean, val description: CharSequence,
override val informationData: MessageInformationData, override val informationData: MessageInformationData,
override val avatarRenderer: AvatarRenderer, override val avatarRenderer: AvatarRenderer,
override val messageColorProvider: MessageColorProvider, override val messageColorProvider: MessageColorProvider,
@ -87,4 +93,10 @@ abstract class VerificationRequestConclusionItem : AbsBaseMessageItem<Verificati
override val readReceiptsCallback: TimelineEventController.ReadReceiptsCallback? = null, override val readReceiptsCallback: TimelineEventController.ReadReceiptsCallback? = null,
val emojiTypeFace: Typeface? = null val emojiTypeFace: Typeface? = null
) : AbsBaseMessageItem.Attributes ) : AbsBaseMessageItem.Attributes
enum class ShieldUIState {
BLACK,
RED,
GREEN
}
} }

View File

@ -15,6 +15,19 @@
android:layout_gravity="center" android:layout_gravity="center"
android:textColor="@color/black" android:textColor="@color/black"
android:textSize="40dp" android:textSize="40dp"
tools:visibility="gone"
tools:ignore="SpUsage"
tools:text="🌵" />
<ImageView
android:id="@+id/item_emoji_image"
android:layout_width="54dp"
android:layout_margin="2dp"
android:layout_height="54dp"
android:layout_gravity="center"
android:src="@drawable/ic_verification_cactus"
tools:visibility="visible"
android:visibility="gone"
tools:ignore="SpUsage" tools:ignore="SpUsage"
tools:text="🌵" /> tools:text="🌵" />

View File

@ -54,6 +54,13 @@
tools:layout_marginTop="160dp" tools:layout_marginTop="160dp"
tools:visibility="visible" /> tools:visibility="visible" />
<ViewStub
android:id="@+id/messageContentMergedCreationStub"
style="@style/TimelineContentStubBaseParams"
android:layout="@layout/item_timeline_event_merged_room_creation_stub"
tools:layout_marginTop="160dp"
tools:visibility="visible" />
</FrameLayout> </FrameLayout>
<im.vector.riotx.core.ui.views.ReadReceiptsView <im.vector.riotx.core.ui.views.ReadReceiptsView

View File

@ -49,7 +49,7 @@
<ViewStub <ViewStub
android:id="@+id/messageVerificationDoneStub" android:id="@+id/messageVerificationDoneStub"
style="@style/TimelineContentStubBaseParams" style="@style/TimelineContentStubBaseParams"
android:layout="@layout/item_timeline_event_verification_done_stub" android:layout="@layout/item_timeline_event_status_tile_stub"
tools:visibility="visible" /> tools:visibility="visible" />
</FrameLayout> </FrameLayout>

View File

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:id="@+id/creationEncryptionTile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_gravity="center"
android:layout_marginTop="2dp"
android:layout_marginEnd="52dp"
android:layout_marginBottom="2dp"
android:background="@drawable/rounded_rect_shape_8"
android:padding="8dp">
<include layout="@layout/item_timeline_event_status_tile_stub" />
</FrameLayout>
<RelativeLayout
android:id="@+id/mergedSumContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/creationEncryptionTile">
<ImageView
android:id="@+id/itemNoticeAvatarView"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
tools:srcCompat="@tools:sample/avatars" />
<TextView
android:id="@+id/itemNoticeTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_gravity="top"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:layout_toStartOf="@id/itemMergedExpandTextView"
android:layout_toEndOf="@id/itemNoticeAvatarView"
android:textColor="?riotx_text_secondary"
android:textSize="14sp"
android:textStyle="italic"
tools:text="@string/room_created_summary_item" />
<TextView
android:id="@+id/itemMergedExpandTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginTop="2dp"
android:paddingLeft="8dp"
android:paddingTop="4dp"
android:paddingRight="8dp"
android:paddingBottom="4dp"
android:text="@string/merged_events_expand"
android:textColor="?attr/colorAccent"
android:textSize="14sp"
android:textStyle="italic" />
</RelativeLayout>
<View
android:id="@+id/itemMergedSeparatorView"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_below="@+id/mergedSumContainer"
android:layout_marginTop="4dp"
android:background="?attr/riotx_header_panel_background" />
</RelativeLayout>

Some files were not shown because too many files have changed in this diff Show More