Merge pull request #245 from fork-maintainers/upstream-sync2
Upstream Sync 2: The Synceningpull/293/head
commit
6d5f903652
@ -0,0 +1,139 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||||
|
<issues format="5" by="lint 3.6.0" client="gradle" variant="debug" version="3.6.0">
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="MozMultipleConstraintLayouts"
|
||||||
|
message="Flatten the view hierarchy by using one `ConstraintLayout`, if possible. If the alternative is several nested `ViewGroup`, it may not help performance and this may be worth suppressing."
|
||||||
|
errorLine1=" <androidx.constraintlayout.widget.ConstraintLayout"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="src/main/res/layout/component_collection_creation.xml"
|
||||||
|
line="134"
|
||||||
|
column="6"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="MozMultipleConstraintLayouts"
|
||||||
|
message="Flatten the view hierarchy by using one `ConstraintLayout`, if possible. If the alternative is several nested `ViewGroup`, it may not help performance and this may be worth suppressing."
|
||||||
|
errorLine1=" <androidx.constraintlayout.widget.ConstraintLayout"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="src/main/res/layout/component_collection_creation_name_collection.xml"
|
||||||
|
line="104"
|
||||||
|
column="6"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="MozMultipleConstraintLayouts"
|
||||||
|
message="Flatten the view hierarchy by using one `ConstraintLayout`, if possible. If the alternative is several nested `ViewGroup`, it may not help performance and this may be worth suppressing."
|
||||||
|
errorLine1=" <androidx.constraintlayout.widget.ConstraintLayout"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="src/main/res/layout/component_collection_creation_select_collection.xml"
|
||||||
|
line="108"
|
||||||
|
column="6"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="MozMultipleConstraintLayouts"
|
||||||
|
message="Flatten the view hierarchy by using one `ConstraintLayout`, if possible. If the alternative is several nested `ViewGroup`, it may not help performance and this may be worth suppressing."
|
||||||
|
errorLine1=" <androidx.constraintlayout.widget.ConstraintLayout"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="src/main/res/layout/component_tabstray.xml"
|
||||||
|
line="28"
|
||||||
|
column="6"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="MozMultipleConstraintLayouts"
|
||||||
|
message="Flatten the view hierarchy by using one `ConstraintLayout`, if possible. If the alternative is several nested `ViewGroup`, it may not help performance and this may be worth suppressing."
|
||||||
|
errorLine1=" <androidx.constraintlayout.widget.ConstraintLayout"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="src/main/res/layout/component_tabstray.xml"
|
||||||
|
line="52"
|
||||||
|
column="6"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="MozMultipleConstraintLayouts"
|
||||||
|
message="Flatten the view hierarchy by using one `ConstraintLayout`, if possible. If the alternative is several nested `ViewGroup`, it may not help performance and this may be worth suppressing."
|
||||||
|
errorLine1=" <androidx.constraintlayout.widget.ConstraintLayout"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="src/main/res/layout/component_tracking_protection_panel.xml"
|
||||||
|
line="15"
|
||||||
|
column="6"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="MozMultipleConstraintLayouts"
|
||||||
|
message="Flatten the view hierarchy by using one `ConstraintLayout`, if possible. If the alternative is several nested `ViewGroup`, it may not help performance and this may be worth suppressing."
|
||||||
|
errorLine1=" <androidx.constraintlayout.widget.ConstraintLayout"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="src/main/res/layout/component_tracking_protection_panel.xml"
|
||||||
|
line="178"
|
||||||
|
column="6"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="MozMultipleConstraintLayouts"
|
||||||
|
message="Flatten the view hierarchy by using one `ConstraintLayout`, if possible. If the alternative is several nested `ViewGroup`, it may not help performance and this may be worth suppressing."
|
||||||
|
errorLine1=" <androidx.constraintlayout.widget.ConstraintLayout"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="src/main/res/layout/fragment_add_on_details.xml"
|
||||||
|
line="150"
|
||||||
|
column="10"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="MozMultipleConstraintLayouts"
|
||||||
|
message="Flatten the view hierarchy by using one `ConstraintLayout`, if possible. If the alternative is several nested `ViewGroup`, it may not help performance and this may be worth suppressing."
|
||||||
|
errorLine1=" <androidx.constraintlayout.widget.ConstraintLayout"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="src/main/res/layout/fragment_search.xml"
|
||||||
|
line="43"
|
||||||
|
column="10"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="MozMultipleConstraintLayouts"
|
||||||
|
message="Flatten the view hierarchy by using one `ConstraintLayout`, if possible. If the alternative is several nested `ViewGroup`, it may not help performance and this may be worth suppressing."
|
||||||
|
errorLine1=" <androidx.constraintlayout.widget.ConstraintLayout"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="src/main/res/layout/fragment_search.xml"
|
||||||
|
line="82"
|
||||||
|
column="14"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="MozMultipleConstraintLayouts"
|
||||||
|
message="Flatten the view hierarchy by using one `ConstraintLayout`, if possible. If the alternative is several nested `ViewGroup`, it may not help performance and this may be worth suppressing."
|
||||||
|
errorLine1=" <androidx.constraintlayout.widget.ConstraintLayout"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="src/main/res/layout/fragment_search_dialog.xml"
|
||||||
|
line="77"
|
||||||
|
column="6"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="MozMultipleConstraintLayouts"
|
||||||
|
message="Flatten the view hierarchy by using one `ConstraintLayout`, if possible. If the alternative is several nested `ViewGroup`, it may not help performance and this may be worth suppressing."
|
||||||
|
errorLine1=" <androidx.constraintlayout.widget.ConstraintLayout"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="src/main/res/layout/fragment_share.xml"
|
||||||
|
line="30"
|
||||||
|
column="6"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
</issues>
|
@ -0,0 +1,30 @@
|
|||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
package org.mozilla.fenix
|
||||||
|
|
||||||
|
import mozilla.components.support.base.log.Log
|
||||||
|
import mozilla.components.support.base.log.sink.AndroidLogSink
|
||||||
|
import mozilla.components.support.base.log.sink.LogSink
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fenix [LogSink] implementation that writes to Android's log, depending on settings.
|
||||||
|
*
|
||||||
|
* @param logsDebug If set to false, removes logging of debug logs.
|
||||||
|
*/
|
||||||
|
class FenixLogSink(private val logsDebug: Boolean = true) : LogSink {
|
||||||
|
|
||||||
|
private val androidLogSink = AndroidLogSink()
|
||||||
|
|
||||||
|
override fun log(
|
||||||
|
priority: Log.Priority,
|
||||||
|
tag: String?,
|
||||||
|
throwable: Throwable?,
|
||||||
|
message: String?
|
||||||
|
) {
|
||||||
|
if (priority == Log.Priority.DEBUG && !logsDebug)
|
||||||
|
return
|
||||||
|
androidLogSink.log(priority, tag, throwable, message)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,106 @@
|
|||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
package org.mozilla.fenix
|
||||||
|
|
||||||
|
import androidx.annotation.VisibleForTesting
|
||||||
|
import mozilla.components.browser.state.action.BrowserAction
|
||||||
|
import mozilla.components.browser.state.action.ContentAction
|
||||||
|
import mozilla.components.browser.state.action.TabListAction
|
||||||
|
import mozilla.components.browser.state.selector.findTab
|
||||||
|
import mozilla.components.browser.state.selector.normalTabs
|
||||||
|
import mozilla.components.browser.state.state.BrowserState
|
||||||
|
import mozilla.components.lib.state.Middleware
|
||||||
|
import mozilla.components.lib.state.MiddlewareContext
|
||||||
|
import mozilla.components.support.base.log.logger.Logger
|
||||||
|
import org.mozilla.fenix.components.metrics.Event
|
||||||
|
import org.mozilla.fenix.components.metrics.MetricController
|
||||||
|
import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry
|
||||||
|
import org.mozilla.fenix.utils.Settings
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [Middleware] to record telemetry in response to [BrowserAction]s.
|
||||||
|
*
|
||||||
|
* @property settings reference to the application [Settings].
|
||||||
|
* @property adsTelemetry reference to [AdsTelemetry] use to record search telemetry.
|
||||||
|
* @property metrics reference to the configured [MetricController] to record general page load events.
|
||||||
|
*/
|
||||||
|
class TelemetryMiddleware(
|
||||||
|
private val settings: Settings,
|
||||||
|
private val adsTelemetry: AdsTelemetry,
|
||||||
|
private val metrics: MetricController
|
||||||
|
) : Middleware<BrowserState, BrowserAction> {
|
||||||
|
|
||||||
|
private val logger = Logger("TelemetryMiddleware")
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
internal val redirectChains = mutableMapOf<String, RedirectChain>()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility to collect URLs / load requests in between location changes.
|
||||||
|
*/
|
||||||
|
internal class RedirectChain(internal val root: String) {
|
||||||
|
internal val chain = mutableListOf<String>()
|
||||||
|
|
||||||
|
fun add(url: String) {
|
||||||
|
chain.add(url)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("TooGenericExceptionCaught")
|
||||||
|
override fun invoke(
|
||||||
|
context: MiddlewareContext<BrowserState, BrowserAction>,
|
||||||
|
next: (BrowserAction) -> Unit,
|
||||||
|
action: BrowserAction
|
||||||
|
) {
|
||||||
|
// Pre process actions
|
||||||
|
when (action) {
|
||||||
|
is ContentAction.UpdateLoadingStateAction -> {
|
||||||
|
context.state.findTab(action.sessionId)?.let { tab ->
|
||||||
|
// Record UriOpened event when a non-private page finishes loading
|
||||||
|
if (tab.content.loading && !action.loading && !tab.content.private) {
|
||||||
|
metrics.track(Event.UriOpened)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is ContentAction.UpdateLoadRequestAction -> {
|
||||||
|
context.state.findTab(action.sessionId)?.let { tab ->
|
||||||
|
// Collect all load requests in between location changes
|
||||||
|
if (!redirectChains.containsKey(action.sessionId) && action.loadRequest.url != tab.content.url) {
|
||||||
|
redirectChains[action.sessionId] = RedirectChain(tab.content.url)
|
||||||
|
}
|
||||||
|
|
||||||
|
redirectChains[action.sessionId]?.add(action.loadRequest.url)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is ContentAction.UpdateUrlAction -> {
|
||||||
|
redirectChains[action.sessionId]?.let {
|
||||||
|
// Record ads telemetry providing all redirects
|
||||||
|
try {
|
||||||
|
adsTelemetry.trackAdClickedMetric(it.root, it.chain)
|
||||||
|
} catch (t: Throwable) {
|
||||||
|
logger.info("Failed to record search telemetry", t)
|
||||||
|
} finally {
|
||||||
|
redirectChains.remove(action.sessionId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
next(action)
|
||||||
|
|
||||||
|
// Post process actions
|
||||||
|
when (action) {
|
||||||
|
is TabListAction.AddTabAction,
|
||||||
|
is TabListAction.AddMultipleTabsAction,
|
||||||
|
is TabListAction.RemoveTabAction,
|
||||||
|
is TabListAction.RemoveAllNormalTabsAction,
|
||||||
|
is TabListAction.RemoveAllTabsAction,
|
||||||
|
is TabListAction.RestoreAction -> {
|
||||||
|
// Update/Persist tabs count whenever it changes
|
||||||
|
settings.openTabsCount = context.state.normalTabs.count()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,84 +0,0 @@
|
|||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
package org.mozilla.fenix.browser
|
|
||||||
|
|
||||||
import androidx.annotation.VisibleForTesting
|
|
||||||
import mozilla.components.browser.session.Session
|
|
||||||
import org.mozilla.fenix.components.metrics.Event
|
|
||||||
import org.mozilla.fenix.components.metrics.MetricController
|
|
||||||
import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry
|
|
||||||
|
|
||||||
class TelemetrySessionObserver(
|
|
||||||
private val metrics: MetricController,
|
|
||||||
private val ads: AdsTelemetry
|
|
||||||
) : Session.Observer {
|
|
||||||
private var urlLoading: String? = null
|
|
||||||
@VisibleForTesting
|
|
||||||
var redirectChain = mutableListOf<String>()
|
|
||||||
@VisibleForTesting
|
|
||||||
var originSessionUrl: String? = null
|
|
||||||
|
|
||||||
private val temporaryFix = TemporaryFix()
|
|
||||||
|
|
||||||
override fun onLoadingStateChanged(session: Session, loading: Boolean) {
|
|
||||||
if (loading) {
|
|
||||||
urlLoading = session.url
|
|
||||||
} else if (urlLoading != null && !session.private && temporaryFix.shouldSendEvent(session.url)) {
|
|
||||||
temporaryFix.eventSentFor = session.url
|
|
||||||
metrics.track(Event.UriOpened)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* When a link is clicked, record its redirect chain as well as origin url
|
|
||||||
*/
|
|
||||||
override fun onLoadRequest(
|
|
||||||
session: Session,
|
|
||||||
url: String,
|
|
||||||
triggeredByRedirect: Boolean,
|
|
||||||
triggeredByWebContent: Boolean
|
|
||||||
) {
|
|
||||||
if (isFirstLinkInRedirectChain(url, session.url)) {
|
|
||||||
originSessionUrl = session.url
|
|
||||||
}
|
|
||||||
if (canStartChain()) {
|
|
||||||
redirectChain.add(url)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun canStartChain(): Boolean {
|
|
||||||
return originSessionUrl != null
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun isFirstLinkInRedirectChain(url: String, sessionUrl: String): Boolean {
|
|
||||||
return originSessionUrl == null && url != sessionUrl
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* After the redirect chain has finished, check if we encountered an ad on the way and clear
|
|
||||||
* the stored info for that chain
|
|
||||||
*/
|
|
||||||
override fun onUrlChanged(session: Session, url: String) {
|
|
||||||
ads.trackAdClickedMetric(originSessionUrl, redirectChain)
|
|
||||||
originSessionUrl = null
|
|
||||||
redirectChain.clear()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Currently, [Session.Observer.onLoadingStateChanged] is called multiple times the first
|
|
||||||
* time a new session loads a page. This is inflating our telemetry numbers, so we need to
|
|
||||||
* handle it, but we will be able to remove this code when [onLoadingStateChanged] has
|
|
||||||
* been fixed.
|
|
||||||
*
|
|
||||||
* See Fenix #3676
|
|
||||||
* See AC https://github.com/mozilla-mobile/android-components/issues/4795
|
|
||||||
* TODO remove this class after AC #4795 has been fixed
|
|
||||||
*/
|
|
||||||
private class TemporaryFix {
|
|
||||||
var eventSentFor: String? = null
|
|
||||||
|
|
||||||
fun shouldSendEvent(newUrl: String): Boolean = eventSentFor != newUrl
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,75 +0,0 @@
|
|||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
package org.mozilla.fenix.browser
|
|
||||||
|
|
||||||
import androidx.annotation.VisibleForTesting
|
|
||||||
import androidx.fragment.app.FragmentActivity
|
|
||||||
import androidx.lifecycle.LifecycleOwner
|
|
||||||
import mozilla.components.browser.session.Session
|
|
||||||
import mozilla.components.browser.session.SessionManager
|
|
||||||
import org.mozilla.fenix.components.metrics.MetricController
|
|
||||||
import org.mozilla.fenix.ext.components
|
|
||||||
import org.mozilla.fenix.ext.metrics
|
|
||||||
import org.mozilla.fenix.ext.sessionsOfType
|
|
||||||
import org.mozilla.fenix.ext.settings
|
|
||||||
import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry
|
|
||||||
import org.mozilla.fenix.utils.Settings
|
|
||||||
|
|
||||||
class UriOpenedObserver(
|
|
||||||
private val settings: Settings,
|
|
||||||
private val owner: LifecycleOwner,
|
|
||||||
private val sessionManager: SessionManager,
|
|
||||||
metrics: MetricController,
|
|
||||||
ads: AdsTelemetry
|
|
||||||
) : SessionManager.Observer {
|
|
||||||
|
|
||||||
constructor(activity: FragmentActivity) : this(
|
|
||||||
activity.applicationContext.settings(),
|
|
||||||
activity,
|
|
||||||
activity.components.core.sessionManager,
|
|
||||||
activity.metrics,
|
|
||||||
activity.components.core.adsTelemetry
|
|
||||||
)
|
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
internal val singleSessionObserver = TelemetrySessionObserver(metrics, ads)
|
|
||||||
|
|
||||||
init {
|
|
||||||
sessionManager.register(this, owner)
|
|
||||||
sessionManager.selectedSession?.register(singleSessionObserver, owner)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onSessionSelected(session: Session) {
|
|
||||||
session.register(singleSessionObserver, owner)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun saveOpenTabsCount() {
|
|
||||||
settings.setOpenTabsCount(sessionManager.sessionsOfType(private = false).count())
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onAllSessionsRemoved() {
|
|
||||||
saveOpenTabsCount()
|
|
||||||
sessionManager.sessions.forEach {
|
|
||||||
it.unregister(singleSessionObserver)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onSessionAdded(session: Session) {
|
|
||||||
saveOpenTabsCount()
|
|
||||||
session.register(singleSessionObserver, owner)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onSessionRemoved(session: Session) {
|
|
||||||
saveOpenTabsCount()
|
|
||||||
session.unregister(singleSessionObserver)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onSessionsRestored() {
|
|
||||||
saveOpenTabsCount()
|
|
||||||
sessionManager.sessions.forEach {
|
|
||||||
it.register(singleSessionObserver, owner)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,77 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||||
|
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt">
|
||||||
|
<aapt:attr name="android:drawable">
|
||||||
|
<vector
|
||||||
|
android:name="vector"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:name="path"
|
||||||
|
android:fillColor="#fbfbfe"
|
||||||
|
android:pathData="M 20 6 C 20 5 19.2 4.1 18.2 4 L 12 3 L 5.8 4 C 4.8 4 4 5 4 6 L 4.1 11 C 4.4 14.2 5.1 16 6.6 18 C 7.929 19.627 9.821 20.698 11.9 21 L 12.1 21 C 14.2 20.7 16.1 19.6 17.4 18 C 19 16 19.6 14.2 19.9 11 L 20 6 Z M 17.9 10.8 C 17.9 12.963 17.198 15.069 15.9 16.8 C 14.9 17.9 13.5 18.8 12 19.1 C 10.452 18.8 9.066 17.946 8.1 16.7 C 6.816 15 6.114 12.93 6.1 10.8 C 6.041 9.167 6.041 7.533 6.1 5.9 L 12 5 L 17.9 6 L 18 6.2 L 17.9 10.9 Z M 8 7.6 L 8 10.6 C 8.3 13.3 8.8 14.3 9.7 15.6 C 10.3 16.2 11.1 16.8 12 17 L 12 7 L 8 7.6 Z"
|
||||||
|
android:strokeWidth="1" />
|
||||||
|
<path
|
||||||
|
android:name="path_1"
|
||||||
|
android:pathData="M 20 6 C 20 5 19.2 4.1 18.2 4 L 12 3 L 5.8 4 C 4.8 4 4 5 4 6 L 4.1 11 C 4.4 14.2 5.1 16 6.6 18 C 7.929 19.627 9.821 20.698 11.9 21 L 12.1 21 C 14.2 20.7 16.1 19.6 17.4 18 C 19 16 19.6 14.2 19.9 11 L 20 6 Z M 17.9 10.8 C 17.9 12.963 17.198 15.069 15.9 16.8 C 14.9 17.9 13.5 18.8 12 19.1 C 10.452 18.8 9.066 17.946 8.1 16.7 C 6.816 15 6.114 12.93 6.1 10.8 C 6.041 9.167 6.041 7.533 6.1 5.9 L 12 5 L 17.9 6 L 18 6.2 L 17.9 10.9 Z M 8 7.6 L 8 10.6 C 8.3 13.3 8.8 14.3 9.7 15.6 C 10.3 16.2 11.1 16.8 12 17 L 12 7 L 8 7.6 Z"
|
||||||
|
android:strokeWidth="1">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:angle="45"
|
||||||
|
android:endColor="#00b3f4"
|
||||||
|
android:endX="0.0"
|
||||||
|
android:endY="20.0"
|
||||||
|
android:startColor="#C689FF"
|
||||||
|
android:startX="24.0"
|
||||||
|
android:startY="10.0"
|
||||||
|
android:type="linear" />
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
</vector>
|
||||||
|
</aapt:attr>
|
||||||
|
<target android:name="path">
|
||||||
|
<aapt:attr name="android:animation">
|
||||||
|
<set>
|
||||||
|
<objectAnimator
|
||||||
|
android:duration="330"
|
||||||
|
android:interpolator="@android:interpolator/fast_out_slow_in"
|
||||||
|
android:propertyName="pathData"
|
||||||
|
android:valueFrom="M 20 6 C 20 5 19.2 4.1 18.2 4 L 12 3 L 5.8 4 C 4.8 4 4 5 4 6 L 4.1 11 C 4.4 14.2 5.1 16 6.6 18 C 7.929 19.627 9.821 20.698 11.9 21 L 12.1 21 C 14.2 20.7 16.1 19.6 17.4 18 C 19 16 19.6 14.2 19.9 11 L 20 6 Z M 17.9 10.8 C 17.9 12.963 17.198 15.069 15.9 16.8 C 14.9 17.9 13.5 18.8 12 19.1 C 10.452 18.8 9.066 17.946 8.1 16.7 C 6.816 15 6.114 12.93 6.1 10.8 C 6.041 9.167 6.041 7.533 6.1 5.9 L 12 5 L 17.9 6 L 18 6.2 L 17.9 10.9 Z M 8 7.6 L 8 10.6 C 8.3 13.3 8.8 14.3 9.7 15.6 C 10.3 16.2 11.1 16.8 12 17 L 12 7 L 8 7.6 Z"
|
||||||
|
android:valueTo="M 20 6 C 20 5 19.2 4.1 18.2 4 L 12 3 L 5.8 4 C 4.8 4 4 5 4 6 L 4.1 11 C 4.4 14.2 5.1 16 6.6 18 C 7.929 19.627 9.821 20.698 11.9 21 L 12.1 21 C 14.2 20.7 16.1 19.6 17.4 18 C 19 16 19.6 14.2 19.9 11 L 20 6 Z M 17.9 10.8 C 17.9 12.963 17.198 15.069 15.9 16.8 C 14.9 17.9 13.5 18.8 12 19.1 C 10.452 18.8 9.066 17.946 8.1 16.7 C 6.816 15 6.114 12.93 6.1 10.8 C 6.041 9.167 6.041 7.533 6.1 5.9 L 12 5 L 17.9 6 L 18 6.2 L 17.9 10.9 Z M 8 7.6 L 8 10.6 C 8.3 13.3 8.8 14.3 9.7 15.6 C 10.3 16.2 11.1 16.8 12 17 L 12 7 L 8 7.6 Z"
|
||||||
|
android:valueType="pathType" />
|
||||||
|
<objectAnimator
|
||||||
|
android:duration="330"
|
||||||
|
android:interpolator="@android:interpolator/fast_out_slow_in"
|
||||||
|
android:propertyName="fillAlpha"
|
||||||
|
android:valueFrom="1"
|
||||||
|
android:valueTo="0"
|
||||||
|
android:valueType="floatType" />
|
||||||
|
</set>
|
||||||
|
</aapt:attr>
|
||||||
|
</target>
|
||||||
|
<target android:name="path_1">
|
||||||
|
<aapt:attr name="android:animation">
|
||||||
|
<set>
|
||||||
|
<objectAnimator
|
||||||
|
android:duration="330"
|
||||||
|
android:interpolator="@android:interpolator/fast_out_slow_in"
|
||||||
|
android:propertyName="pathData"
|
||||||
|
android:valueFrom="M 20 6 C 20 5 19.2 4.1 18.2 4 L 12 3 L 5.8 4 C 4.8 4 4 5 4 6 L 4.1 11 C 4.4 14.2 5.1 16 6.6 18 C 7.929 19.627 9.821 20.698 11.9 21 L 12.1 21 C 14.2 20.7 16.1 19.6 17.4 18 C 19 16 19.6 14.2 19.9 11 L 20 6 Z M 17.9 10.8 C 17.9 12.963 17.198 15.069 15.9 16.8 C 14.9 17.9 13.5 18.8 12 19.1 C 10.452 18.8 9.066 17.946 8.1 16.7 C 6.816 15 6.114 12.93 6.1 10.8 C 6.041 9.167 6.041 7.533 6.1 5.9 L 12 5 L 17.9 6 L 18 6.2 L 17.9 10.9 Z M 8 7.6 L 8 10.6 C 8.3 13.3 8.8 14.3 9.7 15.6 C 10.3 16.2 11.1 16.8 12 17 L 12 7 L 8 7.6 Z"
|
||||||
|
android:valueTo="M 20 6 C 20 5 19.2 4.1 18.2 4 L 12 3 L 5.8 4 C 4.8 4 4 5 4 6 L 4.1 11 C 4.4 14.2 5.1 16 6.6 18 C 7.929 19.627 9.821 20.698 11.9 21 L 12.1 21 C 14.2 20.7 16.1 19.6 17.4 18 C 19 16 19.6 14.2 19.9 11 L 20 6 Z M 17.9 10.8 C 17.9 12.963 17.198 15.069 15.9 16.8 C 14.9 17.9 13.5 18.8 12 19.1 C 10.452 18.8 9.066 17.946 8.1 16.7 C 6.816 15 6.114 12.93 6.1 10.8 C 6.041 9.167 6.041 7.533 6.1 5.9 L 12 5 L 17.9 6 L 18 6.2 L 17.9 10.9 Z M 8 7.6 L 8 10.6 C 8.3 13.3 8.8 14.3 9.7 15.6 C 10.3 16.2 11.1 16.8 12 17 L 12 7 L 8 7.6 Z"
|
||||||
|
android:valueType="pathType" />
|
||||||
|
<objectAnimator
|
||||||
|
android:duration="330"
|
||||||
|
android:interpolator="@android:interpolator/fast_out_slow_in"
|
||||||
|
android:propertyName="fillAlpha"
|
||||||
|
android:valueFrom="0"
|
||||||
|
android:valueTo="1"
|
||||||
|
android:valueType="floatType" />
|
||||||
|
</set>
|
||||||
|
</aapt:attr>
|
||||||
|
</target>
|
||||||
|
</animated-vector>
|
@ -0,0 +1,77 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||||
|
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt">
|
||||||
|
<aapt:attr name="android:drawable">
|
||||||
|
<vector
|
||||||
|
android:name="vector"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:name="path"
|
||||||
|
android:fillColor="#20123a"
|
||||||
|
android:pathData="M 20 6 C 20 5 19.2 4.1 18.2 4 L 12 3 L 5.8 4 C 4.8 4 4 5 4 6 L 4.1 11 C 4.4 14.2 5.1 16 6.6 18 C 7.929 19.627 9.821 20.698 11.9 21 L 12.1 21 C 14.2 20.7 16.1 19.6 17.4 18 C 19 16 19.6 14.2 19.9 11 L 20 6 Z M 17.9 10.8 C 17.9 12.963 17.198 15.069 15.9 16.8 C 14.9 17.9 13.5 18.8 12 19.1 C 10.452 18.8 9.066 17.946 8.1 16.7 C 6.816 15 6.114 12.93 6.1 10.8 C 6.041 9.167 6.041 7.533 6.1 5.9 L 12 5 L 17.9 6 L 18 6.2 L 17.9 10.9 Z M 8 7.6 L 8 10.6 C 8.3 13.3 8.8 14.3 9.7 15.6 C 10.3 16.2 11.1 16.8 12 17 L 12 7 L 8 7.6 Z"
|
||||||
|
android:strokeWidth="1" />
|
||||||
|
<path
|
||||||
|
android:name="path_1"
|
||||||
|
android:pathData="M 20 6 C 20 5 19.2 4.1 18.2 4 L 12 3 L 5.8 4 C 4.8 4 4 5 4 6 L 4.1 11 C 4.4 14.2 5.1 16 6.6 18 C 7.929 19.627 9.821 20.698 11.9 21 L 12.1 21 C 14.2 20.7 16.1 19.6 17.4 18 C 19 16 19.6 14.2 19.9 11 L 20 6 Z M 17.9 10.8 C 17.9 12.963 17.198 15.069 15.9 16.8 C 14.9 17.9 13.5 18.8 12 19.1 C 10.452 18.8 9.066 17.946 8.1 16.7 C 6.816 15 6.114 12.93 6.1 10.8 C 6.041 9.167 6.041 7.533 6.1 5.9 L 12 5 L 17.9 6 L 18 6.2 L 17.9 10.9 Z M 8 7.6 L 8 10.6 C 8.3 13.3 8.8 14.3 9.7 15.6 C 10.3 16.2 11.1 16.8 12 17 L 12 7 L 8 7.6 Z"
|
||||||
|
android:strokeWidth="1">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:angle="45"
|
||||||
|
android:endColor="#0250BB"
|
||||||
|
android:endX="0.0"
|
||||||
|
android:endY="20.0"
|
||||||
|
android:startColor="#9059FF"
|
||||||
|
android:startX="24.0"
|
||||||
|
android:startY="10.0"
|
||||||
|
android:type="linear" />
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
</vector>
|
||||||
|
</aapt:attr>
|
||||||
|
<target android:name="path">
|
||||||
|
<aapt:attr name="android:animation">
|
||||||
|
<set>
|
||||||
|
<objectAnimator
|
||||||
|
android:duration="330"
|
||||||
|
android:interpolator="@android:interpolator/fast_out_slow_in"
|
||||||
|
android:propertyName="pathData"
|
||||||
|
android:valueFrom="M 20 6 C 20 5 19.2 4.1 18.2 4 L 12 3 L 5.8 4 C 4.8 4 4 5 4 6 L 4.1 11 C 4.4 14.2 5.1 16 6.6 18 C 7.929 19.627 9.821 20.698 11.9 21 L 12.1 21 C 14.2 20.7 16.1 19.6 17.4 18 C 19 16 19.6 14.2 19.9 11 L 20 6 Z M 17.9 10.8 C 17.9 12.963 17.198 15.069 15.9 16.8 C 14.9 17.9 13.5 18.8 12 19.1 C 10.452 18.8 9.066 17.946 8.1 16.7 C 6.816 15 6.114 12.93 6.1 10.8 C 6.041 9.167 6.041 7.533 6.1 5.9 L 12 5 L 17.9 6 L 18 6.2 L 17.9 10.9 Z M 8 7.6 L 8 10.6 C 8.3 13.3 8.8 14.3 9.7 15.6 C 10.3 16.2 11.1 16.8 12 17 L 12 7 L 8 7.6 Z"
|
||||||
|
android:valueTo="M 20 6 C 20 5 19.2 4.1 18.2 4 L 12 3 L 5.8 4 C 4.8 4 4 5 4 6 L 4.1 11 C 4.4 14.2 5.1 16 6.6 18 C 7.929 19.627 9.821 20.698 11.9 21 L 12.1 21 C 14.2 20.7 16.1 19.6 17.4 18 C 19 16 19.6 14.2 19.9 11 L 20 6 Z M 17.9 10.8 C 17.9 12.963 17.198 15.069 15.9 16.8 C 14.9 17.9 13.5 18.8 12 19.1 C 10.452 18.8 9.066 17.946 8.1 16.7 C 6.816 15 6.114 12.93 6.1 10.8 C 6.041 9.167 6.041 7.533 6.1 5.9 L 12 5 L 17.9 6 L 18 6.2 L 17.9 10.9 Z M 8 7.6 L 8 10.6 C 8.3 13.3 8.8 14.3 9.7 15.6 C 10.3 16.2 11.1 16.8 12 17 L 12 7 L 8 7.6 Z"
|
||||||
|
android:valueType="pathType" />
|
||||||
|
<objectAnimator
|
||||||
|
android:duration="330"
|
||||||
|
android:interpolator="@android:interpolator/fast_out_slow_in"
|
||||||
|
android:propertyName="fillAlpha"
|
||||||
|
android:valueFrom="1"
|
||||||
|
android:valueTo="0"
|
||||||
|
android:valueType="floatType" />
|
||||||
|
</set>
|
||||||
|
</aapt:attr>
|
||||||
|
</target>
|
||||||
|
<target android:name="path_1">
|
||||||
|
<aapt:attr name="android:animation">
|
||||||
|
<set>
|
||||||
|
<objectAnimator
|
||||||
|
android:duration="330"
|
||||||
|
android:interpolator="@android:interpolator/fast_out_slow_in"
|
||||||
|
android:propertyName="pathData"
|
||||||
|
android:valueFrom="M 20 6 C 20 5 19.2 4.1 18.2 4 L 12 3 L 5.8 4 C 4.8 4 4 5 4 6 L 4.1 11 C 4.4 14.2 5.1 16 6.6 18 C 7.929 19.627 9.821 20.698 11.9 21 L 12.1 21 C 14.2 20.7 16.1 19.6 17.4 18 C 19 16 19.6 14.2 19.9 11 L 20 6 Z M 17.9 10.8 C 17.9 12.963 17.198 15.069 15.9 16.8 C 14.9 17.9 13.5 18.8 12 19.1 C 10.452 18.8 9.066 17.946 8.1 16.7 C 6.816 15 6.114 12.93 6.1 10.8 C 6.041 9.167 6.041 7.533 6.1 5.9 L 12 5 L 17.9 6 L 18 6.2 L 17.9 10.9 Z M 8 7.6 L 8 10.6 C 8.3 13.3 8.8 14.3 9.7 15.6 C 10.3 16.2 11.1 16.8 12 17 L 12 7 L 8 7.6 Z"
|
||||||
|
android:valueTo="M 20 6 C 20 5 19.2 4.1 18.2 4 L 12 3 L 5.8 4 C 4.8 4 4 5 4 6 L 4.1 11 C 4.4 14.2 5.1 16 6.6 18 C 7.929 19.627 9.821 20.698 11.9 21 L 12.1 21 C 14.2 20.7 16.1 19.6 17.4 18 C 19 16 19.6 14.2 19.9 11 L 20 6 Z M 17.9 10.8 C 17.9 12.963 17.198 15.069 15.9 16.8 C 14.9 17.9 13.5 18.8 12 19.1 C 10.452 18.8 9.066 17.946 8.1 16.7 C 6.816 15 6.114 12.93 6.1 10.8 C 6.041 9.167 6.041 7.533 6.1 5.9 L 12 5 L 17.9 6 L 18 6.2 L 17.9 10.9 Z M 8 7.6 L 8 10.6 C 8.3 13.3 8.8 14.3 9.7 15.6 C 10.3 16.2 11.1 16.8 12 17 L 12 7 L 8 7.6 Z"
|
||||||
|
android:valueType="pathType" />
|
||||||
|
<objectAnimator
|
||||||
|
android:duration="330"
|
||||||
|
android:interpolator="@android:interpolator/fast_out_slow_in"
|
||||||
|
android:propertyName="fillAlpha"
|
||||||
|
android:valueFrom="0"
|
||||||
|
android:valueTo="1"
|
||||||
|
android:valueType="floatType" />
|
||||||
|
</set>
|
||||||
|
</aapt:attr>
|
||||||
|
</target>
|
||||||
|
</animated-vector>
|
@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||||
|
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt">
|
||||||
|
<aapt:attr name="android:drawable">
|
||||||
|
<vector
|
||||||
|
android:name="vector"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:name="path"
|
||||||
|
android:fillColor="#fbfbfe"
|
||||||
|
android:pathData="M 20 6 C 20 5 19.2 4.1 18.2 4 L 12 3 L 5.8 4 C 4.8 4 4 5 4 6 L 4.1 11 C 4.4 14.2 5.1 16 6.6 18 C 7.929 19.627 9.821 20.698 11.9 21 L 12.1 21 C 14.2 20.7 16.1 19.6 17.4 18 C 19 16 19.6 14.2 19.9 11 L 20 6 Z M 17.9 10.8 C 17.9 12.963 17.198 15.069 15.9 16.8 C 14.9 17.9 13.5 18.8 12 19.1 C 10.452 18.8 9.066 17.946 8.1 16.7 C 6.816 15 6.114 12.93 6.1 10.8 C 6.041 9.167 6.041 7.533 6.1 5.9 L 12 5 L 17.9 6 L 18 6.2 L 17.9 10.9 Z M 8 7.6 L 8 10.6 C 8.3 13.3 8.8 14.3 9.7 15.6 C 10.3 16.2 11.1 16.8 12 17 L 12 7 L 8 7.6 Z"
|
||||||
|
android:strokeWidth="1" />
|
||||||
|
</vector>
|
||||||
|
</aapt:attr>
|
||||||
|
<target android:name="path">
|
||||||
|
<aapt:attr name="android:animation">
|
||||||
|
<objectAnimator
|
||||||
|
android:duration="300"
|
||||||
|
android:interpolator="@android:interpolator/fast_out_slow_in"
|
||||||
|
android:propertyName="fillColor"
|
||||||
|
android:valueFrom="#fbfbfe"
|
||||||
|
android:valueTo="#00b3f4"
|
||||||
|
android:valueType="colorType" />
|
||||||
|
</aapt:attr>
|
||||||
|
</target>
|
||||||
|
</animated-vector>
|
@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||||
|
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt">
|
||||||
|
<aapt:attr name="android:drawable">
|
||||||
|
<vector
|
||||||
|
android:name="vector"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:name="path"
|
||||||
|
android:fillColor="#20123a"
|
||||||
|
android:pathData="M 20 6 C 20 5 19.2 4.1 18.2 4 L 12 3 L 5.8 4 C 4.8 4 4 5 4 6 L 4.1 11 C 4.4 14.2 5.1 16 6.6 18 C 7.929 19.627 9.821 20.698 11.9 21 L 12.1 21 C 14.2 20.7 16.1 19.6 17.4 18 C 19 16 19.6 14.2 19.9 11 L 20 6 Z M 17.9 10.8 C 17.9 12.963 17.198 15.069 15.9 16.8 C 14.9 17.9 13.5 18.8 12 19.1 C 10.452 18.8 9.066 17.946 8.1 16.7 C 6.816 15 6.114 12.93 6.1 10.8 C 6.041 9.167 6.041 7.533 6.1 5.9 L 12 5 L 17.9 6 L 18 6.2 L 17.9 10.9 Z M 8 7.6 L 8 10.6 C 8.3 13.3 8.8 14.3 9.7 15.6 C 10.3 16.2 11.1 16.8 12 17 L 12 7 L 8 7.6 Z"
|
||||||
|
android:strokeWidth="1" />
|
||||||
|
</vector>
|
||||||
|
</aapt:attr>
|
||||||
|
<target android:name="path">
|
||||||
|
<aapt:attr name="android:animation">
|
||||||
|
<objectAnimator
|
||||||
|
android:duration="300"
|
||||||
|
android:interpolator="@android:interpolator/fast_out_slow_in"
|
||||||
|
android:propertyName="fillColor"
|
||||||
|
android:valueFrom="#20123a"
|
||||||
|
android:valueTo="#0250bb"
|
||||||
|
android:valueType="colorType" />
|
||||||
|
</aapt:attr>
|
||||||
|
</target>
|
||||||
|
</animated-vector>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue