From 5149c2f324940a78b162435fcc6e6298c575999c Mon Sep 17 00:00:00 2001 From: Alex Matus Date: Mon, 12 Jul 2021 09:34:24 +0300 Subject: [PATCH 1/6] updated policy --- iOS/Assets/index.html | 285 ------------------ iOS/Assets/privacy-policy.html | 274 +++++++++++++++++ .../{index1.html => terms-of-service.html} | 0 .../View/PrivacyPolicyViewForm.swift | 2 +- .../Terms/View/TermsOfServiceViewForm.swift | 2 +- 5 files changed, 276 insertions(+), 287 deletions(-) delete mode 100644 iOS/Assets/index.html create mode 100644 iOS/Assets/privacy-policy.html rename iOS/Assets/{index1.html => terms-of-service.html} (100%) diff --git a/iOS/Assets/index.html b/iOS/Assets/index.html deleted file mode 100644 index 251e9fc..0000000 --- a/iOS/Assets/index.html +++ /dev/null @@ -1,285 +0,0 @@ - - - - - - - - -
-

PrivadoVPN Privacy Policy

-

Last Updated: May 26, 2020

-

The PrivadoVPN Privacy Policy ("Policy") applies to the applications, websites and online products and services - provided by Privado Networks AG. By visiting our websites or creating an account to use our Services, you agree - to this Policy. If you do not agree to this Policy, you may not use our Services.

-

This Policy explains how we collect, use and store information. We collect only the minimal data required to - provide the Services.

-

PrivadoVPN Key Privacy Facts

- -

Information that we collect (information that you provide to us):

-
    -
  1. Account Creation: We collect minimal information when you create an account. This is - information that you provide to us, including your email and your username. -
  2. -
  3. Payment Information: We use third party payment processors to facilitate payment for the - Services. If you utilize a credit card, this information will be collected by the payment processor. We do - not collect or store your credit card number. The specific information collected varies based on your choice - of payment method. -
  4. -
  5. Support: We do collect and keep data that you share with us regarding support issues or - customer requests. We may use third parties for support reporting purposes. -
  6. -
-

How We Use Information That You Provide To Us:

-
    -
  1. To communicate with you regarding support issues.
  2. -
  3. To communicate with you regarding billing issues.
  4. -
  5. To send you updates and announcements regarding the Services.
  6. -
  7. To send marketing emails about new products and updates that are part of our Services.
  8. -
  9. To send you promotions, seasonal discounts and to communicate with you about contests regarding our - Services. -
  10. -
-

You may opt out from receiving any marketing or promotional emails by following the opt-out procedures that are - explained in the email. Alternatively, you may go to support@privado.io - opt out of our internal marketing or promotional emails.

-

Information We Collect Automatically When You Use Our Services

-

When you use our Services, we may collect the following information:

-
    -
  1. Mobile Applications: We collect information regarding which App version(s) you have - activated for troubleshooting and assisting with support issues. We may also collect anonymous, - aggregate statistics, such as the type of operating systems and devices that are most commonly used, - including total number of installs, total number of uninstalls and the number of active users over a - period of time. -
  2. -
  3. Mobile Analytics Software: We use self-hosted Sentry crash reporting to send us crash - reports so we can provide bug fixes and address technical issues rapidly. -
  4. -
  5. Mobile Identifiers: We use mobile identifiers provided by iOS and Android devices. These - identifiers do not contain your email address or name. Mobile identifiers provide us with statistics - related to marketing or channel partners. Users may turn-off or reset Mobile Identifiers at any time. - iOS users should review Apple's support page at https://support.apple.com/en-us/HT205223. - Android users should review Google's support page at https://support.google.com - /android/answer/3118621?hl=en. -
  6. -
-

Please note that the anonymized Mobile Applications Data is fully anonymized and is unable to be tied to a - user - of our Services. We collect the information to provide a fast and secure experience.

-
    -
  1. - Information Collected by Cookies: -
      -
    • Cookies are small files that store and provide information about your visit to our websites. We - use cookies to improve the user experience of our website. We use analytics providers, like - Google, which set cookies when you visit our websites. -
    • -
    • We use cookies for a number of reasons, like helping us see which features are most popular, - counting visitors to a page, improving our users' experience, keeping our services secure, and - generally providing you with a better experience. -
    • -
    • To prevent your data from being used by Google Analytics, you can install Google's opt-out browser add-on. -
    • -
    • You are also free to change your cookie preferences in the settings tab for your browser. The - type of browser and device you are using will determine the control level for cookies you wish - to allow or completely block. -
    • -
    • For information on how our advertising partners allow you to opt out of receiving ads based on - your web browsing history, please visit https://www.youronlinechoices.eu. - Users in the United States should please visit http://optout.aboutads.info/. -
    • -
    -
  2. -
-

Any Cookies that are utilized will not contain personally identifying information such as your email address - and - they do not track your activity outside of our websites.

-

Information Collected on Social Media or Blogs: We may collect information on our blog via our - websites or through our social media accounts, including but not limited to Facebook, Reddit and Twitter. - Any communication you provide to us on external social media accounts is done at your own risk and without - guarantee of privacy. If you post a comment on one of our blogs or websites, please contact us if you want - it deleted.

-

External Links: Our Services may contain links to other websites or other services of interest. - We are not responsible for the content or material on any website that we link to, as these external sites - and services are governed by their own terms and privacy policies.

-

Bandwidth Utilized & Free Versions.

-

We measure the amount of bandwidth utilized by users of the Services. Free versions may have a limited data - transfer amount. Subscribers that paid for Services will be provided with unlimited data transfer. The total - sum of data transferred is not identifiable for a user's behavior. We measure bandwidth utilized in order to - improve our services. We do not log any data sent over the connections.

-

Use of Information

-

We combine the information we collect about you and use this information for various purposes, including - to:

- -

Disclosure of Information

-

We only disclose the limited data we have on record (i.e., email address & username) when compelled by - the Swiss authorities. Data requests from foreign authorities must be approved by the Swiss authorities.

-

Under the laws of Switzerland, we are required to notify the targets of a surveillance request. Such - notification may come from Swiss authorities if not directly from Us.

-

We are unable to supply any information for requests related to a PrivadoVPN user's - browsing history, traffic destination, data content, IP addresses, or DNS queries. This information does not - exist.

-

Right to Access, Rectification, Portability and Erasure

-

You can directly access, delete, edit or export personal data processed by us in your use of the Services. - You can also email our support team at support@privado.io to make a - request.

-

Data Retention

-

We store the information we collect about you for as long as necessary for the purposes for which we - originally collected it. We may retain certain information for legitimate business purposes or as required - by the laws of Switzerland.

-

Data Security

-

Data Security is a core pillar of our business. Our infrastructure and secure servers are contained in fully - locked and 24-7 monitored data facilities that are best in class.

-

Even if a regulatory authority physically seizes a PrivadoVPN server (assuming it could break the disk - encryption) there would be no logs or information that could be tied an individual user.

-

Changes to this Policy

-

We reserve the right to review and change this Policy at any time. We will notify users about any such changes. Continued use of our Services will be deemed as acceptance of such changes. -

- -
- - - - diff --git a/iOS/Assets/privacy-policy.html b/iOS/Assets/privacy-policy.html new file mode 100644 index 0000000..6cc3ade --- /dev/null +++ b/iOS/Assets/privacy-policy.html @@ -0,0 +1,274 @@ + + + + + + + + +
+

PrivadoVPN Privacy Policy

+

Last Updated: July 8, 2021

+

PrivadoVPN Key Privacy Facts

+ +

The PrivadoVPN Privacy Policy ("Policy") applies to the applications, websites and online products and services + (the "Services") provided by Privado Networks AG ("we"). By visiting our websites or creating an account to use + our Services and ticking the "I agree"-box, you agree to this Policy. If you do not agree to this Policy, you + may not use our Services.

+

This Policy informs the customers and users ("you" or "user") of our Services of how we collect, process and + store personal data. We strive to collect only the minimal data required to provide the Services.

+

Data Controller:

+

Privado Networks AG in Zug, Switzerland, is the controller for the data processing pursuant to this Policy. You + can notify us of any data protection related concerns using support@privado.io. +

+ +

Data that we collect (data that you provide to us):

+
    +
  1. Account Creation: We collect minimal data when you create an account. This is data that you + provide to us, including your email address and your username. +
  2. +
  3. Payment Information: We use third party payment processors to facilitate payment for the + Services. These third party payment processors are located in Switzerland and the EU. If you utilize a + credit card, this information will be collected by the payment processor. We do not collect or store your + credit card number. The specific information collected varies based on your choice of payment method. We + recommend using Bitcoin when subscribing to our Services for maximum security. +
  4. +
  5. Support: We do collect and keep data that you share with us regarding support issues or + customer requests. We may use third parties for support reporting purposes. +
  6. +
+

How we use data that you provide to us:

+
    +
  1. To communicate with you regarding support issues and to send you technical notices.
  2. +
  3. To communicate with you regarding billing issues and to send you administrative messages.
  4. +
  5. To communicate with you and send you information about products, updates, services, promotions, events, + contests and other news regarding the Services we think will be of interest to you and announcements + regarding the Services. +
  6. +
+

You may opt out from receiving any marketing or promotional emails by following the opt-out procedures that are + explained in the email. Alternatively, you may go to support@privado.io + opt out of our internal marketing or promotional emails.

+

Data we collect automatically when you use our Services

+

When you use our Services, we may collect the following information:

+
    +
  1. Mobile Applications: We collect information regarding which application version(s) you have + activated for troubleshooting and assisting with support issues. We may also collect anonymous, aggregate + statistics, such as the type of operating systems and devices that are most commonly used, including total + number of installs, total number of uninstalls and the number of active users over a period of time. +
  2. +
  3. Mobile Analytics Software: We use self-hosted Sentry crash reporting tools to send us crash + reports so we can provide bug fixes and address technical issues rapidly. +
  4. +
  5. Mobile Identifiers: We use mobile identifiers provided by iOS and Android devices. These + identifiers do not contain your email address or name. Mobile identifiers provide us with statistics related + to marketing or channel partners. Users may turn-off or reset Mobile Identifiers at any time. iOS users + should review Apple's support page at https://support.apple.com/en-us/HT205223. + Android users should review Google's support page at https://support.google.com/android/answer/3118621?hl=en. +
  6. +
+

Please note that the anonymized mobile applications data is fully anonymized and is unable to be tied to + a user of our Services. We collect the information to provide a fast and secure experience.

+
    +
  1. + Information collected by Cookies: +
      +
    • Cookies are small files that store and provide information about your visit to our websites. We use + cookies to improve the user experience of our website. We use analytics providers, like Google, + which set cookies when you visit our websites. +
    • +
    • We use cookies for a number of reasons, like helping us see which features are most popular, + counting visitors to a page, improving our users' experience, keeping our services secure, and + generally providing you with a better experience. +
    • +
    • To prevent your data from being used by Google Analytics, you can install Google's opt-out browser add-on. +
    • +
    • For information on how our advertising partners allow you to opt out of receiving ads based on your + web browsing history, please visit https://www.youronlinechoices.eu. + Users in the United States should please visit http://optout.aboutads.info/. +
    • +
    +
  2. +
+

Any Cookies that are utilized will not contain personally identifying information such as your email + address and they do not track your activity outside of our websites.

+

Information collected on social media or blogs: We may collect information on our blog via our + websites or through our social media accounts, including but not limited to Facebook, Reddit and Twitter. Any + communication you provide to us on external social media accounts is done at your own risk and without guarantee + of privacy. If you post a comment on one of our blogs or websites, please contact us if you want it deleted.

+

External links: Our Services may contain links to other websites or other services of interest. + We are not responsible for the content or material on any website that we link to, as these external sites and + services are governed by their own terms and privacy policies.

+

Bandwidth utilized & free versions

+

We measure the amount of bandwidth utilized by users of the Services. Free versions may have a limited data + transfer amount. Subscribers that paid for Services will be provided with unlimited data transfer. The total sum + of data transferred is not identifiable for a user's behavior. We measure bandwidth utilized in order to improve + our services. We do not log any data sent over the connections.

+

Combination and further use of data

+

We combine the data we collect about you and use this information for various purposes, including to:

+ +

Disclosure of data

+

We only disclose the limited data we have on record (i.e., email address & username) when compelled by the Swiss + authorities. Data requests from foreign authorities must be approved by the Swiss authorities.

+

We are unable to supply any information for requests related to a PrivadoVPN + user's browsing history, traffic destination, data content, IP addresses, or DNS queries. This information does + not exist.

+

Right to access, rectification, object, portability and erasure

+

You can directly access, delete, edit or export personal data processed by us in your use of the Services or + object to our processing of your data. You can also email our support team at support@privado.io to make a request.

+

Data retention

+

We store the data we collect about you for as long as necessary for the purposes for which we originally + collected it. We may retain certain information for legitimate business purposes or as required by the laws of + Switzerland. The data is stored in Switzerland and the EU.

+

Data security

+

Data security is a core pillar of our business. Our infrastructure and secure servers are contained in fully + locked and 24-7 monitored data facilities that are best in class.

+

Even if a regulatory authority physically seizes a PrivadoVPN server (assuming it could break the disk + encryption) there would be no logs or information that could be tied an individual user.

+

Changes to this Policy

+

We reserve the right to review and change this Policy at any time. We will notify users about any such + changes. Continued use of our Services will be deemed as acceptance of such changes.

+
+ + diff --git a/iOS/Assets/index1.html b/iOS/Assets/terms-of-service.html similarity index 100% rename from iOS/Assets/index1.html rename to iOS/Assets/terms-of-service.html diff --git a/iOS/Privado/Sources/Flows/PreferenceFlow/Submodule/UserAccount/PrivacyPolicy/View/PrivacyPolicyViewForm.swift b/iOS/Privado/Sources/Flows/PreferenceFlow/Submodule/UserAccount/PrivacyPolicy/View/PrivacyPolicyViewForm.swift index 493dacb..ad89e27 100644 --- a/iOS/Privado/Sources/Flows/PreferenceFlow/Submodule/UserAccount/PrivacyPolicy/View/PrivacyPolicyViewForm.swift +++ b/iOS/Privado/Sources/Flows/PreferenceFlow/Submodule/UserAccount/PrivacyPolicy/View/PrivacyPolicyViewForm.swift @@ -61,7 +61,7 @@ final class PrivacyPolicyViewForm: UIView { self.webview.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0) ]) - let url = Bundle.main.url(forResource: "index", withExtension: "html") + let url = Bundle.main.url(forResource: "privacy-policy", withExtension: "html") self.webview.load(URLRequest(url: url!)) self.webview.navigationDelegate = self self.webview.scrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 50, right: 0) diff --git a/iOS/Privado/Sources/Flows/PreferenceFlow/Submodule/UserAccount/Terms/View/TermsOfServiceViewForm.swift b/iOS/Privado/Sources/Flows/PreferenceFlow/Submodule/UserAccount/Terms/View/TermsOfServiceViewForm.swift index 17fc8c5..405a98b 100644 --- a/iOS/Privado/Sources/Flows/PreferenceFlow/Submodule/UserAccount/Terms/View/TermsOfServiceViewForm.swift +++ b/iOS/Privado/Sources/Flows/PreferenceFlow/Submodule/UserAccount/Terms/View/TermsOfServiceViewForm.swift @@ -61,7 +61,7 @@ final class TermsOfServiceViewForm: UIView { self.webview.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0) ]) - let url = Bundle.main.url(forResource: "index1", withExtension: "html") + let url = Bundle.main.url(forResource: "terms-of-service", withExtension: "html") self.webview.load(URLRequest(url: url!)) self.webview.navigationDelegate = self self.webview.scrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 50, right: 0) From 96f04952fc0253ec83ec8f0021544d7c73d64627 Mon Sep 17 00:00:00 2001 From: Zhandos Bolatbekov Date: Mon, 12 Jul 2021 23:45:01 +0600 Subject: [PATCH 2/6] VPNDEV-952 - feat(serverList): updated latency images --- .../latencyHigh.imageset/Contents.json | 13 +--- .../latencyHigh.imageset/latencyHigh.pdf | 70 ------------------ .../latencyHigh.imageset/latencyHigh.svg | 5 ++ .../latencyLow.imageset/Contents.json | 13 +--- .../latencyLow.imageset/latencyLow.pdf | Bin 1131 -> 0 bytes .../latencyLow.imageset/latencyLow.svg | 5 ++ .../latencyMedium.imageset/Contents.json | 13 +--- .../latencyMedium.imageset/latencyMedium.pdf | Bin 1129 -> 0 bytes .../latencyMedium.imageset/latencyMedium.svg | 5 ++ iOS/Privado/Info.plist | 2 +- .../View/Subviews/ServerLocationCell.swift | 6 +- 11 files changed, 25 insertions(+), 107 deletions(-) delete mode 100644 iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyHigh.imageset/latencyHigh.pdf create mode 100644 iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyHigh.imageset/latencyHigh.svg delete mode 100644 iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyLow.imageset/latencyLow.pdf create mode 100644 iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyLow.imageset/latencyLow.svg delete mode 100644 iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyMedium.imageset/latencyMedium.pdf create mode 100644 iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyMedium.imageset/latencyMedium.svg diff --git a/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyHigh.imageset/Contents.json b/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyHigh.imageset/Contents.json index b8e2460..0350d65 100644 --- a/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyHigh.imageset/Contents.json +++ b/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyHigh.imageset/Contents.json @@ -1,17 +1,8 @@ { "images" : [ { - "filename" : "latencyHigh.pdf", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "filename" : "latencyHigh.svg", + "idiom" : "universal" } ], "info" : { diff --git a/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyHigh.imageset/latencyHigh.pdf b/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyHigh.imageset/latencyHigh.pdf deleted file mode 100644 index d1a0a6c..0000000 --- a/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyHigh.imageset/latencyHigh.pdf +++ /dev/null @@ -1,70 +0,0 @@ -%PDF-1.4 -% -4 0 obj -<< /Length 5 0 R - /Filter /FlateDecode ->> -stream -x]M0 >/qB4RaQw RTɝON򜒌T(W\rTs-]ޭT3|cCJOd>1M&۴vUةB龗,*N+X̾ ,3R-\a? -MdN4 B{6/T[h@ z7 \qS -Y#-l>;}]"_p͔ޗ[&N~ٚ,:)s+t -endstream -endobj -5 0 obj - 235 -endobj -3 0 obj -<< - /ExtGState << - /a0 << /CA 1 /ca 1 >> - >> ->> -endobj -2 0 obj -<< /Type /Page % 1 - /Parent 1 0 R - /MediaBox [ 0 0 11.25 14.25 ] - /Contents 4 0 R - /Group << - /Type /Group - /S /Transparency - /I true - /CS /DeviceRGB - >> - /Resources 3 0 R ->> -endobj -1 0 obj -<< /Type /Pages - /Kids [ 2 0 R ] - /Count 1 ->> -endobj -6 0 obj -<< /Producer (cairo 1.15.12 (http://cairographics.org)) - /CreationDate (D:20210301133320Z) ->> -endobj -7 0 obj -<< /Type /Catalog - /Pages 1 0 R ->> -endobj -xref -0 8 -0000000000 65535 f -0000000643 00000 n -0000000421 00000 n -0000000349 00000 n -0000000015 00000 n -0000000327 00000 n -0000000708 00000 n -0000000819 00000 n -trailer -<< /Size 8 - /Root 7 0 R - /Info 6 0 R ->> -startxref -871 -%%EOF diff --git a/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyHigh.imageset/latencyHigh.svg b/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyHigh.imageset/latencyHigh.svg new file mode 100644 index 0000000..a2e3067 --- /dev/null +++ b/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyHigh.imageset/latencyHigh.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyLow.imageset/Contents.json b/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyLow.imageset/Contents.json index 13a21b8..17ec8e8 100644 --- a/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyLow.imageset/Contents.json +++ b/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyLow.imageset/Contents.json @@ -1,17 +1,8 @@ { "images" : [ { - "filename" : "latencyLow.pdf", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "filename" : "latencyLow.svg", + "idiom" : "universal" } ], "info" : { diff --git a/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyLow.imageset/latencyLow.pdf b/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyLow.imageset/latencyLow.pdf deleted file mode 100644 index 1e57e9a9f2d5dfd8ef248e3235847a780279d3a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1131 zcmZWpZAcVB7>+)Wmim!t2oep*!JXvo$L*e{omSrYeWINO`BiOqiCB~+6qG*{2}H;WN{hZVBP$3r3q#AWP^g(b?>cN)W_F(0dEfVWo|iQgIkS>j zGfx?Mrf$tsJYaybznZe!0quga4^;sHLv9KHKxauc2&#Ck5fOAkkK%c6^aL` zy0(fPx$-?`P2Z2$g>A9!;r(e>3yo`RX|_|{f1(DTG?mAJ$}`XXIo$c9n>IJ*561RJ z*^ft$*qav$-jz*K8*Y4UotZe-OApM`%+2=o`N#HkJ@`Cxy&|zhXt z;zwgnjzQmd>}+^Lqz3w)PvPsl2m&+$C3a{_Pf_$28q^xuZD# zVSHlkTtZjr<<(=4K8|mUS&`LIUQ2b3(j|xQW66iPXX8Uj z-%;~q^aaP8FU<8xBQA z_=*Nd3k3bnR+WH1qOf2d9Szl5jI*nvtocbkPkji^1xO9R(9VIsa>7HB2fDK}2pHr; zyP>88R1eeuQNj?^7$!+-2Fa+l7Ryc%Xf1aOCI4-m2u0jv=Lid4lL@ZiQZdPGT8 z0BdFiGs^*E6+-@08cU2(pDOyRB#&lRRG-PDCvxDnMv@{si9JSVD#vgvV_{gfTx{n$XRirbtr7)DikXe{T{ROJ + + + + diff --git a/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyMedium.imageset/Contents.json b/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyMedium.imageset/Contents.json index 5b664df..476cc57 100644 --- a/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyMedium.imageset/Contents.json +++ b/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyMedium.imageset/Contents.json @@ -1,17 +1,8 @@ { "images" : [ { - "filename" : "latencyMedium.pdf", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "filename" : "latencyMedium.svg", + "idiom" : "universal" } ], "info" : { diff --git a/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyMedium.imageset/latencyMedium.pdf b/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyMedium.imageset/latencyMedium.pdf deleted file mode 100644 index 755eff9f20bea8d9a651232e36c1b5d61d7939d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1129 zcmZWpTSyd9814qjbTNvu4U*Gk%Z=Q*?l_4U?v5^z*0$RPEvs?%xQ=Wy)67|0yI>I+ zT^@ppt`t;K5eZ2b>d7ub7p;e)9tENF#Snu+Eb5$DcU$Z*oHOS;bN>JTzVBz;A-S@M z^$L{x;ZVmIB>)B(^-WZ1DWI#M9z%`5hoLY90H7QytxNYLSwA`rFdqgUzkG_B~0oO`77GEqK}w{W`d;;Lgh` zrL}7=v;57C;l2yCMb%wxANS8%^V1xAZvHuXR=!r>KbreaY#+ERUcDU|a-Hnzqn6H* zTpa};qWOc(N2Z>>?Y>n5ruVppe4*Y;O?iEP!Ufy!J=h^?^2HMi9{Z)I!rl6<^~Uwh zBP#{h`-MAa7Jh2)l|%g>OF9LA&u_G9e)-X_H_gZS(_Wl9tIb@|?XAgswM1M0{mcB8 z)!o+dw~JAt`_W+Sft=vpvU#sZZVa&Jo9>_4eJr?T#X0Y@Wk1{lldlcu6z|$Ug@Sr? zTn79`1SG1F73;?NIC4&Qd`4bJ(267qMi3Sgl$H_z4_aaH2GD_WzyexT@QfwK2YANM zcpNSh2hf{ZObF zvOX`%fxVBxT%q5=rXaVP%hyZj%9d;WqF%s2-3eGRZh?uI#An4rmZHU><@^yM+CGR&CO(7>0|7!j)huiE1_Kb; V9UpC^Sjb^0NfPCDS8S-H{sLwWP)7g& diff --git a/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyMedium.imageset/latencyMedium.svg b/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyMedium.imageset/latencyMedium.svg new file mode 100644 index 0000000..5469b9b --- /dev/null +++ b/iOS/Assets/Assets.xcassets/Icons and images/Serverlist/latencyMedium.imageset/latencyMedium.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/iOS/Privado/Info.plist b/iOS/Privado/Info.plist index b66da79..5def1ec 100644 --- a/iOS/Privado/Info.plist +++ b/iOS/Privado/Info.plist @@ -34,7 +34,7 @@ LSRequiresIPhoneOS PRIVADO_BUILD_TIMESTAMP - 2021-06-23 + 2021-07-12 UIAppFonts SF-Pro-Text-Semibold.otf diff --git a/iOS/Privado/Sources/Flows/ServersFlow/Submodules/List/View/Subviews/ServerLocationCell.swift b/iOS/Privado/Sources/Flows/ServersFlow/Submodules/List/View/Subviews/ServerLocationCell.swift index a2c5420..b608898 100644 --- a/iOS/Privado/Sources/Flows/ServersFlow/Submodules/List/View/Subviews/ServerLocationCell.swift +++ b/iOS/Privado/Sources/Flows/ServersFlow/Submodules/List/View/Subviews/ServerLocationCell.swift @@ -29,7 +29,7 @@ class ServerLocationCell: UITableViewCell { static let pinImageHeight: CGFloat = 25 static let pinImageWidth: CGFloat = 18 static let latencyImageRight: CGFloat = 82 - static let latencyImageSize: CGFloat = 22 + static let latencyImageSize = CGSize(width: 14, height: 12) static let imagePinLocation = "pinLocation" static let imageBestLocation = "bestLocation" @@ -278,8 +278,8 @@ extension ServerLocationCell { self.addSubview(self.latencyImageView) self.latencyImageView.isHidden = true NSLayoutConstraint.activate([ - self.latencyImageView.widthAnchor.constraint(equalToConstant: Constants.latencyImageSize), - self.latencyImageView.heightAnchor.constraint(equalToConstant: Constants.latencyImageSize), + self.latencyImageView.widthAnchor.constraint(equalToConstant: Constants.latencyImageSize.width), + self.latencyImageView.heightAnchor.constraint(equalToConstant: Constants.latencyImageSize.height), self.latencyImageView.centerYAnchor.constraint(equalTo: self.centerYAnchor), self.latencyImageView.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -Constants.latencyImageRight) ]) From bbe0570d14a86a4aae713d03ab3fc08e424bc7f8 Mon Sep 17 00:00:00 2001 From: Zhandos Bolatbekov Date: Wed, 14 Jul 2021 01:03:39 +0600 Subject: [PATCH 3/6] VPNDEV-955 - feat: best location prioritized by latency --- iOS/Privado/Info.plist | 2 +- .../List/Presenter/ServerListPresenter.swift | 45 +++++++++++++------ 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/iOS/Privado/Info.plist b/iOS/Privado/Info.plist index ac97591..f754b65 100644 --- a/iOS/Privado/Info.plist +++ b/iOS/Privado/Info.plist @@ -34,7 +34,7 @@ LSRequiresIPhoneOS PRIVADO_BUILD_TIMESTAMP - 2021-07-09 + 2021-07-14 UIAppFonts SF-Pro-Text-Semibold.otf diff --git a/iOS/Privado/Sources/Flows/ServersFlow/Submodules/List/Presenter/ServerListPresenter.swift b/iOS/Privado/Sources/Flows/ServersFlow/Submodules/List/Presenter/ServerListPresenter.swift index 3c6a201..27d43ca 100644 --- a/iOS/Privado/Sources/Flows/ServersFlow/Submodules/List/Presenter/ServerListPresenter.swift +++ b/iOS/Privado/Sources/Flows/ServersFlow/Submodules/List/Presenter/ServerListPresenter.swift @@ -130,18 +130,22 @@ final class ServerListPresenter { @discardableResult private func calculateBestRecord(for records: [ServerLocationRecord]?, current location: GeoLocation?) -> ServerLocationRecord? { - #if os(iOS) if let vpn = Session.shared().currentVPN, vpn.state == .connected { if let bestLocation = Session.shared().bestLocation { return bestLocation } } - #endif + + guard let records = records else { return nil } + + if let bestLatencyRecord = self.getBestLatencyRecord(from: records) { + Session.shared().bestLocation = bestLatencyRecord + return bestLatencyRecord + } typealias BestRecord = (ServerLocationRecord?, Haversine.Distance) - guard let records = records - , let location = location + guard let location = location , let latitude = Double(location.lat) , let longitude = Double(location.long) else { return nil } @@ -162,13 +166,26 @@ final class ServerListPresenter { } - #if os(iOS) Session.shared().bestLocation = bestRecord.0 - #endif return bestRecord.0 } + private func getBestLatencyRecord(from records: [ServerLocationRecord]) -> ServerLocationRecord? { + records.reduce(into: nil) { (result, record) in + guard let city = record.city, let latency = self.cityLatencyBest[city] else { + return + } + guard let resultCity = result?.city, let resultLatency = self.cityLatencyBest[resultCity] else { + result = record + return + } + if latency < resultLatency { + result = record + } + } + } + private func searchRecord(for server: Server, in records: [ServerLocationRecord]?) -> ServerLocationRecord? { guard let records = records else { return nil } return records.first(where: { $0.servers?.contains(server) ?? false }) @@ -286,16 +303,16 @@ final class ServerListPresenter { self.updateServerRecords() self.pingServers(of: self.serverRecords) { [weak self] in + + // Update GEO + self?.output?.current(location: result.geoLocation) + self?.viewInput?.reload(collapsing: false) + self?.preselectServer(with: result.geoLocation) + self?.updateView(isBest: false) + + self?.connectToSelectedIfNeeded() } - - // Update GEO - self.output?.current(location: result.geoLocation) - - self.preselectServer(with: result.geoLocation) - self.updateView(isBest: false) - - self.connectToSelectedIfNeeded() } private func preselectServer(with geoLocation: GeoLocation?) { From cf7271bddda062ac77e617b70aef9c7fdd3b5b16 Mon Sep 17 00:00:00 2001 From: Zhandos Bolatbekov Date: Wed, 14 Jul 2021 01:11:24 +0600 Subject: [PATCH 4/6] VPNDEV-955 - feat: select first server if nothing selected --- .../Submodules/List/Presenter/ServerListPresenter.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/iOS/Privado/Sources/Flows/ServersFlow/Submodules/List/Presenter/ServerListPresenter.swift b/iOS/Privado/Sources/Flows/ServersFlow/Submodules/List/Presenter/ServerListPresenter.swift index 27d43ca..7017712 100644 --- a/iOS/Privado/Sources/Flows/ServersFlow/Submodules/List/Presenter/ServerListPresenter.swift +++ b/iOS/Privado/Sources/Flows/ServersFlow/Submodules/List/Presenter/ServerListPresenter.swift @@ -341,6 +341,10 @@ final class ServerListPresenter { self.selectedRecord = self.bestRecord } + if !self.selectedRecord.isExist { + self.selectedRecord = self.connectableRecords?.filter { $0.city.isExist }.first + } + let country = self.selectedRecord?.country ?? "null" let city = self.selectedRecord?.city ?? "null" From 84310314783b577735f24f00769e16e2bc42172d Mon Sep 17 00:00:00 2001 From: "liz.malinouskaya" Date: Thu, 15 Jul 2021 10:45:18 +0300 Subject: [PATCH 5/6] fix: Change AppCenter version from 3.3.4 to 4.2.0, fix logger code --- .../Sources/Common/Comet/Loggers/AppCenterLogger.swift | 4 ++-- iOS/project-sym.yml | 4 ++-- iOS/project.yml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/iOS/Privado/Sources/Common/Comet/Loggers/AppCenterLogger.swift b/iOS/Privado/Sources/Common/Comet/Loggers/AppCenterLogger.swift index 60d3f04..656961b 100644 --- a/iOS/Privado/Sources/Common/Comet/Loggers/AppCenterLogger.swift +++ b/iOS/Privado/Sources/Common/Comet/Loggers/AppCenterLogger.swift @@ -21,7 +21,7 @@ final class AppCenterLogger: EventCometLoggerProtocol { MSAppCenter.start("85703fa1-c9fc-4f84-9373-605c11f310bf", withServices: [MSAnalytics.self, MSCrashes.self]) #endif #else - MSAppCenter.start("ebaa632a-cee6-462b-a321-bb086b5e4cef", withServices: [MSAnalytics.self, MSCrashes.self]) + AppCenter.start(withAppSecret: "ebaa632a-cee6-462b-a321-bb086b5e4cef", services: [Analytics.self, Crashes.self]) #endif } @@ -47,7 +47,7 @@ final class AppCenterLogger: EventCometLoggerProtocol { guard let event = eventName else { return } - MSAnalytics.trackEvent(event, + Analytics.trackEvent(event, withProperties: attributes.mapValues({ value -> String in String(describing: value) })) } diff --git a/iOS/project-sym.yml b/iOS/project-sym.yml index 2dba1c7..7a57075 100644 --- a/iOS/project-sym.yml +++ b/iOS/project-sym.yml @@ -20,10 +20,10 @@ packages: majorVersion: 5.2.2 AppCenterAnalytics: url: https://github.com/microsoft/appcenter-sdk-apple.git - majorVersion: 3.3.4 + majorVersion: 4.2.0 AppCenterCrashes: url: https://github.com/microsoft/appcenter-sdk-apple.git - majorVersion: 3.3.4 + majorVersion: 4.2.0 targets: diff --git a/iOS/project.yml b/iOS/project.yml index f3462e5..7794645 100644 --- a/iOS/project.yml +++ b/iOS/project.yml @@ -20,10 +20,10 @@ packages: majorVersion: 5.2.2 AppCenterAnalytics: url: https://github.com/microsoft/appcenter-sdk-apple.git - majorVersion: 3.3.4 + majorVersion: 4.2.0 AppCenterCrashes: url: https://github.com/microsoft/appcenter-sdk-apple.git - majorVersion: 3.3.4 + majorVersion: 4.2.0 targets: From 7ac27bbc71622627fe5e2437fe91db9ef3d607de Mon Sep 17 00:00:00 2001 From: "liz.malinouskaya" Date: Thu, 15 Jul 2021 11:03:49 +0300 Subject: [PATCH 6/6] fix: remove redundant code --- .../Sources/Common/Comet/Loggers/AppCenterLogger.swift | 8 -------- 1 file changed, 8 deletions(-) diff --git a/iOS/Privado/Sources/Common/Comet/Loggers/AppCenterLogger.swift b/iOS/Privado/Sources/Common/Comet/Loggers/AppCenterLogger.swift index 656961b..363f66c 100644 --- a/iOS/Privado/Sources/Common/Comet/Loggers/AppCenterLogger.swift +++ b/iOS/Privado/Sources/Common/Comet/Loggers/AppCenterLogger.swift @@ -14,15 +14,7 @@ import AppCenterCrashes final class AppCenterLogger: EventCometLoggerProtocol { init() { - #if os(macOS) - #if INTERNAL - MSAppCenter.start("430b7e48-a17b-475a-89e6-0f2d0ffb5e43", withServices: [MSAnalytics.self, MSCrashes.self]) - #else - MSAppCenter.start("85703fa1-c9fc-4f84-9373-605c11f310bf", withServices: [MSAnalytics.self, MSCrashes.self]) - #endif - #else AppCenter.start(withAppSecret: "ebaa632a-cee6-462b-a321-bb086b5e4cef", services: [Analytics.self, Crashes.self]) - #endif } func event(name: String, attributes: [String: Any], secured: [String: Any]?) {