From 44ca8c293a82229a49b5f0bdfbae340a9534cae9 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Thu, 27 Aug 2020 10:16:38 +1000 Subject: [PATCH] Show light mode announcement sheet to existing users --- Signal.xcodeproj/project.pbxproj | 4 ++ .../Loki V2/Sun.imageset/Contents.json | 12 +++++ .../Loki V2/Sun.imageset/Sun.pdf | Bin 0 -> 5351 bytes Signal/src/Loki/View Controllers/HomeVC.swift | 17 +++---- .../View Controllers/LightModeSheet.swift | 47 ++++++++++++++++++ .../src/Loki/View Controllers/PNModeVC.swift | 1 + Signal/src/Loki/View Controllers/Sheet.swift | 9 ++-- .../src/Loki/Utilities/LKUserDefaults.swift | 1 + 8 files changed, 77 insertions(+), 14 deletions(-) create mode 100644 Signal/Images.xcassets/Loki V2/Sun.imageset/Contents.json create mode 100644 Signal/Images.xcassets/Loki V2/Sun.imageset/Sun.pdf create mode 100644 Signal/src/Loki/View Controllers/LightModeSheet.swift diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index b579a2939..483ea7fad 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -573,6 +573,7 @@ BFF3FB9730634F37D25903F4 /* Pods_Signal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D17BB5C25D615AB49813100C /* Pods_Signal.framework */; }; C31A6C5A247F214E001123EF /* UIView+Glow.swift in Sources */ = {isa = PBXBuildFile; fileRef = C31A6C59247F214E001123EF /* UIView+Glow.swift */; }; C31A6C5C247F2CF3001123EF /* CGRect+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C31A6C5B247F2CF3001123EF /* CGRect+Utilities.swift */; }; + C329FEEC24F7277900B1C64C /* LightModeSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C329FEEB24F7277900B1C64C /* LightModeSheet.swift */; }; C34C8F7423A7830B00D82669 /* SpaceMono-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C34C8F7323A7830A00D82669 /* SpaceMono-Bold.ttf */; }; C353F8F9244809150011121A /* PNOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C353F8F8244809150011121A /* PNOptionView.swift */; }; C3548F0624456447009433A8 /* PNModeVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3548F0524456447009433A8 /* PNModeVC.swift */; }; @@ -1365,6 +1366,7 @@ B9EB5ABC1884C002007CBB57 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; }; C31A6C59247F214E001123EF /* UIView+Glow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Glow.swift"; sourceTree = ""; }; C31A6C5B247F2CF3001123EF /* CGRect+Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CGRect+Utilities.swift"; sourceTree = ""; }; + C329FEEB24F7277900B1C64C /* LightModeSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LightModeSheet.swift; sourceTree = ""; }; C34C8F7323A7830A00D82669 /* SpaceMono-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SpaceMono-Bold.ttf"; sourceTree = ""; }; C353F8F8244809150011121A /* PNOptionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PNOptionView.swift; sourceTree = ""; }; C3548F0524456447009433A8 /* PNModeVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PNModeVC.swift; sourceTree = ""; }; @@ -2716,6 +2718,7 @@ B8BB82A4238F627000BA5194 /* HomeVC.swift */, B8CCF63E23975CFB0091D419 /* JoinPublicChatVC.swift */, B82B40872399EB0E00A248E7 /* LandingVC.swift */, + C329FEEB24F7277900B1C64C /* LightModeSheet.swift */, B85357C423A1F13800AAF6CD /* LinkDeviceVC.swift */, B85357C623A1FB5100AAF6CD /* LinkDeviceVCDelegate.swift */, B86BD08323399ACF000F5AE3 /* Modal.swift */, @@ -3843,6 +3846,7 @@ 45A6DAD61EBBF85500893231 /* ReminderView.swift in Sources */, 34D1F0881F8678AA0066283D /* ConversationViewLayout.m in Sources */, B82B408E239DC00D00A248E7 /* DisplayNameVC.swift in Sources */, + C329FEEC24F7277900B1C64C /* LightModeSheet.swift in Sources */, 4CA485BB2232339F004B9E7D /* PhotoCaptureViewController.swift in Sources */, 34330AA31E79686200DF2FB9 /* OWSProgressView.m in Sources */, 344825C6211390C800DB4BD8 /* OWSOrphanDataCleaner.m in Sources */, diff --git a/Signal/Images.xcassets/Loki V2/Sun.imageset/Contents.json b/Signal/Images.xcassets/Loki V2/Sun.imageset/Contents.json new file mode 100644 index 000000000..4676691e4 --- /dev/null +++ b/Signal/Images.xcassets/Loki V2/Sun.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Sun.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Signal/Images.xcassets/Loki V2/Sun.imageset/Sun.pdf b/Signal/Images.xcassets/Loki V2/Sun.imageset/Sun.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e4555bc54cc6e53a70076d49099750ac6484d368 GIT binary patch literal 5351 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 literal 0 HcmV?d00001 diff --git a/Signal/src/Loki/View Controllers/HomeVC.swift b/Signal/src/Loki/View Controllers/HomeVC.swift index 3f1564d6f..c12cf8891 100644 --- a/Signal/src/Loki/View Controllers/HomeVC.swift +++ b/Signal/src/Loki/View Controllers/HomeVC.swift @@ -183,16 +183,13 @@ final class HomeVC : BaseVC, UITableViewDataSource, UITableViewDelegate, UIScrol override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) isViewVisible = true - let hasSeenMultiDeviceRemovalSheet = UserDefaults.standard[.hasSeenMultiDeviceRemovalSheet] - if !hasSeenMultiDeviceRemovalSheet { - let _ = FileServerAPI.getDeviceLinks(associatedWith: getUserHexEncodedPublicKey()).done(on: DispatchQueue.main) { [weak self] deviceLinks in - guard !deviceLinks.isEmpty else { return } - let multiDeviceRemovalSheet = MultiDeviceRemovalSheet() - multiDeviceRemovalSheet.modalPresentationStyle = .overFullScreen - multiDeviceRemovalSheet.modalTransitionStyle = .crossDissolve - self?.present(multiDeviceRemovalSheet, animated: true, completion: nil) - } - UserDefaults.standard[.hasSeenMultiDeviceRemovalSheet] = true + let hasSeenLightModeSheet = UserDefaults.standard[.hasSeenLightModeSheet] + if !hasSeenLightModeSheet { + let lightModeSheet = LightModeSheet() + lightModeSheet.modalPresentationStyle = .overFullScreen + lightModeSheet.modalTransitionStyle = .crossDissolve + present(lightModeSheet, animated: true, completion: nil) + UserDefaults.standard[.hasSeenLightModeSheet] = true } UserDefaults.standard[.hasLaunchedOnce] = true } diff --git a/Signal/src/Loki/View Controllers/LightModeSheet.swift b/Signal/src/Loki/View Controllers/LightModeSheet.swift new file mode 100644 index 000000000..6f956bed5 --- /dev/null +++ b/Signal/src/Loki/View Controllers/LightModeSheet.swift @@ -0,0 +1,47 @@ + +final class LightModeSheet : Sheet { + + override func populateContentView() { + // Set up image view + let imageView = UIImageView(image: #imageLiteral(resourceName: "Sun")) + // Set up title label + let titleLabel = UILabel() + titleLabel.textColor = Colors.text + titleLabel.font = .boldSystemFont(ofSize: isIPhone5OrSmaller ? Values.largeFontSize : Values.veryLargeFontSize) + titleLabel.text = "Light Mode" + titleLabel.numberOfLines = 0 + titleLabel.lineBreakMode = .byWordWrapping + // Set up top stack view + let topStackView = UIStackView(arrangedSubviews: [ imageView, titleLabel ]) + topStackView.axis = .vertical + topStackView.spacing = Values.largeSpacing + topStackView.alignment = .center + // Set up explanation label + let explanationLabel = UILabel() + explanationLabel.textColor = Colors.text + explanationLabel.font = .systemFont(ofSize: Values.smallFontSize) + explanationLabel.text = """ + Who left the lights on? bla bla bla + + Feeling the dark side more? Just pop into the in-app settings and tap the app mode button in the top-right to toggle dark mode again. + """ + explanationLabel.numberOfLines = 0 + explanationLabel.lineBreakMode = .byWordWrapping + // Set up OK button + let okButton = Button(style: .prominentOutline, size: .large) + okButton.set(.width, to: 240) + okButton.setTitle(NSLocalizedString("OK", comment: ""), for: UIControl.State.normal) + okButton.addTarget(self, action: #selector(close), for: UIControl.Event.touchUpInside) + // Set up main stack view + let stackView = UIStackView(arrangedSubviews: [ topStackView, explanationLabel, okButton ]) + stackView.axis = .vertical + stackView.spacing = Values.veryLargeSpacing + stackView.alignment = .center + // Set up constraints + contentView.addSubview(stackView) + stackView.pin(.leading, to: .leading, of: contentView, withInset: Values.veryLargeSpacing) + stackView.pin(.top, to: .top, of: contentView, withInset: Values.largeSpacing) + contentView.pin(.trailing, to: .trailing, of: stackView, withInset: Values.veryLargeSpacing) + contentView.pin(.bottom, to: .bottom, of: stackView, withInset: Values.veryLargeSpacing + overshoot) + } +} diff --git a/Signal/src/Loki/View Controllers/PNModeVC.swift b/Signal/src/Loki/View Controllers/PNModeVC.swift index f09be912d..23c8b9f2f 100644 --- a/Signal/src/Loki/View Controllers/PNModeVC.swift +++ b/Signal/src/Loki/View Controllers/PNModeVC.swift @@ -90,6 +90,7 @@ final class PNModeVC : BaseVC, OptionViewDelegate { } UserDefaults.standard[.isUsingFullAPNs] = (selectedOptionView == apnsOptionView) UserDefaults.standard[.hasSeenMultiDeviceRemovalSheet] = true + UserDefaults.standard[.hasSeenLightModeSheet] = true TSAccountManager.sharedInstance().didRegister() let homeVC = HomeVC() navigationController!.setViewControllers([ homeVC ], animated: true) diff --git a/Signal/src/Loki/View Controllers/Sheet.swift b/Signal/src/Loki/View Controllers/Sheet.swift index 7f2ad7ccc..b34530dcd 100644 --- a/Signal/src/Loki/View Controllers/Sheet.swift +++ b/Signal/src/Loki/View Controllers/Sheet.swift @@ -11,18 +11,19 @@ class Sheet : BaseVC { result.backgroundColor = Colors.modalBackground result.layer.cornerRadius = 24 result.layer.masksToBounds = false - result.layer.borderColor = Colors.modalBorder.cgColor + result.layer.borderColor = isLightMode ? UIColor.white.cgColor : Colors.modalBorder.cgColor result.layer.borderWidth = Values.borderThickness result.layer.shadowColor = UIColor.black.cgColor - result.layer.shadowRadius = 8 - result.layer.shadowOpacity = 0.64 + result.layer.shadowRadius = isLightMode ? 2 : 8 + result.layer.shadowOpacity = isLightMode ? 0.1 : 0.64 return result }() // MARK: Lifecycle override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = UIColor(hex: 0x000000).withAlphaComponent(Values.modalBackgroundOpacity) + let alpha = isLightMode ? CGFloat(0.1) : Values.modalBackgroundOpacity + view.backgroundColor = UIColor(hex: 0x000000).withAlphaComponent(alpha) let swipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(close)) swipeGestureRecognizer.direction = .down view.addGestureRecognizer(swipeGestureRecognizer) diff --git a/SignalServiceKit/src/Loki/Utilities/LKUserDefaults.swift b/SignalServiceKit/src/Loki/Utilities/LKUserDefaults.swift index 9b8184df6..2fc7eaf0a 100644 --- a/SignalServiceKit/src/Loki/Utilities/LKUserDefaults.swift +++ b/SignalServiceKit/src/Loki/Utilities/LKUserDefaults.swift @@ -5,6 +5,7 @@ public enum LKUserDefaults { public enum Bool : Swift.String { case hasLaunchedOnce case hasSeenGIFMetadataWarning + case hasSeenLightModeSheet case hasSeenMultiDeviceRemovalSheet case hasSeenOpenGroupSuggestionSheet case hasViewedSeed