From e568f3afbf165220b919ac8803c93dc610c20433 Mon Sep 17 00:00:00 2001 From: Naomi Kirby Date: Mon, 11 Mar 2024 08:31:58 -0700 Subject: [PATCH] VPN-6115: Remove VPN Speed Tests (#9215) * Remove connectionInfoToggleButton from ControllerView * Remove connectionInfo QML content * Remove unused UI resources * Remove VPNConnectionBenchmark singleton * Remove Benchmark functional test * Remove networkBenchmark mock from functional tests * Remove ConnectionBenchmark C++ class * Remove benchmarkUpload feature * Remove connection benchmarks from documentation * Remove unused glean metrics --- .dictionary | 2 - docs/Components/connection-benchmarks.md | 55 --- src/cmake/sources.cmake | 11 - src/commands/commandui.cpp | 1 - src/connectionbenchmark/benchmarktask.cpp | 51 --- src/connectionbenchmark/benchmarktask.h | 42 -- src/connectionbenchmark/benchmarktaskping.cpp | 45 -- src/connectionbenchmark/benchmarktaskping.h | 30 -- .../benchmarktasksentinel.h | 22 - .../benchmarktasktransfer.cpp | 271 ----------- .../benchmarktasktransfer.h | 55 --- .../connectionbenchmark.cpp | 233 ---------- src/connectionbenchmark/connectionbenchmark.h | 86 ---- .../uploaddatagenerator.cpp | 50 --- src/connectionbenchmark/uploaddatagenerator.h | 31 -- src/constants.h | 20 - src/feature/featurelist.h | 7 - src/mozillavpn.cpp | 2 - src/mozillavpn.h | 2 - src/mozillavpn_p.cpp | 4 - src/mozillavpn_p.h | 2 - src/telemetry/impression_metrics.yaml | 63 --- src/telemetry/interaction_metrics.yaml | 41 -- src/telemetry/outcome_metrics.yaml | 29 -- src/ui/CMakeLists.txt | 1 - src/ui/main.qml | 31 +- src/ui/resources.qrc | 7 - .../animations/speedometer_animation.json | 1 - .../animations/vpnlogo-kinetic_animation.json | 1 - src/ui/resources/bandwidth.svg | 3 - .../resources/connection-error-unstable.svg | 32 -- src/ui/resources/connection-green.svg | 3 - src/ui/resources/download.svg | 3 - src/ui/resources/upload.svg | 3 - .../ViewAnimationsPlayground.qml | 8 - src/ui/screens/home/ViewHome.qml | 1 - .../home/controller/ControllerView.qml | 145 +----- .../ConnectionCheckmarkList.qml | 58 --- .../connectionInfo/ConnectionInfoContent.qml | 282 ------------ .../connectionInfo/ConnectionInfoError.qml | 68 --- .../connectionInfo/ConnectionInfoItem.qml | 67 --- .../connectionInfo/ConnectionInfoScreen.qml | 234 ---------- .../controller/connectionInfo/LogoLoader.qml | 40 -- src/ui/screens/home/controller/qmldir | 6 - src/ui/singletons/VPNConnectionBenchmark.h | 26 -- src/ui/ui.qrc | 6 - tests/functional/queries.js | 6 - tests/functional/servers/networkBenchmark.js | 51 --- tests/functional/setupVpn.js | 11 - tests/functional/setupWasm.js | 8 - tests/functional/testBenchmark.js | 419 ------------------ wasm/test.html | 2 - 52 files changed, 8 insertions(+), 2670 deletions(-) delete mode 100644 docs/Components/connection-benchmarks.md delete mode 100644 src/connectionbenchmark/benchmarktask.cpp delete mode 100644 src/connectionbenchmark/benchmarktask.h delete mode 100644 src/connectionbenchmark/benchmarktaskping.cpp delete mode 100644 src/connectionbenchmark/benchmarktaskping.h delete mode 100644 src/connectionbenchmark/benchmarktasksentinel.h delete mode 100644 src/connectionbenchmark/benchmarktasktransfer.cpp delete mode 100644 src/connectionbenchmark/benchmarktasktransfer.h delete mode 100644 src/connectionbenchmark/connectionbenchmark.cpp delete mode 100644 src/connectionbenchmark/connectionbenchmark.h delete mode 100644 src/connectionbenchmark/uploaddatagenerator.cpp delete mode 100644 src/connectionbenchmark/uploaddatagenerator.h delete mode 100644 src/ui/resources/animations/speedometer_animation.json delete mode 100644 src/ui/resources/animations/vpnlogo-kinetic_animation.json delete mode 100644 src/ui/resources/bandwidth.svg delete mode 100644 src/ui/resources/connection-error-unstable.svg delete mode 100644 src/ui/resources/connection-green.svg delete mode 100644 src/ui/resources/download.svg delete mode 100644 src/ui/resources/upload.svg delete mode 100644 src/ui/screens/home/controller/connectionInfo/ConnectionCheckmarkList.qml delete mode 100644 src/ui/screens/home/controller/connectionInfo/ConnectionInfoContent.qml delete mode 100644 src/ui/screens/home/controller/connectionInfo/ConnectionInfoError.qml delete mode 100644 src/ui/screens/home/controller/connectionInfo/ConnectionInfoItem.qml delete mode 100644 src/ui/screens/home/controller/connectionInfo/ConnectionInfoScreen.qml delete mode 100644 src/ui/screens/home/controller/connectionInfo/LogoLoader.qml delete mode 100644 src/ui/singletons/VPNConnectionBenchmark.h delete mode 100644 tests/functional/servers/networkBenchmark.js delete mode 100644 tests/functional/testBenchmark.js diff --git a/.dictionary b/.dictionary index cdce51347a..09e31c1ac6 100644 --- a/.dictionary +++ b/.dictionary @@ -100,8 +100,6 @@ auth backend backgrounded bea's -benchmarked -benchmarking bool boolean bugfixes diff --git a/docs/Components/connection-benchmarks.md b/docs/Components/connection-benchmarks.md deleted file mode 100644 index 25fa6e37ce..0000000000 --- a/docs/Components/connection-benchmarks.md +++ /dev/null @@ -1,55 +0,0 @@ -# VPN Connection benchmarks - -For showing the user information on their internet speed we need to be able to test their current connection. The test can be run successfully only when the VPN is on and the connection has a signal. Results of the connection test are shown on the **Connection Info Screen**. - -## Benchmarks - -In order to get information on the current connection the following benchmarks are written as `Task`s that are run sequentially. - -### Benchmark: Ping - -The value for ping is determined by listening to changes of ping latency using the `ConnectionHealth` class for a certain duration and calculating the average of all sent and received pings. - -### Benchmark: Download - -The value for download is determined by downloading data from a remote file server and calculating the amount of data that is being received while running the download. - -## Result - -Depending on the results of the benchmarks we set a connection `Speed` to indicate what the current connection is capable of. - -* `SpeedSlow`: Connection speed is slow and should be potentially troubleshooted. - * Switching server locations - * Checking your internet connection -* `SpeedMedium`: Connection speed is good enough for basic internet usage. - * Browsing the internet - * Streaming video - * Video conferencing -* `SpeedFast`: Connection speed is capable of handling usage that requires more bandwidth. - * Streaming in 4K - * High-speed downloads - * Online gaming - -## States - -- `StateInitial`: Benchmarking did not start or was stopped without any errors. -- `StateRunning`: The current connection is being benchmarked. -- `StateReady`: All benchmarks were run successfully and the results are available. -- `StateError`: While benchmarking an unexpected error occurred. - -## User flow - -```mermaid -flowchart LR - MainView(Main View) - LoadingView(Loading view) - ConnectionView(Connection info view) - ErrorView(Error view) - - MainView -->|Start| LoadingView - LoadingView -->|User aborted| MainView - LoadingView -->|Backend error| ErrorView - ErrorView -->|User dismissed| MainView - ErrorView -->|User restarted| LoadingView - LoadingView -->|Result| ConnectionView -``` diff --git a/src/cmake/sources.cmake b/src/cmake/sources.cmake index fa305abb1b..9566e3df82 100644 --- a/src/cmake/sources.cmake +++ b/src/cmake/sources.cmake @@ -69,17 +69,6 @@ target_sources(mozillavpn-sources INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/commands/commandui.h ${CMAKE_CURRENT_SOURCE_DIR}/commands/commandwgconf.cpp ${CMAKE_CURRENT_SOURCE_DIR}/commands/commandwgconf.h - ${CMAKE_CURRENT_SOURCE_DIR}/connectionbenchmark/benchmarktask.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/connectionbenchmark/benchmarktask.h - ${CMAKE_CURRENT_SOURCE_DIR}/connectionbenchmark/benchmarktaskping.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/connectionbenchmark/benchmarktaskping.h - ${CMAKE_CURRENT_SOURCE_DIR}/connectionbenchmark/benchmarktasksentinel.h - ${CMAKE_CURRENT_SOURCE_DIR}/connectionbenchmark/benchmarktasktransfer.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/connectionbenchmark/benchmarktasktransfer.h - ${CMAKE_CURRENT_SOURCE_DIR}/connectionbenchmark/connectionbenchmark.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/connectionbenchmark/connectionbenchmark.h - ${CMAKE_CURRENT_SOURCE_DIR}/connectionbenchmark/uploaddatagenerator.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/connectionbenchmark/uploaddatagenerator.h ${CMAKE_CURRENT_SOURCE_DIR}/connectionhealth.cpp ${CMAKE_CURRENT_SOURCE_DIR}/connectionhealth.h ${CMAKE_CURRENT_SOURCE_DIR}/constants.cpp diff --git a/src/commands/commandui.cpp b/src/commands/commandui.cpp index 903f694c94..f7e1a9b0ef 100644 --- a/src/commands/commandui.cpp +++ b/src/commands/commandui.cpp @@ -15,7 +15,6 @@ #include "apppermission.h" #include "captiveportal/captiveportaldetection.h" #include "commandlineparser.h" -#include "connectionbenchmark/connectionbenchmark.h" #include "connectionhealth.h" #include "constants.h" #include "controller.h" diff --git a/src/connectionbenchmark/benchmarktask.cpp b/src/connectionbenchmark/benchmarktask.cpp deleted file mode 100644 index 987948b066..0000000000 --- a/src/connectionbenchmark/benchmarktask.cpp +++ /dev/null @@ -1,51 +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/. */ - -#include "benchmarktask.h" - -#include - -#include "leakdetector.h" -#include "logger.h" - -namespace { -Logger logger("BenchmarkTask"); -} - -BenchmarkTask::BenchmarkTask(const QString& taskName, uint32_t maxExecutionTime) - : Task(taskName), m_maxExecutionTime(maxExecutionTime) { - MZ_COUNT_CTOR(BenchmarkTask); -} - -BenchmarkTask::~BenchmarkTask() { MZ_COUNT_DTOR(BenchmarkTask); } - -void BenchmarkTask::setState(State state) { - logger.debug() << "Set state" << state; - - m_state = state; - emit stateChanged(m_state); -} - -void BenchmarkTask::run() { - logger.debug() << "Run benchmark"; - - if (m_state == StateCancelled) { - emit completed(); - return; - } - - setState(StateActive); - - QTimer::singleShot(m_maxExecutionTime, this, [this]() { stop(); }); -} - -void BenchmarkTask::stop() { - logger.debug() << "Stop benchmark"; - - if (m_state == StateActive) { - setState(StateInactive); - } else { - setState(StateCancelled); - } -} diff --git a/src/connectionbenchmark/benchmarktask.h b/src/connectionbenchmark/benchmarktask.h deleted file mode 100644 index 95649aaec5..0000000000 --- a/src/connectionbenchmark/benchmarktask.h +++ /dev/null @@ -1,42 +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/. */ - -#ifndef BENCHMARKTASK_H -#define BENCHMARKTASK_H - -#include "benchmarktasksentinel.h" -#include "task.h" - -class BenchmarkTask : public Task { - Q_OBJECT - Q_DISABLE_COPY_MOVE(BenchmarkTask) - - public: - BenchmarkTask(const QString& taskName, uint32_t maxExecutionTime); - virtual ~BenchmarkTask(); - - void run() override; - void stop(); - - enum State { StateActive, StateInactive, StateCancelled }; - - State state() const { return m_state; } - - const BenchmarkTaskSentinel* sentinel() const { return &m_sentinel; } - - signals: - void stateChanged(BenchmarkTask::State state); - - private: - void setState(State state); - - private: - State m_state = StateInactive; - - const uint32_t m_maxExecutionTime; - - BenchmarkTaskSentinel m_sentinel; -}; - -#endif // BENCHMARKTASK_H diff --git a/src/connectionbenchmark/benchmarktaskping.cpp b/src/connectionbenchmark/benchmarktaskping.cpp deleted file mode 100644 index f40bd19664..0000000000 --- a/src/connectionbenchmark/benchmarktaskping.cpp +++ /dev/null @@ -1,45 +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/. */ - -#include "benchmarktaskping.h" - -#include "connectionhealth.h" -#include "constants.h" -#include "leakdetector.h" -#include "logger.h" -#include "mozillavpn.h" - -namespace { -Logger logger("BenchmarkTaskPing"); -} - -BenchmarkTaskPing::BenchmarkTaskPing() - : BenchmarkTask("BenchmarkTaskPing", - Constants::BENCHMARK_MAX_DURATION_PING) { - MZ_COUNT_CTOR(BenchmarkTaskPing); - - connect(this, &BenchmarkTask::stateChanged, this, - &BenchmarkTaskPing::handleState); -} - -BenchmarkTaskPing::~BenchmarkTaskPing() { MZ_COUNT_DTOR(BenchmarkTaskPing); } - -void BenchmarkTaskPing::handleState(BenchmarkTask::State state) { - logger.debug() << "Handle state" << state; - - if (state == BenchmarkTask::StateActive) { - connect(MozillaVPN::instance()->connectionHealth(), - &ConnectionHealth::pingReceived, this, [&] { - logger.debug() << "Ping received"; - pingReady(); - }); - } else if (state == BenchmarkTask::StateInactive) { - pingReady(); - } -} - -void BenchmarkTaskPing::pingReady() { - emit finished(MozillaVPN::instance()->connectionHealth()->latency()); - emit completed(); -} diff --git a/src/connectionbenchmark/benchmarktaskping.h b/src/connectionbenchmark/benchmarktaskping.h deleted file mode 100644 index 5c25239899..0000000000 --- a/src/connectionbenchmark/benchmarktaskping.h +++ /dev/null @@ -1,30 +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/. */ - -#ifndef BENCHMARKTASKPING_H -#define BENCHMARKTASKPING_H - -#include "benchmarktask.h" - -class BenchmarkTaskPing final : public BenchmarkTask { - Q_OBJECT - Q_DISABLE_COPY_MOVE(BenchmarkTaskPing) - - public: - BenchmarkTaskPing(); - ~BenchmarkTaskPing(); - - signals: - void finished(quint64 pingLatency); - - private: - void handleState(BenchmarkTask::State state); - void pingReady(); - - private: - double m_pingLatencyAcc = 0; - quint8 m_numOfPingSamples = 0; -}; - -#endif // BENCHMARKTASKPING_H diff --git a/src/connectionbenchmark/benchmarktasksentinel.h b/src/connectionbenchmark/benchmarktasksentinel.h deleted file mode 100644 index f64d0eb871..0000000000 --- a/src/connectionbenchmark/benchmarktasksentinel.h +++ /dev/null @@ -1,22 +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/. */ - -#ifndef BENCHMARKTASKSENTINEL_H -#define BENCHMARKTASKSENTINEL_H - -#include - -class BenchmarkTaskSentinel final : public QObject { - Q_OBJECT - Q_DISABLE_COPY_MOVE(BenchmarkTaskSentinel) - - public: - BenchmarkTaskSentinel() = default; - ~BenchmarkTaskSentinel() { emit sentinelDestroyed(); } - - signals: - void sentinelDestroyed(); -}; - -#endif // BENCHMARKTASKSENTINEL_H diff --git a/src/connectionbenchmark/benchmarktasktransfer.cpp b/src/connectionbenchmark/benchmarktasktransfer.cpp deleted file mode 100644 index 678278a576..0000000000 --- a/src/connectionbenchmark/benchmarktasktransfer.cpp +++ /dev/null @@ -1,271 +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/. */ - -#include "benchmarktasktransfer.h" - -#include -#include -#include -#include - -#include "constants.h" -#include "leakdetector.h" -#include "logger.h" -#include "networkrequest.h" -#include "uploaddatagenerator.h" - -namespace { -Logger logger("BenchmarkTaskTransfer"); -} - -BenchmarkTaskTransfer::BenchmarkTaskTransfer(const QString& name, - BenchmarkType type, - const QUrl& url) - : BenchmarkTask(name, Constants::BENCHMARK_MAX_DURATION_TRANSFER), - m_type(type), - m_dnsLookup(QDnsLookup::A, url.host()), - m_url(url) { - MZ_COUNT_CTOR(BenchmarkTaskTransfer); - - connect(this, &BenchmarkTask::stateChanged, this, - &BenchmarkTaskTransfer::handleState); - connect(&m_dnsLookup, &QDnsLookup::finished, this, - &BenchmarkTaskTransfer::dnsLookupFinished); -} - -BenchmarkTaskTransfer::~BenchmarkTaskTransfer() { - MZ_COUNT_DTOR(BenchmarkTaskTransfer); -} - -void BenchmarkTaskTransfer::handleState(BenchmarkTask::State state) { - logger.debug() << "Handle state" << state; - - if (state == BenchmarkTask::StateActive) { -#if defined(MZ_DUMMY) || defined(MZ_ANDROID) || defined(MZ_WASM) -# if QT_VERSION >= 0x060800 && defined(MZ_ANDROID) -# error Check if QT added support for QDnsLookup::lookup() on Android -# endif - - createNetworkRequest(); -#else - // Start DNS resolution - m_dnsLookup.lookup(); -#endif - - m_elapsedTimer.start(); - } else if (state == BenchmarkTask::StateInactive) { - for (NetworkRequest* request : m_requests) { - request->abort(); - } - m_requests.clear(); - m_dnsLookup.abort(); - } -} - -void BenchmarkTaskTransfer::createNetworkRequest() { - logger.debug() << "Create network request"; - - NetworkRequest* request = nullptr; - switch (m_type) { - case BenchmarkDownload: { - request = new NetworkRequest(this); - request->get(m_url); - break; - } - case BenchmarkUpload: { - UploadDataGenerator* uploadData = - new UploadDataGenerator(Constants::BENCHMARK_MAX_BYTES_UPLOAD); - - if (!uploadData->open(UploadDataGenerator::ReadOnly)) { - emit finished(0, true); - emit completed(); - }; - request = new NetworkRequest(this, 200); - request->requestInternal().setHeader(QNetworkRequest::ContentTypeHeader, - "application/x-www-form-urlencoded"); - request->post(m_url, uploadData); - break; - } - } - - Q_ASSERT(request); - connectNetworkRequest(request); -} - -void BenchmarkTaskTransfer::createNetworkRequestWithRecord( - const QDnsHostAddressRecord& record) { - logger.debug() << "Create network request with record"; - - NetworkRequest* request = nullptr; - switch (m_type) { - case BenchmarkDownload: { - QUrl requestUrl(m_url); - QString hostname = requestUrl.host(); - - // Rewrite the request URL to use an explicit host address. - if (record.value().protocol() == QAbstractSocket::IPv6Protocol) { - requestUrl.setHost("[" + record.value().toString() + "]"); - } else { - requestUrl.setHost(record.value().toString()); - } - - request = new NetworkRequest(this, 200); - request->requestInternal().setRawHeader("Host", hostname.toLocal8Bit()); - request->requestInternal().setPeerVerifyName(hostname); - - request->get(requestUrl); - break; - } - case BenchmarkUpload: { - UploadDataGenerator* uploadData = - new UploadDataGenerator(Constants::BENCHMARK_MAX_BYTES_UPLOAD); - - if (!uploadData->open(UploadDataGenerator::ReadOnly)) { - emit finished(0, true); - emit completed(); - }; - QUrl requestUrl(m_url); - QString hostname = requestUrl.host(); - - // Rewrite the request URL to use an explicit host address. - if (record.value().protocol() == QAbstractSocket::IPv6Protocol) { - requestUrl.setHost("[" + record.value().toString() + "]"); - } else { - requestUrl.setHost(record.value().toString()); - } - - request = new NetworkRequest(this, 200); - request->requestInternal().setHeader(QNetworkRequest::ContentTypeHeader, - "application/x-www-form-urlencoded"); - - request->requestInternal().setRawHeader("Host", hostname.toLocal8Bit()); - request->requestInternal().setPeerVerifyName(hostname); - - request->post(requestUrl, uploadData); - break; - } - default: { - logger.error() << "Unhandled benchmark type"; - break; - } - } - - Q_ASSERT(request); - connectNetworkRequest(request); -} - -void BenchmarkTaskTransfer::connectNetworkRequest(NetworkRequest* request) { - logger.debug() << "Connect network requests"; - - switch (m_type) { - case BenchmarkDownload: { - connect(request, &NetworkRequest::requestUpdated, this, - &BenchmarkTaskTransfer::transferProgressed); - break; - } - case BenchmarkUpload: { - connect(request, &NetworkRequest::uploadProgressed, this, - &BenchmarkTaskTransfer::transferProgressed); - break; - } - default: { - logger.error() << "Unhandled benchmark type"; - break; - } - } - connect(request, &NetworkRequest::requestFailed, this, - &BenchmarkTaskTransfer::transferReady); - connect(request, &NetworkRequest::requestCompleted, this, - [&](const QByteArray& data) { - transferReady(QNetworkReply::NoError, data); - }); - - logger.debug() << "Starting request"; - m_requests.append(request); -} - -void BenchmarkTaskTransfer::dnsLookupFinished() { - auto guard = qScopeGuard([&] { - emit finished(0, true); - emit completed(); - }); - - if (m_dnsLookup.error() == QDnsLookup::OperationCancelledError) { - guard.dismiss(); - return; - } - - if (m_dnsLookup.error() != QDnsLookup::NoError) { - logger.error() << "DNS Lookup Failed:" << m_dnsLookup.errorString(); - return; - } - if (m_dnsLookup.hostAddressRecords().isEmpty()) { - logger.error() << "DNS Lookup Failed: no records"; - return; - } - if (state() != BenchmarkTask::StateActive) { - logger.warning() << "DNS Lookup finished after task aborted"; - return; - } - - logger.debug() << "DNS Lookup Finished"; - for (const QDnsHostAddressRecord& record : m_dnsLookup.hostAddressRecords()) { - logger.debug() << "Host record:" << record.value().toString(); - createNetworkRequestWithRecord(record); - } - - m_elapsedTimer.start(); - guard.dismiss(); -} - -void BenchmarkTaskTransfer::transferProgressed(qint64 bytesSent, - qint64 bytesTotal, - QNetworkReply* reply) { -#ifdef MZ_DEBUG - logger.debug() << "Transfer progressed:" << bytesSent << "(transferred)" - << bytesTotal << "(total)"; -#else - Q_UNUSED(bytesTotal); -#endif - - NetworkRequest* request = qobject_cast(sender()); - if (request != nullptr) { - request->discardData(); - } - - if (bytesSent > 0) { - m_bytesTransferred = bytesSent; - } -} - -void BenchmarkTaskTransfer::transferReady(QNetworkReply::NetworkError error, - const QByteArray& data) { - logger.debug() << "Transfer ready" << error; - Q_UNUSED(data); - - NetworkRequest* request = qobject_cast(QObject::sender()); - m_requests.removeOne(request); - - quint64 bitsPerSec = 0; - double msecs = static_cast(m_elapsedTimer.elapsed()); - if (m_bytesTransferred > 0 && msecs > 0) { - bitsPerSec = static_cast( - static_cast(m_bytesTransferred * 8) / (msecs / 1000.00)); - } - - bool hasUnexpectedError = (error != QNetworkReply::NoError && - error != QNetworkReply::OperationCanceledError && - error != QNetworkReply::TimeoutError) -#ifndef MZ_WASM - || bitsPerSec == 0 -#endif - ; - - logger.debug() << "Transfer completed" << bitsPerSec << "baud"; - - if (m_requests.isEmpty()) { - emit finished(bitsPerSec, hasUnexpectedError); - emit completed(); - } -} diff --git a/src/connectionbenchmark/benchmarktasktransfer.h b/src/connectionbenchmark/benchmarktasktransfer.h deleted file mode 100644 index 80afb08035..0000000000 --- a/src/connectionbenchmark/benchmarktasktransfer.h +++ /dev/null @@ -1,55 +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/. */ - -#ifndef BENCHMARKTASKTRANSFER_H -#define BENCHMARKTASKTRANSFER_H - -#include -#include -#include -#include - -#include "benchmarktask.h" - -class NetworkRequest; - -class BenchmarkTaskTransfer : public BenchmarkTask { - Q_OBJECT - Q_DISABLE_COPY_MOVE(BenchmarkTaskTransfer) - Q_PROPERTY(BenchmarkType type MEMBER m_type CONSTANT) - - public: - enum BenchmarkType { - BenchmarkDownload, - BenchmarkUpload, - }; - - explicit BenchmarkTaskTransfer(const QString& name, BenchmarkType type, - const QUrl& url); - virtual ~BenchmarkTaskTransfer(); - - signals: - void finished(quint64 bitsPerSec, bool hasUnexpectedError); - - private: - void createNetworkRequest(); - void createNetworkRequestWithRecord(const QDnsHostAddressRecord& record); - void connectNetworkRequest(NetworkRequest* request); - void dnsLookupFinished(); - void handleState(BenchmarkTask::State state); - void transferProgressed(qint64 bytesTransferred, qint64 bytesTotal, - QNetworkReply* reply); - void transferReady(QNetworkReply::NetworkError error, const QByteArray& data); - - private: - BenchmarkType m_type; - QDnsLookup m_dnsLookup; - QList m_requests; - const QUrl m_url; - - qint64 m_bytesTransferred = 0; - QElapsedTimer m_elapsedTimer; -}; - -#endif // BENCHMARKTASKTRANSFER_H diff --git a/src/connectionbenchmark/connectionbenchmark.cpp b/src/connectionbenchmark/connectionbenchmark.cpp deleted file mode 100644 index f08369a59c..0000000000 --- a/src/connectionbenchmark/connectionbenchmark.cpp +++ /dev/null @@ -1,233 +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/. */ - -#include "connectionbenchmark.h" - -#include "benchmarktaskping.h" -#include "benchmarktasktransfer.h" -#include "connectionhealth.h" -#include "constants.h" -#include "controller.h" -#include "feature/feature.h" -#include "glean/generated/metrics.h" -#include "leakdetector.h" -#include "logger.h" -#include "mozillavpn.h" -#include "taskscheduler.h" - -namespace { -Logger logger("ConnectionBenchmark"); -} - -ConnectionBenchmark::ConnectionBenchmark() { - MZ_COUNT_CTOR(ConnectionBenchmark); -} - -ConnectionBenchmark::~ConnectionBenchmark() { - MZ_COUNT_DTOR(ConnectionBenchmark); -} - -void ConnectionBenchmark::initialize() { - MozillaVPN* vpn = MozillaVPN::instance(); - - Controller* controller = vpn->controller(); - Q_ASSERT(controller); - - connect(controller, &Controller::stateChanged, this, - &ConnectionBenchmark::handleControllerState); - connect(vpn->connectionHealth(), &ConnectionHealth::stabilityChanged, this, - &ConnectionBenchmark::handleStabilityChange); -} - -void ConnectionBenchmark::setConnectionSpeed() { - if (m_state == StateError) { - logger.debug() << "Set connection speed abort because of errors"; - return; - } - - logger.debug() << "Set connection speed"; - - // TODO: Take uploadBps for calculating speed into account - if (m_downloadBps >= Constants::BENCHMARK_THRESHOLD_SPEED_FAST) { - m_speed = SpeedFast; - } else if (m_downloadBps >= Constants::BENCHMARK_THRESHOLD_SPEED_MEDIUM) { - m_speed = SpeedMedium; - } else { - m_speed = SpeedSlow; - } - - mozilla::glean::outcome::speed_test_completed.record( - mozilla::glean::outcome::SpeedTestCompletedExtra{ - ._outcome = "speed_test_completed", - ._speed = QVariant::fromValue(m_speed).toString(), - }); - - emit speedChanged(); - setState(StateReady); -} - -void ConnectionBenchmark::setState(State state) { - logger.debug() << "Set state" << state; - m_state = state; - - emit stateChanged(); -} - -void ConnectionBenchmark::start() { - logger.debug() << "Start connection benchmarking"; - - Q_ASSERT(m_state != StateRunning); - - MozillaVPN* vpn = MozillaVPN::instance(); - - Controller* controller = vpn->controller(); - Controller::State connectionState = controller->state(); - Q_ASSERT(connectionState == Controller::StateOn); - - setState(StateRunning); - - // Create ping benchmark - BenchmarkTaskPing* pingTask = new BenchmarkTaskPing(); - connect(pingTask, &BenchmarkTaskPing::finished, this, - &ConnectionBenchmark::pingBenchmarked); - connect(pingTask->sentinel(), &BenchmarkTaskSentinel::sentinelDestroyed, this, - [this, pingTask]() { m_benchmarkTasks.removeOne(pingTask); }); - m_benchmarkTasks.append(pingTask); - TaskScheduler::scheduleTask(pingTask); - - // Create download benchmark - BenchmarkTaskTransfer* downloadTask = new BenchmarkTaskTransfer( - "BenchmarkTaskDownload", BenchmarkTaskTransfer::BenchmarkDownload, - Constants::benchmarkDownloadUrl()); - connect(downloadTask, &BenchmarkTaskTransfer::finished, this, - &ConnectionBenchmark::downloadBenchmarked); - connect(downloadTask->sentinel(), &BenchmarkTaskSentinel::sentinelDestroyed, - this, - [this, downloadTask]() { m_benchmarkTasks.removeOne(downloadTask); }); - m_benchmarkTasks.append(downloadTask); - TaskScheduler::scheduleTask(downloadTask); - - // Create upload benchmark - if (Feature::get(Feature::Feature_benchmarkUpload)->isSupported()) { - BenchmarkTaskTransfer* uploadTask = new BenchmarkTaskTransfer( - "BenchmarkTaskUpload", BenchmarkTaskTransfer::BenchmarkUpload, - Constants::benchmarkUploadUrl()); - Q_UNUSED(uploadTask); - - connect(uploadTask, &BenchmarkTaskTransfer::finished, this, - &ConnectionBenchmark::uploadBenchmarked); - connect(uploadTask->sentinel(), &BenchmarkTask::destroyed, this, - [this, uploadTask]() { m_benchmarkTasks.removeOne(uploadTask); }); - m_benchmarkTasks.append(uploadTask); - TaskScheduler::scheduleTask(uploadTask); - } - - // Need this check to show error screen if there is no connection when - // starting test. - showErrorIfNoSignal(); -} - -void ConnectionBenchmark::stop() { - if (m_state == StateInitial) { - return; - } - - logger.debug() << "Stop benchmarks"; - if ((m_state == StateRunning || m_state == StateError) && - !m_benchmarkTasks.isEmpty()) { - for (BenchmarkTask* benchmark : m_benchmarkTasks) { - benchmark->stop(); - } - - m_benchmarkTasks.clear(); - }; -} - -void ConnectionBenchmark::reset() { - logger.debug() << "Reset benchmarks"; - - stop(); - - m_downloadBps = 0; - m_uploadBps = 0; - m_pingLatency = 0; - - setState(StateInitial); -} - -void ConnectionBenchmark::downloadBenchmarked(quint64 bitsPerSec, - bool hasUnexpectedError) { - logger.debug() << "Benchmarked download" << bitsPerSec; - - if (hasUnexpectedError) { - setState(StateError); - return; - } - - m_downloadBps = bitsPerSec; - emit downloadBpsChanged(); - - if (!Feature::get(Feature::Feature_benchmarkUpload)->isSupported()) { - // All benchmarks ran successfully and we can set the connection speed. - setConnectionSpeed(); - } -} - -void ConnectionBenchmark::pingBenchmarked(quint64 pingLatency) { - logger.debug() << "Benchmarked ping" << pingLatency; - - m_pingLatency = pingLatency; - emit pingLatencyChanged(); -} - -void ConnectionBenchmark::uploadBenchmarked(quint64 bitsPerSec, - bool hasUnexpectedError) { - logger.debug() << "Benchmarked upload" << bitsPerSec; - - if (hasUnexpectedError) { - setState(StateError); - return; - } - - m_uploadBps = bitsPerSec; - emit uploadBpsChanged(); - - if (Feature::get(Feature::Feature_benchmarkUpload)->isSupported()) { - // All benchmarks ran successfully and we can set the connection speed. - setConnectionSpeed(); - } -} - -void ConnectionBenchmark::handleControllerState() { - if (m_state == StateInitial || m_state == StateReady) { - return; - } - - Controller::State connectionState = - MozillaVPN::instance()->controller()->state(); - logger.debug() << "Handle connection state" << connectionState; - - if (connectionState != Controller::StateOn) { - setState(StateError); - stop(); - } -} - -void ConnectionBenchmark::handleStabilityChange() { - if (m_state == StateInitial || m_state == StateReady) { - return; - } - logger.debug() << "Handle stability change"; - showErrorIfNoSignal(); -} - -void ConnectionBenchmark::showErrorIfNoSignal() { - ConnectionHealth::ConnectionStability stability = - MozillaVPN::instance()->connectionHealth()->stability(); - logger.debug() << "Current stability: " << stability; - if (stability == ConnectionHealth::NoSignal) { - setState(StateError); - stop(); - }; -} diff --git a/src/connectionbenchmark/connectionbenchmark.h b/src/connectionbenchmark/connectionbenchmark.h deleted file mode 100644 index 21bb517c9c..0000000000 --- a/src/connectionbenchmark/connectionbenchmark.h +++ /dev/null @@ -1,86 +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/. */ - -#ifndef CONNECTIONBENCHMARK_H -#define CONNECTIONBENCHMARK_H - -#include -#include -#include - -#include "benchmarktask.h" - -class ConnectionHealth; - -class ConnectionBenchmark final : public QObject { - Q_OBJECT; - Q_DISABLE_COPY_MOVE(ConnectionBenchmark); - - Q_PROPERTY(State state READ state NOTIFY stateChanged); - Q_PROPERTY(Speed speed READ speed NOTIFY speedChanged); - Q_PROPERTY(quint64 downloadBps READ downloadBps NOTIFY downloadBpsChanged); - Q_PROPERTY(quint16 pingLatency READ pingLatency NOTIFY pingLatencyChanged); - Q_PROPERTY(quint64 uploadBps READ uploadBps NOTIFY uploadBpsChanged); - - public: - ConnectionBenchmark(); - ~ConnectionBenchmark(); - - void initialize(); - - Q_INVOKABLE void start(); - Q_INVOKABLE void reset(); - - enum State { - StateInitial, - StateRunning, - StateReady, - StateError, - }; - Q_ENUM(State); - - enum Speed { - SpeedSlow, - SpeedMedium, - SpeedFast, - }; - Q_ENUM(Speed); - - State state() const { return m_state; } - Speed speed() const { return m_speed; } - quint16 pingLatency() const { return m_pingLatency; } - quint64 downloadBps() const { return m_downloadBps; } - quint64 uploadBps() const { return m_uploadBps; } - - signals: - void downloadBpsChanged(); - void pingLatencyChanged(); - void uploadBpsChanged(); - void speedChanged(); - void stateChanged(); - - private: - void downloadBenchmarked(quint64 bitsPerSec, bool hasUnexpectedError); - void pingBenchmarked(quint64 pingLatencyLatency); - void uploadBenchmarked(quint64 bitsPerSec, bool hasUnexpectedError); - - void handleControllerState(); - void handleStabilityChange(); - void setConnectionSpeed(); - void setState(State state); - void stop(); - void showErrorIfNoSignal(); - - private: - QList m_benchmarkTasks; - - State m_state = StateInitial; - Speed m_speed = SpeedSlow; - - quint64 m_downloadBps = 0; - quint16 m_pingLatency = 0; - quint64 m_uploadBps = 0; -}; - -#endif // CONNECTIONBENCHMARK_H diff --git a/src/connectionbenchmark/uploaddatagenerator.cpp b/src/connectionbenchmark/uploaddatagenerator.cpp deleted file mode 100644 index ae25e411e3..0000000000 --- a/src/connectionbenchmark/uploaddatagenerator.cpp +++ /dev/null @@ -1,50 +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/. */ - -#include "uploaddatagenerator.h" - -#include -#include - -#include "leakdetector.h" -#include "logger.h" - -namespace { -Logger logger("UploadDataGenerator"); -} - -UploadDataGenerator::UploadDataGenerator(const qint64 totalSize) - : m_totalSize(totalSize) { - MZ_COUNT_CTOR(UploadDataGenerator); - - memset(m_dataBuffer, 0x00, sizeof(m_dataBuffer)); -} - -UploadDataGenerator::~UploadDataGenerator() { - MZ_COUNT_DTOR(UploadDataGenerator); -} - -qint64 UploadDataGenerator::readData(char* data, qint64 maxSize) { - qint64 maxBufferSize = qMin(MAX_BUFFER_SIZE, maxSize); - qint64 maxReadSize = qMin(m_totalSize - pos(), maxBufferSize); - -#ifdef MZ_DEBUG - logger.debug() << "Read data" << maxReadSize; -#endif - - if (maxReadSize < 0) { - return -1; - } - - memcpy(data, m_dataBuffer, maxReadSize); - return maxReadSize; -}; - -qint64 UploadDataGenerator::writeData(const char* data, qint64 maxSize) { - logger.debug() << "Write data"; - Q_UNUSED(data); - Q_UNUSED(maxSize); - - return -1; -}; diff --git a/src/connectionbenchmark/uploaddatagenerator.h b/src/connectionbenchmark/uploaddatagenerator.h deleted file mode 100644 index 5e7077e90d..0000000000 --- a/src/connectionbenchmark/uploaddatagenerator.h +++ /dev/null @@ -1,31 +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/. */ - -#ifndef UPLOADDATAGENERATOR_H -#define UPLOADDATAGENERATOR_H - -#include - -constexpr int32_t MAX_BUFFER_SIZE = 4096; - -class UploadDataGenerator final : public QIODevice { - Q_OBJECT - Q_DISABLE_COPY_MOVE(UploadDataGenerator) - - public: - explicit UploadDataGenerator(const qint64 totalSize); - ~UploadDataGenerator(); - - qint64 size() const override { return m_totalSize; } - - private: - virtual qint64 readData(char* data, qint64 maxSize) override; - virtual qint64 writeData(const char* data, qint64 maxSize) override; - - private: - const qint64 m_totalSize; - char m_dataBuffer[MAX_BUFFER_SIZE]; -}; - -#endif // UPLOADDATAGENERATOR_H diff --git a/src/constants.h b/src/constants.h index 14c6a0a485..99acb13621 100644 --- a/src/constants.h +++ b/src/constants.h @@ -146,13 +146,6 @@ PRODBETAEXPR(QString, fxaApiBaseUrl, "https://api.accounts.firefox.com", #undef PRODBETAEXPR -// Number of msecs for max runtime of the connection benchmarks. -constexpr uint32_t BENCHMARK_MAX_BYTES_UPLOAD = 10485760; // 10 Megabyte -constexpr uint32_t BENCHMARK_MAX_DURATION_PING = 3000; -constexpr uint32_t BENCHMARK_MAX_DURATION_TRANSFER = 15000; -constexpr uint32_t BENCHMARK_THRESHOLD_SPEED_FAST = 25000000; // 25 Megabit -constexpr uint32_t BENCHMARK_THRESHOLD_SPEED_MEDIUM = 10000000; // 10 Megabit - #if defined(UNIT_TEST) # define CONSTEXPR(type, functionName, releaseValue, debugValue, \ testingValue) \ @@ -234,19 +227,6 @@ PRODBETAEXPR(QString, addonBaseUrl, "MZ_ADDON_URL", "https://mozilla-mobile.github.io/mozilla-vpn-client/addons/")) -PRODBETAEXPR(QString, benchmarkDownloadUrl, - "https://archive.mozilla.org/pub/vpn/speedtest/50m.data", - Constants::envOrDefault( - "MZ_BENCHMARK_DOWNLOAD_URL", - "https://archive.mozilla.org/pub/vpn/speedtest/50m.data")); - -PRODBETAEXPR( - QString, benchmarkUploadUrl, "https://benchmark.vpn.mozilla.org/upload", - Constants::envOrDefault( - "MZ_BENCHMARK_UPLOAD_URL", - "https://dev.vpn-network-benchmark.nonprod.webservices.mozgcp.net/" - "upload")); - PRODBETAEXPR(QString, captivePortalUrl, "http://%1/success.txt", Constants::envOrDefault("MZ_CAPTIVE_PORTAL_URL", "http://%1/success.txt")); diff --git a/src/feature/featurelist.h b/src/feature/featurelist.h index ce34460625..b160801aed 100644 --- a/src/feature/featurelist.h +++ b/src/feature/featurelist.h @@ -54,13 +54,6 @@ FEATURE(appReview, // Feature ID QStringList(), // feature dependencies FeatureCallback_iosOrAndroid) -FEATURE(benchmarkUpload, // Feature ID - "Benchmark Upload", // Feature name - FeatureCallback_true, // Can be flipped on - FeatureCallback_true, // Can be flipped off - QStringList(), // feature dependencies - FeatureCallback_true) - FEATURE(captivePortal, // Feature ID "Captive Portal", // Feature name FeatureCallback_true, // Can be flipped on diff --git a/src/mozillavpn.cpp b/src/mozillavpn.cpp index 667c3b0f0d..3a455f5c92 100644 --- a/src/mozillavpn.cpp +++ b/src/mozillavpn.cpp @@ -252,8 +252,6 @@ void MozillaVPN::initialize() { m_private->m_telemetry.initialize(); - m_private->m_connectionBenchmark.initialize(); - m_private->m_ipAddressLookup.initialize(); m_private->m_serverLatency.initialize(); diff --git a/src/mozillavpn.h b/src/mozillavpn.h index a6b44e4f4d..57fd2fcf10 100644 --- a/src/mozillavpn.h +++ b/src/mozillavpn.h @@ -18,7 +18,6 @@ struct MozillaVPNPrivate; class CaptivePortal; class CaptivePortalDetection; -class ConnectionBenchmark; class ConnectionHealth; class Controller; class DeviceModel; @@ -130,7 +129,6 @@ class MozillaVPN final : public App { // Private object getters: CaptivePortal* captivePortal() const; CaptivePortalDetection* captivePortalDetection() const; - ConnectionBenchmark* connectionBenchmark() const; ConnectionHealth* connectionHealth() const; Controller* controller() const; ServerData* serverData() const; diff --git a/src/mozillavpn_p.cpp b/src/mozillavpn_p.cpp index 01fc3eea31..8927d2f346 100644 --- a/src/mozillavpn_p.cpp +++ b/src/mozillavpn_p.cpp @@ -13,10 +13,6 @@ CaptivePortalDetection* MozillaVPN::captivePortalDetection() const { return &m_private->m_captivePortalDetection; } -ConnectionBenchmark* MozillaVPN::connectionBenchmark() const { - return &m_private->m_connectionBenchmark; -} - ConnectionHealth* MozillaVPN::connectionHealth() const { return &m_private->m_connectionHealth; } diff --git a/src/mozillavpn_p.h b/src/mozillavpn_p.h index 150fb4068c..14a217bad8 100644 --- a/src/mozillavpn_p.h +++ b/src/mozillavpn_p.h @@ -7,7 +7,6 @@ #include "captiveportal/captiveportal.h" #include "captiveportal/captiveportaldetection.h" -#include "connectionbenchmark/connectionbenchmark.h" #include "connectionhealth.h" #include "controller.h" #include "ipaddresslookup.h" @@ -29,7 +28,6 @@ struct MozillaVPNPrivate { CaptivePortal m_captivePortal; CaptivePortalDetection m_captivePortalDetection; - ConnectionBenchmark m_connectionBenchmark; ConnectionHealth m_connectionHealth; Controller m_controller; DeviceModel m_deviceModel; diff --git a/src/telemetry/impression_metrics.yaml b/src/telemetry/impression_metrics.yaml index 9353e9d088..138467b1f7 100644 --- a/src/telemetry/impression_metrics.yaml +++ b/src/telemetry/impression_metrics.yaml @@ -30,69 +30,6 @@ impression: screen: description: The id of the screen the user is on type: string - speed_test_loading_screen: - type: event - lifetime: ping - send_in_pings: - - main - description: | - The user has just moved on to the screen that shows - the loading animation for the speed test results - bugs: - - https://mozilla-hub.atlassian.net/browse/VPN-5366 - - https://mozilla-hub.atlassian.net/browse/VPN-5718 - data_reviews: - - https://github.com/mozilla-mobile/mozilla-vpn-client/pull/8060#issuecomment-1724272061 - - https://github.com/mozilla-mobile/mozilla-vpn-client/pull/8386#issuecomment-1780543747 - data_sensitivity: - - interaction - notification_emails: - - brizental@mozilla.com - - vpn-telemetry@mozilla.com - expires: never - extra_keys: *impression_extra_keys - speed_test_completed_screen: - type: event - lifetime: ping - send_in_pings: - - main - description: | - The user has just moved on to the screen that shows - the speed test results - bugs: - - https://mozilla-hub.atlassian.net/browse/VPN-5366 - - https://mozilla-hub.atlassian.net/browse/VPN-5718 - data_reviews: - - https://github.com/mozilla-mobile/mozilla-vpn-client/pull/8060#issuecomment-1724272061 - - https://github.com/mozilla-mobile/mozilla-vpn-client/pull/8386#issuecomment-1780543747 - data_sensitivity: - - interaction - notification_emails: - - brizental@mozilla.com - - vpn-telemetry@mozilla.com - expires: never - extra_keys: *impression_extra_keys - speed_test_error_screen: - type: event - lifetime: ping - send_in_pings: - - main - description: | - The user has just moved on to the screen that shows - the speed test error - bugs: - - https://mozilla-hub.atlassian.net/browse/VPN-5366 - - https://mozilla-hub.atlassian.net/browse/VPN-5718 - data_reviews: - - https://github.com/mozilla-mobile/mozilla-vpn-client/pull/8060#issuecomment-1724272061 - - https://github.com/mozilla-mobile/mozilla-vpn-client/pull/8386#issuecomment-1780543747 - data_sensitivity: - - interaction - notification_emails: - - brizental@mozilla.com - - vpn-telemetry@mozilla.com - expires: never - extra_keys: *impression_extra_keys connection_info_screen: type: event lifetime: ping diff --git a/src/telemetry/interaction_metrics.yaml b/src/telemetry/interaction_metrics.yaml index e8e4c9db4c..5d0c7ad799 100644 --- a/src/telemetry/interaction_metrics.yaml +++ b/src/telemetry/interaction_metrics.yaml @@ -59,47 +59,6 @@ interaction: - vpn-telemetry@mozilla.com expires: never extra_keys: *interaction_extra_keys - start_speed_test_selected: - type: event - lifetime: ping - send_in_pings: - - main - description: | - The user has clicked on the button that triggers the speed test - bugs: - - https://mozilla-hub.atlassian.net/browse/VPN-5366 - - https://mozilla-hub.atlassian.net/browse/VPN-5718 - data_reviews: - - https://github.com/mozilla-mobile/mozilla-vpn-client/pull/8060#issuecomment-1724272061 - - https://github.com/mozilla-mobile/mozilla-vpn-client/pull/8386#issuecomment-1780543747 - data_sensitivity: - - interaction - notification_emails: - - brizental@mozilla.com - - vpn-telemetry@mozilla.com - expires: never - extra_keys: *interaction_extra_keys - refresh_selected: - type: event - lifetime: ping - send_in_pings: - - main - description: | - The user has clicked on the button to refresh the - speed test results - bugs: - - https://mozilla-hub.atlassian.net/browse/VPN-5366 - - https://mozilla-hub.atlassian.net/browse/VPN-5718 - data_reviews: - - https://github.com/mozilla-mobile/mozilla-vpn-client/pull/8060#issuecomment-1724272061 - - https://github.com/mozilla-mobile/mozilla-vpn-client/pull/8386#issuecomment-1780543747 - data_sensitivity: - - interaction - notification_emails: - - brizental@mozilla.com - - vpn-telemetry@mozilla.com - expires: never - extra_keys: *interaction_extra_keys get_help_selected: type: event lifetime: ping diff --git a/src/telemetry/outcome_metrics.yaml b/src/telemetry/outcome_metrics.yaml index 223487772f..7a355d510f 100644 --- a/src/telemetry/outcome_metrics.yaml +++ b/src/telemetry/outcome_metrics.yaml @@ -7,35 +7,6 @@ $schema: moz://mozilla.org/schemas/glean/metrics/2-0-0 # "outcome" category metrics record the outcome of some user action outcome: - speed_test_completed: - type: event - lifetime: ping - send_in_pings: - - main - description: | - A speed test has just been completed, - this is a backend event and does not necessarily - mean the user has seen the speed test completed screen. - For that, there is the impression.speed_test_result_completed event. - bugs: - - https://mozilla-hub.atlassian.net/browse/VPN-5366 - data_reviews: - - https://github.com/mozilla-mobile/mozilla-vpn-client/pull/8060#issuecomment-1724272061 - data_sensitivity: - - technical - notification_emails: - - brizental@mozilla.com - - vpn-telemetry@mozilla.com - expires: never - extra_keys: - speed: - description: | - The speed bucket that the test resulted in, or if problem occurred: - Slow | Medium | Fast | Cancelled | Error - type: string - outcome: &outcome_extra_key - description: The outcome of a given feature - type: string login_started: type: event lifetime: ping diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index ce0a691564..c91fcc2cf4 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -25,7 +25,6 @@ qt_add_qml_module(mozillavpn-ui singletons/VPN.h singletons/VPNAppPermissions.h singletons/VPNCaptivePortal.h - singletons/VPNConnectionBenchmark.h singletons/VPNConnectionHealth.h singletons/VPNController.h singletons/VPNCurrentServer.h diff --git a/src/ui/main.qml b/src/ui/main.qml index 64620c0b24..be56a6b081 100644 --- a/src/ui/main.qml +++ b/src/ui/main.qml @@ -186,36 +186,7 @@ Window { visible: showNavigationBar.includes(MZNavigator.screen) && VPN.userState === VPN.UserAuthenticated && - VPN.state === VPN.StateMain && opacity !== 0 - - function setNavBarOpacity() { - if (MZNavigator.screen === VPN.ScreenHome) { - navbar.opacity = VPNConnectionBenchmark.state === VPNConnectionBenchmark.StateInitial ? 1 : 0 - } else { - navbar.opacity = 1; - } - } - - Connections { - target: VPNConnectionBenchmark - function onStateChanged() { - navbar.setNavBarOpacity(); - } - } - - Connections { - target: MZNavigator - - function onCurrentComponentChanged() { - navbar.setNavBarOpacity(); - } - } - - Behavior on opacity { - PropertyAnimation { - duration: 500 - } - } + VPN.state === VPN.StateMain } Connections { diff --git a/src/ui/resources.qrc b/src/ui/resources.qrc index 5c0879e925..74e06e5786 100644 --- a/src/ui/resources.qrc +++ b/src/ui/resources.qrc @@ -4,16 +4,11 @@ resources/android.svg resources/animations/globe_animation.json resources/animations/lock_animation.json - resources/animations/speedometer_animation.json resources/animations/vpnactive_animation.json resources/animations/vpnlogo-drop_animation.json - resources/animations/vpnlogo-kinetic_animation.json resources/apple-active.svg resources/apple.svg - resources/bandwidth.svg resources/check-email.svg - resources/connection-error-unstable.svg - resources/connection-green.svg resources/connection-info.svg resources/connection-info-dark.svg resources/copy.svg @@ -23,7 +18,6 @@ resources/devicesLimit.svg resources/devicesRemove.svg resources/developer.svg - resources/download.svg resources/flags/AC.png resources/flags/AD.png resources/flags/AE.png @@ -349,7 +343,6 @@ resources/switching.svg resources/tip.svg resources/updateRecommended.svg - resources/upload.svg resources/updateRequired.svg resources/warning-white.svg resources/warning-crash.svg diff --git a/src/ui/resources/animations/speedometer_animation.json b/src/ui/resources/animations/speedometer_animation.json deleted file mode 100644 index 5cd4e48263..0000000000 --- a/src/ui/resources/animations/speedometer_animation.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.7.4","fr":30,"ip":0,"op":150,"w":1240,"h":708,"nm":"Clock","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":3,"nm":"▽ Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[461.158,232.654,0],"ix":2,"l":2},"a":{"a":0,"k":[461.173,230.331,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"▽ Layer 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[461.173,230.331,0],"ix":2,"l":2},"a":{"a":0,"k":[461.173,230.331,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.32],"y":[1.27]},"o":{"x":[0.17],"y":[0.89]},"t":30,"s":[360]},{"i":{"x":[0.32],"y":[1.27]},"o":{"x":[0.17],"y":[0.89]},"t":45,"s":[485]},{"i":{"x":[0.32],"y":[1.27]},"o":{"x":[0.17],"y":[0.89]},"t":75,"s":[474]},{"i":{"x":[0.32],"y":[1]},"o":{"x":[0.17],"y":[0]},"t":105,"s":[492]},{"i":{"x":[0.32],"y":[1.27]},"o":{"x":[0.17],"y":[0.89]},"t":120,"s":[492]},{"t":135,"s":[360]}],"ix":10},"p":{"a":0,"k":[512.813,263.584,0],"ix":2,"l":2},"a":{"a":0,"k":[-48,-31.5,0],"ix":1,"l":2},"s":{"a":0,"k":[-100,-100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.721,2.742],[-64.107,30.036],[0,0],[11.16,-8.862],[0,0],[4.441,-1.318],[4.608,0.497],[4.052,2.234],[2.858,3.62],[1.216,4.437],[-0.618,4.557],[-2.354,3.961]],"o":[[11.16,-8.862],[0,0],[-43.417,55.471],[0,0],[-3.576,2.926],[-4.441,1.318],[-4.608,-0.497],[-4.052,-2.234],[-2.858,-3.62],[-1.216,-4.437],[0.618,-4.557],[2.354,-3.961]],"v":[[-68.055,6.509],[82.072,-68.613],[81.947,-68.582],[-24.637,60.27],[-25.233,60.736],[-37.38,67.167],[-51.091,68.412],[-64.212,64.274],[-74.683,55.405],[-80.856,43.198],[-81.762,29.571],[-77.259,16.665]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.435294121504,0.290196090937,0.905882358551,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":67.826,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[495.869,154.807,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-20.079,28.066],[-32.538,10.821],[-32.629,-10.537],[-20.317,-27.89],[0,0],[25.91,7.912],[25.62,-8.823],[15.752,-22.259],[-0.006,-27.373]],"o":[[-0.013,-34.642],[20.079,-28.066],[32.538,-10.821],[32.629,10.537],[0,0],[-16.512,-21.688],[-25.91,-7.912],[-25.62,8.823],[-15.752,22.259],[0,0]],"v":[[-146.76,77.19],[-115.891,-19.279],[-34.945,-79.102],[65.308,-79.539],[146.76,-20.424],[85.666,7.331],[20.434,-38.186],[-58.804,-36.784],[-122.423,11.012],[-146.636,87.332]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.678431391716,0.474509805441,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[495.869,154.807,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-20.079,28.066],[-32.538,10.821],[-32.629,-10.537],[-20.317,-27.89],[0,0],[25.91,7.912],[25.62,-8.823],[15.752,-22.259],[-0.006,-27.373]],"o":[[-0.013,-34.642],[20.079,-28.066],[32.538,-10.821],[32.629,10.537],[0,0],[-16.512,-21.688],[-25.91,-7.912],[-25.62,8.823],[-15.752,22.259],[0,0]],"v":[[-146.76,77.19],[-115.891,-19.279],[-34.945,-79.102],[65.308,-79.539],[146.76,-20.424],[85.666,7.331],[20.434,-38.186],[-58.804,-36.784],[-122.423,11.012],[-146.636,87.332]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.760784327984,0.776470601559,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.3,"ix":5},"lc":1,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.764705896378,0.772549033165,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":1},{"ddd":0,"ind":6,"ty":3,"nm":"▽ Cloud-2","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[154.125,213.189,0],"ix":2,"l":2},"a":{"a":0,"k":[154.125,213.189,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[360.949,250.592,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[11.951,0],[-11.951,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Vector","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[203.523,106.282,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[104.727,0],[-104.727,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Vector","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[259.45,417.241,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.2,-0.084],[-0.216,0],[0,0],[-0.2,0.086],[-0.151,0.158],[-0.077,0.205],[0.008,0.22],[0,0],[0.081,0.198],[0.15,0.152],[0.196,0.082],[0.212,0],[0.199,-0.08],[0.153,-0.152],[0.083,-0.2],[0,-0.217],[0,0],[-0.083,-0.202],[-0.153,-0.155]],"o":[[0.2,0.084],[0,0],[0.217,0],[0.2,-0.086],[0.151,-0.158],[0.077,-0.205],[0,0],[0,-0.214],[-0.081,-0.198],[-0.15,-0.152],[-0.196,-0.082],[-0.215,-0.004],[-0.199,0.08],[-0.153,0.152],[-0.083,0.2],[0,0],[0,0.219],[0.083,0.202],[0.153,0.155]],"v":[[-0.615,9.01],[0.015,9.137],[0.015,9.137],[0.647,9.007],[1.179,8.637],[1.525,8.085],[1.629,7.441],[1.629,-7.504],[1.506,-8.129],[1.156,-8.658],[0.633,-9.012],[0.015,-9.136],[-0.612,-9.021],[-1.147,-8.669],[-1.505,-8.136],[-1.63,-7.504],[-1.63,7.473],[-1.505,8.11],[-1.149,8.649]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Vector","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":0,"s":[157.067,73.13,0],"to":[-1.667,0,0],"ti":[0,0,0]},{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":75,"s":[147.067,73.13,0],"to":[0,0,0],"ti":[-1.667,0,0]},{"t":149.5,"s":[157.067,73.13,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.735,-9.881],[0,0],[0,0],[3.223,4.98],[5.39,2.39],[5.806,-0.978],[4.334,-4.027],[9.126,7.713],[11.819,1.339],[10.587,-5.48],[5.839,-10.479],[0,0],[7.624,-6.423]],"o":[[0,0],[0,0],[-0.009,-5.953],[-3.223,-4.98],[-5.39,-2.39],[-5.806,0.978],[-3.402,-11.526],[-9.126,-7.713],[-11.819,-1.339],[-10.587,5.48],[0,0],[-9.922,-0.058],[-7.624,6.423]],"v":[[-102.492,33.15],[102.398,33.15],[102.492,33.15],[97.538,16.396],[84.338,5.101],[67.18,2.937],[51.642,10.607],[32.434,-18.89],[0.321,-32.769],[-34.032,-26.42],[-59.216,-1.952],[-60.831,-1.952],[-88,7.904]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":0,"s":[228.073,59.744,0],"to":[1.667,0,0],"ti":[0,0,0]},{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":75,"s":[238.073,59.744,0],"to":[0,0,0],"ti":[1.667,0,0]},{"t":149.5,"s":[228.073,59.744,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,-10.04],[0,0],[0,0],[3.228,5.088],[5.403,2.439],[5.818,-1.004],[4.337,-4.121],[9.149,7.88],[11.85,1.367],[10.613,-5.601],[5.849,-10.708],[0.543,0],[7.585,-6.55]],"o":[[0,0],[0,0],[-0.001,-6.079],[-3.228,-5.088],[-5.403,-2.439],[-5.818,1.004],[-3.407,-11.775],[-9.149,-7.88],[-11.85,-1.367],[-10.613,5.601],[-0.524,0],[-9.896,0.002],[-7.585,6.55]],"v":[[-102.583,33.855],[102.583,33.855],[102.583,33.845],[97.635,16.73],[84.407,5.194],[67.209,2.994],[51.646,10.849],[32.394,-19.288],[0.197,-33.466],[-34.244,-26.974],[-59.485,-1.969],[-61.096,-1.969],[-88.157,8.173]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.658823549747,0.51372551918,0.972549021244,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Vector","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[104.727,128.541,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[104.727,0],[-104.727,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Vector","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[275.234,7.378,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.029,0],[0,4.075],[4.029,0],[0,-4.075]],"o":[[4.029,0],[0,-4.075],[-4.029,0],[0,4.075]],"v":[[0,7.378],[7.295,0],[0,-7.378],[-7.295,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Vector","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[259.465,417.225,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.083,0.2],[0,0.217],[0,0],[0.282,0.309],[0.414,0.032],[0,0],[0.198,-0.084],[0.15,-0.155],[0.079,-0.202],[-0.004,-0.217],[-0.303,-0.306],[-0.428,0],[0,0],[-0.199,0.08],[-0.153,0.152]],"o":[[0.083,-0.2],[0,0],[0.001,-0.42],[-0.282,-0.309],[0,0],[-0.215,0],[-0.198,0.084],[-0.15,0.155],[-0.079,0.202],[0,0.433],[0.303,0.306],[0,0],[0.215,0.004],[0.199,-0.08],[0.153,-0.152]],"v":[[8.908,0.648],[9.034,0.016],[9.034,0.016],[8.597,-1.119],[7.513,-1.649],[-7.419,-1.649],[-8.044,-1.521],[-8.572,-1.159],[-8.92,-0.619],[-9.034,0.016],[-8.561,1.17],[-7.419,1.648],[7.389,1.648],[8.016,1.533],[8.55,1.181]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":0,"s":[242.685,198.682,0],"to":[1.667,0,0],"ti":[0,0,0]},{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":75,"s":[252.685,198.682,0],"to":[0,0,0],"ti":[1.667,0,0]},{"t":149.5,"s":[242.685,198.682,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.58,0.58,0.58],"y":[1,1,1]},"o":{"x":[0.42,0.42,0.42],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.58,0.58,0.58],"y":[1,1,1]},"o":{"x":[0.42,0.42,0.42],"y":[0,0,0]},"t":75,"s":[73,73,100]},{"t":149.5,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-88.537,0],[88.537,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":0,"s":[242.685,303.394,0],"to":[1.833,0,0],"ti":[0,0,0]},{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":75,"s":[253.685,303.394,0],"to":[0,0,0],"ti":[1.833,0,0]},{"t":149.5,"s":[242.685,303.394,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.58,0.58,0.58],"y":[1,1,1]},"o":{"x":[0.42,0.42,0.42],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.58,0.58,0.58],"y":[1,1,1]},"o":{"x":[0.42,0.42,0.42],"y":[0,0,0]},"t":75,"s":[73,73,100]},{"t":149.5,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-88.537,0],[88.537,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":0,"s":[275.254,249.986,0],"to":[-7.833,0,0],"ti":[0,0,0]},{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":75,"s":[228.254,249.986,0],"to":[0,0,0],"ti":[-7.833,0,0]},{"t":149.5,"s":[275.254,249.986,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.58,0.58,0.58],"y":[1,1,1]},"o":{"x":[0.42,0.42,0.42],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.58,0.58,0.58],"y":[1,1,1]},"o":{"x":[0.42,0.42,0.42],"y":[0,0,0]},"t":75,"s":[94,94,100]},{"t":149.5,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-88.537,0],[88.537,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[407.4,357.868,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-8.879,8.98],[8.879,-8.98]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-0.5,"op":149.5,"st":-0.5,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[618.716,354.744,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[8.879,8.995],[-8.879,-8.995]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[661.789,255.608,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[12.557,0],[-12.557,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[511.832,401.779,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,12.7],[0,-12.7]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[511.795,332.475,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-29.43,-30.795],[-42.327,-1.321],[-31.252,28.901],[-2.478,42.755],[0,0]],"o":[[-0.134,42.829],[29.43,30.795],[42.326,1.321],[31.252,-28.901],[0,0],[0,0]],"v":[[-162.561,-82.489],[-116.873,32.326],[-4.969,82.411],[109.775,39.4],[162.376,-72.348],[162.562,-76.304]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[512.988,250.08,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-114.992,0],[0,116.301],[114.992,0],[0,-116.301]],"o":[[114.992,0],[0,-116.301],[-114.992,0],[0,116.301]],"v":[[0,210.582],[208.212,0],[0,-210.582],[-208.212,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[899.871,268.857,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.303,0.306],[0,0.433],[0.079,0.202],[0.15,0.155],[0.198,0.084],[0.215,0],[0,0],[0.309,-0.312],[0,-0.441],[-0.083,-0.2],[-0.153,-0.152],[-0.199,-0.08],[-0.215,0.004],[0,0]],"o":[[0.303,-0.306],[0.004,-0.217],[-0.079,-0.202],[-0.15,-0.155],[-0.198,-0.084],[0,0],[-0.436,0],[-0.309,0.312],[0,0.217],[0.083,0.2],[0.153,0.152],[0.199,0.08],[0,0],[0.428,0]],"v":[[8.561,1.17],[9.034,0.016],[8.92,-0.619],[8.572,-1.159],[8.044,-1.521],[7.419,-1.649],[-7.389,-1.649],[-8.552,-1.161],[-9.034,0.016],[-8.908,0.648],[-8.55,1.181],[-8.016,1.533],[-7.389,1.648],[7.419,1.648]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[899.87,268.889,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.198,-0.084],[-0.215,0],[0,0],[-0.307,0.299],[-0.016,0.43],[0,0],[0.083,0.2],[0.153,0.152],[0.199,0.08],[0.215,-0.004],[0.303,-0.306],[0,-0.433],[0,0],[-0.079,-0.202],[-0.15,-0.155]],"o":[[0.198,0.084],[0,0],[0.426,0],[0.307,-0.299],[0,0],[0,-0.217],[-0.083,-0.2],[-0.153,-0.152],[-0.199,-0.08],[-0.428,0],[-0.303,0.306],[0,0],[-0.004,0.217],[0.079,0.202],[0.15,0.155]],"v":[[-0.64,8.978],[-0.015,9.105],[-0.015,9.105],[1.127,8.64],[1.63,7.504],[1.63,-7.472],[1.504,-8.105],[1.146,-8.638],[0.612,-8.99],[-0.015,-9.105],[-1.157,-8.627],[-1.63,-7.472],[-1.63,7.441],[-1.516,8.076],[-1.168,8.616]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[782.4,171.288,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.029,0],[0,4.075],[4.029,0],[0,-4.075]],"o":[[4.029,0],[0,-4.075],[-4.029,0],[0,4.075]],"v":[[0,7.378],[7.295,0],[0,-7.378],[-7.295,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"Vector","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":0,"s":[791.256,397.798,0],"to":[-1.667,0,0],"ti":[0,0,0]},{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":75,"s":[781.256,397.798,0],"to":[0,0,0],"ti":[-1.667,0,0]},{"t":149.5,"s":[791.256,397.798,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.874,-10.673],[0,0],[0,0],[3.495,5.412],[5.853,2.595],[6.303,-1.068],[4.698,-4.382],[9.907,8.365],[12.826,1.449],[11.488,-5.948],[6.337,-11.371],[0,0],[8.213,-6.964]],"o":[[0,0],[0,0],[0.003,-6.463],[-3.495,-5.412],[-5.853,-2.595],[-6.303,1.068],[-3.7,-12.505],[-9.907,-8.365],[-12.826,-1.449],[-11.488,5.948],[0,0],[-10.717,0.003],[-8.213,6.964]],"v":[[-111.091,35.974],[111.091,35.974],[111.06,35.942],[105.709,17.743],[91.383,5.472],[72.754,3.131],[55.895,11.484],[35.032,-20.515],[0.177,-35.562],[-37.102,-28.665],[-64.432,-2.111],[-66.17,-2.111],[-95.476,8.672]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":0,"s":[852.453,381.363,0],"to":[1.667,0,0],"ti":[0,0,0]},{"i":{"x":0.592,"y":1},"o":{"x":0.429,"y":0},"t":75,"s":[862.453,381.363,0],"to":[0,0,0],"ti":[0.881,0,0]},{"t":150,"s":[852.453,381.363,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.885,-10.926],[0,0],[0,0],[3.51,5.537],[5.876,2.655],[6.327,-1.093],[4.716,-4.484],[9.948,8.576],[12.885,1.487],[11.541,-6.095],[6.36,-11.652],[0.591,0],[8.248,-7.128]],"o":[[0,0],[0,0],[-0.001,-6.615],[-3.51,-5.537],[-5.876,-2.655],[-6.327,1.093],[-3.705,-12.814],[-9.948,-8.576],[-12.885,-1.487],[-11.541,6.095],[-0.57,0],[-10.761,0.002],[-8.248,7.128]],"v":[[-111.547,36.842],[111.547,36.842],[111.547,36.831],[106.166,18.207],[91.782,5.652],[73.082,3.259],[56.158,11.806],[35.224,-20.99],[0.215,-36.419],[-37.236,-29.354],[-64.683,-2.143],[-66.434,-2.143],[-95.86,8.894]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.658823549747,0.51372551918,0.972549021244,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"Clock","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[492,233,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[984,466],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Clock","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Clock 2","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[620,354,0],"ix":2,"l":2},"a":{"a":0,"k":[492,233,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":984,"h":466,"ip":0,"op":150,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[618.85,354.029,0],"ix":2,"l":2},"a":{"a":0,"k":[-1.15,0.029,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[1249.701,720.058],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196078434587,0.109803922474,0.392156869173,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-1.15,0.029],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":150,"st":0,"bm":0}],"markers":[]} diff --git a/src/ui/resources/animations/vpnlogo-kinetic_animation.json b/src/ui/resources/animations/vpnlogo-kinetic_animation.json deleted file mode 100644 index 436831868f..0000000000 --- a/src/ui/resources/animations/vpnlogo-kinetic_animation.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.7.4","fr":60,"ip":0,"op":450,"w":853,"h":853,"nm":"Kintetic","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":84,"s":[491.709,299.635,0],"to":[-32.018,32.011,0],"ti":[32.018,-32.011,0]},{"i":{"x":0.58,"y":0.58},"o":{"x":0.42,"y":0.42},"t":114,"s":[299.6,491.7,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":144,"s":[299.6,491.7,0],"to":[0,-32.017,0],"ti":[0,32.017,0]},{"i":{"x":0.58,"y":0.58},"o":{"x":0.42,"y":0.42},"t":174,"s":[299.6,299.6,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":204,"s":[299.6,299.6,0],"to":[0,32.017,0],"ti":[0,-32.017,0]},{"i":{"x":0.58,"y":0.58},"o":{"x":0.42,"y":0.42},"t":234,"s":[299.6,491.7,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":264,"s":[299.6,491.7,0],"to":[32.018,-32.011,0],"ti":[-32.018,32.011,0]},{"t":294,"s":[491.709,299.635,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,25.459],[-25.459,0],[0,-25.459],[25.459,0]],"o":[[0,-25.459],[25.459,0],[0,25.459],[-25.459,0]],"v":[[-46.098,0],[0,-46.098],[46.098,0],[0,46.098]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[59.405,0],[0,-59.405],[-59.405,0],[0,59.405]],"o":[[-59.405,0],[0,59.405],[59.405,0],[0,-59.405]],"v":[[0,-107.562],[-107.562,0],[0,107.562],[107.562,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-36,"op":452,"st":-36,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":84,"s":[107.562,299.635,0],"to":[32.006,-32.006,0],"ti":[-32.006,32.006,0]},{"i":{"x":0.58,"y":0.58},"o":{"x":0.42,"y":0.42},"t":114,"s":[299.6,107.6,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":144,"s":[299.6,107.6,0],"to":[0,32,0],"ti":[0,-32,0]},{"i":{"x":0.58,"y":0.58},"o":{"x":0.42,"y":0.42},"t":174,"s":[299.6,299.6,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":204,"s":[299.6,299.6,0],"to":[0,-32,0],"ti":[0,32,0]},{"i":{"x":0.58,"y":0.58},"o":{"x":0.42,"y":0.42},"t":234,"s":[299.6,107.6,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":264,"s":[299.6,107.6,0],"to":[-32.006,32.006,0],"ti":[32.006,-32.006,0]},{"t":294,"s":[107.562,299.635,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,25.459],[-25.459,0],[0,-25.459],[25.459,0]],"o":[[0,-25.459],[25.459,0],[0,25.459],[-25.459,0]],"v":[[-46.098,0],[0,-46.098],[46.098,0],[0,46.098]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[59.405,0],[0,-59.405],[-59.405,0],[0,59.405]],"o":[[-59.405,0],[0,59.405],[59.405,0],[0,-59.405]],"v":[[0,-107.562],[-107.562,0],[0,107.562],[107.562,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-36,"op":452,"st":-36,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":147,"s":[299.635,491.713,0],"to":[0,-32.019,0],"ti":[0,32.019,0]},{"i":{"x":0.58,"y":0.58},"o":{"x":0.42,"y":0.42},"t":177,"s":[299.635,299.6,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":207,"s":[299.635,299.6,0],"to":[0,32.019,0],"ti":[0,-32.019,0]},{"i":{"x":0.58,"y":0.58},"o":{"x":0.42,"y":0.42},"t":237,"s":[299.635,491.713,0],"to":[0,0,0],"ti":[0,0,0]},{"t":267,"s":[299.635,491.713,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,25.459],[-25.459,0],[0,-25.459],[25.459,0]],"o":[[0,-25.459],[25.459,0],[0,25.459],[-25.459,0]],"v":[[-46.098,0],[0,-46.098],[46.098,0],[0,46.098]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[59.405,0],[0,-59.405],[-59.404,0],[0,59.405]],"o":[[-59.404,0],[0,59.405],[59.405,0],[0,-59.405]],"v":[[0,-107.562],[-107.562,0],[0,107.562],[107.562,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-33,"op":452,"st":-33,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.58],"y":[1]},"o":{"x":[0.42],"y":[0]},"t":24,"s":[100]},{"i":{"x":[0.58],"y":[1]},"o":{"x":[0.42],"y":[0]},"t":54,"s":[0]},{"i":{"x":[0.58],"y":[1]},"o":{"x":[0.42],"y":[0]},"t":324,"s":[0]},{"t":354,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299.636,299.632,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[28.547,11.212],[0,0],[-19.848,-7.796],[0,0],[0,0],[0,-10.929],[-28.544,-11.212],[0,0],[19.849,7.795],[0,0],[0,0],[0,10.927]],"o":[[0,0],[7.796,19.849],[0,0],[0,0],[-4.113,9.412],[0,32.521],[0,0],[-7.797,-19.848],[0,0],[0,0],[4.112,-9.411],[0,-32.524]],"v":[[-163.998,-71.538],[-71.538,-163.999],[-28.077,-120.536],[-117.882,-30.73],[121.64,-30.73],[115.245,0.005],[163.995,71.542],[71.538,163.999],[28.074,120.539],[117.881,30.733],[-121.635,30.733],[-115.242,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-0.351,-0.894],[0,0],[0,0]],"o":[[0,0],[0,0],[0.383,0.876]],"v":[[263.611,-28.074],[266.268,-30.73],[262.51,-30.73]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0.351,0.894],[0,0]],"o":[[-0.383,-0.877],[0,0],[0,0]],"v":[[-262.509,30.733],[-263.611,28.076],[-266.268,30.733]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-36,"op":452,"st":-36,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Vector","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":144,"s":[299.635,107.562,0],"to":[0,32.006,0],"ti":[0,-32.006,0]},{"i":{"x":0.58,"y":0.58},"o":{"x":0.42,"y":0.42},"t":174,"s":[299.635,299.6,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.58,"y":1},"o":{"x":0.42,"y":0},"t":204,"s":[299.635,299.6,0],"to":[0,-32.006,0],"ti":[0,32.006,0]},{"i":{"x":0.58,"y":0.58},"o":{"x":0.42,"y":0.42},"t":234,"s":[299.635,107.562,0],"to":[0,0,0],"ti":[0,0,0]},{"t":264,"s":[299.635,107.562,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,25.459],[-25.46,0],[0,-25.459],[25.459,0]],"o":[[0,-25.459],[25.459,0],[0,25.459],[-25.46,0]],"v":[[-46.098,0],[0,-46.098],[46.098,0],[0,46.098]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[59.404,0],[0,-59.405],[-59.405,0],[0,59.405]],"o":[[-59.405,0],[0,59.405],[59.404,0],[0,-59.405]],"v":[[0,-107.562],[-107.561,0],[0,107.562],[107.561,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-36,"op":452,"st":-36,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Logo 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[600,600],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Logo 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-36,"op":453,"st":-36,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Logo 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[426,427,0],"ix":2,"l":2},"a":{"a":0,"k":[300,300,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":600,"h":600,"ip":0,"op":452,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/ui/resources/bandwidth.svg b/src/ui/resources/bandwidth.svg deleted file mode 100644 index eeea099b41..0000000000 --- a/src/ui/resources/bandwidth.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/ui/resources/connection-error-unstable.svg b/src/ui/resources/connection-error-unstable.svg deleted file mode 100644 index d6ae73f94d..0000000000 --- a/src/ui/resources/connection-error-unstable.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/resources/connection-green.svg b/src/ui/resources/connection-green.svg deleted file mode 100644 index d03007fb70..0000000000 --- a/src/ui/resources/connection-green.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/ui/resources/download.svg b/src/ui/resources/download.svg deleted file mode 100644 index a4b91564cf..0000000000 --- a/src/ui/resources/download.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/ui/resources/upload.svg b/src/ui/resources/upload.svg deleted file mode 100644 index 3df7c0c89d..0000000000 --- a/src/ui/resources/upload.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/ui/screens/getHelp/developerMenu/ViewAnimationsPlayground.qml b/src/ui/screens/getHelp/developerMenu/ViewAnimationsPlayground.qml index 85ca526a21..d254b9c6eb 100644 --- a/src/ui/screens/getHelp/developerMenu/ViewAnimationsPlayground.qml +++ b/src/ui/screens/getHelp/developerMenu/ViewAnimationsPlayground.qml @@ -96,10 +96,6 @@ Item { name: "VPN Logo (drop)" value: ":/ui/resources/animations/vpnlogo-drop_animation.json" } - ListElement { - name: "VPN Logo (kinetic)" - value: ":/ui/resources/animations/vpnlogo-kinetic_animation.json" - } ListElement { name: "Lock" value: ":/ui/resources/animations/lock_animation.json" @@ -112,10 +108,6 @@ Item { name: "VPN Active" value: ":/ui/resources/animations/vpnactive_animation.json" } - ListElement { - name: "Speedometer" - value: ":/ui/resources/animations/speedometer_animation.json" - } } function setCurrentAnimationSource() { diff --git a/src/ui/screens/home/ViewHome.qml b/src/ui/screens/home/ViewHome.qml index 7d7a8fc06c..f4b3442799 100644 --- a/src/ui/screens/home/ViewHome.qml +++ b/src/ui/screens/home/ViewHome.qml @@ -107,7 +107,6 @@ MZFlickable { disableRowWhen: (VPNController.state !== VPNController.StateOn && VPNController.state !== VPNController.StateOff) - || box.connectionInfoScreenVisible Layout.topMargin: 12 contentChildren: [ diff --git a/src/ui/screens/home/controller/ControllerView.qml b/src/ui/screens/home/controller/ControllerView.qml index 5aa4ef1128..a8a86ed897 100644 --- a/src/ui/screens/home/controller/ControllerView.qml +++ b/src/ui/screens/home/controller/ControllerView.qml @@ -13,12 +13,6 @@ import compat 0.1 Item { id: box - property bool connectionInfoScreenVisible: false - - function closeConnectionInfo() { - box.connectionInfoScreenVisible = false; - } - function handleConnectionStateChange() { // Notify accessibility client of connection state if (!logoTitle.Accessible.ignored) { @@ -54,17 +48,8 @@ Item { radius: MZTheme.theme.cornerRadius * 2 antialiasing: true - height: box.connectionInfoScreenVisible - ? maximumBoxHeight - : box.height + height: box.height width: box.width - - Behavior on height { - NumberAnimation { - duration: connectionInfoScreen.transitionDuration - easing.type: Easing.InOutQuad - } - } } MZDropShadowWithStates { @@ -105,11 +90,6 @@ Item { visible: false } - PropertyChanges { - target: connectionInfoToggleButton - visible: false - } - PropertyChanges { target: connectionStability visible: false @@ -149,11 +129,6 @@ Item { visible: false } - PropertyChanges { - target: connectionInfoToggleButton - visible: connectionInfoScreenVisible - } - PropertyChanges { target: connectionStability visible: false @@ -196,11 +171,6 @@ Item { visible: false } - PropertyChanges { - target: connectionInfoToggleButton - visible: connectionInfoScreenVisible - } - PropertyChanges { target: connectionStability visible: false @@ -243,11 +213,6 @@ Item { visible: false } - PropertyChanges { - target: connectionInfoToggleButton - visible: connectionInfoScreenVisible - } - PropertyChanges { target: connectionStability visible: false @@ -286,11 +251,6 @@ Item { visible: true } - PropertyChanges { - target: connectionInfoToggleButton - visible: !ipInfoPanel.isOpen - } - PropertyChanges { target: animatedRings visible: true @@ -328,11 +288,6 @@ Item { visible: false } - PropertyChanges { - target: connectionInfoToggleButton - visible: connectionInfoScreenVisible - } - PropertyChanges { target: connectionStability visible: false @@ -374,11 +329,6 @@ Item { visible: false } - PropertyChanges { - target: connectionInfoToggleButton - visible: connectionInfoScreenVisible - } - PropertyChanges { target: connectionStability visible: false @@ -458,65 +408,6 @@ Item { width: 80 } - MZIconButton { - id: connectionInfoToggleButton - objectName: "connectionInfoToggleButton" - - property var connectionInfoCloseText: MZI18n.GlobalClose - - anchors { - left: parent.left - leftMargin: MZTheme.theme.windowMargin / 2 - top: parent.top - topMargin: MZTheme.theme.windowMargin / 2 - } - accessibleName: box.connectionInfoScreenVisible ? connectionInfoCloseText : MZI18n.ConnectionInfoStartSpeedTest - Accessible.ignored: !enabled || !visible - buttonColorScheme: MZTheme.theme.iconButtonDarkBackground - enabled: visible && !ipInfoPanel.isOpen - opacity: visible ? 1 : 0 - z: 1 - - onClicked: { - if (!box.connectionInfoScreenVisible) { - Glean.interaction.startSpeedTestSelected.record({ - screen: "main", - }); - } else { - Glean.interaction.closeSelected.record({ - screen: connectionInfoScreen.state == "open-ready" ? "speed_test_completed" - : connectionInfoScreen.state == "open-error" ? "speed_test_error" - : connectionInfoScreen.state == "open-loading" ? "speed_test_loading" - // Used in case the connection info screen state is "closed", "closing" or "opening". - // This should not happen, because the button is not available in these states... - // But it is a possible code path, so there you go. - : "unexpected", - }); - } - - box.connectionInfoScreenVisible = !box.connectionInfoScreenVisible; - } - - Image { - property int iconSize: box.connectionInfoScreenVisible - ? MZTheme.theme.iconSize - : MZTheme.theme.iconSize * 1.5 - - anchors.centerIn: connectionInfoToggleButton - source: box.connectionInfoScreenVisible - ? "qrc:/nebula/resources/close-white.svg" - : "qrc:/ui/resources/bandwidth.svg" - sourceSize.height: iconSize - sourceSize.width: iconSize - } - - Behavior on opacity { - NumberAnimation { - duration: 300 - } - } - } - MZIconButton { id: ipInfoToggleButton objectName: "ipInfoToggleButton" @@ -536,9 +427,7 @@ Item { buttonColorScheme: MZTheme.theme.iconButtonDarkBackground enabled: visible && VPNConnectionHealth.stability !== VPNConnectionHealth.NoSignal opacity: visible ? 1 : 0 - visible: (VPNController.state === VPNController.StateOn || VPNController.state === VPNController.StateSilentSwitching) - && !connectionInfoScreen.isOpen - && !connectionInfoScreen.isTransitioning + visible: VPNController.state === VPNController.StateOn || VPNController.state === VPNController.StateSilentSwitching z: 1 onClicked: { ipInfoPanel.isOpen = !ipInfoPanel.isOpen; @@ -618,7 +507,7 @@ Item { objectName: "controllerTitle" lineHeight: MZTheme.theme.labelLineHeight font.pixelSize: 22 - Accessible.ignored: connectionInfoScreenVisible || ipInfoPanel.isOpen || !visible + Accessible.ignored: ipInfoPanel.isOpen || !visible width: parent.width onPaintedHeightChanged: if (visible) col.handleMultilineText() onTextChanged: handleConnectionStateChange() @@ -654,7 +543,7 @@ Item { color: MZTheme.theme.white lineHeight: MZTheme.theme.controllerInterLineHeight - Accessible.ignored: connectionInfoScreenVisible || ipInfoPanel.isOpen || !visible + Accessible.ignored: ipInfoPanel.isOpen || !visible //% "Secure and private" //: This refers to the user’s internet connection. @@ -669,7 +558,7 @@ Item { ConnectionStability { id: connectionStability - Accessible.ignored: connectionInfoScreenVisible || !visible + Accessible.ignored: !visible width: parent.width implicitHeight: childrenRect.height } @@ -686,9 +575,9 @@ Item { horizontalCenterOffset: 0 horizontalCenter: parent.horizontalCenter } - enabled: !connectionInfoScreenVisible && !ipInfoPanel.visible + enabled: !ipInfoPanel.visible - Accessible.ignored: connectionInfoScreenVisible || ipInfoPanel.isOpen || !visible + Accessible.ignored: ipInfoPanel.isOpen || !visible } IPInfoPanel { @@ -727,24 +616,4 @@ Item { } } } - - ConnectionInfoScreen { - id: connectionInfoScreen - isOpen: box.connectionInfoScreenVisible - - height: boxBackground.height - radius: MZTheme.theme.cornerRadius * 2 - } - - Component.onCompleted: MZNavigator.addView(VPN.ScreenHome, connectionInfoScreen) - - Connections { - function onGoBack(item) { - if (item === connectionInfoScreen && connectionInfoScreen.isOpen) { - closeConnectionInfo(); - } - } - - target: MZNavigator - } } diff --git a/src/ui/screens/home/controller/connectionInfo/ConnectionCheckmarkList.qml b/src/ui/screens/home/controller/connectionInfo/ConnectionCheckmarkList.qml deleted file mode 100644 index e3a39372ac..0000000000 --- a/src/ui/screens/home/controller/connectionInfo/ConnectionCheckmarkList.qml +++ /dev/null @@ -1,58 +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/. */ - -import QtQuick 2.5 -import QtQuick.Layouts 1.14 - -import Mozilla.Shared 1.0 -import Mozilla.VPN 1.0 -import components 0.1 - -ColumnLayout { - property string listHeader - property variant listModel: ({}) - - id: root - - spacing: MZTheme.theme.listSpacing - - MZTextBlock { - Layout.fillWidth: true - - color: MZTheme.colors.white - text: root.listHeader - wrapMode: Text.WordWrap - } - - Component { - id: checkMarkItem - - Row { - Layout.fillWidth: true - - Image { - fillMode: Image.PreserveAspectFit - source: type === "checkmark" - ? "qrc:/nebula/resources/checkmark-green.svg" - : "qrc:/nebula/resources/dropdown-closed.svg" - sourceSize.height: MZTheme.theme.iconSize * 1.5 - sourceSize.width: MZTheme.theme.iconSize * 1.5 - } - MZTextBlock { - anchors.verticalCenter: parent.verticalCenter - anchors.verticalCenterOffset: 2 - color: MZTheme.colors.grey20 - text: title - wrapMode: Text.WordWrap - } - } - } - - Repeater { - id: checkmarkListRepeater - delegate: checkMarkItem - model: listModel - } - -} diff --git a/src/ui/screens/home/controller/connectionInfo/ConnectionInfoContent.qml b/src/ui/screens/home/controller/connectionInfo/ConnectionInfoContent.qml deleted file mode 100644 index fc82024c0d..0000000000 --- a/src/ui/screens/home/controller/connectionInfo/ConnectionInfoContent.qml +++ /dev/null @@ -1,282 +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/. */ - -import QtQuick 2.5 -import QtQuick.Layouts 1.14 - -import Mozilla.Shared 1.0 -import Mozilla.VPN 1.0 -import components 0.1 -import compat 0.1 - -MZFlickable { - id: root - - anchors.fill: parent - flickContentHeight: col.implicitHeight - interactive: flickContentHeight > height || contentY > 0 - - onVisibleChanged: { - if (visible) { - speedometerAnimation.play(); - populateCheckmarkListModel(); - } else { - speedometerAnimation.stop(); - checkmarkListModel.clear(); - } - } - - ListModel { - id: checkmarkListModel - } - - ColumnLayout { - id: col - spacing: 0 - - anchors { - left: parent.left - right: parent.right - top: parent.top - } - - ColumnLayout { - // The ColumnLayout nesting here is a hack to get around binding loops caused by less verbose methods of stipulating - // that the child content of `root` is vertically centered within `root.height` or is scrollable when root.contentHeight > root.height. - Layout.minimumHeight: root.height - - ColumnLayout { - id: viewContent - - Layout.alignment: Qt.AlignVCenter - Layout.preferredWidth: parent.width - spacing: MZTheme.theme.listSpacing * 0.5 - - // Lottie animation - Item { - Layout.alignment: Qt.AlignHCenter - Layout.fillWidth: true - Layout.preferredHeight: root.height * 0.25 - - MZLottieAnimation { - id: speedometerAnimation - loop: false - source: ":/ui/resources/animations/speedometer_animation.json" - } - } - - ConnectionCheckmarkList { - id: checkmarkList - - listHeader: VPNConnectionBenchmark.speed === VPNConnectionBenchmark.SpeedSlow - ? MZI18n.ConnectionInfoListHeaderSlow - : MZI18n.ConnectionInfoListHeaderDefault - listModel: checkmarkListModel - - Layout.bottomMargin: MZTheme.theme.vSpacingSmall - Layout.topMargin: MZTheme.theme.listSpacing * 0.5 - Layout.leftMargin: MZTheme.theme.windowMargin - Layout.rightMargin: MZTheme.theme.windowMargin - } - - ColumnLayout { - property bool isMultipHop: (typeof(VPNCurrentServer.entryCountryCode) !== undefined - && VPNCurrentServer.entryCountryCode !== "") - id: serverLocations - - spacing: 0 - - Layout.fillWidth: true - Layout.leftMargin: MZTheme.theme.windowMargin - Layout.rightMargin: MZTheme.theme.windowMargin - - RowLayout { - ConnectionInfoItem { - id: entryServerLabel - title: serverLocations.isMultipHop - ? VPNCurrentServer.localizedEntryCityName - : "" - subtitle: "" - iconPath: serverLocations.isMultipHop - ? "qrc:/ui/resources/flags/" - + VPNCurrentServer.entryCountryCode.toUpperCase() - + ".png" - : "" - isFlagIcon: true - visible: serverLocations.isMultipHop - } - - MZIcon { - id: arrowIcon - source: "qrc:/nebula/resources/arrow-forward-white.svg" - sourceSize { - height: MZTheme.theme.iconSize * 1.25 - width: MZTheme.theme.iconSize * 1.25 - } - visible: serverLocations.isMultipHop - Layout.fillWidth: true - Layout.leftMargin: MZTheme.theme.listSpacing - Layout.rightMargin: MZTheme.theme.listSpacing - } - - ConnectionInfoItem { - title: serverLocations.isMultipHop - ? VPNCurrentServer.localizedExitCityName - : VPNCurrentServer.localizedExitCountryName; - subtitle: serverLocations.isMultipHop - ? "" - : VPNCurrentServer.localizedExitCityName - iconPath: "qrc:/ui/resources/flags/" - + VPNCurrentServer.exitCountryCode.toUpperCase() - + ".png" - isFlagIcon: true - } - } - - Rectangle { - color: MZTheme.colors.white - height: 1 - opacity: 0.2 - Layout.fillWidth: true - } - - ConnectionInfoItem { - title: MZI18n.ConnectionInfoLabelPing - subtitle: VPNConnectionBenchmark.pingLatency + " " + MZI18n.ConnectionInfoUnitPing - iconPath: "qrc:/ui/resources/connection-green.svg" - } - - Rectangle { - color: MZTheme.colors.white - height: 1 - opacity: 0.2 - Layout.fillWidth: true - } - - ConnectionInfoItem { - //% "Download" - title: qsTrId("vpn.connectionInfo.download") - subtitle: root.getConnectionLabel(VPNConnectionBenchmark.downloadBps) - iconPath: "qrc:/ui/resources/download.svg" - } - - Rectangle { - color: MZTheme.colors.white - height: 1 - opacity: 0.2 - visible: MZFeatureList.get("benchmarkUpload").isSupported - - Layout.fillWidth: true - } - - ConnectionInfoItem { - title: MZI18n.ConnectionInfoLabelUpload - subtitle: root.getConnectionLabel(VPNConnectionBenchmark.uploadBps) - iconPath: "qrc:/ui/resources/upload.svg" - visible: MZFeatureList.get("benchmarkUpload").isSupported - } - } - } - } - } - - function getConnectionLabel(connectionValueBits) { - return `${computeValue(connectionValueBits)} ${computeRange(connectionValueBits)}`; - } - - function computeRange(connectionValueBits) { - if (connectionValueBits < 1000) { - // bit/s - return MZI18n.ConnectionInfoLabelBitps; - } - - if (connectionValueBits < Math.pow(1000, 2)) { - // kbit/s - return MZI18n.ConnectionInfoLabelKbitps; - } - - if (connectionValueBits < Math.pow(1000, 3)) { - // Mbit/s - return MZI18n.ConnectionInfoLabelMbitps; - } - - if (connectionValueBits < Math.pow(1000, 4)) { - // Gbit/s - return MZI18n.ConnectionInfoLabelGbitps; - } - - // Tbit/s - return MZI18n.ConnectionInfoLabelTbitps; - } - - function roundValue(value) { - return Math.round(value * 100) / 100; - } - - function computeValue(connectionValueBits) { - if (connectionValueBits < 1000) - return roundValue(connectionValueBits); - - if (connectionValueBits < Math.pow(1000, 2)) - return roundValue(connectionValueBits / 1000); - - if (connectionValueBits < Math.pow(1000, 3)) - return roundValue(connectionValueBits / Math.pow(1000, 2)); - - if (connectionValueBits < Math.pow(1000, 4)) - return roundValue(connectionValueBits / Math.pow(1000, 3)); - - return roundValue(connectionValueBits / Math.pow(1000, 4)); - } - - function populateCheckmarkListModel() { - // Fast connection threshold - if (VPNConnectionBenchmark.speed === VPNConnectionBenchmark.SpeedFast) { - checkmarkListModel.append({ - title: MZI18n.ConnectionInfoHighBulletOne, - type: "checkmark" - }); - checkmarkListModel.append({ - title: MZI18n.ConnectionInfoHighBulletTwo, - type: "checkmark" - }); - checkmarkListModel.append({ - title: MZI18n.ConnectionInfoHighBulletThree, - type: "checkmark" - }); - } else if (VPNConnectionBenchmark.speed === VPNConnectionBenchmark.SpeedMedium) { - // Medium connection threshold - checkmarkListModel.append({ - title: MZI18n.ConnectionInfoMediumBulletOne, - type: "checkmark" - }); - checkmarkListModel.append({ - title: MZI18n.ConnectionInfoMediumBulletTwo, - type: "checkmark" - }); - checkmarkListModel.append({ - title: MZI18n.ConnectionInfoMediumBulletThree, - type: "checkmark" - }); - } else { - // Slow connection threshold - checkmarkListModel.append({ - title: MZI18n.ConnectionInfoTroubleshootingBulletOne, - type: "arrow", - }); - checkmarkListModel.append({ - title: MZI18n.ConnectionInfoTroubleshootingBulletTwo, - type: "arrow", - }); - - if (serverLocations.isMultipHop) { - checkmarkListModel.append({ - title: MZI18n.ConnectionInfoTroubleshootingBulletThree, - type: "arrow", - }); - } - } - } - -} diff --git a/src/ui/screens/home/controller/connectionInfo/ConnectionInfoError.qml b/src/ui/screens/home/controller/connectionInfo/ConnectionInfoError.qml deleted file mode 100644 index d07d18fdbc..0000000000 --- a/src/ui/screens/home/controller/connectionInfo/ConnectionInfoError.qml +++ /dev/null @@ -1,68 +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/. */ - -import QtQuick 2.5 -import QtQuick.Layouts 1.14 - -import Mozilla.Shared 1.0 -import Mozilla.VPN 1.0 -import components 0.1 -import compat 0.1 - -ColumnLayout { - anchors { - horizontalCenter: parent.horizontalCenter - verticalCenter: parent.verticalCenter - } - width: parent.width - MZTheme.theme.windowMargin * 2 - - Image { - Layout.fillWidth: true - - source: "qrc:/ui/resources/connection-error-unstable.svg" - fillMode: Image.PreserveAspectFit - } - - MZMetropolisLabel { - Layout.fillWidth: true - Layout.leftMargin: MZTheme.theme.vSpacingSmall - Layout.rightMargin: MZTheme.theme.windowMargin - - color: MZTheme.colors.white - font.pixelSize: MZTheme.theme.fontSizeLarge - text: MZI18n.GenericErrorUnexpected - width: parent.width - MZTheme.theme.windowMargin - } - - MZTextBlock { - Layout.fillWidth: true - Layout.bottomMargin: MZTheme.theme.vSpacingSmall - Layout.leftMargin: MZTheme.theme.vSpacingSmall - Layout.rightMargin: MZTheme.theme.windowMargin - Layout.topMargin: MZTheme.theme.windowMargin - - color: MZTheme.colors.grey20 - horizontalAlignment: Text.AlignHCenter - text: MZI18n.ConnectionInfoErrorMessage - wrapMode: Text.WordWrap - width: parent.width < MZTheme.theme.maxTextWidth - ? parent.width - : MZTheme.theme.maxTextWidth - } - - MZButton { - objectName: "connectionInfoErrorRetryButton" - Layout.fillWidth: true - - // Try again - text: MZI18n.GenericPurchaseErrorGenericPurchaseErrorButton - onClicked: { - Glean.interaction.refreshSelected.record({ - screen: "speed_test_error", - }); - - VPNConnectionBenchmark.start(); - } - } -} diff --git a/src/ui/screens/home/controller/connectionInfo/ConnectionInfoItem.qml b/src/ui/screens/home/controller/connectionInfo/ConnectionInfoItem.qml deleted file mode 100644 index f19c336251..0000000000 --- a/src/ui/screens/home/controller/connectionInfo/ConnectionInfoItem.qml +++ /dev/null @@ -1,67 +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/. */ - -import QtQuick 2.5 -import QtQuick.Layouts 1.14 - -import Mozilla.Shared 1.0 -import Mozilla.VPN 1.0 -import components 0.1 -import compat 0.1 - -RowLayout { - id: infoStatusItem - - property string title - property string subtitle - property string iconPath - property bool isFlagIcon: false - - spacing: MZTheme.theme.hSpacing * 0.2 - - Layout.preferredHeight: MZTheme.theme.rowHeight - Layout.fillWidth: true - - Item { - id: itemIconWrapper - - height: MZTheme.theme.iconSize * 1.5 - width: MZTheme.theme.iconSize * 1.5 - - Layout.alignment: Qt.AlignVCenter - - MZIcon { - id: itemIcon - - anchors.centerIn: parent - antialiasing: true - source: infoStatusItem.iconPath - sourceSize.width: isFlagIcon ? MZTheme.theme.iconSizeFlag : parent.width - sourceSize.height: isFlagIcon ? MZTheme.theme.iconSizeFlag : parent.height - height: isFlagIcon ? MZTheme.theme.iconSize : parent.height - width: isFlagIcon ? MZTheme.theme.iconSize : parent.width - } - } - - MZBoldLabel { - id: itemLabel - color: MZTheme.theme.white - text: infoStatusItem.title - - Layout.alignment: Qt.AlignVCenter - Layout.fillWidth: true - elide: Text.ElideRight - } - - MZInterLabel { - id: itemValue - - color: MZTheme.colors.white - text: infoStatusItem.subtitle - horizontalAlignment: Text.AlignRight - visible: itemValue.text !== "" - - Layout.alignment: Qt.AlignRight | Qt. AlignVCenter - } -} diff --git a/src/ui/screens/home/controller/connectionInfo/ConnectionInfoScreen.qml b/src/ui/screens/home/controller/connectionInfo/ConnectionInfoScreen.qml deleted file mode 100644 index 89e1521df3..0000000000 --- a/src/ui/screens/home/controller/connectionInfo/ConnectionInfoScreen.qml +++ /dev/null @@ -1,234 +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/. */ - -import QtQuick 2.5 - -import Mozilla.Shared 1.0 -import Mozilla.VPN 1.0 -import components 0.1 -import compat 0.1 - -Rectangle { - property bool isOpen: false - property bool isTransitioning: false - property int transitionDuration: 750 - - id: root - - clip: true - color: MZTheme.colors.primary - opacity: 0 - state: "closed" - states: [ - State { - name: "closed" - when: !isOpen && !isTransitioning - - PropertyChanges { - target: root - opacity: 0 - restoreEntryValues: false - } - StateChangeScript { - script: VPNConnectionBenchmark.reset(); - } - }, - State { - name: "opening" - when: isOpen && isTransitioning - - PropertyChanges { - target: root - opacity: 1 - visible: true - restoreEntryValues: false - } - }, - State { - name: "closing" - when: !isOpen && isTransitioning - StateChangeScript { - script: if(root.isTransitioning) root.opacity = 0 - } - }, - State { - name: "open-loading" - when: VPNConnectionBenchmark.state === VPNConnectionBenchmark.StateRunning - && isOpen - - PropertyChanges { - target: root - opacity: 1 - visible: true - restoreEntryValues: false - } - }, - State { - name: "open-ready" - when: VPNConnectionBenchmark.state === VPNConnectionBenchmark.StateReady - && isOpen - - PropertyChanges { - target: root - opacity: 1 - visible: true - restoreEntryValues: false - } - }, - State { - name: "open-error" - when: VPNConnectionBenchmark.state === VPNConnectionBenchmark.StateError - && isOpen - - PropertyChanges { - target: root - opacity: 1 - visible: true - restoreEntryValues: false - } - } - ] - width: parent.width - - onIsOpenChanged: () => { - // Start opening/closing transition - isTransitioning = true; - - if (VPNConnectionBenchmark.state === VPNConnectionBenchmark.StateInitial) { - VPNConnectionBenchmark.start(); - } else { - VPNConnectionBenchmark.reset(); - } - - timer.setTimeout(function() { - // Finished opening/closing transition - isTransitioning = false; - }, transitionDuration); - } - - onStateChanged: () => { - if (state === "open-loading") { - Glean.impression.speedTestLoadingScreen.record({ - screen: "speed_test_loading", - }); - } else if (state === "open-ready") { - Glean.impression.speedTestCompletedScreen.record({ - screen: "speed_test_completed", - }); - } else if (state === "open-error") { - Glean.impression.speedTestErrorScreen.record({ - screen: "speed_test_error", - }); - } - } - - Behavior on opacity { - NumberAnimation { - target: root - property: "opacity" - duration: root.transitionDuration - easing.type: Easing.InOutQuad - } - } - - ConnectionInfoContent { - id: connectionInfoContent - - opacity: visible && root.state !== "closing" ? 1 : 0 - visible: root.state === "open-ready" - - Behavior on opacity { - NumberAnimation { - duration: root.state !== "closing" - ? root.transitionDuration - : root.transitionDuration * 2 - } - } - } - - ConnectionInfoError { - id: connectionInfoError - objectName: "connectionInfoError" - - opacity: visible && root.state !== "closing" ? 1 : 0 - visible: root.state === "open-error" || root.state === "closing" - } - - MZIconButton { - id: connectionInfoRestartButton - objectName: "connectionInfoRestartButton" - - visible: VPNController.state === VPNController.StateOn && (connectionInfoContent.visible || connectionInfoError.visible) - - anchors { - top: parent.top - right: parent.right - topMargin: MZTheme.theme.windowMargin / 2 - rightMargin: MZTheme.theme.windowMargin / 2 - } - - accessibleName: MZI18n.ConnectionInfoRestartSpeedTest - buttonColorScheme: MZTheme.theme.iconButtonDarkBackground - enabled: visible - z: 1 - - onClicked: { - if (VPNConnectionBenchmark.state !== VPNConnectionBenchmark.StateRunning) { - Glean.interaction.refreshSelected.record({ - screen: root.state == "open-error" ? "speed_test_error" - : root.state == "open-ready" ? "speed_test_completed" - : "unexpected", - }); - - VPNConnectionBenchmark.start(); - } - } - - Image { - anchors.centerIn: connectionInfoRestartButton - opacity: 0.8 - source: "qrc:/nebula/resources/refresh.svg" - sourceSize.height: MZTheme.theme.iconSize * 1.5 - sourceSize.width: MZTheme.theme.iconSize * 1.5 - } - } - - LogoLoader { - anchors { - horizontalCenter: parent.horizontalCenter - verticalCenter: parent.verticalCenter - verticalCenterOffset: -1 * MZTheme.theme.rowHeight - } - height: MZTheme.theme.desktopAppWidth * 0.33 - showLoader: root.state === "open-loading" - width: height - - MZMetropolisLabel { - anchors { - horizontalCenter: parent.horizontalCenter - top: parent.bottom - } - color: MZTheme.colors.white - font.pixelSize: MZTheme.theme.fontSizeLarge - text: MZI18n.ConnectionInfoLoadingIndicatorLabel - } - } - - MZTimer { - id: timer - } - - Component.onDestruction: VPNConnectionBenchmark.reset() - - Connections { - target: MZNavigator - - function onCurrentComponentChanged() { - // Stop connection speed test when navigating away from ScreenHome - if (isOpen) { - closeConnectionInfo(); - } - } - } -} diff --git a/src/ui/screens/home/controller/connectionInfo/LogoLoader.qml b/src/ui/screens/home/controller/connectionInfo/LogoLoader.qml deleted file mode 100644 index 582fcdbf19..0000000000 --- a/src/ui/screens/home/controller/connectionInfo/LogoLoader.qml +++ /dev/null @@ -1,40 +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/. */ - -import QtQuick 2.5 - -import Mozilla.Shared 1.0 -import Mozilla.VPN 1.0 -import components 0.1 - -Item { - property bool showLoader: false - - id: logoLoader - - height: parent.height - opacity: visible ? 1 : 0 - visible: showLoader - width: parent.width - - onVisibleChanged: { - if (visible) { - loadingAnimation.play(); - } else { - loadingAnimation.stop(); - } - } - - MZLottieAnimation { - id: loadingAnimation - source: ":/ui/resources/animations/vpnlogo-kinetic_animation.json" - } - - - Behavior on opacity { - NumberAnimation { - duration: 300 - } - } -} diff --git a/src/ui/screens/home/controller/qmldir b/src/ui/screens/home/controller/qmldir index 5476d3fc53..294345cbf7 100644 --- a/src/ui/screens/home/controller/qmldir +++ b/src/ui/screens/home/controller/qmldir @@ -1,11 +1,5 @@ ControllerView 0.1 ControllerView.qml -ConnectionCheckmarkList 0.1 connectionInfo/ConnectionCheckmarkList.qml -ConnectionInfoContent 0.1 connectionInfo/ConnectionInfoContent.qml -ConnectionInfoError 0.1 connectionInfo/ConnectionInfoError.qml -ConnectionInfoItem 0.1 connectionInfo/ConnectionInfoItem.qml -ConnectionInfoScreen 0.1 connectionInfo/ConnectionInfoScreen.qml ConnectionTimer 0.1 ConnectionTimer.qml IPAddress 0.1 ip/IPAddress.qml IPInfoPanel 0.1 ip/IPInfoPanel.qml -LogoLoader 0.1 connectionInfo/LogoLoader.qml VPNToggle 0.1 VPNToggle.qml \ No newline at end of file diff --git a/src/ui/singletons/VPNConnectionBenchmark.h b/src/ui/singletons/VPNConnectionBenchmark.h deleted file mode 100644 index 756178fba7..0000000000 --- a/src/ui/singletons/VPNConnectionBenchmark.h +++ /dev/null @@ -1,26 +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/. */ - -#ifndef VPNCONNECTIONBENCHMARK_H -#define VPNCONNECTIONBENCHMARK_H - -#include - -#include "connectionbenchmark/connectionbenchmark.h" -#include "mozillavpn.h" - -struct VPNConnectionBenchmark { - Q_GADGET - QML_FOREIGN(ConnectionBenchmark) - QML_ELEMENT - QML_SINGLETON - - public: - static ConnectionBenchmark* create(QQmlEngine* qmlEngine, - QJSEngine* jsEngine) { - return MozillaVPN::instance()->connectionBenchmark(); - } -}; - -#endif // VPNCONNECTIONBENCHMARK_H diff --git a/src/ui/ui.qrc b/src/ui/ui.qrc index 538c14fecb..103b0af42f 100644 --- a/src/ui/ui.qrc +++ b/src/ui/ui.qrc @@ -31,12 +31,6 @@ screens/getHelp/developerMenu/ViewTelemetryDebugging.qml screens/getHelp/developerMenu/ViewThemeList.qml screens/getHelp/developerMenu/ViewUiTesting.qml - screens/home/controller/connectionInfo/ConnectionCheckmarkList.qml - screens/home/controller/connectionInfo/ConnectionInfoContent.qml - screens/home/controller/connectionInfo/ConnectionInfoError.qml - screens/home/controller/connectionInfo/ConnectionInfoItem.qml - screens/home/controller/connectionInfo/ConnectionInfoScreen.qml - screens/home/controller/connectionInfo/LogoLoader.qml screens/home/controller/ConnectionStability.qml screens/home/controller/ConnectionTimer.qml screens/home/controller/ControllerImage.qml diff --git a/tests/functional/queries.js b/tests/functional/queries.js index 7b8fa96c63..bc0b08359e 100644 --- a/tests/functional/queries.js +++ b/tests/functional/queries.js @@ -78,12 +78,6 @@ class QmlQueryComposer { const screenHome = { BACK: new QmlQueryComposer('//screenHome-back'), CAP_PORTAL_BUTTON: new QmlQueryComposer('//captivePortalAlertActionButton'), - CONNECTION_INFO_ERROR: new QmlQueryComposer('//connectionInfoError'), - CONNECTION_INFO_RETRY: - new QmlQueryComposer('//connectionInfoErrorRetryButton'), - CONNECTION_INFO_RESTART: - new QmlQueryComposer('//connectionInfoRestartButton'), - CONNECTION_INFO_TOGGLE: new QmlQueryComposer('//connectionInfoToggleButton'), CONTROLLER_SUBTITLE: new QmlQueryComposer('//controllerSubTitle'), CONTROLLER_TITLE: new QmlQueryComposer('//controllerTitle'), CONTROLLER_TOGGLE: new QmlQueryComposer('//controllerToggle'), diff --git a/tests/functional/servers/networkBenchmark.js b/tests/functional/servers/networkBenchmark.js deleted file mode 100644 index 4eb0d522eb..0000000000 --- a/tests/functional/servers/networkBenchmark.js +++ /dev/null @@ -1,51 +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/. */ - -const Server = require('./server.js'); - -// Mock server for VPN Network Benchmark: -// https://github.com/mozilla-services/vpn-network-benchmark -let server = null; -module.exports = { - async start(headerCheck = true) { - server = new Server( - 'VPN Network Benchmark', { - GETs: { - '/': { - status: 200, - bodyRaw: new Array(1024).join('a'), - } - }, - POSTs: { - '/': {status: 200, body: {}}, - }, - }, - headerCheck); - await server.start(); - }, - - stop() { - server.stop(); - }, - - get port() { - return server.port; - }, - - get url() { - return server.url; - }, - - get overrideEndpoints() { - return server.overrideEndpoints; - }, - - set overrideEndpoints(value) { - server.overrideEndpoints = value; - }, - - throwExceptionsIfAny() { - server.throwExceptionsIfAny(); - }, -}; diff --git a/tests/functional/setupVpn.js b/tests/functional/setupVpn.js index 5490945ce5..eee027b46c 100644 --- a/tests/functional/setupVpn.js +++ b/tests/functional/setupVpn.js @@ -23,7 +23,6 @@ const vpnWS = require('./helperWS.js'); const fxaServer = require('./servers/fxa.js'); const guardian = require('./servers/guardian.js'); const addonServer = require('./servers/addon.js'); -const networkBenchmark = require('./servers/networkBenchmark.js'); const captivePortalServer = require('./servers/captivePortalServer.js'); const app = process.env.MVPN_BIN; @@ -75,7 +74,6 @@ exports.mochaHooks = { await guardian.start(); await fxaServer.start(guardian.url); await addonServer.start(); - await networkBenchmark.start(); await captivePortalServer.start(); process.env['MVPN_API_BASE_URL'] = guardian.url; @@ -83,9 +81,6 @@ exports.mochaHooks = { process.env['MZ_ADDON_URL'] = `${addonServer.url}/01_empty_manifest/`; process.env['MVPN_SKIP_ADDON_SIGNATURE'] = '1'; - process.env['MZ_BENCHMARK_DOWNLOAD_URL'] = networkBenchmark.url; - process.env['MZ_BENCHMARK_UPLOAD_URL'] = networkBenchmark.url; - process.env['MZ_CAPTIVE_PORTAL_URL'] = `http://%1:${captivePortalServer.port}/success.txt`; }, @@ -94,13 +89,11 @@ exports.mochaHooks = { guardian.stop(); fxaServer.stop(); addonServer.stop(); - networkBenchmark.stop(); captivePortalServer.stop(); guardian.throwExceptionsIfAny(); fxaServer.throwExceptionsIfAny(); addonServer.throwExceptionsIfAny(); - networkBenchmark.throwExceptionsIfAny(); captivePortalServer.throwExceptionsIfAny(); }, @@ -111,7 +104,6 @@ exports.mochaHooks = { guardian.overrideEndpoints = null; fxaServer.overrideEndpoints = null; - networkBenchmark.overrideEndpoints = null; await startAndConnect(); await vpn.reset(); @@ -131,8 +123,6 @@ exports.mochaHooks = { this.currentTest.ctx.guardianOverrideEndpoints || null; fxaServer.overrideEndpoints = this.currentTest.ctx.fxaOverrideEndpoints || null; - networkBenchmark.overrideEndpoints = - this.currentTest.ctx.networkBenchmarkOverrideEndpoints || null; if (this.currentTest.ctx.authenticationNeeded) { fs.writeFileSync( @@ -159,7 +149,6 @@ exports.mochaHooks = { // middle of the tests this.currentTest.ctx.guardianServer = guardian; this.currentTest.ctx.fxaServer = fxaServer; - this.currentTest.ctx.networkBenchmarkServer = networkBenchmark; console.log('Starting test:', this.currentTest.title); }, diff --git a/tests/functional/setupWasm.js b/tests/functional/setupWasm.js index e13aa887c6..dd0748d9f3 100644 --- a/tests/functional/setupWasm.js +++ b/tests/functional/setupWasm.js @@ -19,7 +19,6 @@ const vpnWasm = require('./helperWasm.js'); const fxaServer = require('./servers/fxa.js'); const guardian = require('./servers/guardian.js'); const addonServer = require('./servers/addon.js'); -const networkBenchmark = require('./servers/networkBenchmark.js'); const captivePortalServer = require('./servers/captivePortalServer.js'); const wasm = require('./wasm.js'); @@ -47,14 +46,12 @@ exports.mochaHooks = { await guardian.start(false); await fxaServer.start(guardian.url, false); await addonServer.start(false); - await networkBenchmark.start(false); await captivePortalServer.start(false); const u = new URL(`${url}/test.html`); u.searchParams.set('guardian', guardian.url); u.searchParams.set('fxa', fxaServer.url); u.searchParams.set('addon', `${addonServer.url}/01_empty_manifest/`); - u.searchParams.set('benchmark', networkBenchmark.url); u.searchParams.set( 'captivePortal', `http://%1:${captivePortalServer.port}/success.txt`); url = u.toString() @@ -86,14 +83,12 @@ exports.mochaHooks = { guardian.stop(); fxaServer.stop(); addonServer.stop(); - networkBenchmark.stop(); captivePortalServer.stop(); wasm.stop(); guardian.throwExceptionsIfAny(); fxaServer.throwExceptionsIfAny(); addonServer.throwExceptionsIfAny(); - networkBenchmark.throwExceptionsIfAny(); captivePortalServer.throwExceptionsIfAny(); await driver.quit(); @@ -106,8 +101,6 @@ exports.mochaHooks = { this.currentTest.ctx.guardianOverrideEndpoints || null; fxaServer.overrideEndpoints = this.currentTest.ctx.fxaOverrideEndpoints || null; - networkBenchmark.overrideEndpoints = - this.currentTest.ctx.networkBenchmarkOverrideEndpoints || null; await driver.get(url); await vpn.connect(vpnWasm, { url, driver }); @@ -122,7 +115,6 @@ exports.mochaHooks = { // middle of the tests this.currentTest.ctx.guardianServer = guardian; this.currentTest.ctx.fxaServer = fxaServer; - this.currentTest.ctx.networkBenchmarkServer = networkBenchmark; console.log('Starting test:', this.currentTest.title); }, diff --git a/tests/functional/testBenchmark.js b/tests/functional/testBenchmark.js deleted file mode 100644 index bec9540017..0000000000 --- a/tests/functional/testBenchmark.js +++ /dev/null @@ -1,419 +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/. */ - -const vpn = require('./helper.js'); -const assert = require('assert'); -const queries = require('./queries.js'); - -describe('Benchmark', function() { - this.timeout(120000); - this.ctx.authenticationNeeded = true; - - this.ctx.networkBenchmarkOverrideEndpoints = { - GETs: { - '/': { - status: 200, - bodyRaw: new Array(1024).join('a'), - callback: async req => await this.ctx.downloadUrlCallback(req) - }, - }, - POSTs: {}, - DELETEs: {}, - }; - - it('Successful benchmark', async () => { - // For the first tests, we don't need any special responses. - this.ctx.downloadUrlCallback = req => {}; - - await vpn.waitForQuery(queries.screenHome.CONTROLLER_TITLE.visible()); - await vpn.activate(true); - - // Start the connection benchmark. - await vpn.waitForQueryAndClick( - queries.screenHome.CONNECTION_INFO_TOGGLE.visible()); - await vpn.waitForCondition(async () => { - let state = await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'state'); - return state == 'StateRunning'; - }); - await vpn.waitForCondition(async () => { - let state = await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'state'); - return state != 'StateRunning'; - }); - - // We expect the benchmark to succeed. - let speed = await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'speed'); - let downloadBps = parseInt(await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'downloadBps')); - let uploadBps = parseInt(await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'uploadBps')); - let state = await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'state'); - assert.strictEqual(state, 'StateReady'); - - assert.strictEqual( - speed, - (downloadBps >= 25000000 && uploadBps > 0) ? - 'SpeedFast' : - ((downloadBps >= 10000000 && uploadBps > 0) ? 'SpeedMedium' : - 'SpeedSlow')); - - // Exit the benchmark - await vpn.waitForQueryAndClick(queries.screenHome.CONNECTION_INFO_TOGGLE); - }); - - it('Failed benchmark on HTTP error', async () => { - await vpn.waitForQuery(queries.screenHome.CONTROLLER_TITLE.visible()); - await vpn.activate(true); - - // Re-Configure the benchmark to use a URL that generates an HTTP error. - this.ctx.downloadUrlCallback = async req => { - this.ctx.networkBenchmarkOverrideEndpoints.GETs['/'].status = 500; - await new Promise(r => setTimeout(r, 2000)); - }; - - // Start the connection benchmark and wait for it to finish. - await vpn.waitForQueryAndClick(queries.screenHome.CONNECTION_INFO_TOGGLE); - await vpn.waitForCondition(async () => { - let state = await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'state'); - return state == 'StateRunning'; - }); - await vpn.waitForCondition(async () => { - let state = await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'state'); - return state != 'StateRunning'; - }); - - // We expect the benchmark to fail. - assert.strictEqual( - await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'state'), - 'StateError'); - await vpn.waitForQuery(queries.screenHome.CONNECTION_INFO_ERROR.visible()); - - // Exit the benchmark - await vpn.waitForQueryAndClick(queries.screenHome.CONNECTION_INFO_TOGGLE); - }); - - it('Retry failed benchmark', async () => { - await vpn.waitForQuery(queries.screenHome.CONTROLLER_TITLE.visible()); - await vpn.activate(true); - - // Re-Configure the benchmark to use a URL that generates an HTTP error. - this.ctx.downloadUrlCallback = async req => { - this.ctx.networkBenchmarkOverrideEndpoints.GETs['/'].status = 400; - await new Promise(r => setTimeout(r, 2000)); - }; - - // Start the connection benchmark and wait for it to finish. - await vpn.waitForQueryAndClick(queries.screenHome.CONNECTION_INFO_TOGGLE); - await vpn.waitForCondition(async () => { - let state = await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'state'); - return state == 'StateRunning'; - }); - await vpn.waitForCondition(async () => { - let state = await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'state'); - return state != 'StateRunning'; - }); - - // We expect the benchmark to fail. - assert.strictEqual( - await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'state'), - 'StateError'); - await vpn.waitForQuery(queries.screenHome.CONNECTION_INFO_ERROR.visible()); - - // Let's set 200 as status code. - this.ctx.downloadUrlCallback = async req => { - this.ctx.networkBenchmarkOverrideEndpoints.GETs['/'].status = 200; - }; - - await vpn.waitForQueryAndClick(queries.screenHome.CONNECTION_INFO_RETRY); - await vpn.waitForCondition(async () => { - let state = await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'state'); - return state == 'StateRunning'; - }); - await vpn.waitForCondition(async () => { - let state = await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'state'); - return state != 'StateRunning'; - }); - - // This time we expect the benchmark to succeed. - let speed = await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'speed'); - let downloadBps = parseInt(await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'downloadBps')); - let uploadBps = parseInt(await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'uploadBps')); - let state = await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'state'); - assert.strictEqual(state, 'StateReady'); - - assert.strictEqual( - speed, - (downloadBps >= 25000000 && uploadBps > 0) ? - 'SpeedFast' : - ((downloadBps >= 10000000 && uploadBps > 0) ? 'SpeedMedium' : - 'SpeedSlow')); - - // Exit the benchmark - await vpn.waitForQueryAndClick(queries.screenHome.CONNECTION_INFO_TOGGLE); - }); - - it('Error on unexpected disconnect', async () => { - await vpn.waitForQuery(queries.screenHome.CONTROLLER_TITLE.visible()); - await vpn.activate(true); - - // Re-Configure the benchmark to use a URL that will hang for a while. - this.ctx.downloadUrlCallback = async req => { - this.ctx.networkBenchmarkOverrideEndpoints.GETs['/'].status = 230; - await new Promise(r => setTimeout(r, 10000)); - }; - - // Start the connection benchmark. - await vpn.waitForQueryAndClick(queries.screenHome.CONNECTION_INFO_TOGGLE); - await vpn.waitForCondition(async () => { - let state = await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'state'); - return state == 'StateRunning'; - }); - - // Disconnect the VPN, this should trigger an error. - await vpn.deactivate(); - await vpn.waitForCondition(async () => { - let state = await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'state'); - return state != 'StateRunning'; - }); - - // We expect the benchmark to fail. - assert.strictEqual( - await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'state'), - 'StateError'); - await vpn.waitForQuery(queries.screenHome.CONNECTION_INFO_ERROR.visible()); - - // Exit the benchmark - await vpn.waitForQueryAndClick(queries.screenHome.CONNECTION_INFO_TOGGLE); - }); - - it('Error when starting with no connection', async () => { - await vpn.waitForQuery(queries.screenHome.CONTROLLER_TITLE.visible()); - await vpn.activate(true); - - // Force a No Signal situation - await vpn.forceConnectionStabilityStatus('nosignal'); - - // Start the connection benchmark; it goes into Running state before Error. - await vpn.waitForQueryAndClick(queries.screenHome.CONNECTION_INFO_TOGGLE); - - // We expect the benchmark to fail. - assert.strictEqual( - await vpn.getMozillaProperty( - 'Mozilla.VPN', 'VPNConnectionBenchmark', 'state'), - 'StateError'); - await vpn.waitForQuery(queries.screenHome.CONNECTION_INFO_ERROR.visible()); - - // Exit the benchmark - await vpn.waitForQueryAndClick(queries.screenHome.CONNECTION_INFO_TOGGLE); - }); - - describe('speed tests related telemetry tests', () => { - if(vpn.runningOnWasm()) { - // No Glean on WASM. - return; - } - - // Telemetry design is detailed at: - // https://miro.com/app/board/uXjVM_QZzjA=/?share_link_id=616399368132 - - it("records events on successful speed test", async () => { - this.ctx.downloadUrlCallback = async () => {}; - - // Activate the VPN, otherwise the speed test feature is disabled - await vpn.waitForQuery(queries.screenHome.CONTROLLER_TITLE.visible()); - await vpn.activate(true); - - const [ { extra: appStepExtras } ] = await vpn.gleanTestGetValue("impression", "mainScreen", "main"); - assert.strictEqual("main", appStepExtras.screen); - - // Start the connection benchmark. - await vpn.waitForQueryAndClick( - queries.screenHome.CONNECTION_INFO_TOGGLE.visible()); - - const triggeredEventsList = await vpn.gleanTestGetValue("interaction", "startSpeedTestSelected", "main") - assert.strictEqual(triggeredEventsList.length, 1); - const triggeredEventExtra = triggeredEventsList[0].extra; - assert.strictEqual("main", triggeredEventExtra.screen); - - // Connection benchmark results loaded succesfully - let completedEventsList; - await vpn.waitForCondition(async () => { - completedEventsList = await vpn.gleanTestGetValue("impression", "speedTestCompletedScreen", "main") - return completedEventsList.length == 1; - }); - - let completedEventExtra = completedEventsList[0].extra; - assert.strictEqual("speed_test_completed", completedEventExtra.screen); - - const outcomeEventsList = await vpn.gleanTestGetValue("outcome", "speedTestCompleted", "main") - assert.strictEqual(outcomeEventsList.length, 1); - const outcomeEventExtra = outcomeEventsList[0].extra; - assert.strictEqual("speed_test_completed", outcomeEventExtra.outcome); - assert.strictEqual(await vpn.getMozillaProperty('Mozilla.VPN', 'VPNConnectionBenchmark', 'speed'), outcomeEventExtra.speed); - - // Refresh the test - await vpn.waitForQueryAndClick( - queries.screenHome.CONNECTION_INFO_RESTART.visible()); - - const refreshEventsList = await vpn.gleanTestGetValue("interaction", "refreshSelected", "main") - assert.strictEqual(refreshEventsList.length, 1); - const refreshEventExtra = refreshEventsList[0].extra; - assert.strictEqual("speed_test_completed", refreshEventExtra.screen); - - // Connection benchmark results loaded succesfully again - await vpn.waitForCondition(async () => { - completedEventsList = await vpn.gleanTestGetValue("impression", "speedTestCompletedScreen", "main") - // Now the list has two events, the first one and the new one - return completedEventsList.length == 2; - }); - - completedEventExtra = completedEventsList[1].extra; - assert.strictEqual("speed_test_completed", completedEventExtra.screen); - - // Close the connection benchmark - await vpn.waitForQueryAndClick( - queries.screenHome.CONNECTION_INFO_TOGGLE.visible()); - - const closedEventsList = await vpn.gleanTestGetValue("interaction", "closeSelected", "main") - assert.strictEqual(closedEventsList.length, 1); - const closedEventExtra = closedEventsList[0].extra; - assert.strictEqual("speed_test_completed", closedEventExtra.screen); - }); - - it("records events while loading speed test", async () => { - let resolveSpeedTestResults; - this.ctx.downloadUrlCallback = async () => { - // Hold the speed test in the loading state until we are done testing the loading state. - await new Promise(resolve => resolveSpeedTestResults = resolve); - }; - - // Activate the VPN, otherwise the speed test feature is disabled - await vpn.waitForQuery(queries.screenHome.CONTROLLER_TITLE.visible()); - await vpn.activate(true); - - // Start the connection benchmark. - await vpn.waitForQueryAndClick( - queries.screenHome.CONNECTION_INFO_TOGGLE.visible()); - - // Connection benchmark results are loading - let loadingEventsList; - await vpn.waitForCondition(async () => { - loadingEventsList = await vpn.gleanTestGetValue("impression", "speedTestLoadingScreen", "main") - return loadingEventsList.length == 1; - }); - - let loadingEventExtra = loadingEventsList[0].extra; - assert.strictEqual("speed_test_loading", loadingEventExtra.screen); - - // Close the connection benchmark while loading - await vpn.waitForQueryAndClick( - queries.screenHome.CONNECTION_INFO_TOGGLE.visible()); - - const closedEventsList = await vpn.gleanTestGetValue("interaction", "closeSelected", "main") - assert.strictEqual(closedEventsList.length, 1); - const closedEventExtra = closedEventsList[0].extra; - assert.strictEqual("speed_test_loading", closedEventExtra.screen); - - // Resolve the loading speed test, just in case. - resolveSpeedTestResults(); - }); - - it("records events on errored speed test", async () => { - this.ctx.networkBenchmarkOverrideEndpoints.GETs['/'].status = 400; - this.ctx.downloadUrlCallback = async () => {}; - - // Activate the VPN, otherwise the speed test feature is disabled - await vpn.waitForQuery(queries.screenHome.CONTROLLER_TITLE.visible()); - await vpn.activate(true); - - const [ { extra: appStepExtras } ] = await vpn.gleanTestGetValue("impression", "mainScreen", "main") - assert.strictEqual("main", appStepExtras.screen); - - // Start the connection benchmark. - await vpn.waitForQueryAndClick( - queries.screenHome.CONNECTION_INFO_TOGGLE.visible()); - - const triggeredEventsList = await vpn.gleanTestGetValue("interaction", "startSpeedTestSelected", "main") - assert.strictEqual(triggeredEventsList.length, 1); - const triggeredEventExtra = triggeredEventsList[0].extra; - assert.strictEqual("main", triggeredEventExtra.screen); - - // Connection benchmark results errorred - let erroredEventsList; - await vpn.waitForCondition(async () => { - erroredEventsList = await vpn.gleanTestGetValue("impression", "speedTestErrorScreen", "main") - return erroredEventsList.length == 1; - }); - - let completedEventExtra = erroredEventsList[0].extra; - assert.strictEqual("speed_test_error", completedEventExtra.screen); - - // Refresh the test - await vpn.waitForQueryAndClick( - queries.screenHome.CONNECTION_INFO_RESTART.visible()); - - const refreshEventsList = await vpn.gleanTestGetValue("interaction", "refreshSelected", "main") - assert.strictEqual(refreshEventsList.length, 1); - const refreshEventExtra = refreshEventsList[0].extra; - assert.strictEqual("speed_test_error", refreshEventExtra.screen); - - // Connection benchmark results errored again - await vpn.waitForCondition(async () => { - erroredEventsList = await vpn.gleanTestGetValue("impression", "speedTestErrorScreen", "main") - // Now the list has two events, the first one and the new one - return erroredEventsList.length == 2; - }); - - completedEventExtra = erroredEventsList[1].extra; - assert.strictEqual("speed_test_error", completedEventExtra.screen); - - // Refresh the test, but this time through the "Try Again" button - await vpn.waitForQueryAndClick( - queries.screenHome.CONNECTION_INFO_RETRY.visible()); - - const tryAgainEventsList = await vpn.gleanTestGetValue("interaction", "refreshSelected", "main") - // Execting two events, since this is the same as the refreshEvent - assert.strictEqual(tryAgainEventsList.length, 2); - const tryAgainEventExtra = tryAgainEventsList[1].extra; - assert.strictEqual("speed_test_error", tryAgainEventExtra.screen); - - // Connection benchmark results errored again - await vpn.waitForCondition(async () => { - erroredEventsList = await vpn.gleanTestGetValue("impression", "speedTestErrorScreen", "main") - // Now the list has three events, the first one and the new one - return erroredEventsList.length == 3; - }); - - completedEventExtra = erroredEventsList[2].extra; - assert.strictEqual("speed_test_error", completedEventExtra.screen); - - // Close the connection benchmark - await vpn.waitForQueryAndClick( - queries.screenHome.CONNECTION_INFO_TOGGLE.visible()); - - const closedEventsList = await vpn.gleanTestGetValue("interaction", "closeSelected", "main") - assert.strictEqual(closedEventsList.length, 1); - const closedEventExtra = closedEventsList[0].extra; - assert.strictEqual("speed_test_error", closedEventExtra.screen); - }); - }); -}); diff --git a/wasm/test.html b/wasm/test.html index 973f8cd208..f9433cf720 100644 --- a/wasm/test.html +++ b/wasm/test.html @@ -76,8 +76,6 @@

Mozilla VPN - WebAssembly Viewer

MZ_FXA_API_BASE_URL: u.searchParams.get('fxa'), MZ_ADDON_URL: u.searchParams.get('addon'), MVPN_SKIP_ADDON_SIGNATURE: '1', - MZ_BENCHMARK_DOWNLOAD_URL: u.searchParams.get('benchmark'), - MZ_BENCHMARK_UPLOAD_URL: u.searchParams.get('benchmark'), MZ_CAPTIVE_PORTAL_URL: u.searchParams.get('captivePortal'), } });