From bc4b172460438feef4aeae7ea85f276a6e8bb8d2 Mon Sep 17 00:00:00 2001 From: Aliaksandr Dvoineu Date: Tue, 25 Apr 2023 23:31:14 +0300 Subject: [PATCH] KB-3510 Fix bugs, new UI elements for Firewall, VPN and Configuration --- Assets.xcassets/Firewall/Contents.json | 6 + .../Firewall/Subscription Plans/Contents.json | 6 + .../advanced.imageset/Contents.json | 15 + .../advanced.imageset/advanced.pdf | 157 ++++++ .../anonymous.imageset/Contents.json | 15 + .../anonymous.imageset/anonymous.pdf | 157 ++++++ .../basic.imageset/Contents.json | 15 + .../basic.imageset/basic.pdf | 145 ++++++ .../universal.imageset/Contents.json | 15 + .../universal.imageset/universal.pdf | 139 ++++++ .../Contents.json | 15 + .../icn_clickbait_trackers.pdf | 118 +++++ .../icn_data_trackers.imageset/Contents.json | 15 + .../icn_data_trackers.pdf | 127 +++++ .../icn_email_trackers.imageset/Contents.json | 15 + .../icn_email_trackers.pdf | 325 ++++++++++++ .../Contents.json | 15 + .../icn_facebook_trackers.pdf | 468 ++++++++++++++++++ .../icn_game_marketing.imageset/Contents.json | 15 + .../icn_game_marketing.pdf | 137 +++++ .../Firewall/icn_lock.imageset/Contents.json | 15 + .../Firewall/icn_lock.imageset/icn_lock.pdf | 111 +++++ .../Contents.json | 15 + .../icn_marketing.pdf | 114 +++++ Assets.xcassets/VPN/Contents.json | 6 + .../VPN/icn_activity.imageset/Contents.json | 15 + .../icn_activity.imageset/icn_activity.pdf | 110 ++++ .../Contents.json | 15 + .../icn_configure_blocking.pdf | 127 +++++ .../VPN/icn_globe.imageset/Contents.json | 15 + .../VPN/icn_globe.imageset/icn_globe.pdf | 118 +++++ .../VPN/icn_import.imageset/Contents.json | 15 + .../VPN/icn_import.imageset/icn_import.pdf | 90 ++++ .../Contents.json | 15 + .../icn_personalized_blocking.pdf | 113 +++++ .../VPN/icn_whitelist.imageset/Contents.json | 15 + .../icn_whitelist.imageset/icn_whitelists.pdf | 118 +++++ .../icn_firewall.imageset/Contents.json | 15 + .../icn_firewall.imageset/icn_firewall.pdf | 123 +++++ .../icn_vpn.imageset/Contents.json | 15 + Assets.xcassets/icn_vpn.imageset/icn_vpn.pdf | 138 ++++++ FirewallUtilities.swift | 9 + LockdowniOS.xcodeproj/project.pbxproj | 128 ++++- LockdowniOS/AccessLevelView.swift | 137 +++++ LockdowniOS/BlockListViewController.swift | 6 +- LockdowniOS/DescriptionLabel.swift | 72 +++ LockdowniOS/LDCardView.swift | 90 ++++ .../LDConfigurationViewController.swift | 155 ++++++ LockdowniOS/LDFirewallViewController.swift | 249 ++++++++++ LockdowniOS/LDVpnViewController.swift | 193 ++++++++ .../ListDescriptionViewController.swift | 59 ++- LockdowniOS/ListDetailViewController.swift | 63 ++- LockdowniOS/ListSettingsViewController.swift | 69 ++- LockdowniOS/OverallStatiscticView.swift | 152 ++++++ LockdowniOS/StaticTableView.swift | 2 +- LockdowniOS/String+Extensions.swift | 40 ++ LockdowniOS/TrackersGroupView.swift | 117 +++++ Shared.swift | 2 + 58 files changed, 4701 insertions(+), 80 deletions(-) create mode 100644 Assets.xcassets/Firewall/Contents.json create mode 100644 Assets.xcassets/Firewall/Subscription Plans/Contents.json create mode 100644 Assets.xcassets/Firewall/Subscription Plans/advanced.imageset/Contents.json create mode 100644 Assets.xcassets/Firewall/Subscription Plans/advanced.imageset/advanced.pdf create mode 100644 Assets.xcassets/Firewall/Subscription Plans/anonymous.imageset/Contents.json create mode 100644 Assets.xcassets/Firewall/Subscription Plans/anonymous.imageset/anonymous.pdf create mode 100644 Assets.xcassets/Firewall/Subscription Plans/basic.imageset/Contents.json create mode 100644 Assets.xcassets/Firewall/Subscription Plans/basic.imageset/basic.pdf create mode 100644 Assets.xcassets/Firewall/Subscription Plans/universal.imageset/Contents.json create mode 100644 Assets.xcassets/Firewall/Subscription Plans/universal.imageset/universal.pdf create mode 100644 Assets.xcassets/Firewall/icn_clickbait_trackers.imageset/Contents.json create mode 100644 Assets.xcassets/Firewall/icn_clickbait_trackers.imageset/icn_clickbait_trackers.pdf create mode 100644 Assets.xcassets/Firewall/icn_data_trackers.imageset/Contents.json create mode 100644 Assets.xcassets/Firewall/icn_data_trackers.imageset/icn_data_trackers.pdf create mode 100644 Assets.xcassets/Firewall/icn_email_trackers.imageset/Contents.json create mode 100644 Assets.xcassets/Firewall/icn_email_trackers.imageset/icn_email_trackers.pdf create mode 100644 Assets.xcassets/Firewall/icn_facebook_trackers.imageset/Contents.json create mode 100644 Assets.xcassets/Firewall/icn_facebook_trackers.imageset/icn_facebook_trackers.pdf create mode 100644 Assets.xcassets/Firewall/icn_game_marketing.imageset/Contents.json create mode 100644 Assets.xcassets/Firewall/icn_game_marketing.imageset/icn_game_marketing.pdf create mode 100644 Assets.xcassets/Firewall/icn_lock.imageset/Contents.json create mode 100644 Assets.xcassets/Firewall/icn_lock.imageset/icn_lock.pdf create mode 100644 Assets.xcassets/Firewall/icn_marketing_trackers.imageset/Contents.json create mode 100644 Assets.xcassets/Firewall/icn_marketing_trackers.imageset/icn_marketing.pdf create mode 100644 Assets.xcassets/VPN/Contents.json create mode 100644 Assets.xcassets/VPN/icn_activity.imageset/Contents.json create mode 100644 Assets.xcassets/VPN/icn_activity.imageset/icn_activity.pdf create mode 100644 Assets.xcassets/VPN/icn_configure_blocking.imageset/Contents.json create mode 100644 Assets.xcassets/VPN/icn_configure_blocking.imageset/icn_configure_blocking.pdf create mode 100644 Assets.xcassets/VPN/icn_globe.imageset/Contents.json create mode 100644 Assets.xcassets/VPN/icn_globe.imageset/icn_globe.pdf create mode 100644 Assets.xcassets/VPN/icn_import.imageset/Contents.json create mode 100644 Assets.xcassets/VPN/icn_import.imageset/icn_import.pdf create mode 100644 Assets.xcassets/VPN/icn_personalized_blocking.imageset/Contents.json create mode 100644 Assets.xcassets/VPN/icn_personalized_blocking.imageset/icn_personalized_blocking.pdf create mode 100644 Assets.xcassets/VPN/icn_whitelist.imageset/Contents.json create mode 100644 Assets.xcassets/VPN/icn_whitelist.imageset/icn_whitelists.pdf create mode 100644 Assets.xcassets/icn_firewall.imageset/Contents.json create mode 100644 Assets.xcassets/icn_firewall.imageset/icn_firewall.pdf create mode 100644 Assets.xcassets/icn_vpn.imageset/Contents.json create mode 100644 Assets.xcassets/icn_vpn.imageset/icn_vpn.pdf create mode 100644 LockdowniOS/AccessLevelView.swift create mode 100644 LockdowniOS/DescriptionLabel.swift create mode 100644 LockdowniOS/LDCardView.swift create mode 100644 LockdowniOS/LDConfigurationViewController.swift create mode 100644 LockdowniOS/LDFirewallViewController.swift create mode 100644 LockdowniOS/LDVpnViewController.swift create mode 100644 LockdowniOS/OverallStatiscticView.swift create mode 100644 LockdowniOS/String+Extensions.swift create mode 100644 LockdowniOS/TrackersGroupView.swift diff --git a/Assets.xcassets/Firewall/Contents.json b/Assets.xcassets/Firewall/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Assets.xcassets/Firewall/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/Firewall/Subscription Plans/Contents.json b/Assets.xcassets/Firewall/Subscription Plans/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Assets.xcassets/Firewall/Subscription Plans/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/Firewall/Subscription Plans/advanced.imageset/Contents.json b/Assets.xcassets/Firewall/Subscription Plans/advanced.imageset/Contents.json new file mode 100644 index 0000000..0da03fc --- /dev/null +++ b/Assets.xcassets/Firewall/Subscription Plans/advanced.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "advanced.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/Firewall/Subscription Plans/advanced.imageset/advanced.pdf b/Assets.xcassets/Firewall/Subscription Plans/advanced.imageset/advanced.pdf new file mode 100644 index 0000000..73ef19c --- /dev/null +++ b/Assets.xcassets/Firewall/Subscription Plans/advanced.imageset/advanced.pdf @@ -0,0 +1,157 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +1.000000 1.000000 1.000000 scn +90.250000 0.000000 m +101.895164 14.500000 l +90.250000 29.000000 l +0.000000 29.000000 l +0.000000 14.500000 l +0.000000 0.000000 l +90.250000 0.000000 l +h +f +n +Q +90.250000 0.000000 m +101.895164 14.500000 l +90.250000 29.000000 l +0.000000 29.000000 l +0.000000 14.500000 l +0.000000 0.000000 l +90.250000 0.000000 l +h +W* +n +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +0.000000 0.678431 0.905882 scn +101.895164 14.500000 m +102.674850 13.873825 l +103.177734 14.500000 l +102.674850 15.126175 l +101.895164 14.500000 l +h +90.250000 0.000000 m +90.250000 -1.000000 l +90.729462 -1.000000 l +91.029686 -0.626175 l +90.250000 0.000000 l +h +90.250000 29.000000 m +91.029686 29.626175 l +90.729462 30.000000 l +90.250000 30.000000 l +90.250000 29.000000 l +h +0.000000 0.000000 m +-1.000000 0.000000 l +-1.000000 -1.000000 l +0.000000 -1.000000 l +0.000000 0.000000 l +h +0.000000 29.000000 m +0.000000 30.000000 l +-1.000000 30.000000 l +-1.000000 29.000000 l +0.000000 29.000000 l +h +101.115479 15.126175 m +89.470314 0.626175 l +91.029686 -0.626175 l +102.674850 13.873825 l +101.115479 15.126175 l +h +89.470314 28.373825 m +101.115479 13.873825 l +102.674850 15.126175 l +91.029686 29.626175 l +89.470314 28.373825 l +h +90.250000 1.000000 m +0.000000 1.000000 l +0.000000 -1.000000 l +90.250000 -1.000000 l +90.250000 1.000000 l +h +0.000000 28.000000 m +90.250000 28.000000 l +90.250000 30.000000 l +0.000000 30.000000 l +0.000000 28.000000 l +h +1.000000 0.000000 m +1.000000 14.500000 l +-1.000000 14.500000 l +-1.000000 0.000000 l +1.000000 0.000000 l +h +1.000000 14.500000 m +1.000000 29.000000 l +-1.000000 29.000000 l +-1.000000 14.500000 l +1.000000 14.500000 l +h +f +n +Q +Q + +endstream +endobj + +3 0 obj + 1746 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 101.895142 29.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000001836 00000 n +0000001859 00000 n +0000002033 00000 n +0000002107 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +2166 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/Firewall/Subscription Plans/anonymous.imageset/Contents.json b/Assets.xcassets/Firewall/Subscription Plans/anonymous.imageset/Contents.json new file mode 100644 index 0000000..7f72c74 --- /dev/null +++ b/Assets.xcassets/Firewall/Subscription Plans/anonymous.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "anonymous.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/Firewall/Subscription Plans/anonymous.imageset/anonymous.pdf b/Assets.xcassets/Firewall/Subscription Plans/anonymous.imageset/anonymous.pdf new file mode 100644 index 0000000..75f424a --- /dev/null +++ b/Assets.xcassets/Firewall/Subscription Plans/anonymous.imageset/anonymous.pdf @@ -0,0 +1,157 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +1.000000 1.000000 1.000000 scn +90.250000 0.000000 m +101.895164 14.500000 l +90.250000 29.000000 l +0.000000 29.000000 l +0.000000 14.500000 l +0.000000 0.000000 l +90.250000 0.000000 l +h +f +n +Q +90.250000 0.000000 m +101.895164 14.500000 l +90.250000 29.000000 l +0.000000 29.000000 l +0.000000 14.500000 l +0.000000 0.000000 l +90.250000 0.000000 l +h +W* +n +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +0.803922 0.811765 0.815686 scn +101.895164 14.500000 m +102.674850 13.873825 l +103.177734 14.500000 l +102.674850 15.126175 l +101.895164 14.500000 l +h +90.250000 0.000000 m +90.250000 -1.000000 l +90.729462 -1.000000 l +91.029686 -0.626175 l +90.250000 0.000000 l +h +90.250000 29.000000 m +91.029686 29.626175 l +90.729462 30.000000 l +90.250000 30.000000 l +90.250000 29.000000 l +h +0.000000 0.000000 m +-1.000000 0.000000 l +-1.000000 -1.000000 l +0.000000 -1.000000 l +0.000000 0.000000 l +h +0.000000 29.000000 m +0.000000 30.000000 l +-1.000000 30.000000 l +-1.000000 29.000000 l +0.000000 29.000000 l +h +101.115479 15.126175 m +89.470314 0.626175 l +91.029686 -0.626175 l +102.674850 13.873825 l +101.115479 15.126175 l +h +89.470314 28.373825 m +101.115479 13.873825 l +102.674850 15.126175 l +91.029686 29.626175 l +89.470314 28.373825 l +h +90.250000 1.000000 m +0.000000 1.000000 l +0.000000 -1.000000 l +90.250000 -1.000000 l +90.250000 1.000000 l +h +0.000000 28.000000 m +90.250000 28.000000 l +90.250000 30.000000 l +0.000000 30.000000 l +0.000000 28.000000 l +h +1.000000 0.000000 m +1.000000 14.500000 l +-1.000000 14.500000 l +-1.000000 0.000000 l +1.000000 0.000000 l +h +1.000000 14.500000 m +1.000000 29.000000 l +-1.000000 29.000000 l +-1.000000 14.500000 l +1.000000 14.500000 l +h +f +n +Q +Q + +endstream +endobj + +3 0 obj + 1746 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 101.895142 29.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000001836 00000 n +0000001859 00000 n +0000002033 00000 n +0000002107 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +2166 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/Firewall/Subscription Plans/basic.imageset/Contents.json b/Assets.xcassets/Firewall/Subscription Plans/basic.imageset/Contents.json new file mode 100644 index 0000000..31d0267 --- /dev/null +++ b/Assets.xcassets/Firewall/Subscription Plans/basic.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "basic.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/Firewall/Subscription Plans/basic.imageset/basic.pdf b/Assets.xcassets/Firewall/Subscription Plans/basic.imageset/basic.pdf new file mode 100644 index 0000000..baba656 --- /dev/null +++ b/Assets.xcassets/Firewall/Subscription Plans/basic.imageset/basic.pdf @@ -0,0 +1,145 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +1.000000 1.000000 1.000000 scn +90.250000 0.000000 m +101.895164 14.500000 l +90.250000 29.000000 l +14.500001 29.000000 l +6.491872 29.000000 0.000000 22.508129 0.000000 14.500000 c +0.000000 6.491871 6.491870 0.000000 14.499998 0.000000 c +90.250000 0.000000 l +h +f +n +Q +90.250000 0.000000 m +101.895164 14.500000 l +90.250000 29.000000 l +14.500001 29.000000 l +6.491872 29.000000 0.000000 22.508129 0.000000 14.500000 c +0.000000 6.491871 6.491870 0.000000 14.499998 0.000000 c +90.250000 0.000000 l +h +W* +n +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +0.000000 0.678431 0.905882 scn +101.895164 14.500000 m +102.674850 13.873825 l +103.177734 14.500000 l +102.674850 15.126175 l +101.895164 14.500000 l +h +90.250000 0.000000 m +90.250000 -1.000000 l +90.729462 -1.000000 l +91.029686 -0.626175 l +90.250000 0.000000 l +h +90.250000 29.000000 m +91.029686 29.626175 l +90.729462 30.000000 l +90.250000 30.000000 l +90.250000 29.000000 l +h +101.115479 15.126175 m +89.470314 0.626175 l +91.029686 -0.626175 l +102.674850 13.873825 l +101.115479 15.126175 l +h +89.470314 28.373825 m +101.115479 13.873825 l +102.674850 15.126175 l +91.029686 29.626175 l +89.470314 28.373825 l +h +90.250000 1.000000 m +14.499998 1.000000 l +14.499998 -1.000000 l +90.250000 -1.000000 l +90.250000 1.000000 l +h +14.500001 28.000000 m +90.250000 28.000000 l +90.250000 30.000000 l +14.500001 30.000000 l +14.500001 28.000000 l +h +14.500001 30.000000 m +5.939588 30.000000 -1.000000 23.060413 -1.000000 14.500000 c +1.000000 14.500000 l +1.000000 21.955845 7.044157 28.000000 14.500001 28.000000 c +14.500001 30.000000 l +h +14.499998 1.000000 m +7.044155 1.000000 1.000000 7.044155 1.000000 14.500000 c +-1.000000 14.500000 l +-1.000000 5.939587 5.939585 -1.000000 14.499998 -1.000000 c +14.499998 1.000000 l +h +f +n +Q +Q + +endstream +endobj + +3 0 obj + 1844 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 101.895142 29.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000001934 00000 n +0000001957 00000 n +0000002131 00000 n +0000002205 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +2264 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/Firewall/Subscription Plans/universal.imageset/Contents.json b/Assets.xcassets/Firewall/Subscription Plans/universal.imageset/Contents.json new file mode 100644 index 0000000..a971507 --- /dev/null +++ b/Assets.xcassets/Firewall/Subscription Plans/universal.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "universal.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/Firewall/Subscription Plans/universal.imageset/universal.pdf b/Assets.xcassets/Firewall/Subscription Plans/universal.imageset/universal.pdf new file mode 100644 index 0000000..a2ce090 --- /dev/null +++ b/Assets.xcassets/Firewall/Subscription Plans/universal.imageset/universal.pdf @@ -0,0 +1,139 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +1.000000 1.000000 1.000000 scn +0.000000 0.000000 m +75.750000 0.000000 l +83.758133 0.000000 90.250000 6.491871 90.250000 14.500000 c +90.250000 22.508129 83.758133 29.000000 75.750008 29.000000 c +0.000000 29.000000 l +0.000000 14.500000 l +0.000000 0.000000 l +h +f +n +Q +0.000000 0.000000 m +75.750000 0.000000 l +83.758133 0.000000 90.250000 6.491871 90.250000 14.500000 c +90.250000 22.508129 83.758133 29.000000 75.750008 29.000000 c +0.000000 29.000000 l +0.000000 14.500000 l +0.000000 0.000000 l +h +W* +n +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +0.803922 0.811765 0.815686 scn +0.000000 0.000000 m +-1.000000 0.000000 l +-1.000000 -1.000000 l +0.000000 -1.000000 l +0.000000 0.000000 l +h +0.000000 29.000000 m +0.000000 30.000000 l +-1.000000 30.000000 l +-1.000000 29.000000 l +0.000000 29.000000 l +h +75.750000 1.000000 m +0.000000 1.000000 l +0.000000 -1.000000 l +75.750000 -1.000000 l +75.750000 1.000000 l +h +0.000000 28.000000 m +75.750008 28.000000 l +75.750008 30.000000 l +0.000000 30.000000 l +0.000000 28.000000 l +h +1.000000 0.000000 m +1.000000 14.500000 l +-1.000000 14.500000 l +-1.000000 0.000000 l +1.000000 0.000000 l +h +1.000000 14.500000 m +1.000000 29.000000 l +-1.000000 29.000000 l +-1.000000 14.500000 l +1.000000 14.500000 l +h +89.250000 14.500000 m +89.250000 7.044155 83.205849 1.000000 75.750000 1.000000 c +75.750000 -1.000000 l +84.310417 -1.000000 91.250000 5.939587 91.250000 14.500000 c +89.250000 14.500000 l +h +91.250000 14.500000 m +91.250000 23.060413 84.310417 30.000000 75.750008 30.000000 c +75.750008 28.000000 l +83.205849 28.000000 89.250000 21.955845 89.250000 14.500000 c +91.250000 14.500000 l +h +f +n +Q +Q + +endstream +endobj + +3 0 obj + 1711 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 90.250000 29.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000001801 00000 n +0000001824 00000 n +0000001997 00000 n +0000002071 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +2130 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/Firewall/icn_clickbait_trackers.imageset/Contents.json b/Assets.xcassets/Firewall/icn_clickbait_trackers.imageset/Contents.json new file mode 100644 index 0000000..12fcb9b --- /dev/null +++ b/Assets.xcassets/Firewall/icn_clickbait_trackers.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icn_clickbait_trackers.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/Firewall/icn_clickbait_trackers.imageset/icn_clickbait_trackers.pdf b/Assets.xcassets/Firewall/icn_clickbait_trackers.imageset/icn_clickbait_trackers.pdf new file mode 100644 index 0000000..a4db3f9 --- /dev/null +++ b/Assets.xcassets/Firewall/icn_clickbait_trackers.imageset/icn_clickbait_trackers.pdf @@ -0,0 +1,118 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +0.647059 0.282353 0.850980 scn +9.700000 4.500000 m +8.099999 4.583333 6.750000 5.200000 5.650000 6.349999 c +4.550000 7.499999 4.000000 8.883333 4.000000 10.500000 c +4.000000 12.166667 4.583333 13.583333 5.750000 14.750000 c +6.916667 15.916667 8.333333 16.500000 10.000000 16.500000 c +11.616667 16.500000 13.000001 15.950000 14.150001 14.850000 c +15.300000 13.750000 15.916667 12.391666 16.000000 10.775000 c +14.425000 11.275000 l +14.241667 12.341666 13.741667 13.229166 12.925000 13.937500 c +12.108334 14.645834 11.133333 15.000000 10.000000 15.000000 c +8.750000 15.000000 7.687500 14.562500 6.812500 13.687500 c +5.937500 12.812500 5.500000 11.750000 5.500000 10.500000 c +5.500000 9.383333 5.854167 8.412499 6.562500 7.587500 c +7.270833 6.762500 8.158334 6.258333 9.225000 6.075000 c +9.700000 4.500000 l +h +10.900001 0.549999 m +10.750001 0.533333 10.599999 0.520832 10.450000 0.512499 c +10.300000 0.504166 10.150000 0.500000 10.000000 0.500000 c +8.616667 0.500000 7.316667 0.762501 6.100000 1.287500 c +4.883333 1.812500 3.825000 2.525000 2.925000 3.424999 c +2.025000 4.324999 1.312500 5.383333 0.787500 6.599999 c +0.262500 7.816666 0.000000 9.116667 0.000000 10.500000 c +0.000000 11.883333 0.262500 13.183333 0.787500 14.400000 c +1.312500 15.616667 2.025000 16.674999 2.925000 17.575001 c +3.825000 18.475000 4.883333 19.187500 6.100000 19.712500 c +7.316667 20.237499 8.616667 20.500000 10.000000 20.500000 c +11.383333 20.500000 12.683334 20.237499 13.900001 19.712500 c +15.116667 19.187500 16.175001 18.475000 17.075001 17.575001 c +17.975000 16.674999 18.687500 15.616667 19.212500 14.400000 c +19.737499 13.183333 20.000000 11.883333 20.000000 10.500000 c +20.000000 10.350000 19.995834 10.200000 19.987501 10.050000 c +19.979168 9.900001 19.966667 9.749999 19.950001 9.599999 c +18.500000 10.050000 l +18.500000 10.500000 l +18.500000 12.866667 17.674999 14.875000 16.025000 16.525000 c +14.375000 18.174999 12.366667 19.000000 10.000000 19.000000 c +7.633333 19.000000 5.625000 18.174999 3.975000 16.525000 c +2.325000 14.875000 1.500000 12.866667 1.500000 10.500000 c +1.500000 8.133333 2.325000 6.125000 3.975000 4.475000 c +5.625000 2.825001 7.633333 2.000000 10.000000 2.000000 c +10.450000 2.000000 l +10.900001 0.549999 l +h +18.525000 0.000000 m +14.250000 4.275000 l +13.000000 0.500000 l +10.000000 10.500000 l +20.000000 7.500000 l +16.225000 6.250000 l +20.500000 1.975000 l +18.525000 0.000000 l +h +f +n +Q + +endstream +endobj + +3 0 obj + 2483 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 20.500000 20.500000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000002573 00000 n +0000002596 00000 n +0000002769 00000 n +0000002843 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +2902 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/Firewall/icn_data_trackers.imageset/Contents.json b/Assets.xcassets/Firewall/icn_data_trackers.imageset/Contents.json new file mode 100644 index 0000000..83f28eb --- /dev/null +++ b/Assets.xcassets/Firewall/icn_data_trackers.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icn_data_trackers.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/Firewall/icn_data_trackers.imageset/icn_data_trackers.pdf b/Assets.xcassets/Firewall/icn_data_trackers.imageset/icn_data_trackers.pdf new file mode 100644 index 0000000..ab53b36 --- /dev/null +++ b/Assets.xcassets/Firewall/icn_data_trackers.imageset/icn_data_trackers.pdf @@ -0,0 +1,127 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +1.000000 0.203922 0.164706 scn +9.000000 0.000000 m +6.483334 0.000000 4.354167 0.387499 2.612500 1.162500 c +0.870833 1.937500 0.000000 2.883333 0.000000 4.000000 c +0.000000 14.000000 l +0.000000 15.100000 0.879167 16.041666 2.637500 16.825001 c +4.395833 17.608334 6.516667 18.000000 9.000000 18.000000 c +11.483334 18.000000 13.604167 17.608334 15.362500 16.825001 c +17.120834 16.041666 18.000000 15.100000 18.000000 14.000000 c +18.000000 4.000000 l +18.000000 2.883333 17.129168 1.937500 15.387500 1.162500 c +13.645834 0.387499 11.516666 0.000000 9.000000 0.000000 c +h +9.000000 12.200000 m +10.433333 12.200000 11.904167 12.420834 13.412500 12.862499 c +14.920834 13.304167 15.891666 13.799999 16.325001 14.350000 c +15.875000 14.883333 14.895834 15.375000 13.387500 15.825000 c +11.879167 16.275000 10.416667 16.500000 9.000000 16.500000 c +7.533333 16.500000 6.058333 16.283333 4.575000 15.850000 c +3.091667 15.416666 2.116667 14.916666 1.650000 14.350000 c +2.116667 13.766666 3.083333 13.262500 4.550000 12.837500 c +6.016667 12.412500 7.500000 12.200000 9.000000 12.200000 c +h +8.975000 6.849999 m +9.675000 6.849999 10.375000 6.887500 11.075000 6.962500 c +11.775001 7.037499 12.445833 7.150000 13.087501 7.300000 c +13.729167 7.450000 14.341667 7.633333 14.925000 7.849999 c +15.508333 8.066667 16.033333 8.308333 16.500000 8.575000 c +16.500000 12.450000 l +16.016666 12.183333 15.483334 11.941667 14.900001 11.725000 c +14.316667 11.508333 13.700000 11.325000 13.050000 11.174999 c +12.400001 11.025000 11.733334 10.908333 11.050000 10.825000 c +10.366667 10.741667 9.675000 10.700000 8.975000 10.700000 c +8.275001 10.700000 7.575000 10.741667 6.875000 10.825000 c +6.175000 10.908333 5.504167 11.025000 4.862500 11.174999 c +4.220833 11.325000 3.612500 11.508333 3.037500 11.725000 c +2.462500 11.941667 1.950000 12.183333 1.500000 12.450000 c +1.500000 8.575000 l +1.950000 8.308333 2.458333 8.066667 3.025000 7.849999 c +3.591667 7.633333 4.195833 7.450000 4.837500 7.300000 c +5.479167 7.150000 6.150000 7.037499 6.850000 6.962500 c +7.550000 6.887500 8.258333 6.849999 8.975000 6.849999 c +h +9.000000 1.500000 m +9.800000 1.500000 10.625000 1.570833 11.475000 1.712500 c +12.325000 1.854166 13.104167 2.041666 13.812500 2.275000 c +14.520834 2.508333 15.120833 2.766666 15.612500 3.050000 c +16.104166 3.333333 16.400000 3.625000 16.500000 3.925000 c +16.500000 7.050000 l +16.033333 6.783333 15.508333 6.545834 14.925000 6.337500 c +14.341667 6.129167 13.729167 5.950000 13.087501 5.800000 c +12.445833 5.650000 11.779167 5.537499 11.087501 5.462500 c +10.395834 5.387500 9.691667 5.349999 8.975000 5.349999 c +8.258333 5.349999 7.550000 5.387500 6.850000 5.462500 c +6.150000 5.537499 5.479167 5.650000 4.837500 5.800000 c +4.195833 5.950000 3.591667 6.129167 3.025000 6.337500 c +2.458333 6.545834 1.950000 6.783333 1.500000 7.050000 c +1.500000 3.900000 l +1.583333 3.616667 1.866667 3.329166 2.350000 3.037499 c +2.833333 2.745833 3.433333 2.487500 4.150000 2.262500 c +4.866667 2.037499 5.650000 1.854166 6.500000 1.712500 c +7.350000 1.570833 8.183333 1.500000 9.000000 1.500000 c +h +f +n +Q + +endstream +endobj + +3 0 obj + 3151 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 18.000000 18.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000003241 00000 n +0000003264 00000 n +0000003437 00000 n +0000003511 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +3570 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/Firewall/icn_email_trackers.imageset/Contents.json b/Assets.xcassets/Firewall/icn_email_trackers.imageset/Contents.json new file mode 100644 index 0000000..7f661cf --- /dev/null +++ b/Assets.xcassets/Firewall/icn_email_trackers.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icn_email_trackers.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/Firewall/icn_email_trackers.imageset/icn_email_trackers.pdf b/Assets.xcassets/Firewall/icn_email_trackers.imageset/icn_email_trackers.pdf new file mode 100644 index 0000000..fe9ff8b --- /dev/null +++ b/Assets.xcassets/Firewall/icn_email_trackers.imageset/icn_email_trackers.pdf @@ -0,0 +1,325 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +0.305882 0.298039 0.815686 scn +1.350000 -0.000006 m +0.990000 -0.000006 0.675000 0.134995 0.405000 0.404995 c +0.135000 0.674994 0.000000 0.989994 0.000000 1.349995 c +0.000000 13.049994 l +0.000000 13.409994 0.135000 13.724994 0.405000 13.994994 c +0.675000 14.264994 0.990000 14.399994 1.350000 14.399994 c +16.650002 14.399994 l +17.010000 14.399994 17.325001 14.264994 17.595001 13.994994 c +17.865000 13.724994 18.000000 13.409994 18.000000 13.049994 c +18.000000 1.349995 l +18.000000 0.989994 17.865000 0.674994 17.595001 0.404995 c +17.325001 0.134995 17.010000 -0.000006 16.650002 -0.000006 c +1.350000 -0.000006 l +h +9.000000 6.794994 m +1.350000 11.812494 l +1.350000 1.349995 l +16.650002 1.349995 l +16.650002 11.812494 l +9.000000 6.794994 l +h +9.000000 8.144995 m +16.560001 13.049994 l +1.462500 13.049994 l +9.000000 8.144995 l +h +1.350000 11.812494 m +1.350000 13.049994 l +1.350000 1.349995 l +1.350000 11.812494 l +h +f +n +Q +1.350000 -0.000006 m +0.990000 -0.000006 0.675000 0.134995 0.405000 0.404995 c +0.135000 0.674994 0.000000 0.989994 0.000000 1.349995 c +0.000000 13.049994 l +0.000000 13.409994 0.135000 13.724994 0.405000 13.994994 c +0.675000 14.264994 0.990000 14.399994 1.350000 14.399994 c +16.650002 14.399994 l +17.010000 14.399994 17.325001 14.264994 17.595001 13.994994 c +17.865000 13.724994 18.000000 13.409994 18.000000 13.049994 c +18.000000 1.349995 l +18.000000 0.989994 17.865000 0.674994 17.595001 0.404995 c +17.325001 0.134995 17.010000 -0.000006 16.650002 -0.000006 c +1.350000 -0.000006 l +h +9.000000 6.794994 m +1.350000 11.812494 l +1.350000 1.349995 l +16.650002 1.349995 l +16.650002 11.812494 l +9.000000 6.794994 l +h +9.000000 8.144995 m +16.560001 13.049994 l +1.462500 13.049994 l +9.000000 8.144995 l +h +1.350000 11.812494 m +1.350000 13.049994 l +1.350000 1.349995 l +1.350000 11.812494 l +h +W* +n +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +0.305882 0.298039 0.815686 scn +0.450000 11.812494 m +0.450000 1.349995 l +2.250000 1.349995 l +2.250000 11.812494 l +0.450000 11.812494 l +h +9.000000 6.794994 m +8.012806 5.289854 l +9.000000 4.642370 l +9.987195 5.289854 l +9.000000 6.794994 l +h +1.350000 11.812494 m +-0.450000 11.812494 l +-0.450000 10.840459 l +0.362805 10.307354 l +1.350000 11.812494 l +h +1.350000 1.349995 m +-0.450000 1.349995 l +-0.450000 -0.450006 l +1.350000 -0.450006 l +1.350000 1.349995 l +h +16.650002 1.349995 m +16.650002 -0.450006 l +18.450001 -0.450006 l +18.450001 1.349995 l +16.650002 1.349995 l +h +16.650002 11.812494 m +18.450001 11.812494 l +18.450001 15.145705 l +15.662806 13.317634 l +16.650002 11.812494 l +h +9.000000 8.144995 m +8.018230 6.636310 l +8.998539 5.998378 l +9.979715 6.634975 l +9.000000 8.144995 l +h +16.560001 13.049994 m +17.539715 11.539974 l +22.641397 14.849994 l +16.560001 14.849994 l +16.560001 13.049994 l +h +1.462500 13.049994 m +1.462500 14.849994 l +-4.603716 14.849994 l +0.480730 11.541310 l +1.462500 13.049994 l +h +1.350000 1.799994 m +1.401242 1.799994 1.475013 1.789044 1.552805 1.755706 c +1.628516 1.723258 1.669326 1.686253 1.677792 1.677787 c +-0.867792 -0.867798 l +-0.282952 -1.452638 0.481404 -1.800005 1.350000 -1.800005 c +1.350000 1.799994 l +h +1.677792 1.677787 m +1.686258 1.669321 1.723263 1.628510 1.755711 1.552799 c +1.789050 1.475008 1.800000 1.401237 1.800000 1.349995 c +-1.800000 1.349995 l +-1.800000 0.481399 -1.452632 -0.282958 -0.867792 -0.867798 c +1.677792 1.677787 l +h +1.800000 1.349995 m +1.800000 13.049994 l +-1.800000 13.049994 l +-1.800000 1.349995 l +1.800000 1.349995 l +h +1.800000 13.049994 m +1.800000 12.998752 1.789050 12.924980 1.755711 12.847189 c +1.723263 12.771478 1.686258 12.730667 1.677792 12.722201 c +-0.867792 15.267786 l +-1.452632 14.682946 -1.800000 13.918591 -1.800000 13.049994 c +1.800000 13.049994 l +h +1.677792 12.722201 m +1.669326 12.713736 1.628516 12.676730 1.552805 12.644283 c +1.475013 12.610944 1.401242 12.599994 1.350000 12.599994 c +1.350000 16.199993 l +0.481404 16.199993 -0.282952 15.852626 -0.867792 15.267786 c +1.677792 12.722201 l +h +1.350000 12.599994 m +16.650002 12.599994 l +16.650002 16.199993 l +1.350000 16.199993 l +1.350000 12.599994 l +h +16.650002 12.599994 m +16.598759 12.599994 16.524988 12.610944 16.447197 12.644283 c +16.371485 12.676730 16.330675 12.713736 16.322208 12.722201 c +18.867792 15.267786 l +18.282953 15.852626 17.518597 16.199993 16.650002 16.199993 c +16.650002 12.599994 l +h +16.322208 12.722201 m +16.313744 12.730667 16.276737 12.771478 16.244289 12.847189 c +16.210951 12.924980 16.200001 12.998752 16.200001 13.049994 c +19.800001 13.049994 l +19.800001 13.918591 19.452633 14.682946 18.867792 15.267786 c +16.322208 12.722201 l +h +16.200001 13.049994 m +16.200001 1.349995 l +19.800001 1.349995 l +19.800001 13.049994 l +16.200001 13.049994 l +h +16.200001 1.349995 m +16.200001 1.401237 16.210951 1.475008 16.244289 1.552799 c +16.276737 1.628510 16.313744 1.669321 16.322208 1.677787 c +18.867792 -0.867798 l +19.452633 -0.282958 19.800001 0.481399 19.800001 1.349995 c +16.200001 1.349995 l +h +16.322208 1.677787 m +16.330675 1.686253 16.371485 1.723258 16.447197 1.755706 c +16.524988 1.789044 16.598759 1.799994 16.650002 1.799994 c +16.650002 -1.800005 l +17.518597 -1.800005 18.282953 -1.452638 18.867792 -0.867798 c +16.322208 1.677787 l +h +16.650002 1.799994 m +1.350000 1.799994 l +1.350000 -1.800005 l +16.650002 -1.800005 l +16.650002 1.799994 l +h +9.987195 8.300135 m +2.337195 13.317634 l +0.362805 10.307354 l +8.012806 5.289854 l +9.987195 8.300135 l +h +1.350000 -0.450006 m +16.650002 -0.450006 l +16.650002 3.149995 l +1.350000 3.149995 l +1.350000 -0.450006 l +h +18.450001 1.349995 m +18.450001 11.812494 l +14.850000 11.812494 l +14.850000 1.349995 l +18.450001 1.349995 l +h +15.662806 13.317634 m +8.012806 8.300135 l +9.987195 5.289854 l +17.637196 10.307354 l +15.662806 13.317634 l +h +9.979715 6.634975 m +17.539715 11.539974 l +15.580286 14.560014 l +8.020286 9.655014 l +9.979715 6.634975 l +h +16.560001 14.849994 m +1.462500 14.849994 l +1.462500 11.249994 l +16.560001 11.249994 l +16.560001 14.849994 l +h +0.480730 11.541310 m +8.018230 6.636310 l +9.981771 9.653678 l +2.444270 14.558678 l +0.480730 11.541310 l +h +3.150000 11.812494 m +3.150000 13.049994 l +-0.450000 13.049994 l +-0.450000 11.812494 l +3.150000 11.812494 l +h +-0.450000 13.049994 m +-0.450000 1.349995 l +3.150000 1.349995 l +3.150000 13.049994 l +-0.450000 13.049994 l +h +f +n +Q +Q + +endstream +endobj + +3 0 obj + 6312 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 18.000000 14.399994 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000006402 00000 n +0000006425 00000 n +0000006598 00000 n +0000006672 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +6731 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/Firewall/icn_facebook_trackers.imageset/Contents.json b/Assets.xcassets/Firewall/icn_facebook_trackers.imageset/Contents.json new file mode 100644 index 0000000..a37ecd0 --- /dev/null +++ b/Assets.xcassets/Firewall/icn_facebook_trackers.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icn_facebook_trackers.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/Firewall/icn_facebook_trackers.imageset/icn_facebook_trackers.pdf b/Assets.xcassets/Firewall/icn_facebook_trackers.imageset/icn_facebook_trackers.pdf new file mode 100644 index 0000000..f914962 --- /dev/null +++ b/Assets.xcassets/Firewall/icn_facebook_trackers.imageset/icn_facebook_trackers.pdf @@ -0,0 +1,468 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +0.000000 0.000000 0.000000 scn +15.925000 0.000000 m +4.825000 0.000000 l +4.825000 12.799999 l +11.775001 20.000000 l +12.750000 19.225000 l +12.850000 19.141666 12.925000 19.025000 12.975000 18.875000 c +13.025001 18.725000 13.050000 18.541666 13.050000 18.325001 c +13.050000 18.075001 l +11.925000 12.799999 l +19.400000 12.799999 l +19.800001 12.799999 20.150000 12.650000 20.450001 12.350000 c +20.750000 12.049999 20.900000 11.700000 20.900000 11.300000 c +20.900000 9.254025 l +20.900000 9.134675 20.912500 9.012500 20.937500 8.887500 c +20.962500 8.762500 20.950001 8.641666 20.900000 8.525000 c +17.750000 1.275000 l +17.602034 0.920834 17.355410 0.619791 17.010126 0.371874 c +16.664860 0.123959 16.303150 0.000000 15.925000 0.000000 c +h +6.325000 1.500000 m +16.250000 1.500000 l +19.400000 8.974999 l +19.400000 11.300000 l +10.075000 11.300000 l +11.400001 17.525000 l +6.325000 12.174999 l +6.325000 1.500000 l +h +4.825000 12.799999 m +4.825000 11.300000 l +1.500000 11.300000 l +1.500000 1.500000 l +4.825000 1.500000 l +4.825000 0.000000 l +0.000000 0.000000 l +0.000000 12.799999 l +4.825000 12.799999 l +h +f +n +Q +15.925000 0.000000 m +4.825000 0.000000 l +4.825000 12.799999 l +11.775001 20.000000 l +12.750000 19.225000 l +12.850000 19.141666 12.925000 19.025000 12.975000 18.875000 c +13.025001 18.725000 13.050000 18.541666 13.050000 18.325001 c +13.050000 18.075001 l +11.925000 12.799999 l +19.400000 12.799999 l +19.800001 12.799999 20.150000 12.650000 20.450001 12.350000 c +20.750000 12.049999 20.900000 11.700000 20.900000 11.300000 c +20.900000 9.254025 l +20.900000 9.134675 20.912500 9.012500 20.937500 8.887500 c +20.962500 8.762500 20.950001 8.641666 20.900000 8.525000 c +17.750000 1.275000 l +17.602034 0.920834 17.355410 0.619791 17.010126 0.371874 c +16.664860 0.123959 16.303150 0.000000 15.925000 0.000000 c +h +6.325000 1.500000 m +16.250000 1.500000 l +19.400000 8.974999 l +19.400000 11.300000 l +10.075000 11.300000 l +11.400001 17.525000 l +6.325000 12.174999 l +6.325000 1.500000 l +h +4.825000 12.799999 m +4.825000 11.300000 l +1.500000 11.300000 l +1.500000 1.500000 l +4.825000 1.500000 l +4.825000 0.000000 l +0.000000 0.000000 l +0.000000 12.799999 l +4.825000 12.799999 l +h +W* +n +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +0.000000 0.435294 1.000000 scn +11.775001 20.000000 m +12.895040 21.409082 l +11.615291 22.426319 l +10.479922 21.250109 l +11.775001 20.000000 l +h +12.750000 19.225000 m +13.902332 20.607798 l +13.886338 20.621126 l +13.870040 20.634081 l +12.750000 19.225000 l +h +13.050000 18.075001 m +14.810410 17.699556 l +14.850000 17.885191 l +14.850000 18.075001 l +13.050000 18.075001 l +h +11.925000 12.799999 m +10.164591 13.175443 l +9.700633 11.000000 l +11.925000 11.000000 l +11.925000 12.799999 l +h +20.900000 8.525000 m +22.550928 7.807700 l +22.554461 7.815945 l +20.900000 8.525000 l +h +17.750000 1.275000 m +16.099092 1.992290 l +16.094027 1.980627 l +16.089125 1.968895 l +17.750000 1.275000 l +h +17.010126 0.371874 m +15.960296 1.834015 l +15.960262 1.833992 l +17.010126 0.371874 l +h +6.325000 1.500000 m +4.525000 1.500000 l +4.525000 -0.300001 l +6.325000 -0.300001 l +6.325000 1.500000 l +h +16.250000 1.500000 m +16.250000 -0.300001 l +17.444767 -0.300001 l +17.908735 0.801001 l +16.250000 1.500000 l +h +19.400000 8.974999 m +21.058735 8.276001 l +21.200001 8.611226 l +21.200001 8.974999 l +19.400000 8.974999 l +h +19.400000 11.300000 m +21.200001 11.300000 l +21.200001 13.100000 l +19.400000 13.100000 l +19.400000 11.300000 l +h +10.075000 11.300000 m +8.314440 11.674738 l +7.851544 9.500000 l +10.075000 9.500000 l +10.075000 11.300000 l +h +11.400001 17.525000 m +13.160561 17.150263 l +14.490488 23.398417 l +10.094088 18.763786 l +11.400001 17.525000 l +h +6.325000 12.174999 m +5.019087 13.413786 l +4.525000 12.892925 l +4.525000 12.174999 l +6.325000 12.174999 l +h +4.825000 11.300000 m +4.825000 9.500000 l +6.625000 9.500000 l +6.625000 11.300000 l +4.825000 11.300000 l +h +1.500000 11.300000 m +1.500000 13.100000 l +-0.300000 13.100000 l +-0.300000 11.300000 l +1.500000 11.300000 l +h +1.500000 1.500000 m +-0.300000 1.500000 l +-0.300000 -0.300001 l +1.500000 -0.300001 l +1.500000 1.500000 l +h +4.825000 1.500000 m +6.625000 1.500000 l +6.625000 3.299999 l +4.825000 3.299999 l +4.825000 1.500000 l +h +0.000000 0.000000 m +-1.800000 0.000000 l +-1.800000 -1.800001 l +0.000000 -1.800001 l +0.000000 0.000000 l +h +0.000000 12.799999 m +0.000000 14.600000 l +-1.800000 14.600000 l +-1.800000 12.799999 l +0.000000 12.799999 l +h +15.925000 1.799999 m +4.825000 1.799999 l +4.825000 -1.800001 l +15.925000 -1.800001 l +15.925000 1.799999 l +h +6.625000 0.000000 m +6.625000 12.799999 l +3.025000 12.799999 l +3.025000 0.000000 l +6.625000 0.000000 l +h +6.120078 11.549891 m +13.070078 18.749891 l +10.479922 21.250109 l +3.529922 14.050110 l +6.120078 11.549891 l +h +10.654961 18.590918 m +11.629961 17.815918 l +13.870040 20.634081 l +12.895040 21.409082 l +10.654961 18.590918 l +h +11.597669 17.842201 m +11.390246 18.015053 11.300418 18.206646 11.267370 18.305790 c +14.682631 19.444210 l +14.549582 19.843353 14.309754 20.268280 13.902332 20.607798 c +11.597669 17.842201 l +h +11.267370 18.305790 m +11.259361 18.329817 11.254526 18.348635 11.251715 18.361128 c +11.248905 18.373619 11.247894 18.380779 11.247756 18.381796 c +11.247615 18.382830 11.248207 18.378748 11.248818 18.368969 c +11.249428 18.359213 11.250000 18.344694 11.250000 18.325001 c +14.850000 18.325001 l +14.850000 18.668697 14.811775 19.056776 14.682631 19.444210 c +11.267370 18.305790 l +h +11.250000 18.325001 m +11.250000 18.075001 l +14.850000 18.075001 l +14.850000 18.325001 l +11.250000 18.325001 l +h +11.289591 18.450443 m +10.164591 13.175443 l +13.685410 12.424557 l +14.810410 17.699556 l +11.289591 18.450443 l +h +11.925000 11.000000 m +19.400000 11.000000 l +19.400000 14.600000 l +11.925000 14.600000 l +11.925000 11.000000 l +h +19.400000 11.000000 m +19.368757 11.000000 19.313738 11.007199 19.253445 11.033039 c +19.195234 11.057986 19.170673 11.083742 19.177208 11.077208 c +21.722792 13.622792 l +21.107952 14.237632 20.308596 14.600000 19.400000 14.600000 c +19.400000 11.000000 l +h +19.177208 11.077208 m +19.183743 11.070674 19.157988 11.095234 19.133039 11.153445 c +19.107201 11.213737 19.100000 11.268758 19.100000 11.300000 c +22.700001 11.300000 l +22.700001 12.208596 22.337633 13.007952 21.722792 13.622792 c +19.177208 11.077208 l +h +19.100000 11.300000 m +19.100000 9.254025 l +22.700001 9.254025 l +22.700001 11.300000 l +19.100000 11.300000 l +h +19.100000 9.254025 m +19.100000 9.008410 19.125776 8.767887 19.172455 8.534491 c +22.702545 9.240509 l +22.699224 9.257113 22.700001 9.260941 22.700001 9.254025 c +19.100000 9.254025 l +h +19.172455 8.534491 m +19.126373 8.764904 19.151443 9.014497 19.245539 9.234055 c +22.554461 7.815945 l +22.748558 8.268836 22.798628 8.760096 22.702545 9.240509 c +19.172455 8.534491 l +h +19.249094 9.242290 m +16.099092 1.992290 l +19.400908 0.557709 l +22.550907 7.807709 l +19.249094 9.242290 l +h +16.089125 1.968895 m +16.083267 1.954876 16.064671 1.908958 15.960296 1.834015 c +18.059958 -1.090265 l +18.646147 -0.669376 19.120800 -0.113211 19.410877 0.581104 c +16.089125 1.968895 l +h +15.960262 1.833992 m +15.914719 1.801289 15.893434 1.794754 15.896347 1.795752 c +15.897339 1.796091 15.901518 1.797396 15.908098 1.798498 c +15.914706 1.799604 15.920696 1.799999 15.925000 1.799999 c +15.925000 -1.800001 l +16.725832 -1.800001 17.448351 -1.529427 18.059990 -1.090242 c +15.960262 1.833992 l +h +6.325000 -0.300001 m +16.250000 -0.300001 l +16.250000 3.299999 l +6.325000 3.299999 l +6.325000 -0.300001 l +h +17.908735 0.801001 m +21.058735 8.276001 l +17.741266 9.673999 l +14.591266 2.198997 l +17.908735 0.801001 l +h +21.200001 8.974999 m +21.200001 11.300000 l +17.600000 11.300000 l +17.600000 8.974999 l +21.200001 8.974999 l +h +19.400000 13.100000 m +10.075000 13.100000 l +10.075000 9.500000 l +19.400000 9.500000 l +19.400000 13.100000 l +h +11.835560 10.925262 m +13.160561 17.150263 l +9.639441 17.899738 l +8.314440 11.674738 l +11.835560 10.925262 l +h +10.094088 18.763786 m +5.019087 13.413786 l +7.630913 10.936213 l +12.705913 16.286213 l +10.094088 18.763786 l +h +4.525000 12.174999 m +4.525000 1.500000 l +8.125000 1.500000 l +8.125000 12.174999 l +4.525000 12.174999 l +h +3.025000 12.799999 m +3.025000 11.300000 l +6.625000 11.300000 l +6.625000 12.799999 l +3.025000 12.799999 l +h +4.825000 13.100000 m +1.500000 13.100000 l +1.500000 9.500000 l +4.825000 9.500000 l +4.825000 13.100000 l +h +-0.300000 11.300000 m +-0.300000 1.500000 l +3.300000 1.500000 l +3.300000 11.300000 l +-0.300000 11.300000 l +h +1.500000 -0.300001 m +4.825000 -0.300001 l +4.825000 3.299999 l +1.500000 3.299999 l +1.500000 -0.300001 l +h +3.025000 1.500000 m +3.025000 0.000000 l +6.625000 0.000000 l +6.625000 1.500000 l +3.025000 1.500000 l +h +4.825000 1.799999 m +0.000000 1.799999 l +0.000000 -1.800001 l +4.825000 -1.800001 l +4.825000 1.799999 l +h +1.800000 0.000000 m +1.800000 12.799999 l +-1.800000 12.799999 l +-1.800000 0.000000 l +1.800000 0.000000 l +h +0.000000 11.000000 m +4.825000 11.000000 l +4.825000 14.600000 l +0.000000 14.600000 l +0.000000 11.000000 l +h +f +n +Q +Q + +endstream +endobj + +3 0 obj + 8991 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 20.950012 20.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000009081 00000 n +0000009104 00000 n +0000009277 00000 n +0000009351 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +9410 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/Firewall/icn_game_marketing.imageset/Contents.json b/Assets.xcassets/Firewall/icn_game_marketing.imageset/Contents.json new file mode 100644 index 0000000..19787c4 --- /dev/null +++ b/Assets.xcassets/Firewall/icn_game_marketing.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icn_game_marketing.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/Firewall/icn_game_marketing.imageset/icn_game_marketing.pdf b/Assets.xcassets/Firewall/icn_game_marketing.imageset/icn_game_marketing.pdf new file mode 100644 index 0000000..87d6134 --- /dev/null +++ b/Assets.xcassets/Firewall/icn_game_marketing.imageset/icn_game_marketing.pdf @@ -0,0 +1,137 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +1.000000 0.333333 0.000000 scn +2.050773 -0.000008 m +1.369951 -0.000008 0.836939 0.228426 0.451737 0.685294 c +0.066535 1.142161 -0.072317 1.773713 0.035181 2.579950 c +1.325160 11.582926 l +1.468491 12.532494 1.911921 13.347689 2.655451 14.028511 c +3.398980 14.709332 4.245529 15.049744 5.195096 15.049744 c +16.831779 15.049744 l +17.781347 15.049744 18.627895 14.709332 19.371426 14.028511 c +20.114954 13.347689 20.558384 12.532494 20.701715 11.582926 c +21.964819 2.579950 l +22.072317 1.773713 21.933466 1.142161 21.548264 0.685294 c +21.163061 0.228426 20.630051 -0.000008 19.949228 -0.000008 c +19.537151 -0.000008 19.187782 0.067179 18.901119 0.201551 c +18.614458 0.335925 18.372587 0.501651 18.175507 0.698731 c +15.380553 3.493685 l +6.619448 3.493685 l +3.824494 0.698731 l +3.627414 0.501651 3.385543 0.335925 3.098881 0.201551 c +2.812219 0.067179 2.462850 -0.000008 2.050773 -0.000008 c +h +2.534515 1.719964 m +5.920710 5.106158 l +16.079292 5.106158 l +19.465487 1.719964 l +19.555067 1.630383 19.716314 1.549759 19.949228 1.478093 c +20.110476 1.478093 20.231411 1.558717 20.312035 1.719964 c +20.392658 1.881211 20.415054 2.042459 20.379221 2.203706 c +19.089243 11.314180 l +18.999660 11.941254 18.735394 12.451870 18.296442 12.846030 c +17.857491 13.240191 17.369270 13.437270 16.831779 13.437270 c +5.168222 13.437270 l +4.630731 13.437270 4.142509 13.240191 3.703558 12.846030 c +3.264607 12.451870 3.000341 11.941254 2.910759 11.314180 c +1.620780 2.203706 l +1.584947 2.042459 1.607343 1.881211 1.687966 1.719964 c +1.768590 1.558717 1.889526 1.478093 2.050773 1.478093 c +2.176188 1.478093 2.337435 1.558717 2.534515 1.719964 c +h +16.912403 6.449886 m +17.199064 6.449886 17.449894 6.557384 17.664890 6.772381 c +17.879887 6.987377 17.987385 7.238206 17.987385 7.524868 c +17.987385 7.811530 17.879887 8.062359 17.664890 8.277355 c +17.449894 8.492352 17.199064 8.599850 16.912403 8.599850 c +16.625740 8.599850 16.374912 8.492352 16.159916 8.277355 c +15.944919 8.062359 15.837420 7.811530 15.837420 7.524868 c +15.837420 7.238206 15.944919 6.987377 16.159916 6.772381 c +16.374912 6.557384 16.625740 6.449886 16.912403 6.449886 c +h +14.628065 9.943579 m +14.914727 9.943579 15.165557 10.051077 15.380553 10.266073 c +15.595550 10.481070 15.703048 10.731898 15.703048 11.018560 c +15.703048 11.305223 15.595550 11.556051 15.380553 11.771048 c +15.165557 11.986044 14.914727 12.093542 14.628065 12.093542 c +14.341404 12.093542 14.090574 11.986044 13.875578 11.771048 c +13.660582 11.556051 13.553083 11.305223 13.553083 11.018560 c +13.553083 10.731898 13.660582 10.481070 13.875578 10.266073 c +14.090574 10.051077 14.341404 9.943579 14.628065 9.943579 c +h +6.162580 6.584259 m +7.506308 6.584259 l +7.506308 8.599850 l +9.521899 8.599850 l +9.521899 9.943579 l +7.506308 9.943579 l +7.506308 11.959169 l +6.162580 11.959169 l +6.162580 9.943579 l +4.146989 9.943579 l +4.146989 8.599850 l +6.162580 8.599850 l +6.162580 6.584259 l +h +f +n +Q + +endstream +endobj + +3 0 obj + 2991 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 22.000000 15.049744 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000003081 00000 n +0000003104 00000 n +0000003277 00000 n +0000003351 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +3410 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/Firewall/icn_lock.imageset/Contents.json b/Assets.xcassets/Firewall/icn_lock.imageset/Contents.json new file mode 100644 index 0000000..960edaa --- /dev/null +++ b/Assets.xcassets/Firewall/icn_lock.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icn_lock.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/Firewall/icn_lock.imageset/icn_lock.pdf b/Assets.xcassets/Firewall/icn_lock.imageset/icn_lock.pdf new file mode 100644 index 0000000..bd2a190 --- /dev/null +++ b/Assets.xcassets/Firewall/icn_lock.imageset/icn_lock.pdf @@ -0,0 +1,111 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +0.592157 0.611765 0.619608 scn +1.975000 0.000000 m +1.425000 0.000000 0.958333 0.195835 0.575000 0.587502 c +0.191667 0.979168 -0.000000 1.441668 0.000000 1.975000 c +0.000000 12.575001 l +0.000000 13.125001 0.191667 13.595834 0.575000 13.987501 c +0.958333 14.379168 1.425000 14.575001 1.975000 14.575001 c +3.450000 14.575001 l +3.450000 16.650000 l +3.450000 18.033333 3.925000 19.204166 4.875000 20.162500 c +5.825000 21.120834 6.983335 21.600000 8.350001 21.600000 c +9.716668 21.600000 10.875002 21.120834 11.825002 20.162500 c +12.775002 19.204166 13.250002 18.033333 13.250002 16.650000 c +13.250002 14.575001 l +14.725002 14.575001 l +15.275002 14.575001 15.745836 14.379168 16.137503 13.987501 c +16.529169 13.595834 16.725002 13.125001 16.725002 12.575001 c +16.725002 1.975000 l +16.725002 1.441668 16.529169 0.979168 16.137503 0.587502 c +15.745836 0.195835 15.275002 0.000000 14.725002 0.000000 c +1.975000 0.000000 l +h +1.975000 1.975000 m +14.725002 1.975000 l +14.725002 12.575001 l +1.975000 12.575001 l +1.975000 1.975000 l +h +8.350001 5.350000 m +8.883335 5.350000 9.337501 5.533335 9.712501 5.900002 c +10.087501 6.266668 10.275001 6.708334 10.275001 7.225000 c +10.275001 7.725000 10.087501 8.179167 9.712501 8.587501 c +9.337501 8.995834 8.883335 9.200001 8.350001 9.200001 c +7.816668 9.200001 7.362501 8.995834 6.987501 8.587501 c +6.612501 8.179167 6.425001 7.725000 6.425001 7.225000 c +6.425001 6.708334 6.612501 6.266668 6.987501 5.900002 c +7.362501 5.533335 7.816668 5.350000 8.350001 5.350000 c +h +5.425000 14.575001 m +11.275001 14.575001 l +11.275001 16.650000 l +11.275001 17.483334 10.991667 18.187500 10.425000 18.762501 c +9.858334 19.337500 9.166668 19.625000 8.350001 19.625000 c +7.533335 19.625000 6.841668 19.337500 6.275001 18.762501 c +5.708334 18.187500 5.425000 17.483334 5.425000 16.650000 c +5.425000 14.575001 l +h +f +n +Q + +endstream +endobj + +3 0 obj + 1917 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 16.725006 21.600000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000002007 00000 n +0000002030 00000 n +0000002203 00000 n +0000002277 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +2336 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/Firewall/icn_marketing_trackers.imageset/Contents.json b/Assets.xcassets/Firewall/icn_marketing_trackers.imageset/Contents.json new file mode 100644 index 0000000..d95e161 --- /dev/null +++ b/Assets.xcassets/Firewall/icn_marketing_trackers.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icn_marketing.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/Firewall/icn_marketing_trackers.imageset/icn_marketing.pdf b/Assets.xcassets/Firewall/icn_marketing_trackers.imageset/icn_marketing.pdf new file mode 100644 index 0000000..c676776 --- /dev/null +++ b/Assets.xcassets/Firewall/icn_marketing_trackers.imageset/icn_marketing.pdf @@ -0,0 +1,114 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +0.313726 0.756863 0.976471 scn +19.500000 8.700014 m +19.500000 10.500013 l +24.000000 10.500013 l +24.000000 8.700014 l +19.500000 8.700014 l +h +21.000000 0.000015 m +17.369999 2.700014 l +18.449999 4.140015 l +22.080000 1.440014 l +21.000000 0.000015 l +h +18.539999 15.090014 m +17.459999 16.530012 l +21.000000 19.200012 l +22.080000 17.760012 l +18.539999 15.090014 l +h +3.900000 1.200014 m +3.900000 6.000014 l +1.800000 6.000014 l +1.305000 6.000014 0.881250 6.176264 0.528750 6.528764 c +0.176250 6.881264 0.000000 7.305014 0.000000 7.800014 c +0.000000 11.400013 l +0.000000 11.895014 0.176250 12.318764 0.528750 12.671263 c +0.881250 13.023764 1.305000 13.200013 1.800000 13.200013 c +7.200000 13.200013 l +13.200000 16.800013 l +13.200000 2.400015 l +7.200000 6.000014 l +5.700000 6.000014 l +5.700000 1.200014 l +3.900000 1.200014 l +h +14.400000 5.580014 m +14.400000 13.620013 l +14.940000 13.140013 15.375000 12.555014 15.705000 11.865013 c +16.035000 11.175014 16.199999 10.420013 16.199999 9.600014 c +16.199999 8.780014 16.035000 8.025014 15.705000 7.335014 c +15.375000 6.645014 14.940000 6.060014 14.400000 5.580014 c +h +1.800000 11.400013 m +1.800000 7.800014 l +7.680000 7.800014 l +11.400000 5.580014 l +11.400000 13.620013 l +7.680000 11.400013 l +1.800000 11.400013 l +h +f +n +Q + +endstream +endobj + +3 0 obj + 1344 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 24.000000 19.200012 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000001434 00000 n +0000001457 00000 n +0000001630 00000 n +0000001704 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +1763 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/VPN/Contents.json b/Assets.xcassets/VPN/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Assets.xcassets/VPN/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Assets.xcassets/VPN/icn_activity.imageset/Contents.json b/Assets.xcassets/VPN/icn_activity.imageset/Contents.json new file mode 100644 index 0000000..fb8d664 --- /dev/null +++ b/Assets.xcassets/VPN/icn_activity.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icn_activity.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/VPN/icn_activity.imageset/icn_activity.pdf b/Assets.xcassets/VPN/icn_activity.imageset/icn_activity.pdf new file mode 100644 index 0000000..291a4b6 --- /dev/null +++ b/Assets.xcassets/VPN/icn_activity.imageset/icn_activity.pdf @@ -0,0 +1,110 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +1.000000 0.156863 0.294118 scn +2.450000 10.449999 m +0.000000 12.250000 l +9.400001 27.250000 l +15.378551 20.250000 l +23.350000 33.150002 l +28.800001 25.049999 l +28.266666 24.983334 27.750000 24.875000 27.250000 24.725000 c +26.750000 24.574999 26.250000 24.400000 25.750000 24.199999 c +23.500000 27.650000 l +15.872149 15.199999 l +9.800000 22.250000 l +2.450000 10.449999 l +h +41.850002 0.000000 m +35.150002 6.700001 l +34.450001 6.200001 33.691666 5.816666 32.875000 5.549999 c +32.058334 5.283333 31.216667 5.149998 30.350000 5.149998 c +27.988901 5.149998 25.981951 5.976967 24.329151 7.630898 c +22.676384 9.284798 21.850000 11.293133 21.850000 13.655899 c +21.850000 16.018631 22.676966 18.025000 24.330900 19.674999 c +25.984800 21.324999 27.993134 22.150000 30.355900 22.150000 c +32.718632 22.150000 34.725002 21.323616 36.375000 19.670849 c +38.025002 18.018049 38.850002 16.011099 38.850002 13.650000 c +38.850002 12.783333 38.708332 11.941666 38.424999 11.125000 c +38.141666 10.308332 37.766666 9.525867 37.299999 8.777599 c +44.000000 2.149998 l +41.850002 0.000000 l +h +30.342951 8.149998 m +31.880983 8.149998 33.183334 8.680984 34.250000 9.742950 c +35.316666 10.804916 35.850002 12.104918 35.850002 13.642950 c +35.850002 15.180983 35.319016 16.483334 34.257050 17.549999 c +33.195084 18.616667 31.895082 19.150000 30.357050 19.150000 c +28.819017 19.150000 27.516666 18.619017 26.450001 17.557049 c +25.383333 16.495083 24.850000 15.195082 24.850000 13.657049 c +24.850000 12.119017 25.380983 10.816666 26.442951 9.750000 c +27.504917 8.683334 28.804918 8.149998 30.342951 8.149998 c +h +34.049999 24.549999 m +33.549999 24.750000 33.033333 24.883333 32.500000 24.949999 c +31.966667 25.016666 31.416668 25.083334 30.850000 25.150000 c +41.549999 42.000000 l +44.000000 40.200001 l +34.049999 24.549999 l +h +f +n +Q + +endstream +endobj + +3 0 obj + 1886 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 44.000000 42.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000001976 00000 n +0000001999 00000 n +0000002172 00000 n +0000002246 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +2305 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/VPN/icn_configure_blocking.imageset/Contents.json b/Assets.xcassets/VPN/icn_configure_blocking.imageset/Contents.json new file mode 100644 index 0000000..536528d --- /dev/null +++ b/Assets.xcassets/VPN/icn_configure_blocking.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icn_configure_blocking.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/VPN/icn_configure_blocking.imageset/icn_configure_blocking.pdf b/Assets.xcassets/VPN/icn_configure_blocking.imageset/icn_configure_blocking.pdf new file mode 100644 index 0000000..74659c5 --- /dev/null +++ b/Assets.xcassets/VPN/icn_configure_blocking.imageset/icn_configure_blocking.pdf @@ -0,0 +1,127 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +0.305882 0.298039 0.815686 scn +3.000000 0.000000 m +2.175000 0.000000 1.468750 0.293751 0.881250 0.881248 c +0.293750 1.468750 0.000000 2.174999 0.000000 3.000000 c +0.000000 41.000000 l +0.000000 41.825001 0.293750 42.531250 0.881250 43.118752 c +1.468750 43.706249 2.175000 44.000000 3.000000 44.000000 c +25.000000 44.000000 l +25.825001 44.000000 26.531250 43.706249 27.118750 43.118752 c +27.706251 42.531250 28.000000 41.825001 28.000000 41.000000 c +28.000000 33.700001 l +25.000000 33.700001 l +25.000000 36.500000 l +3.000000 36.500000 l +3.000000 7.500000 l +25.000000 7.500000 l +25.000000 10.299999 l +28.000000 10.299999 l +28.000000 3.000000 l +28.000000 2.174999 27.706251 1.468750 27.118750 0.881248 c +26.531250 0.293751 25.825001 0.000000 25.000000 0.000000 c +3.000000 0.000000 l +h +3.000000 3.000000 m +25.000000 3.000000 l +25.000000 4.500000 l +3.000000 4.500000 l +3.000000 3.000000 l +h +26.000000 14.000000 m +23.800001 14.000000 21.916668 14.783333 20.350000 16.350000 c +18.783333 17.916666 18.000000 19.799999 18.000000 22.000000 c +18.000000 24.199999 18.783333 26.083334 20.350000 27.650000 c +21.916668 29.216667 23.800001 30.000000 26.000000 30.000000 c +28.200001 30.000000 30.083334 29.216667 31.650000 27.650000 c +33.216667 26.083334 34.000000 24.199999 34.000000 22.000000 c +34.000000 19.799999 33.216667 17.916666 31.650000 16.350000 c +30.083334 14.783333 28.200001 14.000000 26.000000 14.000000 c +h +26.000000 16.500000 m +26.525700 16.500000 27.040466 16.566666 27.544300 16.699999 c +28.048100 16.833332 28.500000 17.049999 28.900000 17.350000 c +21.350000 24.900000 l +21.083334 24.466667 20.875000 24.009050 20.725000 23.527151 c +20.575001 23.045252 20.500000 22.552866 20.500000 22.049999 c +20.500000 20.516666 21.031668 19.208332 22.095001 18.125000 c +23.158335 17.041666 24.460001 16.500000 26.000000 16.500000 c +h +30.700001 19.100000 m +30.966667 19.533333 31.166668 19.996433 31.300001 20.489300 c +31.433334 20.982134 31.500000 21.485699 31.500000 22.000000 c +31.500000 23.539999 30.968332 24.841667 29.904999 25.905001 c +28.841665 26.968334 27.540001 27.500000 26.000000 27.500000 c +25.474300 27.500000 24.959534 27.433332 24.455702 27.299999 c +23.951900 27.166666 23.500000 26.966667 23.100000 26.699999 c +30.700001 19.100000 l +h +3.000000 39.500000 m +25.000000 39.500000 l +25.000000 41.000000 l +3.000000 41.000000 l +3.000000 39.500000 l +h +f +n +Q + +endstream +endobj + +3 0 obj + 2444 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 34.000000 44.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000002534 00000 n +0000002557 00000 n +0000002730 00000 n +0000002804 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +2863 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/VPN/icn_globe.imageset/Contents.json b/Assets.xcassets/VPN/icn_globe.imageset/Contents.json new file mode 100644 index 0000000..9f943b4 --- /dev/null +++ b/Assets.xcassets/VPN/icn_globe.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icn_globe.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/VPN/icn_globe.imageset/icn_globe.pdf b/Assets.xcassets/VPN/icn_globe.imageset/icn_globe.pdf new file mode 100644 index 0000000..b1c8e86 --- /dev/null +++ b/Assets.xcassets/VPN/icn_globe.imageset/icn_globe.pdf @@ -0,0 +1,118 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +0.180392 0.752941 0.309804 scn +20.000000 0.000000 m +17.233334 0.000000 14.633333 0.524998 12.200000 1.575001 c +9.766666 2.625000 7.650000 4.049999 5.850000 5.849998 c +4.050000 7.649998 2.625000 9.766666 1.575000 12.199999 c +0.525000 14.633333 0.000000 17.233334 0.000000 20.000000 c +0.000000 22.766666 0.525000 25.366667 1.575000 27.799999 c +2.625000 30.233334 4.050000 32.349998 5.850000 34.150002 c +7.650000 35.950001 9.766666 37.375000 12.200000 38.424999 c +14.633333 39.474998 17.233334 40.000000 20.000000 40.000000 c +22.766666 40.000000 25.366667 39.474998 27.800001 38.424999 c +30.233334 37.375000 32.350002 35.950001 34.150002 34.150002 c +35.950001 32.349998 37.375000 30.233334 38.424999 27.799999 c +39.475002 25.366667 40.000000 22.766666 40.000000 20.000000 c +40.000000 17.233334 39.475002 14.633333 38.424999 12.199999 c +37.375000 9.766666 35.950001 7.649998 34.150002 5.849998 c +32.350002 4.049999 30.233334 2.625000 27.800001 1.575001 c +25.366667 0.524998 22.766666 0.000000 20.000000 0.000000 c +h +17.850000 3.049999 m +17.850000 7.149998 l +16.683334 7.149998 15.700000 7.583332 14.900001 8.449999 c +14.100000 9.316666 13.700000 10.333332 13.700000 11.500000 c +13.700000 13.699999 l +3.450000 23.949999 l +3.283333 23.283333 3.166667 22.625000 3.100000 21.975000 c +3.033333 21.324999 3.000000 20.666666 3.000000 20.000000 c +3.000000 15.666666 4.408333 11.883333 7.225000 8.650000 c +10.041667 5.416668 13.583333 3.549999 17.850000 3.049999 c +h +32.549999 8.449999 m +33.283333 9.250000 33.924999 10.100000 34.475002 11.000000 c +35.025002 11.900000 35.491669 12.841667 35.875000 13.824999 c +36.258335 14.808332 36.541668 15.816666 36.725002 16.850000 c +36.908333 17.883333 37.000000 18.933332 37.000000 20.000000 c +37.000000 23.533333 36.033333 26.741667 34.100002 29.625000 c +32.166668 32.508331 29.583334 34.616669 26.350000 35.950001 c +26.350000 35.049999 l +26.350000 33.883331 25.950001 32.866669 25.150000 32.000000 c +24.350000 31.133333 23.366667 30.700001 22.200001 30.700001 c +17.850000 30.700001 l +17.850000 26.349998 l +17.850000 25.783333 17.625000 25.316666 17.175001 24.950001 c +16.725000 24.583332 16.216667 24.400000 15.650001 24.400000 c +11.500000 24.400000 l +11.500000 20.000000 l +24.400000 20.000000 l +24.966667 20.000000 25.433334 19.783333 25.800001 19.350000 c +26.166668 18.916666 26.350000 18.416666 26.350000 17.850000 c +26.350000 11.500000 l +28.500000 11.500000 l +29.466667 11.500000 30.316668 11.216667 31.050001 10.650000 c +31.783335 10.083332 32.283333 9.350000 32.549999 8.449999 c +h +f +n +Q + +endstream +endobj + +3 0 obj + 2612 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 40.000000 40.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000002702 00000 n +0000002725 00000 n +0000002898 00000 n +0000002972 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +3031 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/VPN/icn_import.imageset/Contents.json b/Assets.xcassets/VPN/icn_import.imageset/Contents.json new file mode 100644 index 0000000..9da8012 --- /dev/null +++ b/Assets.xcassets/VPN/icn_import.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icn_import.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/VPN/icn_import.imageset/icn_import.pdf b/Assets.xcassets/VPN/icn_import.imageset/icn_import.pdf new file mode 100644 index 0000000..eaedc35 --- /dev/null +++ b/Assets.xcassets/VPN/icn_import.imageset/icn_import.pdf @@ -0,0 +1,90 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +1.000000 0.670588 0.000000 scn +3.000000 0.000000 m +2.200000 0.000000 1.500000 0.299999 0.900000 0.900000 c +0.300000 1.500000 0.000000 2.199999 0.000000 3.000000 c +0.000000 10.150000 l +3.000000 10.150000 l +3.000000 3.000000 l +29.000000 3.000000 l +29.000000 10.150000 l +32.000000 10.150000 l +32.000000 3.000000 l +32.000000 2.199999 31.700001 1.500000 31.100000 0.900000 c +30.500000 0.299999 29.800001 0.000000 29.000000 0.000000 c +3.000000 0.000000 l +h +14.500000 7.650000 m +14.500000 26.200001 l +8.500000 20.200001 l +6.350000 22.349998 l +16.000000 32.000000 l +25.650000 22.349998 l +23.500000 20.200001 l +17.500000 26.200001 l +17.500000 7.650000 l +14.500000 7.650000 l +h +f +n +Q + +endstream +endobj + +3 0 obj + 762 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 32.000000 32.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000000852 00000 n +0000000874 00000 n +0000001047 00000 n +0000001121 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +1180 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/VPN/icn_personalized_blocking.imageset/Contents.json b/Assets.xcassets/VPN/icn_personalized_blocking.imageset/Contents.json new file mode 100644 index 0000000..7edd911 --- /dev/null +++ b/Assets.xcassets/VPN/icn_personalized_blocking.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icn_personalized_blocking.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/VPN/icn_personalized_blocking.imageset/icn_personalized_blocking.pdf b/Assets.xcassets/VPN/icn_personalized_blocking.imageset/icn_personalized_blocking.pdf new file mode 100644 index 0000000..3954829 --- /dev/null +++ b/Assets.xcassets/VPN/icn_personalized_blocking.imageset/icn_personalized_blocking.pdf @@ -0,0 +1,113 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +0.313726 0.756863 0.976471 scn +15.350000 0.000000 m +15.350000 11.250000 l +18.350000 11.250000 l +18.350000 7.100000 l +36.000000 7.100000 l +36.000000 4.100000 l +18.350000 4.100000 l +18.350000 0.000000 l +15.350000 0.000000 l +h +0.000000 4.100000 m +0.000000 7.100000 l +12.350000 7.100000 l +12.350000 4.100000 l +0.000000 4.100000 l +h +9.350000 12.400000 m +9.350000 16.500000 l +0.000000 16.500000 l +0.000000 19.500000 l +9.350000 19.500000 l +9.350000 23.700001 l +12.350000 23.700001 l +12.350000 12.400000 l +9.350000 12.400000 l +h +15.350000 16.500000 m +15.350000 19.500000 l +36.000000 19.500000 l +36.000000 16.500000 l +15.350000 16.500000 l +h +23.650000 24.750000 m +23.650000 36.000000 l +26.650000 36.000000 l +26.650000 31.900000 l +36.000000 31.900000 l +36.000000 28.900000 l +26.650000 28.900000 l +26.650000 24.750000 l +23.650000 24.750000 l +h +0.000000 28.900000 m +0.000000 31.900000 l +20.650000 31.900000 l +20.650000 28.900000 l +0.000000 28.900000 l +h +f +n +Q + +endstream +endobj + +3 0 obj + 1036 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 36.000000 36.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000001126 00000 n +0000001149 00000 n +0000001322 00000 n +0000001396 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +1455 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/VPN/icn_whitelist.imageset/Contents.json b/Assets.xcassets/VPN/icn_whitelist.imageset/Contents.json new file mode 100644 index 0000000..55f6c3a --- /dev/null +++ b/Assets.xcassets/VPN/icn_whitelist.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icn_whitelists.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/VPN/icn_whitelist.imageset/icn_whitelists.pdf b/Assets.xcassets/VPN/icn_whitelist.imageset/icn_whitelists.pdf new file mode 100644 index 0000000..e94a02f --- /dev/null +++ b/Assets.xcassets/VPN/icn_whitelist.imageset/icn_whitelists.pdf @@ -0,0 +1,118 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm +1.000000 0.541176 0.000000 scn +3.000000 0.000000 m +2.175000 0.000000 1.468750 0.293751 0.881250 0.881248 c +0.293750 1.468750 0.000000 2.174999 0.000000 3.000000 c +0.000000 33.000000 l +0.000000 33.825001 0.293750 34.531250 0.881250 35.118752 c +1.468750 35.706249 2.175000 36.000000 3.000000 36.000000 c +13.250000 36.000000 l +13.416667 37.166668 13.950000 38.125000 14.850000 38.875000 c +15.750000 39.625000 16.800001 40.000000 18.000000 40.000000 c +19.200001 40.000000 20.250000 39.625000 21.150000 38.875000 c +22.050001 38.125000 22.583334 37.166668 22.750000 36.000000 c +33.000000 36.000000 l +33.825001 36.000000 34.531250 35.706249 35.118752 35.118752 c +35.706249 34.531250 36.000000 33.825001 36.000000 33.000000 c +36.000000 3.000000 l +36.000000 2.174999 35.706249 1.468750 35.118752 0.881248 c +34.531250 0.293751 33.825001 0.000000 33.000000 0.000000 c +3.000000 0.000000 l +h +3.000000 3.000000 m +33.000000 3.000000 l +33.000000 33.000000 l +3.000000 33.000000 l +3.000000 3.000000 l +h +8.000000 8.000000 m +21.650000 8.000000 l +21.650000 11.000000 l +8.000000 11.000000 l +8.000000 8.000000 l +h +8.000000 16.500000 m +28.000000 16.500000 l +28.000000 19.500000 l +8.000000 19.500000 l +8.000000 16.500000 l +h +8.000000 25.000000 m +28.000000 25.000000 l +28.000000 28.000000 l +8.000000 28.000000 l +8.000000 25.000000 l +h +18.000000 33.849998 m +18.466667 33.849998 18.875000 34.025002 19.225000 34.375000 c +19.575001 34.724998 19.750000 35.133331 19.750000 35.599998 c +19.750000 36.066666 19.575001 36.474998 19.225000 36.825001 c +18.875000 37.174999 18.466667 37.349998 18.000000 37.349998 c +17.533333 37.349998 17.125000 37.174999 16.775000 36.825001 c +16.425001 36.474998 16.250000 36.066666 16.250000 35.599998 c +16.250000 35.133331 16.425001 34.724998 16.775000 34.375000 c +17.125000 34.025002 17.533333 33.849998 18.000000 33.849998 c +h +f +n +Q + +endstream +endobj + +3 0 obj + 1923 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 36.000000 40.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000002013 00000 n +0000002036 00000 n +0000002209 00000 n +0000002283 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +2342 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/icn_firewall.imageset/Contents.json b/Assets.xcassets/icn_firewall.imageset/Contents.json new file mode 100644 index 0000000..aae1cd5 --- /dev/null +++ b/Assets.xcassets/icn_firewall.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icn_firewall.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/icn_firewall.imageset/icn_firewall.pdf b/Assets.xcassets/icn_firewall.imageset/icn_firewall.pdf new file mode 100644 index 0000000..47fa338 --- /dev/null +++ b/Assets.xcassets/icn_firewall.imageset/icn_firewall.pdf @@ -0,0 +1,123 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 0.000000 -0.038940 cm +0.000000 0.678431 0.905882 scn +9.368752 21.862000 m +9.194237 21.920187 9.005553 21.920187 8.831038 21.861998 c +0.583308 19.111998 l +0.236485 18.996359 0.002457 18.671904 0.002168 18.306311 c +0.001081 16.243475 l +0.000538 14.868362 -0.000004 12.805750 0.000000 10.055637 c +0.000004 6.883197 2.356120 4.369862 4.453098 2.738857 c +5.528415 1.902489 6.598883 1.248783 7.398052 0.804794 c +7.798634 0.582245 8.133549 0.411011 8.370125 0.294598 c +8.488472 0.236362 8.582383 0.191763 8.647791 0.161238 c +8.680501 0.145973 8.706099 0.134222 8.724077 0.126038 c +8.745275 0.116442 l +8.751473 0.113661 l +8.753452 0.112778 l +8.753727 0.112656 8.754677 0.112232 9.099898 0.888971 c +8.754677 0.112232 l +8.974457 0.014551 9.225331 0.014549 9.445113 0.112228 c +9.099898 0.888971 l +9.445113 0.112228 9.444839 0.112106 9.445113 0.112228 c +9.448316 0.113657 l +9.454515 0.116438 l +9.475712 0.126034 l +9.493691 0.134218 9.519290 0.145969 9.552000 0.161234 c +9.617410 0.191759 9.711323 0.236359 9.829673 0.294594 c +10.066255 0.411007 10.401177 0.582241 10.801768 0.804789 c +11.600957 1.248777 12.671450 1.902485 13.746792 2.738852 c +15.843817 4.369852 18.199993 6.883188 18.199993 10.055638 c +18.199993 12.805750 18.199451 14.868362 18.198910 16.243473 c +18.197826 18.305799 l +18.197538 18.671396 17.963507 18.996363 17.616680 19.112000 c +9.368752 21.862000 l +h +1.701082 16.242804 m +1.701782 17.692917 l +9.099901 20.159637 l +16.498211 17.692913 l +16.498909 16.242804 l +16.499146 15.644088 16.499382 14.915001 16.499573 14.055543 c +8.824856 16.660160 l +8.824856 15.094015 l +16.499844 12.489305 l +16.499937 11.748799 16.499992 10.937577 16.499992 10.055638 c +16.499992 9.977984 16.498024 9.900617 16.494143 9.823545 c +8.824856 12.426319 l +8.824856 10.860174 l +16.191282 8.360183 l +15.883361 7.509837 15.364548 6.707459 14.723963 5.966928 c +8.824856 8.102413 l +8.824856 6.523023 l +13.572360 4.804420 l +13.291318 4.553133 12.999986 4.311666 12.703099 4.080757 c +11.715919 3.312958 10.723887 2.706247 9.976183 2.290861 c +9.615200 2.090317 9.313493 1.935654 9.099903 1.830183 c +8.886319 1.935654 8.584622 2.090315 8.223654 2.290857 c +7.475968 2.706244 6.483963 3.312952 5.496806 4.080751 c +3.468838 5.658081 1.700004 7.728080 1.700001 10.055639 c +1.699997 12.805528 1.700539 14.867916 1.701082 16.242804 c +h +f* +n +Q + +endstream +endobj + +3 0 obj + 2375 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 18.199997 21.866699 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000002465 00000 n +0000002488 00000 n +0000002661 00000 n +0000002735 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +2794 +%%EOF \ No newline at end of file diff --git a/Assets.xcassets/icn_vpn.imageset/Contents.json b/Assets.xcassets/icn_vpn.imageset/Contents.json new file mode 100644 index 0000000..00e105c --- /dev/null +++ b/Assets.xcassets/icn_vpn.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icn_vpn.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Assets.xcassets/icn_vpn.imageset/icn_vpn.pdf b/Assets.xcassets/icn_vpn.imageset/icn_vpn.pdf new file mode 100644 index 0000000..117a703 --- /dev/null +++ b/Assets.xcassets/icn_vpn.imageset/icn_vpn.pdf @@ -0,0 +1,138 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 0.000000 0.149963 cm +0.600000 0.600000 0.600000 scn +11.849976 3.579506 m +11.546523 3.087814 11.212810 2.613092 10.849998 2.158247 c +9.058451 4.404251 7.976406 7.134955 7.744002 10.000012 c +13.955997 10.000012 l +13.945384 9.869171 13.932999 9.738609 13.918855 9.608362 c +14.005692 9.704117 14.098930 9.795992 14.198324 9.883459 c +14.901587 10.502329 15.855413 10.850006 16.849976 10.850006 c +17.780272 10.850006 18.674925 10.545810 19.362213 10.000012 c +19.961042 10.000012 l +19.944735 9.822983 19.923386 9.647412 19.897137 9.473449 c +20.351223 8.916369 20.599976 8.244474 20.599976 7.550006 c +20.599976 6.450006 l +20.770750 6.450006 l +21.368084 7.794821 21.700001 9.283655 21.700001 10.850012 c +21.700001 16.842300 16.842289 21.700012 10.850000 21.700012 c +4.857711 21.700012 0.000000 16.842300 0.000000 10.850012 c +0.000000 4.857723 4.857711 0.000011 10.850000 0.000011 c +11.345162 0.000011 11.832578 0.033180 12.310145 0.097420 c +12.277525 0.120823 12.246119 0.145763 12.216092 0.172188 c +11.981672 0.378477 11.849976 0.658268 11.849976 0.950006 c +11.849976 3.579506 l +h +8.918088 19.795685 m +5.061772 18.966837 2.108130 15.707682 1.738958 11.700012 c +6.039007 11.700012 l +6.250525 14.616378 7.249507 17.413153 8.918088 19.795685 c +h +12.781912 19.795685 m +14.450494 17.413153 15.449475 14.616378 15.660994 11.700012 c +19.961042 11.700012 l +19.591869 15.707682 16.638227 18.966839 12.781912 19.795685 c +h +13.955997 11.700012 m +13.723594 14.565069 12.641545 17.295773 10.849998 19.541779 c +9.058451 17.295773 7.976406 14.565069 7.744002 11.700012 c +13.955997 11.700012 l +h +6.039007 10.000012 m +1.738958 10.000012 l +2.108130 5.992342 5.061772 2.733187 8.918088 1.904341 c +7.249507 4.286873 6.250525 7.083647 6.039007 10.000012 c +h +f* +n +Q +q +1.000000 0.000000 -0.000000 1.000000 0.000000 11.849976 cm +0.600000 0.600000 0.600000 scn +16.849976 -1.850006 m +17.645624 -1.850006 18.408688 -2.166077 18.971296 -2.728685 c +19.533905 -3.291294 19.849976 -4.054357 19.849976 -4.850006 c +19.849976 -5.850006 l +20.849976 -5.850006 l +20.849976 -10.850006 l +20.849976 -11.115223 20.744619 -11.369577 20.557083 -11.557114 c +20.369547 -11.744650 20.115192 -11.850006 19.849976 -11.850006 c +13.849976 -11.850006 l +13.584759 -11.850006 13.330405 -11.744650 13.142869 -11.557114 c +12.955333 -11.369577 12.849976 -11.115223 12.849976 -10.850006 c +12.849976 -5.850006 l +13.849976 -5.850006 l +13.849976 -4.850006 l +13.849976 -4.054357 14.166046 -3.291294 14.728655 -2.728685 c +15.291264 -2.166077 16.054327 -1.850006 16.849976 -1.850006 c +h +16.849976 -3.850006 m +16.336975 -3.850006 15.849976 -4.300006 15.849976 -4.850006 c +15.849976 -5.850006 l +17.849976 -5.850006 l +17.849976 -4.850006 l +17.849976 -4.584789 17.744619 -4.330436 17.557083 -4.142900 c +17.369547 -3.955363 17.115192 -3.850006 16.849976 -3.850006 c +h +f +n +Q + +endstream +endobj + +3 0 obj + 2865 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 21.700012 21.849976 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Pages 5 0 R + /Type /Catalog + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000002955 00000 n +0000002978 00000 n +0000003151 00000 n +0000003225 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +3284 +%%EOF \ No newline at end of file diff --git a/FirewallUtilities.swift b/FirewallUtilities.swift index 597a8a9..6f4022c 100644 --- a/FirewallUtilities.swift +++ b/FirewallUtilities.swift @@ -461,6 +461,15 @@ func addBlockedList(listName: String) { defaults.set(encodedData, forKey: kUserBlockedLists) } +func changeBlockedListName(from listName: String, to newListName: String) { + var data = getBlockedLists() + data.userBlockListsDefaults[newListName] = data.userBlockListsDefaults[listName] + data.userBlockListsDefaults[newListName]?.name = newListName + data.userBlockListsDefaults[listName] = nil + let encodedData = try? JSONEncoder().encode(data) + defaults.set(encodedData, forKey: kUserBlockedLists) +} + func deleteBlockedList(listName: String) { var data = getBlockedLists() data.userBlockListsDefaults[listName] = nil diff --git a/LockdowniOS.xcodeproj/project.pbxproj b/LockdowniOS.xcodeproj/project.pbxproj index eab1e41..cc9bfe1 100644 --- a/LockdowniOS.xcodeproj/project.pbxproj +++ b/LockdowniOS.xcodeproj/project.pbxproj @@ -202,6 +202,10 @@ 3DF2455423A2F8A400E46613 /* EmailSignUpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DF2455323A2F8A400E46613 /* EmailSignUpViewController.swift */; }; 3DF2455623A306DB00E46613 /* Loader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DF2455523A306DB00E46613 /* Loader.swift */; }; 3DF5D75F2633B1E100F77D79 /* amazon_trackers.txt in Resources */ = {isa = PBXBuildFile; fileRef = 3DF5D75E2633B1E100F77D79 /* amazon_trackers.txt */; }; + 4015B4F729EFD9AC004102E0 /* AccessLevelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4015B4F629EFD9AC004102E0 /* AccessLevelView.swift */; }; + 4015B4FD29F00DD8004102E0 /* LDVpnViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4015B4FC29F00DD8004102E0 /* LDVpnViewController.swift */; }; + 4015B4FF29F14C95004102E0 /* LDCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4015B4FE29F14C95004102E0 /* LDCardView.swift */; }; + 4015B50329F16E1A004102E0 /* LDConfigurationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4015B50229F16E1A004102E0 /* LDConfigurationViewController.swift */; }; 402D24B829D59B4400A5AB60 /* EmptyListsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 402D24B729D59B4400A5AB60 /* EmptyListsView.swift */; }; 402D24CB29D87B5A00A5AB60 /* ListsSubmenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 402D24CA29D87B5A00A5AB60 /* ListsSubmenuView.swift */; }; 402D24D429D87F4500A5AB60 /* CustomBlockedTableHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 402D24D329D87F4500A5AB60 /* CustomBlockedTableHeader.swift */; }; @@ -218,7 +222,13 @@ 402D252F29E6357700A5AB60 /* ListDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 402D252E29E6357700A5AB60 /* ListDetailViewController.swift */; }; 402D253129E635CB00A5AB60 /* DomainsBlockedTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 402D253029E635CB00A5AB60 /* DomainsBlockedTableViewCell.swift */; }; 402D253329E6588000A5AB60 /* ListDescriptionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 402D253229E6588000A5AB60 /* ListDescriptionViewController.swift */; }; - 402D253B29E8F9A400A5AB60 /* JSONSerialization+Extentions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 402D253A29E8F9A400A5AB60 /* JSONSerialization+Extentions.swift */; }; + 402D253B29E8F9A400A5AB60 /* JSONSerialization+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 402D253A29E8F9A400A5AB60 /* JSONSerialization+Extensions.swift */; }; + 402D254829EE112E00A5AB60 /* LDFirewallViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 402D254729EE112E00A5AB60 /* LDFirewallViewController.swift */; }; + 402D254A29EE1C6E00A5AB60 /* DescriptionLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 402D254929EE1C6E00A5AB60 /* DescriptionLabel.swift */; }; + 402D254C29EE32F300A5AB60 /* FirewallSegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 402D254B29EE32F300A5AB60 /* FirewallSegmentedControl.swift */; }; + 402D254E29EE598D00A5AB60 /* TrackersGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 402D254D29EE598D00A5AB60 /* TrackersGroupView.swift */; }; + 402D255029EE78D600A5AB60 /* OverallStatiscticView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 402D254F29EE78D600A5AB60 /* OverallStatiscticView.swift */; }; + 40FC414329F74C7900BD7396 /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40FC414229F74C7900BD7396 /* String+Extensions.swift */; }; 4A86219093026DE70A097E79 /* Pods-LockdownTests-metadata.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8DA68459884385F76BF86234 /* Pods-LockdownTests-metadata.plist */; }; 54F0B1A0273200B0002F3630 /* FirewallController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DCA4F4022F252720017740D /* FirewallController.swift */; }; 5647ACFEBBAB001FAE27CAF9 /* Pods-LockdownTunnel-settings-metadata.plist in Resources */ = {isa = PBXBuildFile; fileRef = 6F089C7008AB8F59DE3EA7BD /* Pods-LockdownTunnel-settings-metadata.plist */; }; @@ -616,6 +626,10 @@ 3DF2455323A2F8A400E46613 /* EmailSignUpViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailSignUpViewController.swift; sourceTree = ""; }; 3DF2455523A306DB00E46613 /* Loader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Loader.swift; sourceTree = ""; }; 3DF5D75E2633B1E100F77D79 /* amazon_trackers.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = amazon_trackers.txt; sourceTree = ""; }; + 4015B4F629EFD9AC004102E0 /* AccessLevelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessLevelView.swift; sourceTree = ""; }; + 4015B4FC29F00DD8004102E0 /* LDVpnViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LDVpnViewController.swift; sourceTree = ""; }; + 4015B4FE29F14C95004102E0 /* LDCardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LDCardView.swift; sourceTree = ""; }; + 4015B50229F16E1A004102E0 /* LDConfigurationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LDConfigurationViewController.swift; sourceTree = ""; }; 402D24B729D59B4400A5AB60 /* EmptyListsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyListsView.swift; sourceTree = ""; }; 402D24CA29D87B5A00A5AB60 /* ListsSubmenuView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListsSubmenuView.swift; sourceTree = ""; }; 402D24D329D87F4500A5AB60 /* CustomBlockedTableHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomBlockedTableHeader.swift; sourceTree = ""; }; @@ -632,7 +646,13 @@ 402D252E29E6357700A5AB60 /* ListDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListDetailViewController.swift; sourceTree = ""; }; 402D253029E635CB00A5AB60 /* DomainsBlockedTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomainsBlockedTableViewCell.swift; sourceTree = ""; }; 402D253229E6588000A5AB60 /* ListDescriptionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListDescriptionViewController.swift; sourceTree = ""; }; - 402D253A29E8F9A400A5AB60 /* JSONSerialization+Extentions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "JSONSerialization+Extentions.swift"; sourceTree = ""; }; + 402D253A29E8F9A400A5AB60 /* JSONSerialization+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "JSONSerialization+Extensions.swift"; sourceTree = ""; }; + 402D254729EE112E00A5AB60 /* LDFirewallViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LDFirewallViewController.swift; sourceTree = ""; }; + 402D254929EE1C6E00A5AB60 /* DescriptionLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DescriptionLabel.swift; sourceTree = ""; }; + 402D254B29EE32F300A5AB60 /* FirewallSegmentedControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirewallSegmentedControl.swift; sourceTree = ""; }; + 402D254D29EE598D00A5AB60 /* TrackersGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackersGroupView.swift; sourceTree = ""; }; + 402D254F29EE78D600A5AB60 /* OverallStatiscticView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverallStatiscticView.swift; sourceTree = ""; }; + 40FC414229F74C7900BD7396 /* String+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extensions.swift"; sourceTree = ""; }; 4CA426CE326B009F3E4493D1 /* Pods_Lockdown.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Lockdown.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 50F9BE503587CE4933CB7983 /* Pods-Lockdown-settings-metadata.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "Pods-Lockdown-settings-metadata.plist"; path = "Settings.bundle/Pods-Lockdown-settings-metadata.plist"; sourceTree = ""; }; 50FB8ADA1D444FD9486F2D44 /* Pods-Lockdown Firewall Widget-settings-metadata.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "Pods-Lockdown Firewall Widget-settings-metadata.plist"; path = "LockdowniOS/Settings.bundle/Pods-Lockdown Firewall Widget-settings-metadata.plist"; sourceTree = ""; }; @@ -1092,9 +1112,61 @@ name = Main; sourceTree = ""; }; + 4015B4F829F00D74004102E0 /* VPN */ = { + isa = PBXGroup; + children = ( + 4015B4FB29F00D8C004102E0 /* Models */, + 4015B4FA29F00D87004102E0 /* Views */, + 4015B4F929F00D7E004102E0 /* Controllers */, + ); + name = VPN; + sourceTree = ""; + }; + 4015B4F929F00D7E004102E0 /* Controllers */ = { + isa = PBXGroup; + children = ( + 4015B4FC29F00DD8004102E0 /* LDVpnViewController.swift */, + ); + name = Controllers; + sourceTree = ""; + }; + 4015B4FA29F00D87004102E0 /* Views */ = { + isa = PBXGroup; + children = ( + 4015B4FE29F14C95004102E0 /* LDCardView.swift */, + ); + name = Views; + sourceTree = ""; + }; + 4015B4FB29F00D8C004102E0 /* Models */ = { + isa = PBXGroup; + children = ( + ); + name = Models; + sourceTree = ""; + }; + 4015B50029F16DD9004102E0 /* Configuration */ = { + isa = PBXGroup; + children = ( + 4015B50129F16DEB004102E0 /* Controllers */, + ); + name = Configuration; + sourceTree = ""; + }; + 4015B50129F16DEB004102E0 /* Controllers */ = { + isa = PBXGroup; + children = ( + 4015B50229F16E1A004102E0 /* LDConfigurationViewController.swift */, + ); + name = Controllers; + sourceTree = ""; + }; 402D24CE29D87EF300A5AB60 /* Scenes */ = { isa = PBXGroup; children = ( + 4015B50029F16DD9004102E0 /* Configuration */, + 4015B4F829F00D74004102E0 /* VPN */, + 402D253E29EE10A100A5AB60 /* Firewall */, 402D252429E5840500A5AB60 /* Import Block List */, 402D251129E5142A00A5AB60 /* Edit Domains */, 402D24CF29D87EF900A5AB60 /* Configure Blocking */, @@ -1168,6 +1240,7 @@ 402D251A29E519B500A5AB60 /* CustomTableView.swift */, 402D251829E517E100A5AB60 /* ConfiguredNavigationView.swift */, 402D252229E5473E00A5AB60 /* EditDomainsCell.swift */, + 4015B4F629EFD9AC004102E0 /* AccessLevelView.swift */, ); name = Views; sourceTree = ""; @@ -1188,6 +1261,42 @@ name = Controllers; sourceTree = ""; }; + 402D253E29EE10A100A5AB60 /* Firewall */ = { + isa = PBXGroup; + children = ( + 402D254629EE10BB00A5AB60 /* Models */, + 402D254529EE10B500A5AB60 /* Views */, + 402D254429EE10AD00A5AB60 /* Controllers */, + ); + name = Firewall; + sourceTree = ""; + }; + 402D254429EE10AD00A5AB60 /* Controllers */ = { + isa = PBXGroup; + children = ( + 402D254729EE112E00A5AB60 /* LDFirewallViewController.swift */, + ); + name = Controllers; + sourceTree = ""; + }; + 402D254529EE10B500A5AB60 /* Views */ = { + isa = PBXGroup; + children = ( + 402D254929EE1C6E00A5AB60 /* DescriptionLabel.swift */, + 402D254B29EE32F300A5AB60 /* FirewallSegmentedControl.swift */, + 402D254D29EE598D00A5AB60 /* TrackersGroupView.swift */, + 402D254F29EE78D600A5AB60 /* OverallStatiscticView.swift */, + ); + name = Views; + sourceTree = ""; + }; + 402D254629EE10BB00A5AB60 /* Models */ = { + isa = PBXGroup; + children = ( + ); + name = Models; + sourceTree = ""; + }; 7C0D11102473EDFD00A26E04 /* Services */ = { isa = PBXGroup; children = ( @@ -1219,7 +1328,8 @@ children = ( 7C1AE07F248028F40000A7D3 /* UIKit+Extensions.swift */, 7C422EA425279724007F9C22 /* Align.swift */, - 402D253A29E8F9A400A5AB60 /* JSONSerialization+Extentions.swift */, + 402D253A29E8F9A400A5AB60 /* JSONSerialization+Extensions.swift */, + 40FC414229F74C7900BD7396 /* String+Extensions.swift */, ); name = Extensions; sourceTree = ""; @@ -2258,11 +2368,14 @@ 402D251B29E519B500A5AB60 /* CustomTableView.swift in Sources */, 7C3E8D21247D8057004B81D6 /* PushNotifications.swift in Sources */, 3DBD57A222FBB0D900DE189F /* WebViewViewController.swift in Sources */, + 402D255029EE78D600A5AB60 /* OverallStatiscticView.swift in Sources */, A118F64320B33FED009A64E7 /* FadeTransition.swift in Sources */, 7CE91C592521D54F009D8269 /* UserDefaults.swift in Sources */, 3D47CDC822F3C3F3003BD7F7 /* NVActivityIndicatorAnimationCircleStrokeSpin.swift in Sources */, 3DF2455623A306DB00E46613 /* Loader.swift in Sources */, A118F64720B33FED009A64E7 /* SpinerLayer.swift in Sources */, + 4015B4FF29F14C95004102E0 /* LDCardView.swift in Sources */, + 402D254E29EE598D00A5AB60 /* TrackersGroupView.swift in Sources */, 3D47CDC522F3C3F3003BD7F7 /* NVActivityIndicatorAnimationBallRotateChase.swift in Sources */, A1EBEACD2097AE6E002B9087 /* M13CheckboxFadeController.swift in Sources */, 3D47CDCF22F3C3F3003BD7F7 /* NVActivityIndicatorAnimationPacman.swift in Sources */, @@ -2280,6 +2393,7 @@ 3D0711B822FE79BE00391C6E /* WhyTrustViewController.swift in Sources */, A118F64520B33FED009A64E7 /* TimerEx.swift in Sources */, 7C422EAF252797A6007F9C22 /* AccountVC.swift in Sources */, + 4015B50329F16E1A004102E0 /* LDConfigurationViewController.swift in Sources */, 3D47CDD222F3C3F3003BD7F7 /* NVActivityIndicatorAnimationBallSpinFadeLoader.swift in Sources */, 3D9FC67723E503DF004122D3 /* EmailSignInViewController.swift in Sources */, 3DCA4F3322F22CB40017740D /* HomeViewController.swift in Sources */, @@ -2304,12 +2418,14 @@ A1EBEAD42097AE6E002B9087 /* M13CheckboxPathGenerator.swift in Sources */, A1EBEACB2097AE6E002B9087 /* M13CheckboxDisclosurePathGenerator.swift in Sources */, 3D47CDC622F3C3F3003BD7F7 /* NVActivityIndicatorAnimationBallPulse.swift in Sources */, + 402D254829EE112E00A5AB60 /* LDFirewallViewController.swift in Sources */, 3D47CDCB22F3C3F3003BD7F7 /* NVActivityIndicatorAnimationBallGridBeat.swift in Sources */, 3D47CDCA22F3C3F3003BD7F7 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift in Sources */, 7C422EB72527A2D1007F9C22 /* MainTabBarViewController.swift in Sources */, 3D47CDC722F3C3F3003BD7F7 /* NVActivityIndicatorAnimationBlank.swift in Sources */, A1E7481A1F9108B6004B8021 /* SpeedTest.swift in Sources */, 3D970DAF22EC15D800F9CC93 /* BlockLogViewController.swift in Sources */, + 402D254A29EE1C6E00A5AB60 /* DescriptionLabel.swift in Sources */, 402D24D429D87F4500A5AB60 /* CustomBlockedTableHeader.swift in Sources */, A1EBEADB2097AE6E002B9087 /* M13CheckboxAnimationGenerator.swift in Sources */, 7CC8EFED254036050005054C /* FirewallRepair.swift in Sources */, @@ -2327,6 +2443,7 @@ 3DBD57B022FC14CD00DE189F /* Shared.swift in Sources */, A154A07E215C78180010FFCC /* BlockListCell.swift in Sources */, 3D47CDCE22F3C3F3003BD7F7 /* NVActivityIndicatorAnimationBallScaleRippleMultiple.swift in Sources */, + 40FC414329F74C7900BD7396 /* String+Extensions.swift in Sources */, 3D47CDCC22F3C3F3003BD7F7 /* NVActivityIndicatorAnimationBallScaleMultiple.swift in Sources */, A1EBEADC2097AE6E002B9087 /* DefaultValues.swift in Sources */, A1EBEAD02097AE6E002B9087 /* M13CheckboxController.swift in Sources */, @@ -2373,14 +2490,17 @@ 3D47CDD322F3C3F3003BD7F7 /* NVActivityIndicatorAnimationLineScaleParty.swift in Sources */, A1141A151F46230500F54698 /* AppDelegate.swift in Sources */, 3DBD57AE22FBE04300DE189F /* WhitelistAddCell.swift in Sources */, + 4015B4F729EFD9AC004102E0 /* AccessLevelView.swift in Sources */, 3D47CDB922F3C3F3003BD7F7 /* NVActivityIndicatorAnimationBallTrianglePath.swift in Sources */, 402D24CB29D87B5A00A5AB60 /* ListsSubmenuView.swift in Sources */, + 4015B4FD29F00DD8004102E0 /* LDVpnViewController.swift in Sources */, A1EBEACE2097AE6E002B9087 /* M13CheckboxExpandController.swift in Sources */, 3D5F5A0C23109ABB004C3860 /* WhatIsVpnViewController.swift in Sources */, A174CCAE22B15B1000F1B840 /* BlockListViewController.swift in Sources */, 3DAF73522768572300D97BB0 /* FirewallUtilities.swift in Sources */, - 402D253B29E8F9A400A5AB60 /* JSONSerialization+Extentions.swift in Sources */, + 402D253B29E8F9A400A5AB60 /* JSONSerialization+Extensions.swift in Sources */, 3D47CDD022F3C3F3003BD7F7 /* NVActivityIndicatorAnimationBallPulseSync.swift in Sources */, + 402D254C29EE32F300A5AB60 /* FirewallSegmentedControl.swift in Sources */, 402D252729E5843300A5AB60 /* ImportBlockListViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/LockdowniOS/AccessLevelView.swift b/LockdowniOS/AccessLevelView.swift new file mode 100644 index 0000000..35377d6 --- /dev/null +++ b/LockdowniOS/AccessLevelView.swift @@ -0,0 +1,137 @@ +// +// AccessLevelView.swift +// Lockdown +// +// Created by Aliaksandr Dvoineu on 19.04.23. +// Copyright © 2023 Confirmed Inc. All rights reserved. +// + +import UIKit + +final class AccessLevelView: UIView { + + // MARK: - Properties + + private lazy var containerView: UIView = { + let view = UIView() + return view + }() + + lazy var accessLevelIv: UIImageView = { + let image = UIImageView() + image.contentMode = .scaleAspectFit + image.layer.masksToBounds = true + return image + }() + + lazy var accessLevelName: UILabel = { + let label = UILabel() + label.textColor = .label + label.font = fontBold11 + label.textAlignment = .center + return label + }() + + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Functions + + private func configureUI() { + addSubview(containerView) + containerView.anchors.edges.pin() + + containerView.addSubview(accessLevelIv) + accessLevelIv.anchors.centerX.align() + accessLevelIv.anchors.centerY.align() + + containerView.addSubview(accessLevelName) + accessLevelName.anchors.centerX.align() + accessLevelName.anchors.centerY.align() + } +} + +final class AccessLevelslView: UIView { + + // MARK: - Properties + + private lazy var containerView: UIView = { + let view = UIView() + return view + }() + + private let basicView: AccessLevelView = { + let view = AccessLevelView() + view.accessLevelIv.image = UIImage(named: "basic") + view.accessLevelName.text = "Basic" + return view + }() + + private let advancedView: AccessLevelView = { + let view = AccessLevelView() + view.accessLevelIv.image = UIImage(named: "advanced") + view.accessLevelName.text = "Advanced" + return view + }() + + let anonymousView: AccessLevelView = { + let view = AccessLevelView() + view.accessLevelIv.image = UIImage(named: "anonymous") + view.accessLevelName.text = "Anonymous" + return view + }() + + private let universalView: AccessLevelView = { + let view = AccessLevelView() + view.accessLevelIv.image = UIImage(named: "universal") + view.accessLevelName.text = "Universal" + return view + }() + + private lazy var stackView: UIStackView = { + let stackView = UIStackView() + stackView.addArrangedSubview(basicView) + stackView.addArrangedSubview(advancedView) + stackView.addArrangedSubview(anonymousView) + stackView.addArrangedSubview(universalView) + stackView.axis = .horizontal + stackView.distribution = .fillEqually + stackView.alignment = .center + stackView.spacing = 0 + return stackView + }() + + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Functions + + private func configureUI() { + + addSubview(stackView) + stackView.anchors.edges.pin() + + stackView.insertSubview(advancedView, belowSubview: basicView) + stackView.insertSubview(anonymousView, belowSubview: advancedView) + stackView.insertSubview(universalView, belowSubview: anonymousView) + } +} + diff --git a/LockdowniOS/BlockListViewController.swift b/LockdowniOS/BlockListViewController.swift index e0a1ffa..77fdd57 100644 --- a/LockdowniOS/BlockListViewController.swift +++ b/LockdowniOS/BlockListViewController.swift @@ -162,11 +162,13 @@ final class BlockListViewController: BaseViewController { paragraphLabel.anchors.top.spacing(0, to: customNavigationView.anchors.bottom) paragraphLabel.anchors.leading.readableContentPin(inset: 3) paragraphLabel.anchors.trailing.readableContentPin(inset: 3) + paragraphLabel.anchors.height.equal(60) view.addSubview(segmented) segmented.anchors.top.spacing(12, to: paragraphLabel.anchors.bottom) segmented.anchors.leading.readableContentPin() segmented.anchors.trailing.readableContentPin() + segmented.anchors.height.equal(40) } private func configureCuratedBlockedDomainsTableView() { @@ -174,6 +176,7 @@ final class BlockListViewController: BaseViewController { tableView.anchors.top.spacing(8, to: segmented.anchors.bottom) tableView.anchors.leading.pin() tableView.anchors.trailing.pin() + tableView.anchors.bottom.pin() }) reloadCuratedBlockDomains() @@ -185,7 +188,7 @@ final class BlockListViewController: BaseViewController { view.addSubview(listsLabel) listsLabel.anchors.top.spacing(24, to: segmented.anchors.bottom) listsLabel.anchors.leading.marginsPin() - + view.addSubview(addNewListButton) addNewListButton.anchors.centerY.equal(listsLabel.anchors.centerY) addNewListButton.anchors.trailing.marginsPin() @@ -376,7 +379,6 @@ extension BlockListViewController { self.didMakeChange = true let vc = ListSettingsViewController() vc.listName = list.name - vc.blockedList = list vc.blockListVC = self navigationController?.pushViewController(vc, animated: true) }.onSwipeToDelete { [unowned self] in diff --git a/LockdowniOS/DescriptionLabel.swift b/LockdowniOS/DescriptionLabel.swift new file mode 100644 index 0000000..429f7e3 --- /dev/null +++ b/LockdowniOS/DescriptionLabel.swift @@ -0,0 +1,72 @@ +// +// FirewallDescriptionLabel.swift +// Lockdown +// +// Created by Aliaksandr Dvoineu on 18.04.23. +// Copyright © 2023 Confirmed Inc. All rights reserved. +// + +import UIKit + +struct DescriptionLabelViewModel { + let text: String +} + +final class DescriptionLabel: UIView { + + // MARK: - Properties + + private lazy var lockImage: UIImageView = { + let image = UIImageView() + image.image = UIImage(named: "icn_lock") + image.contentMode = .scaleAspectFit + image.layer.masksToBounds = true + return image + }() + + private lazy var descriptionLabel: UILabel = { + let label = UILabel() + label.textColor = .label + label.font = fontMedium15 + label.textAlignment = .left + return label + }() + + private lazy var stackView: UIStackView = { + let stackView = UIStackView() + stackView.addArrangedSubview(lockImage) + stackView.addArrangedSubview(descriptionLabel) + stackView.axis = .horizontal + stackView.distribution = .fillProportionally + stackView.alignment = .center + stackView.spacing = 12 + return stackView + }() + + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Functions + + private func configureUI() { + + addSubview(stackView) + stackView.anchors.top.pin() + stackView.anchors.bottom.pin() + stackView.anchors.leading.pin() + stackView.anchors.trailing.pin() + } + + func configure(with model: DescriptionLabelViewModel) { + descriptionLabel.text = model.text + } +} diff --git a/LockdowniOS/LDCardView.swift b/LockdowniOS/LDCardView.swift new file mode 100644 index 0000000..3514879 --- /dev/null +++ b/LockdowniOS/LDCardView.swift @@ -0,0 +1,90 @@ +// +// LDCardView.swift +// Lockdown +// +// Created by Aliaksandr Dvoineu on 19.04.23. +// Copyright © 2023 Confirmed Inc. All rights reserved. +// + +import UIKit + +final class LDCardView: UIView { + + // MARK: - Properties + + var isSelected: Bool = false + + private lazy var backgroundView: UIView = { + let view = UIView() + view.isUserInteractionEnabled = true + view.layer.cornerRadius = 8 + view.layer.borderWidth = 2 + view.layer.borderColor = isSelected ? UIColor.gray.cgColor : UIColor.tunnelsBlue.cgColor + return view + }() + + lazy var iconImageView: UIImageView = { + let image = UIImageView() + image.contentMode = .scaleAspectFit + image.image = isSelected ? UIImage(named: "kksdlf") : UIImage(named: "dfgerte") + image.layer.masksToBounds = true + return image + }() + + lazy var title: UILabel = { + let label = UILabel() + label.textColor = .label + label.font = fontBold15 + label.numberOfLines = 0 + label.textAlignment = .center + return label + }() + + lazy var subTitle: UILabel = { + let label = UILabel() + label.text = "" + label.textColor = .label + label.font = fontBold15 + label.textColor = .lightGray + label.textAlignment = .center + return label + }() + + private lazy var stackView: UIStackView = { + let stackView = UIStackView() + stackView.addArrangedSubview(iconImageView) + stackView.addArrangedSubview(title) + stackView.addArrangedSubview(subTitle) + stackView.axis = .vertical + stackView.distribution = .fillProportionally + stackView.alignment = .center + stackView.spacing = 8 + return stackView + }() + + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Functions + + private func configureUI() { + + addSubview(backgroundView) + backgroundView.anchors.edges.pin() + + backgroundView.addSubview(stackView) + stackView.anchors.centerX.align() + stackView.anchors.leading.marginsPin() + stackView.anchors.trailing.marginsPin() + stackView.anchors.centerY.align() + } +} diff --git a/LockdowniOS/LDConfigurationViewController.swift b/LockdowniOS/LDConfigurationViewController.swift new file mode 100644 index 0000000..690f389 --- /dev/null +++ b/LockdowniOS/LDConfigurationViewController.swift @@ -0,0 +1,155 @@ +// +// LDConfigurationViewController.swift +// Lockdown +// +// Created by Aliaksandr Dvoineu on 20.04.23. +// Copyright © 2023 Confirmed Inc. All rights reserved. +// + +import UIKit + +final class LDConfigurationViewController: UIViewController { + + // MARK: - Properties + + private lazy var activityCard: LDCardView = { + let view = LDCardView() + view.title.text = "Activity" + view.iconImageView.image = UIImage(named: "icn_activity") + view.isUserInteractionEnabled = true + return view + }() + + private lazy var configureBlockingCard: LDCardView = { + let view = LDCardView() + view.title.text = "Configure blocking" + view.title.numberOfLines = 0 + view.iconImageView.image = UIImage(named: "icn_configure_blocking") + view.isUserInteractionEnabled = true + return view + }() + + private lazy var personalizedBlockingCard: LDCardView = { + let view = LDCardView() + view.title.text = "Personalized blocking" + view.title.numberOfLines = 0 + view.iconImageView.image = UIImage(named: "icn_personalized_blocking") + view.isUserInteractionEnabled = true + return view + }() + + private lazy var importListsCard: LDCardView = { + let view = LDCardView() + view.title.text = "Import custom block lists" + view.title.numberOfLines = 0 + view.iconImageView.image = UIImage(named: "icn_import") + view.isUserInteractionEnabled = true + return view + }() + + private lazy var hStack1: UIStackView = { + let stack = UIStackView() + stack.addArrangedSubview(activityCard) + stack.addArrangedSubview(configureBlockingCard) + stack.alignment = .center + stack.axis = .horizontal + stack.distribution = .equalCentering + stack.spacing = 16 + return stack + }() + + private lazy var hStack2: UIStackView = { + let stack = UIStackView() + stack.addArrangedSubview(personalizedBlockingCard) + stack.addArrangedSubview(importListsCard) + stack.alignment = .center + stack.axis = .horizontal + stack.distribution = .equalCentering + stack.spacing = 16 + return stack + }() + + private lazy var vStack: UIStackView = { + let stack = UIStackView() + stack.addArrangedSubview(hStack1) + stack.addArrangedSubview(hStack2) + stack.alignment = .center + stack.axis = .vertical + stack.distribution = .equalCentering + stack.spacing = 16 + return stack + }() + + private lazy var viewAccountSettingsButton: UIButton = { + let button = UIButton(type: .system) + button.setTitle("View account settings", for: .normal) + button.setTitleColor(.tunnelsBlue, for: .normal) + button.titleLabel?.font = fontBold15 + button.addTarget(self, action: #selector(viewAccountSettings), for: .touchUpInside) + return button + }() + + private lazy var viewAuditReportButton: UIButton = { + let button = UIButton(type: .system) + button.setTitle("View audit report (Feb 2023)", for: .normal) + button.setTitleColor(.tunnelsBlue, for: .normal) + button.titleLabel?.font = fontBold15 + button.addTarget(self, action: #selector(viewAccountSettings), for: .touchUpInside) + return button + }() + + lazy var vStackView: UIStackView = { + let stackView = UIStackView() + stackView.addArrangedSubview(viewAccountSettingsButton) + stackView.addArrangedSubview(viewAuditReportButton) + stackView.axis = .vertical + stackView.alignment = .center + stackView.distribution = .fillEqually + stackView.spacing = 8 + return stackView + }() + + // MARK: - LifeCycle + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = .systemBackground + + view.addSubview(vStack) + vStack.anchors.centerY.align() + vStack.anchors.centerX.align() + + activityCard.anchors.width.equal(view.bounds.width / 2 - 20) + activityCard.anchors.height.equal(view.bounds.width / 2 - 20) + + configureBlockingCard.anchors.width.equal(view.bounds.width / 2 - 20) + configureBlockingCard.anchors.height.equal(view.bounds.width / 2 - 20) + + personalizedBlockingCard.anchors.width.equal(view.bounds.width / 2 - 20) + personalizedBlockingCard.anchors.height.equal(view.bounds.width / 2 - 20) + + importListsCard.anchors.width.equal(view.bounds.width / 2 - 20) + importListsCard.anchors.height.equal(view.bounds.width / 2 - 20) + + view.addSubview(vStackView) + vStackView.anchors.top.spacing(30, to: vStack.anchors.bottom) + vStackView.anchors.leading.marginsPin() + vStackView.anchors.trailing.marginsPin() + } +} + +// MARK: - Private functions + +private extension LDConfigurationViewController { + + @objc func viewAccountSettings() { + + } + + @objc func viewAuditReport() { + + } +} + + diff --git a/LockdowniOS/LDFirewallViewController.swift b/LockdowniOS/LDFirewallViewController.swift new file mode 100644 index 0000000..543f488 --- /dev/null +++ b/LockdowniOS/LDFirewallViewController.swift @@ -0,0 +1,249 @@ +// +// LDFirewallViewController.swift +// Lockdown +// +// Created by Aliaksandr Dvoineu on 17.04.23. +// Copyright © 2023 Confirmed Inc. All rights reserved. +// + +import UIKit + +final class LDFirewallViewController: UIViewController { + + lazy var accessLevelslView: AccessLevelslView = { + let view = AccessLevelslView() + return view + }() + + private lazy var scrollView: UIScrollView = { + let view = UIScrollView() + view.isScrollEnabled = true + return view + }() + + private lazy var contentView: UIView = { + let view = UIView() + view.anchors.height.equal(1000) + return view + }() + + private lazy var firewallTitle: UILabel = { + let label = UILabel() + label.text = NSLocalizedString("Get complete protection", comment: "") + label.font = fontBold24 + label.numberOfLines = 0 + label.textColor = .label + return label + }() + + private lazy var firewallDescriptionLabel1: DescriptionLabel = { + let label = DescriptionLabel() + label.configure(with: DescriptionLabelViewModel(text: NSLocalizedString("Block as many trackers as you want", comment: ""))) + return label + }() + + private lazy var firewallDescriptionLabel2: DescriptionLabel = { + let label = DescriptionLabel() + label.configure(with: DescriptionLabelViewModel(text: NSLocalizedString("Import and export your own block lists", comment: ""))) + return label + }() + + private lazy var firewallDescriptionLabel3: DescriptionLabel = { + let label = DescriptionLabel() + label.configure(with: DescriptionLabelViewModel(text: NSLocalizedString("Access to new curated lists of trackers", comment: ""))) + return label + }() + + private lazy var stackView: UIStackView = { + let stackView = UIStackView() + stackView.addArrangedSubview(firewallTitle) + stackView.addArrangedSubview(firewallDescriptionLabel1) + stackView.addArrangedSubview(firewallDescriptionLabel2) + stackView.addArrangedSubview(firewallDescriptionLabel3) + stackView.axis = .vertical + stackView.distribution = .fillProportionally + stackView.spacing = 10 + return stackView + }() + + private lazy var cpTitle: UILabel = { + let label = UILabel() + label.text = NSLocalizedString("Only blocked with complete protection", comment: "") + label.textColor = .label + label.font = fontBold15 + label.textAlignment = .center + return label + }() + + private lazy var cpTrackersGroupView1: TrackersGroupView = { + let view = TrackersGroupView() + view.placeNumber.text = "#1" + view.configure(with: TrackersGroupViewModel(image: UIImage(named: "icn_game_marketing")!, title: "Game Marketing", number: 4678)) + return view + }() + + private lazy var cpTrackersGroupView2: TrackersGroupView = { + let view = TrackersGroupView() + view.placeNumber.text = "#2" + view.configure(with: TrackersGroupViewModel(image: UIImage(named: "icn_marketing_trackers")!, title: "Marketing Trackers", number: 3432)) + return view + }() + + private lazy var cpTrackersGroupView3: TrackersGroupView = { + let view = TrackersGroupView() + view.placeNumber.text = "#3" + view.configure(with: TrackersGroupViewModel(image: UIImage(named: "icn_email_trackers")!, title: "Email Trackers", number: 2756)) + return view + }() + + private lazy var cpStackView: UIStackView = { + let stackView = UIStackView() + stackView.addArrangedSubview(cpTitle) + stackView.addArrangedSubview(cpTrackersGroupView1) + stackView.addArrangedSubview(cpTrackersGroupView2) + stackView.addArrangedSubview(cpTrackersGroupView3) + stackView.layer.cornerRadius = 8 + stackView.layer.borderWidth = 2 + stackView.layer.borderColor = UIColor.black.cgColor + stackView.axis = .vertical + stackView.distribution = .fillEqually + stackView.spacing = 0 + stackView.backgroundColor = .secondarySystemBackground + return stackView + }() + + private lazy var upgradeButton: UIButton = { + let button = UIButton(type: .system) + button.tintColor = .white + button.setTitle(NSLocalizedString("Upgrade", comment: ""), for: .normal) + button.titleLabel?.font = fontBold18 + button.backgroundColor = .tunnelsBlue + button.layer.cornerRadius = 28 + button.anchors.height.equal(56) + button.addTarget(self, action: #selector(upgrade), for: .touchUpInside) + return button + }() + + private lazy var maTitle: UILabel = { + let label = UILabel() + label.text = NSLocalizedString("Most active this week", comment: "") + label.textColor = .label + label.font = fontBold15 + label.textAlignment = .center + return label + }() + + private lazy var maTrackersGroupView1: TrackersGroupView = { + let view = TrackersGroupView() + view.placeNumber.text = "#1" + view.number.textColor = .label + view.configure(with: TrackersGroupViewModel(image: UIImage(named: "icn_facebook_trackers")!, title: "Facebook Trackers", number: 764)) + return view + }() + + private lazy var maTrackersGroupView2: TrackersGroupView = { + let view = TrackersGroupView() + view.placeNumber.text = "#2" + view.number.textColor = .label + view.configure(with: TrackersGroupViewModel(image: UIImage(named: "icn_data_trackers")!, title: "Data Trackers", number: 330)) + return view + }() + + private lazy var maTrackersGroupView3: TrackersGroupView = { + let view = TrackersGroupView() + view.placeNumber.text = "#3" + view.number.textColor = .label + view.configure(with: TrackersGroupViewModel(image: UIImage(named: "icn_clickbait_trackers")!, title: "Clickbait", number: 106)) + return view + }() + + private lazy var maStackView: UIStackView = { + let stackView = UIStackView() + stackView.addArrangedSubview(maTitle) + stackView.addArrangedSubview(maTrackersGroupView1) + stackView.addArrangedSubview(maTrackersGroupView2) + stackView.addArrangedSubview(maTrackersGroupView3) + stackView.layer.cornerRadius = 8 + stackView.layer.borderWidth = 1 + stackView.layer.borderColor = UIColor.lightGray.cgColor + stackView.axis = .vertical + stackView.distribution = .fillEqually + stackView.spacing = 0 + return stackView + }() + + lazy var statisitcsView: OverallStatiscticView = { + let view = OverallStatiscticView() + return view + }() + + private let segmented: FirewallSegmentedControl = { + let symbolConfig = UIImage.SymbolConfiguration(pointSize: 18, weight: .regular, scale: .large) + let image = UIImage() + let text = "Swipe to Activate Firewall" + let items = [image, text] + let control = FirewallSegmentedControl(items: items) + return control + }() + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = .systemBackground + + view.addSubview(accessLevelslView) + accessLevelslView.anchors.top.safeAreaPin(inset: 18) + accessLevelslView.anchors.leading.marginsPin() + accessLevelslView.anchors.trailing.marginsPin() + + view.addSubview(scrollView) + scrollView.anchors.top.spacing(18, to: accessLevelslView.anchors.bottom) + scrollView.anchors.leading.pin() + scrollView.anchors.trailing.pin() + scrollView.anchors.bottom.pin() + + scrollView.addSubview(contentView) + contentView.anchors.top.pin() + contentView.anchors.centerX.align() + contentView.anchors.width.equal(scrollView.anchors.width) + contentView.anchors.bottom.pin() + + contentView.addSubview(stackView) + stackView.anchors.top.marginsPin() + stackView.anchors.leading.marginsPin() + stackView.anchors.trailing.marginsPin() + + contentView.addSubview(cpStackView) + cpStackView.anchors.top.spacing(18, to: stackView.anchors.bottom) + cpStackView.anchors.leading.marginsPin() + cpStackView.anchors.trailing.marginsPin() + + contentView.addSubview(upgradeButton) + upgradeButton.anchors.top.spacing(18, to: cpStackView.anchors.bottom) + upgradeButton.anchors.leading.marginsPin() + upgradeButton.anchors.trailing.marginsPin() + + contentView.addSubview(maStackView) + maStackView.anchors.top.spacing(18, to: upgradeButton.anchors.bottom) + maStackView.anchors.leading.marginsPin() + maStackView.anchors.trailing.marginsPin() + + contentView.addSubview(statisitcsView) + statisitcsView.anchors.top.spacing(18, to: maStackView.anchors.bottom) + statisitcsView.anchors.leading.marginsPin() + statisitcsView.anchors.trailing.marginsPin() + + view.addSubview(segmented) + segmented.anchors.bottom.safeAreaPin() + segmented.anchors.leading.marginsPin() + segmented.anchors.trailing.marginsPin() + segmented.anchors.height.equal(56) + } +} + +private extension LDFirewallViewController { + + @objc func upgrade() { + + } +} diff --git a/LockdowniOS/LDVpnViewController.swift b/LockdowniOS/LDVpnViewController.swift new file mode 100644 index 0000000..5aba854 --- /dev/null +++ b/LockdowniOS/LDVpnViewController.swift @@ -0,0 +1,193 @@ +// +// LDVpnViewController.swift +// Lockdown +// +// Created by Aliaksandr Dvoineu on 19.04.23. +// Copyright © 2023 Confirmed Inc. All rights reserved. +// + +import UIKit + +final class LDVpnViewController: UIViewController { + + // MARK: - Properties + + lazy var accessLevelslView: AccessLevelslView = { + let view = AccessLevelslView() + return view + }() + + private lazy var scrollView: UIScrollView = { + let view = UIScrollView() + view.isScrollEnabled = true + return view + }() + + private lazy var contentView: UIView = { + let view = UIView() + view.anchors.height.equal(640) + return view + }() + + private lazy var firewallTitle: UILabel = { + let label = UILabel() + label.text = NSLocalizedString("Get complete protection", comment: "") + label.font = fontBold24 + label.numberOfLines = 0 + label.textColor = .label + return label + }() + + private lazy var firewallDescriptionLabel1: DescriptionLabel = { + let label = DescriptionLabel() + label.configure(with: DescriptionLabelViewModel(text: NSLocalizedString("Block as many trackers as you want", comment: ""))) + return label + }() + + private lazy var firewallDescriptionLabel2: DescriptionLabel = { + let label = DescriptionLabel() + label.configure(with: DescriptionLabelViewModel(text: NSLocalizedString("Import and export your own block lists", comment: ""))) + return label + }() + + private lazy var firewallDescriptionLabel3: DescriptionLabel = { + let label = DescriptionLabel() + label.configure(with: DescriptionLabelViewModel(text: NSLocalizedString("Access to new curated lists of trackers", comment: ""))) + return label + }() + + private lazy var firewallDescriptionLabel4: DescriptionLabel = { + let label = DescriptionLabel() + label.configure(with: DescriptionLabelViewModel(text: NSLocalizedString("The only fully open source VPN", comment: ""))) + return label + }() + + private lazy var firewallDescriptionLabel5: DescriptionLabel = { + let label = DescriptionLabel() + label.configure(with: DescriptionLabelViewModel(text: NSLocalizedString("Hide your identity around the world", comment: ""))) + return label + }() + + private lazy var stackView: UIStackView = { + let stackView = UIStackView() + stackView.addArrangedSubview(firewallTitle) + stackView.addArrangedSubview(firewallDescriptionLabel1) + stackView.addArrangedSubview(firewallDescriptionLabel2) + stackView.addArrangedSubview(firewallDescriptionLabel3) + stackView.addArrangedSubview(firewallDescriptionLabel4) + stackView.addArrangedSubview(firewallDescriptionLabel5) + stackView.axis = .vertical + stackView.distribution = .fillProportionally + stackView.spacing = 10 + return stackView + }() + + private lazy var upgradeButton: UIButton = { + let button = UIButton(type: .system) + button.tintColor = .white + button.setTitle(NSLocalizedString("Upgrade", comment: ""), for: .normal) + button.titleLabel?.font = fontBold18 + button.backgroundColor = .tunnelsBlue + button.layer.cornerRadius = 28 + button.anchors.height.equal(56) + button.addTarget(self, action: #selector(upgrade), for: .touchUpInside) + return button + }() + + private lazy var whitelistCard: LDCardView = { + let view = LDCardView() + view.title.text = "Whitelist" + view.iconImageView.image = UIImage(named: "icn_whitelist") + view.isUserInteractionEnabled = true + return view + }() + + private lazy var regionCard: LDCardView = { + let view = LDCardView() + view.title.text = "Region" + view.iconImageView.image = UIImage(named: "icn_globe") + view.subTitle.text = "USA West" + view.isUserInteractionEnabled = true + return view + }() + + private lazy var hStack: UIStackView = { + let stack = UIStackView() + stack.addArrangedSubview(whitelistCard) + stack.addArrangedSubview(regionCard) + stack.alignment = .center + stack.distribution = .equalCentering + stack.spacing = 16 + return stack + }() + + private let segmented: FirewallSegmentedControl = { + let symbolConfig = UIImage.SymbolConfiguration(pointSize: 18, weight: .regular, scale: .large) + let image = UIImage() + let text = "Swipe to Activate Firewall" + let items = [image, text] + let control = FirewallSegmentedControl(items: items) + return control + }() + + // MARK: - LifeCycle + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = .systemBackground + + view.addSubview(accessLevelslView) + accessLevelslView.anchors.top.safeAreaPin(inset: 18) + accessLevelslView.anchors.leading.marginsPin() + accessLevelslView.anchors.trailing.marginsPin() + + view.addSubview(scrollView) + scrollView.anchors.top.spacing(18, to: accessLevelslView.anchors.bottom) + scrollView.anchors.leading.pin() + scrollView.anchors.trailing.pin() + scrollView.anchors.bottom.pin() + + scrollView.addSubview(contentView) + contentView.anchors.top.pin() + contentView.anchors.centerX.align() + contentView.anchors.width.equal(scrollView.anchors.width) + contentView.anchors.bottom.pin() + + contentView.addSubview(stackView) + stackView.anchors.top.marginsPin() + stackView.anchors.leading.marginsPin() + stackView.anchors.trailing.marginsPin() + + contentView.addSubview(upgradeButton) + upgradeButton.anchors.top.spacing(18, to: stackView.anchors.bottom) + upgradeButton.anchors.leading.marginsPin() + upgradeButton.anchors.trailing.marginsPin() + + contentView.addSubview(hStack) + hStack.anchors.top.spacing(18, to: upgradeButton.anchors.bottom) + hStack.anchors.centerX.align() + + whitelistCard.anchors.width.equal(view.bounds.width / 2 - 20) + whitelistCard.anchors.height.equal(view.bounds.width / 2 - 20) + + regionCard.anchors.width.equal(view.bounds.width / 2 - 20) + regionCard.anchors.height.equal(view.bounds.width / 2 - 20) + + view.addSubview(segmented) + segmented.anchors.bottom.safeAreaPin() + segmented.anchors.leading.marginsPin() + segmented.anchors.trailing.marginsPin() + segmented.anchors.height.equal(56) + } +} + +// MARK: - Private functions + +private extension LDVpnViewController { + + @objc func upgrade() { + + } +} + diff --git a/LockdowniOS/ListDescriptionViewController.swift b/LockdowniOS/ListDescriptionViewController.swift index 96ca830..406d7dd 100644 --- a/LockdowniOS/ListDescriptionViewController.swift +++ b/LockdowniOS/ListDescriptionViewController.swift @@ -8,10 +8,16 @@ import UIKit +protocol ListDescriptionViewControllerDelegate { + func changeListDescription(description: String) +} + final class ListDescriptionViewController: UIViewController { var listName = "" + var delegate: ListDescriptionViewControllerDelegate? + var domains = getBlockedLists().userBlockListsDefaults // MARK: - Properties @@ -23,7 +29,6 @@ final class ListDescriptionViewController: UIViewController { view.leftNavButton.addTarget(self, action: #selector(returnBack), for: .touchUpInside) view.rightNavButton.setTitle("DONE", for: .normal) view.rightNavButton.addTarget(self, action: #selector(doneButtonClicked), for: .touchUpInside) - view.rightNavButton.tintColor = .gray return view }() @@ -36,9 +41,19 @@ final class ListDescriptionViewController: UIViewController { view.backgroundColor = .systemBackground view.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 15, height: .zero)) view.leftViewMode = .always + view.addTarget(self, action: #selector(handleTextChange), for: .editingChanged) return view }() + private lazy var validationPrompt: UILabel = { + let label = UILabel() + label.textColor = .red + label.font = fontRegular14 + label.textAlignment = .left + label.numberOfLines = 0 + return label + }() + // MARK: - Lifecycle override func viewDidLoad() { super.viewDidLoad() @@ -46,6 +61,7 @@ final class ListDescriptionViewController: UIViewController { let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) tap.cancelsTouchesInView = false view.addGestureRecognizer(tap) + configureUI() } @@ -61,6 +77,11 @@ final class ListDescriptionViewController: UIViewController { descriptionTextField.anchors.leading.marginsPin() descriptionTextField.anchors.trailing.marginsPin() descriptionTextField.anchors.height.equal(40) + + view.addSubview(validationPrompt) + validationPrompt.anchors.top.spacing(8, to: descriptionTextField.anchors.bottom) + validationPrompt.anchors.leading.marginsPin() + validationPrompt.anchors.trailing.marginsPin() } override func viewDidLayoutSubviews() { @@ -72,9 +93,15 @@ final class ListDescriptionViewController: UIViewController { // MARK: - Functions private extension ListDescriptionViewController { - func isValidListName(_ text: String) -> Bool { - let regEx = "^[a-zA-Z0-9]{1,20}$" - return text.range(of: "\(regEx)", options: .regularExpression) != nil + @objc func handleTextChange() { + guard let text = descriptionTextField.text else { return } + if text.isValid(.listDescription) { + navigationView.rightNavButton.isEnabled = true + validationPrompt.text = "" + } else { + navigationView.rightNavButton.isEnabled = false + validationPrompt.text = "Invalid Description. Please use only letters and digits. The maximum number of symbols is 500." + } } @objc func returnBack() { @@ -82,6 +109,10 @@ private extension ListDescriptionViewController { } @objc func doneButtonClicked() { + + guard let newDescription = descriptionTextField.text else { return } + delegate?.changeListDescription(description: newDescription) + let domains = getBlockedLists().userBlockListsDefaults var userList = domains[listName] @@ -99,23 +130,3 @@ private extension ListDescriptionViewController { view.endEditing(true) } } - -// MARK: - TextField delegate methods -extension ListDescriptionViewController: UITextFieldDelegate { - - func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool{ - if textField == descriptionTextField { - - if let text = descriptionTextField.text { - if self.isValidListName(text) == true { - navigationView.rightNavButton.isEnabled = true - navigationView.rightNavButton.setTitleColor(.tunnelsBlue, for: .normal) - } else { - navigationView.rightNavButton.isEnabled = false - navigationView.rightNavButton.setTitleColor(.gray, for: .normal) - } - } - } - return true - } -} diff --git a/LockdowniOS/ListDetailViewController.swift b/LockdowniOS/ListDetailViewController.swift index 9664bd0..59c3eb0 100644 --- a/LockdowniOS/ListDetailViewController.swift +++ b/LockdowniOS/ListDetailViewController.swift @@ -8,8 +8,14 @@ import UIKit +protocol ListDetailViewControllerDelegate { + func changeListName(name: String) +} + final class ListDetailViewController: UIViewController { + var delegate: ListDetailViewControllerDelegate? + var listName = "" // MARK: - Properties @@ -21,11 +27,10 @@ final class ListDetailViewController: UIViewController { view.leftNavButton.addTarget(self, action: #selector(returnBack), for: .touchUpInside) view.rightNavButton.setTitle("DONE", for: .normal) view.rightNavButton.addTarget(self, action: #selector(doneButtonClicked), for: .touchUpInside) - view.rightNavButton.tintColor = .gray return view }() - private lazy var listNameTextField: UITextField = { + lazy var listNameTextField: UITextField = { let view = UITextField() view.text = listName view.font = fontMedium17 @@ -33,9 +38,19 @@ final class ListDetailViewController: UIViewController { view.backgroundColor = .systemBackground view.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 15, height: .zero)) view.leftViewMode = .always + view.addTarget(self, action: #selector(handleTextChange), for: .editingChanged) return view }() + private lazy var validationPrompt: UILabel = { + let label = UILabel() + label.textColor = .red + label.font = fontRegular14 + label.textAlignment = .left + label.numberOfLines = 0 + return label + }() + // MARK: - Lifecycle override func viewDidLoad() { super.viewDidLoad() @@ -58,6 +73,11 @@ final class ListDetailViewController: UIViewController { listNameTextField.anchors.leading.marginsPin() listNameTextField.anchors.trailing.marginsPin() listNameTextField.anchors.height.equal(40) + + view.addSubview(validationPrompt) + validationPrompt.anchors.top.spacing(8, to: listNameTextField.anchors.bottom) + validationPrompt.anchors.leading.marginsPin() + validationPrompt.anchors.trailing.marginsPin() } override func viewDidLayoutSubviews() { @@ -67,11 +87,17 @@ final class ListDetailViewController: UIViewController { } // MARK: - Functions -private extension ListDetailViewController { +extension ListDetailViewController { - func isValidListName(_ text: String) -> Bool { - let regEx = "^[a-zA-Z0-9]{1,20}$" - return text.range(of: "\(regEx)", options: .regularExpression) != nil + @objc func handleTextChange() { + guard let text = listNameTextField.text else { return } + if text.isValid(.listName) { + navigationView.rightNavButton.isEnabled = true + validationPrompt.text = "" + } else { + navigationView.rightNavButton.isEnabled = false + validationPrompt.text = "Invalid name. Please use only letters and digits. The maximum number of symbols is 20." + } } @objc func returnBack() { @@ -79,31 +105,14 @@ private extension ListDetailViewController { } @objc func doneButtonClicked() { + + guard let newListName = listNameTextField.text else { return } + delegate?.changeListName(name: newListName) + changeBlockedListName(from: listName, to: newListName) navigationController?.popViewController(animated: true) - // TODO: - add new list name to defaults if changed } @objc func dismissKeyboard() { view.endEditing(true) } } - -// MARK: - TextField delegate methods -extension ListDetailViewController: UITextFieldDelegate { - - func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool{ - if textField == listNameTextField { - - if let text = listNameTextField.text { - if self.isValidListName(text) == true { - navigationView.rightNavButton.isEnabled = true - navigationView.rightNavButton.setTitleColor(.tunnelsBlue, for: .normal) - } else { - navigationView.rightNavButton.isEnabled = false - navigationView.rightNavButton.setTitleColor(.gray, for: .normal) - } - } - } - return true - } -} diff --git a/LockdowniOS/ListSettingsViewController.swift b/LockdowniOS/ListSettingsViewController.swift index 83d67c9..2bba215 100644 --- a/LockdowniOS/ListSettingsViewController.swift +++ b/LockdowniOS/ListSettingsViewController.swift @@ -12,11 +12,9 @@ import CocoaLumberjackSwift final class ListSettingsViewController: UIViewController { // MARK: - Properties + private var blockedList: UserBlockListsGroup? var listName = "" - var descriptionText = "" - - var blockedList: UserBlockListsGroup? weak var blockListVC: BlockListViewController? @@ -24,7 +22,7 @@ final class ListSettingsViewController: UIViewController { lazy var navigationView: ConfiguredNavigationView = { let view = ConfiguredNavigationView() - view.titleLabel.text = listName + view.titleLabel.text = "List Settings" view.leftNavButton.setTitle(NSLocalizedString("BACK", comment: ""), for: .normal) view.leftNavButton.setImage(UIImage(systemName: "chevron.left"), for: .normal) view.leftNavButton.addTarget(self, action: #selector(backButtonClicked), for: .touchUpInside) @@ -66,6 +64,12 @@ final class ListSettingsViewController: UIViewController { configureTableView() } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + let userBlockedLists = getBlockedLists().userBlockListsDefaults + blockedList = userBlockedLists[listName] + } + // MARK: - Configure UI func configureUI() { view.addSubview(navigationView) @@ -152,8 +156,7 @@ extension ListSettingsViewController: UITableViewDataSource { } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - let userBlockedLists = getBlockedLists().userBlockListsDefaults - let numberOfDomains = userBlockedLists[listName]?.domains.count + let numberOfDomains = blockedList?.domains.count switch section { case 0, 1: return 1 @@ -167,29 +170,25 @@ extension ListSettingsViewController: UITableViewDataSource { } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let userBlockedLists = getBlockedLists().userBlockListsDefaults - let domains = userBlockedLists[listName]?.domains switch indexPath.section { case 0: guard let cell = tableView.dequeueReusableCell(withIdentifier: ListBlockedTableViewCell.identifier, for: indexPath) as? ListBlockedTableViewCell else { return UITableViewCell() } - cell.label.text = userBlockedLists[listName]?.name + cell.label.text = listName return cell case 1: guard let cell = tableView.dequeueReusableCell(withIdentifier: ListBlockedTableViewCell.identifier, for: indexPath) as? ListBlockedTableViewCell else { return UITableViewCell() } - - cell.label.text = userBlockedLists[listName]?.description ?? "Description" - + cell.label.text = blockedList?.description ?? "Description" return cell case 2: guard let cell = tableView.dequeueReusableCell(withIdentifier: DomainsBlockedTableViewCell.identifier, for: indexPath) as? DomainsBlockedTableViewCell else { return UITableViewCell() } - cell.label.text = domains?[indexPath.row].name + cell.label.text = blockedList?.domains[indexPath.row].name return cell default: return UITableViewCell() @@ -201,10 +200,13 @@ extension ListSettingsViewController: UITableViewDataSource { switch indexPath.section { case 0: let vc = ListDetailViewController() + vc.delegate = self vc.listName = listName navigationController?.pushViewController(vc, animated: true) + case 1: let vc = ListDescriptionViewController() + vc.delegate = self vc.listName = listName navigationController?.pushViewController(vc, animated: true) default: @@ -227,13 +229,10 @@ extension ListSettingsViewController { func saveNewDomain(userEnteredDomainName: String) { didMakeChange = true DDLogInfo("Adding custom domain - \(userEnteredDomainName)") + + addDomainToBlockedList(domain: userEnteredDomainName, for: listName) + blockedList = getBlockedLists().userBlockListsDefaults[listName] - let domains = getBlockedLists().userBlockListsDefaults - let userList = domains[listName] - - if let list = userList { - addDomainToBlockedList(domain: userEnteredDomainName, for: list.name.lowercased()) - } tableView.reloadData() } @@ -244,13 +243,25 @@ extension ListSettingsViewController { if let txtField = alertController.textFields?.first, let text = txtField.text { self.saveNewDomain(userEnteredDomainName: text) - self.tableView.reloadData() } } + + saveAction.isEnabled = false + let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (_) in } alertController.addTextField { (textField) in + textField.keyboardType = .URL textField.placeholder = "domain-to-block URL" } + + NotificationCenter.default.addObserver( + forName: UITextField.textDidChangeNotification, + object: alertController.textFields?.first, + queue: .main) { (notification) -> Void in + guard let textFieldText = alertController.textFields?.first?.text else { return } + saveAction.isEnabled = textFieldText.isValid(.domainName) + } + alertController.addAction(saveAction) alertController.addAction(cancelAction) self.present(alertController, animated: true, completion: nil) @@ -308,8 +319,7 @@ extension ListSettingsViewController { } @objc func exportList(_ sender: UIButton) { - let domains = getBlockedLists().userBlockListsDefaults - var domainsList = domains[listName]?.domains + let domainsList = blockedList?.domains guard let url = domainsList?.first?.exportToURL() else { return } @@ -321,3 +331,18 @@ extension ListSettingsViewController { present(activity, animated: true, completion: nil) } } + +extension ListSettingsViewController: ListDetailViewControllerDelegate { + + func changeListName(name: String) { + listName = name + tableView.reloadData() + } +} + +extension ListSettingsViewController: ListDescriptionViewControllerDelegate { + + func changeListDescription(description: String) { + tableView.reloadData() + } +} diff --git a/LockdowniOS/OverallStatiscticView.swift b/LockdowniOS/OverallStatiscticView.swift new file mode 100644 index 0000000..23515b4 --- /dev/null +++ b/LockdowniOS/OverallStatiscticView.swift @@ -0,0 +1,152 @@ +// +// OverallStatiscticView.swift +// Lockdown +// +// Created by Aliaksandr Dvoineu on 18.04.23. +// Copyright © 2023 Confirmed Inc. All rights reserved. +// + +import UIKit + +struct OverallStatiscticViewModel { + let enabled: Int + let disabled: Int + let requests: Int + let blocked: Int +} + +final class BoxLabelView: UIView { + + // MARK: - Properties + + lazy var boxView: UIView = { + let view = UIView() + view.layer.cornerRadius = 4 + view.layer.borderColor = UIColor.lightGray.cgColor + view.layer.borderWidth = 1 + view.anchors.height.equal(65) + return view + }() + + lazy var numberLabel: UILabel = { + let label = UILabel() + label.textColor = .label + label.font = fontBold24 + label.textAlignment = .center + return label + }() + + lazy var boxTitle: UILabel = { + let label = UILabel() + label.textColor = .label + label.font = fontRegular14 + label.textAlignment = .center + return label + }() + + private lazy var stackView: UIStackView = { + let stackView = UIStackView() + stackView.addArrangedSubview(boxView) + stackView.addArrangedSubview(boxTitle) + stackView.axis = .vertical + stackView.distribution = .fillProportionally + stackView.spacing = 8 + return stackView + }() + + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Functions + + private func configureUI() { + addSubview(stackView) + stackView.anchors.edges.pin() + + boxView.addSubview(numberLabel) + numberLabel.anchors.centerX.align() + numberLabel.anchors.centerY.align() + } +} + +final class OverallStatiscticView: UIView { + + // MARK: - Properties + + private let enabledBoxView: BoxLabelView = { + let box = BoxLabelView() + box.numberLabel.text = "15" + box.boxTitle.text = "Enabled" + return box + }() + + private let disabledBoxView: BoxLabelView = { + let box = BoxLabelView() + box.numberLabel.text = "1" + box.boxTitle.text = "Disabled" + return box + }() + + private let requestsBoxView: BoxLabelView = { + let box = BoxLabelView() + box.numberLabel.text = "2.3M" + box.boxTitle.text = "Requests" + return box + }() + + private let blockedBoxView: BoxLabelView = { + let box = BoxLabelView() + box.numberLabel.text = "2.4K" + box.boxTitle.text = "Blocked" + return box + }() + + private lazy var stackView: UIStackView = { + let stackView = UIStackView() + stackView.addArrangedSubview(enabledBoxView) + stackView.addArrangedSubview(disabledBoxView) + stackView.addArrangedSubview(requestsBoxView) + stackView.addArrangedSubview(blockedBoxView) + stackView.axis = .horizontal + stackView.distribution = .fillEqually + stackView.alignment = .center + stackView.spacing = 8 + return stackView + }() + + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Functions + + private func configureUI() { + + addSubview(stackView) + stackView.anchors.top.marginsPin() + stackView.anchors.bottom.marginsPin() + stackView.anchors.leading.pin() + stackView.anchors.trailing.pin() + } + + func configure(with model: OverallStatiscticViewModel) { + + } +} diff --git a/LockdowniOS/StaticTableView.swift b/LockdowniOS/StaticTableView.swift index 3deefd5..dc0972e 100644 --- a/LockdowniOS/StaticTableView.swift +++ b/LockdowniOS/StaticTableView.swift @@ -16,7 +16,7 @@ final class StaticTableView: UITableView { invalidateIntrinsicContentSize() } } - + override var intrinsicContentSize: CGSize { layoutIfNeeded() return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height) diff --git a/LockdowniOS/String+Extensions.swift b/LockdowniOS/String+Extensions.swift new file mode 100644 index 0000000..96d63b2 --- /dev/null +++ b/LockdowniOS/String+Extensions.swift @@ -0,0 +1,40 @@ +// +// String+Extentions.swift +// Lockdown +// +// Created by Aliaksandr Dvoineu on 25.04.23. +// Copyright © 2023 Confirmed Inc. All rights reserved. +// + +import Foundation + +extension String { + + enum ValidityType { + case listName + case domainName + case listDescription + } + + enum Regex: String { + case listName = "^[a-zA-Z0-9\\s]{1,20}$" + case domainName = "^([a-zA-Z0-9]+(\\.[a-zA-Z0-9]+)+.*)$" + case listDescription = "^[a-zA-Z0-9\\s]{1,500}$" + } + + func isValid(_ validityType: ValidityType) -> Bool { + let format = "SELF MATCHES %@" + var regex = "" + + switch validityType { + case .listName: + regex = Regex.listName.rawValue + case .domainName: + regex = Regex.domainName.rawValue + case .listDescription: + regex = Regex.listDescription.rawValue + } + + return NSPredicate(format: format, regex).evaluate(with: self) + } +} diff --git a/LockdowniOS/TrackersGroupView.swift b/LockdowniOS/TrackersGroupView.swift new file mode 100644 index 0000000..3748c76 --- /dev/null +++ b/LockdowniOS/TrackersGroupView.swift @@ -0,0 +1,117 @@ +// +// TrackersGroupView.swift +// Lockdown +// +// Created by Aliaksandr Dvoineu on 18.04.23. +// Copyright © 2023 Confirmed Inc. All rights reserved. +// + +import UIKit + +struct TrackersGroupViewModel { + let image: UIImage + let title: String + let number: Int +} + +final class TrackersGroupView: UIView { + + // MARK: - Properties + + private lazy var separator: UIView = { + let view = UIView() + view.backgroundColor = .lightGray + view.anchors.height.equal(1) + return view + }() + + lazy var placeNumber: UILabel = { + let label = UILabel() + label.textColor = .label + label.font = fontMedium15 + label.textAlignment = .left + return label + }() + + private lazy var trackersImage: UIImageView = { + let image = UIImageView() + image.contentMode = .center + image.layer.masksToBounds = true + return image + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.textColor = .label + label.font = fontMedium15 + label.text = "Game Marketing" + label.textAlignment = .left + return label + }() + + lazy var number: UILabel = { + let label = UILabel() + label.textColor = .label + label.font = fontBold18 + label.textColor = .red + label.textAlignment = .right + return label + }() + + private lazy var lockImage: UIImageView = { + let image = UIImageView() + image.contentMode = .right + image.layer.masksToBounds = true + image.image = UIImage(named: "icn_lock") + return image + }() + + private lazy var stackView: UIStackView = { + let stackView = UIStackView() + stackView.addArrangedSubview(placeNumber) + stackView.addArrangedSubview(trackersImage) + stackView.addArrangedSubview(titleLabel) +// stackView.addArrangedSubview(number) + stackView.addArrangedSubview(lockImage) + stackView.axis = .horizontal + stackView.distribution = .fillProportionally + stackView.alignment = .leading + stackView.spacing = 8 + stackView.anchors.height.equal(40) + return stackView + }() + + // MARK: - Initializer + + override init(frame: CGRect) { + super.init(frame: frame) + configureUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Functions + + private func configureUI() { + + addSubview(separator) + separator.anchors.leading.pin() + separator.anchors.trailing.pin() + separator.anchors.top.pin() + + addSubview(stackView) + stackView.anchors.top.spacing(12, to: separator.anchors.bottom) + stackView.anchors.bottom.pin() + stackView.anchors.leading.marginsPin() + stackView.anchors.trailing.marginsPin() + } + + func configure(with model: TrackersGroupViewModel) { + trackersImage.image = model.image + titleLabel.text = model.title + number.text = String(model.number) + } +} diff --git a/Shared.swift b/Shared.swift index 22ebada..83203c0 100644 --- a/Shared.swift +++ b/Shared.swift @@ -292,3 +292,5 @@ let fontBold11 = UIFont(name: "Montserrat-Bold", size: 11)! let fontBold13 = UIFont(name: "Montserrat-Bold", size: 13)! let fontBold15 = UIFont(name: "Montserrat-Bold", size: 15)! let fontBold18 = UIFont(name: "Montserrat-Bold", size: 18)! +let fontBold24 = UIFont(name: "Montserrat-Bold", size: 24)! +let fontBold28 = UIFont(name: "Montserrat-Bold", size: 28)!