Added rounding to the settings and updated the SettingVC to use the config approach

Removed some unused code
pull/672/head
Morgan Pretty 2 years ago
parent 2bc9334244
commit f98e2a157e

@ -148,7 +148,6 @@
7BAF54D327ACCF01003D12F8 /* ShareAppExtensionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BAF54D127ACCF01003D12F8 /* ShareAppExtensionContext.swift */; };
7BAF54D427ACCF01003D12F8 /* SAEScreenLockViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BAF54D227ACCF01003D12F8 /* SAEScreenLockViewController.swift */; };
7BAF54D827ACD0E3003D12F8 /* ReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BAF54D527ACD0E2003D12F8 /* ReusableView.swift */; };
7BAF54DC27ACD12B003D12F8 /* UIColor+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BAF54DB27ACD12B003D12F8 /* UIColor+Extensions.swift */; };
7BB92B3F28C825FD0082762F /* NewConversationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BB92B3E28C825FD0082762F /* NewConversationViewModel.swift */; };
7BBBDC44286EAD2D00747E59 /* TappableLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BBBDC43286EAD2D00747E59 /* TappableLabel.swift */; };
7BBBDC462875600700747E59 /* DocumentTitleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BBBDC452875600700747E59 /* DocumentTitleViewController.swift */; };
@ -304,14 +303,10 @@
C32C6018256E07F9003C73A2 /* NSUserDefaults+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB51255A580D00E217F9 /* NSUserDefaults+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33100092558FF6D00070591 /* UserCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C31D1DDC25217014005D4DA8 /* UserCell.swift */; };
C33100282559000A00070591 /* UIView+Rendering.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33100272559000A00070591 /* UIView+Rendering.swift */; };
C3310033255900A400070591 /* Notification+AppMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3310032255900A400070591 /* Notification+AppMode.swift */; };
C331FF1F2558F9D300070591 /* SessionUIKit.h in Headers */ = {isa = PBXBuildFile; fileRef = C331FF1D2558F9D300070591 /* SessionUIKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
C331FF222558F9D300070591 /* SessionUIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C331FF1B2558F9D300070591 /* SessionUIKit.framework */; };
C331FF232558F9D300070591 /* SessionUIKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C331FF1B2558F9D300070591 /* SessionUIKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
C331FF962558FA6B00070591 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB829F238F322400BA5194 /* Colors.swift */; };
C331FF972558FA6B00070591 /* Fonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82BD2394D4CE00BA5194 /* Fonts.swift */; };
C331FF982558FA6B00070591 /* AppMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8C9689023FA1401005F64E0 /* AppMode.swift */; };
C331FF992558FA6B00070591 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C39DD28724F3318C008590FC /* Colors.xcassets */; };
C331FF9A2558FA6B00070591 /* Values.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82A1238F356100BA5194 /* Values.swift */; };
C331FFB82558FA8D00070591 /* DeviceUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8544E3023D16CA500299F14 /* DeviceUtilities.swift */; };
C331FFB92558FA8D00070591 /* UIView+Constraints.swift in Sources */ = {isa = PBXBuildFile; fileRef = B885D5F52334A32100EE0D8E /* UIView+Constraints.swift */; };
@ -324,7 +319,6 @@
C331FFF32558FF0300070591 /* PathStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B879D44A247E1D9200DB3608 /* PathStatusView.swift */; };
C331FFF42558FF0300070591 /* PNOptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C353F8F8244809150011121A /* PNOptionView.swift */; };
C331FFFE2558FF3B00070591 /* FullConversationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82AA238F669C00BA5194 /* FullConversationCell.swift */; };
C33FD4E9255A149100E217F9 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C39DD28724F3318C008590FC /* Colors.xcassets */; };
C33FD9AF255A548A00E217F9 /* SignalUtilitiesKit.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FD9AD255A548A00E217F9 /* SignalUtilitiesKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
C33FD9B3255A548A00E217F9 /* SignalUtilitiesKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C33FD9AB255A548A00E217F9 /* SignalUtilitiesKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
C33FD9C2255A54EF00E217F9 /* SessionMessagingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3C2A6F025539DE700C340D1 /* SessionMessagingKit.framework */; };
@ -432,14 +426,10 @@
C38EF3C5255B6DE7007E1867 /* OWSViewController+ImageEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF3B5255B6DE6007E1867 /* OWSViewController+ImageEditor.swift */; };
C38EF3C6255B6DE7007E1867 /* ImageEditorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF3B6255B6DE6007E1867 /* ImageEditorModel.swift */; };
C38EF3C7255B6DE7007E1867 /* ImageEditorCanvasView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF3B7255B6DE6007E1867 /* ImageEditorCanvasView.swift */; };
C38EF3F5255B6DF7007E1867 /* OWSTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = C38EF3D7255B6DF0007E1867 /* OWSTextField.h */; settings = {ATTRIBUTES = (Public, ); }; };
C38EF3F6255B6DF7007E1867 /* OWSTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = C38EF3D8255B6DF0007E1867 /* OWSTextView.h */; settings = {ATTRIBUTES = (Public, ); }; };
C38EF3F7255B6DF7007E1867 /* OWSNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF3D9255B6DF1007E1867 /* OWSNavigationBar.swift */; };
C38EF3F9255B6DF7007E1867 /* OWSLayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF3DB255B6DF1007E1867 /* OWSLayerView.swift */; };
C38EF3FA255B6DF7007E1867 /* DirectionalPanGestureRecognizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF3DC255B6DF1007E1867 /* DirectionalPanGestureRecognizer.swift */; };
C38EF3FB255B6DF7007E1867 /* UIAlertController+OWS.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF3DD255B6DF1007E1867 /* UIAlertController+OWS.swift */; };
C38EF3FD255B6DF7007E1867 /* OWSTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = C38EF3DF255B6DF2007E1867 /* OWSTextView.m */; };
C38EF3FE255B6DF7007E1867 /* OWSTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = C38EF3E0255B6DF3007E1867 /* OWSTextField.m */; };
C38EF3FF255B6DF7007E1867 /* TappableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF3E1255B6DF3007E1867 /* TappableView.swift */; };
C38EF400255B6DF7007E1867 /* GalleryRailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF3E2255B6DF3007E1867 /* GalleryRailView.swift */; };
C38EF401255B6DF7007E1867 /* VideoPlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF3E3255B6DF4007E1867 /* VideoPlayerView.swift */; };
@ -498,7 +488,6 @@
C3CA3ABE255CDB0D00F4C6D4 /* portuguese.txt in Resources */ = {isa = PBXBuildFile; fileRef = C3CA3ABD255CDB0D00F4C6D4 /* portuguese.txt */; };
C3CA3AC8255CDB2900F4C6D4 /* spanish.txt in Resources */ = {isa = PBXBuildFile; fileRef = C3CA3AC7255CDB2900F4C6D4 /* spanish.txt */; };
C3D0972B2510499C00F6E3E4 /* BackgroundPoller.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D0972A2510499C00F6E3E4 /* BackgroundPoller.swift */; };
C3D90A1125773888002C9DF5 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C39DD28724F3318C008590FC /* Colors.xcassets */; };
C3D90A5C25773A25002C9DF5 /* SessionUtilitiesKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3C2A679255388CC00C340D1 /* SessionUtilitiesKit.framework */; };
C3D9E35525675EE10040E4F3 /* MIMETypeUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB41255A580C00E217F9 /* MIMETypeUtil.m */; };
C3D9E35E25675F640040E4F3 /* OWSFileSystem.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA8E255A57FD00E217F9 /* OWSFileSystem.m */; };
@ -708,6 +697,8 @@
FD71162028D97ABC00B47552 /* UIImage+Tinting.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD71161F28D97ABC00B47552 /* UIImage+Tinting.swift */; };
FD71162228D983ED00B47552 /* QRCodeScanningViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD71162128D983ED00B47552 /* QRCodeScanningViewController.swift */; };
FD71162A28DA83DF00B47552 /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38EF3EE255B6DF6007E1867 /* GradientView.swift */; };
FD71162C28E1451400B47552 /* Position.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD71162B28E1451400B47552 /* Position.swift */; };
FD71162E28E168C700B47552 /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD71162D28E168C700B47552 /* SettingsViewModel.swift */; };
FD7162DB281B6C440060647B /* TypedTableAlias.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD7162DA281B6C440060647B /* TypedTableAlias.swift */; };
FD716E6428502DDD00C96BF4 /* CallManagerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD716E6328502DDD00C96BF4 /* CallManagerProtocol.swift */; };
FD716E6628502EE200C96BF4 /* CurrentCallProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD716E6528502EE200C96BF4 /* CurrentCallProtocol.swift */; };
@ -1212,7 +1203,6 @@
7BAF54D127ACCF01003D12F8 /* ShareAppExtensionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareAppExtensionContext.swift; sourceTree = "<group>"; };
7BAF54D227ACCF01003D12F8 /* SAEScreenLockViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SAEScreenLockViewController.swift; sourceTree = "<group>"; };
7BAF54D527ACD0E2003D12F8 /* ReusableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReusableView.swift; sourceTree = "<group>"; };
7BAF54DB27ACD12B003D12F8 /* UIColor+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+Extensions.swift"; sourceTree = "<group>"; };
7BB92B3E28C825FD0082762F /* NewConversationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewConversationViewModel.swift; sourceTree = "<group>"; };
7BBBDC43286EAD2D00747E59 /* TappableLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TappableLabel.swift; sourceTree = "<group>"; };
7BBBDC452875600700747E59 /* DocumentTitleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentTitleViewController.swift; sourceTree = "<group>"; };
@ -1313,7 +1303,6 @@
B8BAC75B2695645400EA1759 /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Localizable.strings; sourceTree = "<group>"; };
B8BAC75C2695648500EA1759 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = "<group>"; };
B8BAC75D2695649000EA1759 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/Localizable.strings; sourceTree = "<group>"; };
B8BB829F238F322400BA5194 /* Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = "<group>"; };
B8BB82A1238F356100BA5194 /* Values.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Values.swift; sourceTree = "<group>"; };
B8BB82A4238F627000BA5194 /* HomeVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeVC.swift; sourceTree = "<group>"; };
B8BB82AA238F669C00BA5194 /* FullConversationCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullConversationCell.swift; sourceTree = "<group>"; };
@ -1324,7 +1313,6 @@
B8BC00BF257D90E30032E807 /* General.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = General.swift; sourceTree = "<group>"; };
B8BF43B926CC95FB007828D1 /* WebRTC+Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WebRTC+Utilities.swift"; sourceTree = "<group>"; };
B8C2B2C72563685C00551B4D /* CircleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircleView.swift; sourceTree = "<group>"; };
B8C9689023FA1401005F64E0 /* AppMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppMode.swift; sourceTree = "<group>"; };
B8CCF6342396005F0091D419 /* SpaceMono-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SpaceMono-Regular.ttf"; sourceTree = "<group>"; };
B8CCF63623961D6D0091D419 /* NewDMVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewDMVC.swift; sourceTree = "<group>"; };
B8CCF638239721E20091D419 /* TabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBar.swift; sourceTree = "<group>"; };
@ -1368,7 +1356,6 @@
C328255125CA64470062D0A7 /* ContextMenuVC+ActionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ContextMenuVC+ActionView.swift"; sourceTree = "<group>"; };
C32C5A87256DBCF9003C73A2 /* MessageReceiver+ClosedGroups.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageReceiver+ClosedGroups.swift"; sourceTree = "<group>"; };
C33100272559000A00070591 /* UIView+Rendering.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Rendering.swift"; sourceTree = "<group>"; };
C3310032255900A400070591 /* Notification+AppMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+AppMode.swift"; sourceTree = "<group>"; };
C331FF1B2558F9D300070591 /* SessionUIKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SessionUIKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C331FF1D2558F9D300070591 /* SessionUIKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SessionUIKit.h; sourceTree = "<group>"; };
C331FF1E2558F9D300070591 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@ -1530,14 +1517,10 @@
C38EF3B5255B6DE6007E1867 /* OWSViewController+ImageEditor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "OWSViewController+ImageEditor.swift"; path = "SignalUtilitiesKit/Media Viewing & Editing/OWSViewController+ImageEditor.swift"; sourceTree = SOURCE_ROOT; };
C38EF3B6255B6DE6007E1867 /* ImageEditorModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ImageEditorModel.swift; path = "SignalUtilitiesKit/Media Viewing & Editing/Image Editing/ImageEditorModel.swift"; sourceTree = SOURCE_ROOT; };
C38EF3B7255B6DE6007E1867 /* ImageEditorCanvasView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ImageEditorCanvasView.swift; path = "SignalUtilitiesKit/Media Viewing & Editing/Image Editing/ImageEditorCanvasView.swift"; sourceTree = SOURCE_ROOT; };
C38EF3D7255B6DF0007E1867 /* OWSTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OWSTextField.h; path = "SignalUtilitiesKit/Shared Views/OWSTextField.h"; sourceTree = SOURCE_ROOT; };
C38EF3D8255B6DF0007E1867 /* OWSTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OWSTextView.h; path = "SignalUtilitiesKit/Shared Views/OWSTextView.h"; sourceTree = SOURCE_ROOT; };
C38EF3D9255B6DF1007E1867 /* OWSNavigationBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OWSNavigationBar.swift; path = "SignalUtilitiesKit/Shared Views/OWSNavigationBar.swift"; sourceTree = SOURCE_ROOT; };
C38EF3DB255B6DF1007E1867 /* OWSLayerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OWSLayerView.swift; path = "SignalUtilitiesKit/Shared Views/OWSLayerView.swift"; sourceTree = SOURCE_ROOT; };
C38EF3DC255B6DF1007E1867 /* DirectionalPanGestureRecognizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DirectionalPanGestureRecognizer.swift; path = SignalUtilitiesKit/Utilities/DirectionalPanGestureRecognizer.swift; sourceTree = SOURCE_ROOT; };
C38EF3DD255B6DF1007E1867 /* UIAlertController+OWS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIAlertController+OWS.swift"; path = "SignalUtilitiesKit/Utilities/UIAlertController+OWS.swift"; sourceTree = SOURCE_ROOT; };
C38EF3DF255B6DF2007E1867 /* OWSTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OWSTextView.m; path = "SignalUtilitiesKit/Shared Views/OWSTextView.m"; sourceTree = SOURCE_ROOT; };
C38EF3E0255B6DF3007E1867 /* OWSTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OWSTextField.m; path = "SignalUtilitiesKit/Shared Views/OWSTextField.m"; sourceTree = SOURCE_ROOT; };
C38EF3E1255B6DF3007E1867 /* TappableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TappableView.swift; path = "SignalUtilitiesKit/Shared Views/TappableView.swift"; sourceTree = SOURCE_ROOT; };
C38EF3E2255B6DF3007E1867 /* GalleryRailView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = GalleryRailView.swift; path = "SignalUtilitiesKit/Shared Views/GalleryRailView.swift"; sourceTree = SOURCE_ROOT; };
C38EF3E3255B6DF4007E1867 /* VideoPlayerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = VideoPlayerView.swift; path = "SignalUtilitiesKit/Media Viewing & Editing/VideoPlayerView.swift"; sourceTree = SOURCE_ROOT; };
@ -1551,7 +1534,6 @@
C396469D2509D3F400B0B9F5 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = "<group>"; };
C396469E2509D40400B0B9F5 /* vi-VN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "vi-VN"; path = "vi-VN.lproj/Localizable.strings"; sourceTree = "<group>"; };
C396469F2509D41100B0B9F5 /* id-ID */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "id-ID"; path = "id-ID.lproj/Localizable.strings"; sourceTree = "<group>"; };
C39DD28724F3318C008590FC /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = "<group>"; };
C3A01E02261D24C400290BEB /* public-loki-foundation.der */ = {isa = PBXFileReference; lastKnownFileType = file; path = "public-loki-foundation.der"; sourceTree = "<group>"; };
C3A01E03261D24C400290BEB /* storage-seed-1.der */ = {isa = PBXFileReference; lastKnownFileType = file; path = "storage-seed-1.der"; sourceTree = "<group>"; };
C3A01E04261D24C400290BEB /* storage-seed-3.der */ = {isa = PBXFileReference; lastKnownFileType = file; path = "storage-seed-3.der"; sourceTree = "<group>"; };
@ -1794,6 +1776,8 @@
FD71161D28D9772700B47552 /* UIViewController+OWS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+OWS.swift"; sourceTree = "<group>"; };
FD71161F28D97ABC00B47552 /* UIImage+Tinting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Tinting.swift"; sourceTree = "<group>"; };
FD71162128D983ED00B47552 /* QRCodeScanningViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCodeScanningViewController.swift; sourceTree = "<group>"; };
FD71162B28E1451400B47552 /* Position.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Position.swift; sourceTree = "<group>"; };
FD71162D28E168C700B47552 /* SettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewModel.swift; sourceTree = "<group>"; };
FD7162DA281B6C440060647B /* TypedTableAlias.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypedTableAlias.swift; sourceTree = "<group>"; };
FD716E6328502DDD00C96BF4 /* CallManagerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallManagerProtocol.swift; sourceTree = "<group>"; };
FD716E6528502EE200C96BF4 /* CurrentCallProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrentCallProtocol.swift; sourceTree = "<group>"; };
@ -2799,11 +2783,7 @@
isa = PBXGroup;
children = (
FD37E9C428A1C701003AE748 /* Themes */,
B8C9689023FA1401005F64E0 /* AppMode.swift */,
FD37E9C228A1C6F3003AE748 /* ThemeManager.swift */,
C3310032255900A400070591 /* Notification+AppMode.swift */,
B8BB829F238F322400BA5194 /* Colors.swift */,
C39DD28724F3318C008590FC /* Colors.xcassets */,
B8BB82BD2394D4CE00BA5194 /* Fonts.swift */,
B8BB82A1238F356100BA5194 /* Values.swift */,
);
@ -2818,6 +2798,7 @@
B885D5F52334A32100EE0D8E /* UIView+Constraints.swift */,
C33100272559000A00070591 /* UIView+Rendering.swift */,
FD71161F28D97ABC00B47552 /* UIImage+Tinting.swift */,
FD71162B28E1451400B47552 /* Position.swift */,
);
path = Utilities;
sourceTree = "<group>";
@ -2911,6 +2892,7 @@
B886B4A62398B23E00211ABE /* QRCodeVC.swift */,
FD37EA0828AA2D27003AE748 /* SettingsTableViewModel.swift */,
FD37EA0628AA2CCA003AE748 /* SettingsTableViewController.swift */,
FD71162D28E168C700B47552 /* SettingsViewModel.swift */,
FD52090428B4915F006098F6 /* PrivacySettingsViewModel.swift */,
FD37EA0428AA00C1003AE748 /* NotificationSettingsViewModel.swift */,
FD37EA1828AC5CCA003AE748 /* NotificationSoundViewModel.swift */,
@ -3107,10 +3089,6 @@
C38EF3E7255B6DF5007E1867 /* OWSButton.swift */,
C38EF3DB255B6DF1007E1867 /* OWSLayerView.swift */,
C38EF3D9255B6DF1007E1867 /* OWSNavigationBar.swift */,
C38EF3D7255B6DF0007E1867 /* OWSTextField.h */,
C38EF3E0255B6DF3007E1867 /* OWSTextField.m */,
C38EF3D8255B6DF0007E1867 /* OWSTextView.h */,
C38EF3DF255B6DF2007E1867 /* OWSTextView.m */,
C38EF3E9255B6DF6007E1867 /* Toast.swift */,
C38EF3E2255B6DF3007E1867 /* GalleryRailView.swift */,
C38EF3ED255B6DF6007E1867 /* TappableStackView.swift */,
@ -3316,7 +3294,6 @@
children = (
FD848B9B284435D7000E298B /* AppSetup.swift */,
FDCDB8DD2810F73B00352A0C /* Differentiable+Utilities.swift */,
7BAF54DB27ACD12B003D12F8 /* UIColor+Extensions.swift */,
C38EF3DC255B6DF1007E1867 /* DirectionalPanGestureRecognizer.swift */,
C38EF240255B6D67007E1867 /* UIView+OWS.swift */,
FD71161D28D9772700B47552 /* UIViewController+OWS.swift */,
@ -4172,14 +4149,12 @@
C33FDDD0255A582000E217F9 /* FunctionalUtil.h in Headers */,
C33FDD5B255A582000E217F9 /* OWSOperation.h in Headers */,
C33FDD7C255A582000E217F9 /* SSKAsserts.h in Headers */,
C38EF3F6255B6DF7007E1867 /* OWSTextView.h in Headers */,
C38EF24C255B6D67007E1867 /* NSAttributedString+OWS.h in Headers */,
C38EF32B255B6DBF007E1867 /* OWSFormat.h in Headers */,
C33FDDCC255A582000E217F9 /* TSConstants.h in Headers */,
C33FDDBD255A582000E217F9 /* ByteParser.h in Headers */,
C38EF35D255B6DCC007E1867 /* OWSNavigationController.h in Headers */,
C38EF249255B6D67007E1867 /* UIColor+OWS.h in Headers */,
C38EF3F5255B6DF7007E1867 /* OWSTextField.h in Headers */,
C33FDDB3255A582000E217F9 /* OWSError.h in Headers */,
C38EF35E255B6DCC007E1867 /* OWSViewController.h in Headers */,
C38EF246255B6D67007E1867 /* UIFont+OWS.h in Headers */,
@ -4633,7 +4608,6 @@
347850551FD749C0007B8332 /* Localizable.strings in Resources */,
B8D07406265C683A00F77E07 /* ElegantIcons.ttf in Resources */,
3478504C1FD7496D007B8332 /* Images.xcassets in Resources */,
C3D90A1125773888002C9DF5 /* Colors.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -4649,7 +4623,6 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C331FF992558FA6B00070591 /* Colors.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -4712,7 +4685,6 @@
C3A01E06261D24C400290BEB /* storage-seed-1.der in Resources */,
45B74A782044AAB600CD42F8 /* bamboo-quiet.aifc in Resources */,
45B74A7B2044AAB600CD42F8 /* chord.aifc in Resources */,
C33FD4E9255A149100E217F9 /* Colors.xcassets in Resources */,
45B74A812044AAB600CD42F8 /* chord-quiet.aifc in Resources */,
45B74A832044AAB600CD42F8 /* circles.aifc in Resources */,
45B74A892044AAB600CD42F8 /* circles-quiet.aifc in Resources */,
@ -5141,10 +5113,9 @@
FD37EA0128A60473003AE748 /* UIKit+Theme.swift in Sources */,
FD37E9CF28A1EB1B003AE748 /* Theme.swift in Sources */,
C331FFB92558FA8D00070591 /* UIView+Constraints.swift in Sources */,
C331FF962558FA6B00070591 /* Colors.swift in Sources */,
FD37E9F628A5F106003AE748 /* Configuration.swift in Sources */,
C331FFE02558FB0000070591 /* SearchBar.swift in Sources */,
C331FF982558FA6B00070591 /* AppMode.swift in Sources */,
FD71162C28E1451400B47552 /* Position.swift in Sources */,
FD52090328B4680F006098F6 /* RadioButton.swift in Sources */,
C331FFE82558FB0000070591 /* TextView.swift in Sources */,
FD71162028D97ABC00B47552 /* UIImage+Tinting.swift in Sources */,
@ -5155,7 +5126,6 @@
C331FF9A2558FA6B00070591 /* Values.swift in Sources */,
FD37E9C628A1D4EC003AE748 /* Theme+ClassicDark.swift in Sources */,
C331FFE42558FB0000070591 /* OutlineButton.swift in Sources */,
C3310033255900A400070591 /* Notification+AppMode.swift in Sources */,
C331FFE92558FB0000070591 /* Separator.swift in Sources */,
C33100282559000A00070591 /* UIView+Rendering.swift in Sources */,
FD37E9CA28A1E4BD003AE748 /* Theme+ClassicLight.swift in Sources */,
@ -5166,7 +5136,6 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C38EF3FD255B6DF7007E1867 /* OWSTextView.m in Sources */,
C38EF3C6255B6DE7007E1867 /* ImageEditorModel.swift in Sources */,
C38EF3C3255B6DE7007E1867 /* ImageEditorTextItem.swift in Sources */,
C33FDC7D255A582000E217F9 /* OWSDispatch.m in Sources */,
@ -5210,7 +5179,6 @@
C38EF3BA255B6DE7007E1867 /* ImageEditorItem.swift in Sources */,
C38EF3F7255B6DF7007E1867 /* OWSNavigationBar.swift in Sources */,
C33FDD3A255A582000E217F9 /* Notification+Loki.swift in Sources */,
7BAF54DC27ACD12B003D12F8 /* UIColor+Extensions.swift in Sources */,
C38EF370255B6DCC007E1867 /* OWSNavigationController.m in Sources */,
C38EF24E255B6D67007E1867 /* Collection+OWS.swift in Sources */,
C33FDCFA255A582000E217F9 /* SignalIOSProto.swift in Sources */,
@ -5229,7 +5197,6 @@
FD52090B28B59BB4006098F6 /* ScreenLockViewController.swift in Sources */,
C38EF401255B6DF7007E1867 /* VideoPlayerView.swift in Sources */,
B8856D60256F129B001CE70E /* OWSAlerts.swift in Sources */,
C38EF3FE255B6DF7007E1867 /* OWSTextField.m in Sources */,
C38EF3BD255B6DE7007E1867 /* ImageEditorTransform.swift in Sources */,
C38EF24F255B6D67007E1867 /* UIColor+OWS.m in Sources */,
C33FDC9A255A582000E217F9 /* ByteParser.m in Sources */,
@ -5774,6 +5741,7 @@
3427C64320F500E000EEC730 /* OWSMessageTimerView.m in Sources */,
C33100092558FF6D00070591 /* UserCell.swift in Sources */,
B8269D2925C7A4B400488AB4 /* InputView.swift in Sources */,
FD71162E28E168C700B47552 /* SettingsViewModel.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

@ -797,7 +797,7 @@ extension ConversationVC:
self.contextMenuWindow?.themeBackgroundColor = .clear
self.contextMenuWindow?.rootViewController = self.contextMenuVC
self.contextMenuWindow?.overrideUserInterfaceStyle = (isDarkMode ? .dark : .light)
self.contextMenuWindow?.overrideUserInterfaceStyle = ThemeManager.currentTheme.interfaceStyle
self.contextMenuWindow?.makeKeyAndVisible()
}

@ -94,7 +94,7 @@ final class TypingIndicatorCell: MessageCell {
case .top: return [ .topLeft, .topRight, .bottomRight ]
case .middle: return [ .topRight, .bottomRight ]
case .bottom: return [ .topRight, .bottomRight, .bottomLeft ]
case .none: return .allCorners
case .none, .individual: return .allCorners
}
}
}

@ -743,7 +743,10 @@ final class VisibleMessageCell: MessageCell, TappableLabelDelegate {
.black :
.primary
)
let opacity: Float = (isLightMode ? 0.5 : 1)
let opacity: Float = (ThemeManager.currentTheme.interfaceStyle == .light ?
0.5 :
1
)
DispatchQueue.main.async { [weak self] in
let oldMasksToBounds: Bool = (self?.layer.masksToBounds ?? false)

@ -24,6 +24,7 @@ class ThreadSettingsViewModel: SettingsTableViewModel<ThreadSettingsViewModel.Na
}
public enum Section: SettingSection {
case conversationInfo
case content
}
@ -222,42 +223,25 @@ class ThreadSettingsViewModel: SettingsTableViewModel<ThreadSettingsViewModel.Na
return [
SectionModel(
model: .content,
model: .conversationInfo,
elements: [
SettingInfo(
id: .threadInfo,
title: threadViewModel.displayName,
action: .threadInfo(
threadViewModel: threadViewModel,
createAvatarTapDestination: { [weak self] in
guard
threadVariant == .contact,
let profileData: Data = ProfileManager.profileAvatar(id: threadId)
else { return nil }
let format: ImageFormat = profileData.guessedImageFormat
let navController: UINavigationController = UINavigationController(
rootViewController: ProfilePictureVC(
image: (format == .gif || format == .webp ?
nil :
UIImage(data: profileData)
),
animatedImage: (format != .gif && format != .webp ?
nil :
YYImage(data: profileData)
),
title: threadViewModel.displayName
)
)
navController.modalPresentationStyle = .fullScreen
return navController
avatarTapped: { [weak self] in
self?.updateProfilePicture(threadViewModel: threadViewModel)
},
titleTapped: { [weak self] in self?.setIsEditing(true) },
titleChanged: { [weak self] text in self?.editedDisplayName = text }
)
),
)
]
),
SectionModel(
model: .content,
elements: [
(threadVariant == .closedGroup ? nil :
SettingInfo(
id: .copyThreadId,
@ -328,38 +312,22 @@ class ThreadSettingsViewModel: SettingsTableViewModel<ThreadSettingsViewModel.Na
)
)?.withRenderingMode(.alwaysTemplate),
title: "DISAPPEARING_MESSAGES".localized(),
subtitle: {
guard threadId != userPublicKey else {
return "When enabled, messages will disappear after they have been seen."
}
let customDisplayName: String = {
switch threadVariant {
case .closedGroup, .openGroup: return "the group"
case .contact: return threadViewModel.displayName
}
}()
return String(
format: "When enabled, messages between you and %@ will disappear after they have been seen.",
arguments: [customDisplayName]
)
}(),
subtitle: (disappearingMessagesConfig.isEnabled ?
String(
format: "DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER".localized(),
arguments: [disappearingMessagesConfig.durationString]
) :
"DISAPPEARING_MESSAGES_SUBTITLE_OFF".localized()
),
accessibilityIdentifier: "\(ThreadSettingsViewModel.self).disappearing_messages",
action: .generalEnum(
title: (disappearingMessagesConfig.isEnabled ?
disappearingMessagesConfig.durationString :
"DISAPPEARING_MESSAGES_OFF".localized()
),
createUpdateScreen: {
SettingsTableViewController(
viewModel: ThreadDisappearingMessagesViewModel(
threadId: threadId,
config: disappearingMessagesConfig
)
action: .push(showChevron: false) {
SettingsTableViewController(
viewModel: ThreadDisappearingMessagesViewModel(
threadId: threadId,
config: disappearingMessagesConfig
)
}
)
)
}
)
),
@ -539,6 +507,32 @@ class ThreadSettingsViewModel: SettingsTableViewModel<ThreadSettingsViewModel.Na
self._settingsData = updatedSettings
}
private func updateProfilePicture(threadViewModel: SessionThreadViewModel) {
guard
threadViewModel.threadVariant == .contact,
let profile: Profile = threadViewModel.profile,
let profileData: Data = ProfileManager.profileAvatar(profile: profile)
else { return }
let format: ImageFormat = profileData.guessedImageFormat
let navController: UINavigationController = UINavigationController(
rootViewController: ProfilePictureVC(
image: (format == .gif || format == .webp ?
nil :
UIImage(data: profileData)
),
animatedImage: (format != .gif && format != .webp ?
nil :
YYImage(data: profileData)
),
title: threadViewModel.displayName
)
)
navController.modalPresentationStyle = .fullScreen
self.transitionToScreen(navController, transitionType: .present)
}
private func addUsersToOpenGoup(selectedUsers: Set<String>) {
let threadId: String = self.threadId

@ -743,8 +743,10 @@ final class HomeVC: BaseVC, UITableViewDataSource, UITableViewDelegate, SeedRemi
}
@objc private func openSettings() {
let settingsVC = SettingsVC()
let navigationController = OWSNavigationController(rootViewController: settingsVC)
let settingsViewController: SettingsTableViewController = SettingsTableViewController(
viewModel: SettingsViewModel()
)
let navigationController = OWSNavigationController(rootViewController: settingsViewController)
navigationController.modalPresentationStyle = .fullScreen
present(navigationController, animated: true, completion: nil)
}

@ -87,7 +87,7 @@ final class NewConversationVC: BaseVC, ThemedNavigation, UITableViewDelegate, UI
}
private func setUpViewHierarchy() {
buttonStackViewContainer.backgroundColor = Colors.cellBackground
buttonStackViewContainer.themeBackgroundColor = .backgroundSecondary
let headerView = UIView(
frame: CGRect(
@ -249,7 +249,7 @@ private final class NewConversationButton: UIView {
let iconImageView = UIImageView(image: self.icon)
iconImageView.contentMode = .center
iconImageView.tintColor = Colors.text
iconImageView.themeTintColor = .textPrimary
iconImageView.set(.width, to: NewConversationButton.iconSize)
let titleLable: UILabel = UILabel()

@ -361,9 +361,11 @@ extension SendMediaNavigationController: ImagePickerGridControllerDelegate {
.retainUntilComplete()
}
ModalActivityIndicatorViewController.present(fromViewController: self,
canCancel: false,
backgroundBlock: backgroundBlock)
ModalActivityIndicatorViewController.present(
fromViewController: self,
canCancel: false,
onAppear: backgroundBlock
)
}
func imagePicker(_ imagePicker: ImagePickerGridController, isAssetSelected asset: PHAsset) -> Bool {

@ -14,7 +14,7 @@ import UIKit
import SignalUtilitiesKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, AppModeManagerDelegate {
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
var window: UIWindow?
var backgroundSnapshotBlockerWindow: UIWindow?
var appStartupWindow: UIWindow?
@ -31,7 +31,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
SetCurrentAppContext(MainAppContext())
verifyDBKeysAvailableBeforeBackgroundLaunch()
AppModeManager.configure(delegate: self)
Cryptography.seedRandom()
AppVersion.sharedInstance()
@ -573,39 +572,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
OpenGroupManager.shared.stopPolling()
}
// MARK: - App Mode
private func adapt(appMode: AppMode) {
// FIXME: Need to update this when an appropriate replacement is added (see https://teng.pub/technical/2021/11/9/uiapplication-key-window-replacement)
guard let window: UIWindow = UIApplication.shared.keyWindow else { return }
switch (appMode) {
case .light:
window.overrideUserInterfaceStyle = .light
window.backgroundColor = .white
case .dark:
window.overrideUserInterfaceStyle = .dark
window.backgroundColor = .black
}
if LKAppModeUtilities.isSystemDefault {
window.overrideUserInterfaceStyle = .unspecified
}
NotificationCenter.default.post(name: .appModeChanged, object: nil)
}
func setCurrentAppMode(to appMode: AppMode) {
UserDefaults.standard[.appMode] = appMode.rawValue
adapt(appMode: appMode)
}
func setAppModeToSystemDefault() {
UserDefaults.standard.removeObject(forKey: SNUserDefaults.Int.appMode.rawValue)
adapt(appMode: AppModeManager.getAppModeOrSystemDefault())
}
// MARK: - App Link
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "icon_apperance.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,308 @@
%PDF-1.7
1 0 obj
<< /Type /XObject
/Length 2 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << >>
/BBox [ 0.000000 0.000000 24.000000 24.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 7.843140 7.830475 cm
0.000000 0.000000 0.000000 scn
9.276358 -0.000002 m
9.108232 -0.000002 8.948511 0.067249 8.830823 0.184938 c
0.184939 8.835024 l
0.067251 8.952713 0.000000 9.116636 0.000000 9.284762 c
0.000000 9.452888 0.067251 9.612608 0.189142 9.730296 c
0.479159 10.016110 l
0.735551 10.268299 1.004554 10.533098 1.269352 10.797897 c
2.673205 12.201750 l
3.824869 13.353414 4.980735 14.509280 6.136602 15.656740 c
6.275306 15.795444 6.422417 15.887914 6.552715 15.971977 c
6.594747 15.997196 6.640981 16.026617 6.678809 16.056040 c
6.783888 16.131697 6.909983 16.169525 7.040281 16.169525 c
7.397548 16.169525 l
7.511033 16.169525 7.620316 16.140102 7.716989 16.081259 c
7.742208 16.068649 7.767426 16.056040 7.788441 16.043430 c
7.885114 15.992992 8.019615 15.925742 8.141506 15.808054 c
8.486165 15.484411 8.759370 15.211206 9.007357 14.950611 c
9.234326 14.711031 9.360421 14.425217 9.389843 14.122590 c
9.742908 14.097371 10.058145 13.908230 10.419616 13.546759 c
12.647286 11.319088 l
13.155868 10.810507 13.277760 10.230471 13.000351 9.633623 c
13.588793 9.911032 14.160422 9.797546 14.669003 9.297371 c
14.895972 9.074605 l
15.122943 8.851837 15.349913 8.629070 15.564274 8.397898 c
15.702978 8.250787 15.812260 8.091067 15.908932 7.952363 c
15.946760 7.897722 15.984590 7.843081 16.026621 7.788440 c
16.106482 7.679158 16.152716 7.544657 16.152716 7.410156 c
16.152716 7.052888 l
16.152716 6.914184 16.106482 6.783887 16.026621 6.674604 c
15.988793 6.619964 15.950965 6.565323 15.913136 6.510682 c
15.812261 6.367775 15.698776 6.199649 15.547462 6.052538 c
14.173032 4.673904 12.798600 3.295270 11.424169 1.916636 c
9.826971 0.319439 l
9.826971 0.319439 9.780736 0.252189 9.772330 0.243782 c
9.663048 0.100876 9.494922 0.012608 9.314186 -0.000002 c
9.301577 -0.000002 9.288967 -0.000002 9.276358 -0.000002 c
9.276358 -0.000002 l
h
1.525745 9.276356 m
9.263749 1.538352 l
10.537304 2.811908 l
11.911735 4.186338 13.286166 5.564972 14.660597 6.943606 c
14.732051 7.015059 14.803504 7.120139 14.883364 7.233624 c
14.803504 7.347109 14.723643 7.456390 14.647986 7.540454 c
14.446235 7.759018 14.231875 7.964972 14.021717 8.175130 c
13.790545 8.402101 l
13.681262 8.511382 13.626622 8.523991 13.626622 8.523991 c
13.626622 8.523991 13.571980 8.523992 13.437480 8.431522 c
11.403153 7.048685 l
11.289668 6.973028 11.150964 6.888966 10.949212 6.855340 c
10.701226 6.809106 10.453241 6.918387 10.314537 7.128545 c
10.175833 7.338702 10.175833 7.611907 10.314537 7.822065 c
10.415412 7.977582 l
10.474256 8.070051 10.537303 8.162520 10.596148 8.254990 c
11.798249 10.041329 l
11.936954 10.247284 11.924344 10.272503 11.768827 10.432222 c
9.541157 12.659893 l
9.364624 12.836426 9.301577 12.865848 9.288967 12.870050 c
9.288967 12.870050 9.221718 12.861645 8.994747 12.752362 c
8.956919 12.735550 8.919089 12.718737 8.868651 12.697721 c
8.780386 12.659893 l
8.545009 12.559017 8.271805 12.613659 8.091069 12.794394 c
7.910333 12.975130 7.855693 13.248335 7.952366 13.483711 c
8.007006 13.609806 l
8.044834 13.706478 8.078460 13.786338 8.116288 13.866198 c
8.179336 14.004902 8.149913 14.038527 8.103678 14.084762 c
7.876708 14.328545 7.620316 14.580733 7.296673 14.883361 c
7.288267 14.887564 7.271453 14.895970 7.254641 14.904376 c
7.246236 14.904376 l
7.162173 14.849735 7.082312 14.799297 7.040281 14.761469 c
5.884414 13.614009 4.732750 12.458142 3.576883 11.306479 c
2.168827 9.902626 l
1.958669 9.692468 1.744308 9.478107 1.534151 9.276356 c
1.525745 9.276356 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 0.000000 -0.058136 cm
0.000000 0.000000 0.000000 scn
3.740806 0.058136 m
3.072505 0.058136 l
3.005254 0.058136 2.938004 0.070744 2.874956 0.091761 c
2.866550 0.091761 2.820315 0.108572 2.816112 0.112776 c
1.635026 0.335543 0.748161 1.037469 0.273205 2.147101 c
0.184939 2.353056 0.130298 2.559011 0.084063 2.739746 c
0.067250 2.811200 0.046235 2.882654 0.025219 2.954108 c
0.008406 3.012952 0.000000 3.071796 0.000000 3.130640 c
0.000000 3.794739 l
0.000000 3.836771 0.000000 3.878802 0.012609 3.920834 c
0.210158 4.887559 0.626270 5.602096 1.290368 6.114880 c
1.576182 6.333444 1.916638 6.589835 2.278109 6.829414 c
3.686165 7.758311 5.094221 8.687208 6.506480 9.607698 c
6.968827 9.910326 7.019265 10.212953 7.010859 10.469345 c
7.002452 10.692112 6.901577 10.885458 6.687216 11.099819 c
6.271104 11.515930 l
5.892820 11.890011 5.518739 12.264091 5.144659 12.642376 c
4.526795 13.268646 4.522593 14.079854 5.136253 14.701921 c
5.522943 15.092813 5.909633 15.483707 6.300526 15.874600 c
6.754466 16.328541 l
6.792295 16.366369 6.834326 16.404198 6.872155 16.429417 c
7.124344 16.631168 7.506831 16.631168 7.733801 16.399994 c
16.362873 7.770922 l
16.480562 7.653234 16.547812 7.489310 16.547812 7.321184 c
16.547812 7.153058 16.476358 6.993338 16.358669 6.875649 c
16.102278 6.623461 l
15.887918 6.413303 15.669353 6.203145 15.454992 5.988784 c
15.135552 5.669345 l
14.971629 5.505422 14.811910 5.345701 14.647986 5.185982 c
14.021717 4.580728 13.214711 4.584932 12.592645 5.198592 c
12.079861 5.702971 11.571280 6.215755 11.066901 6.724336 c
10.844133 6.947103 10.646585 7.052183 10.423819 7.060589 c
10.058144 7.077402 9.797548 6.926087 9.557969 6.560413 c
9.520141 6.501569 l
8.608056 5.101919 7.662347 3.651831 6.712435 2.239572 c
6.401402 1.777225 6.048337 1.340096 5.661647 0.932390 c
5.262347 0.512075 4.720140 0.243074 4.005604 0.108574 c
3.934151 0.083353 l
3.875307 0.066542 3.812259 0.053932 3.749212 0.053932 c
3.740806 0.058136 l
h
3.181787 1.319081 m
3.639930 1.319081 l
3.686165 1.335895 3.728197 1.344299 3.770228 1.352706 c
4.215762 1.436769 4.535202 1.583880 4.745359 1.806647 c
5.081612 2.159712 5.392645 2.546402 5.661647 2.945702 c
6.607356 4.353758 7.548862 5.795440 8.460946 7.195090 c
8.498775 7.253934 l
9.104029 8.182831 9.902628 8.350957 10.470054 8.325738 c
11.012259 8.304722 11.516638 8.065143 11.962173 7.615405 c
12.466551 7.106824 12.970929 6.598242 13.479510 6.098067 c
13.609808 5.967769 13.639231 5.967769 13.773731 6.098067 c
13.933452 6.253584 14.088967 6.409101 14.244484 6.564617 c
14.572330 6.892463 l
14.723643 7.039573 14.874957 7.190886 15.026271 7.333794 c
7.279860 15.071798 l
7.191595 14.983532 l
6.804904 14.596842 6.418214 14.214355 6.035727 13.823462 c
5.918039 13.705773 5.901227 13.676351 6.044134 13.533443 c
6.414011 13.159363 6.788092 12.785282 7.157969 12.415405 c
7.574081 11.999293 l
8.011209 11.562165 8.246586 11.066195 8.267601 10.528191 c
8.292820 9.964968 8.124695 9.166368 7.191595 8.556911 c
5.779335 7.636420 4.371279 6.711727 2.967426 5.782830 c
2.639580 5.564266 2.320140 5.324686 2.051139 5.118731 c
1.647636 4.807698 1.391244 4.366367 1.252540 3.731691 c
1.252540 3.218906 l
1.269352 3.164265 1.281962 3.109624 1.294571 3.054982 c
1.332399 2.903669 1.370228 2.760763 1.420666 2.647278 c
1.731699 1.920133 2.265499 1.495613 3.055692 1.352706 c
3.097723 1.344299 3.135552 1.335894 3.169177 1.323284 c
3.181787 1.319081 l
h
3.446585 1.789834 m
3.438179 1.789834 l
2.505079 1.794038 1.740105 2.559012 1.735902 3.496316 c
1.735902 3.954459 1.912434 4.387383 2.240280 4.715229 c
2.563923 5.038872 2.992645 5.219607 3.446585 5.219607 c
3.454992 5.219607 l
4.392295 5.215405 5.157268 4.446227 5.161471 3.513127 c
5.161471 3.059187 4.984939 2.626262 4.657093 2.298415 c
4.329247 1.974772 3.900526 1.794037 3.446585 1.794037 c
3.446585 1.789834 l
h
3.446585 3.954458 m
3.328897 3.954458 3.219615 3.908223 3.131349 3.819957 c
3.043082 3.731691 2.996848 3.618206 2.996848 3.500518 c
2.996848 3.256736 3.202802 3.054983 3.446585 3.050780 c
3.560070 3.067593 3.681962 3.097015 3.770228 3.185282 c
3.858494 3.273548 3.904729 3.387033 3.904729 3.504721 c
3.904729 3.744300 3.694571 3.954458 3.454992 3.954458 c
3.446585 3.954458 l
h
f
n
Q
endstream
endobj
2 0 obj
7782
endobj
3 0 obj
<< /Type /XObject
/Length 4 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << >>
/BBox [ 0.000000 0.000000 24.000000 24.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.000000 0.000000 scn
0.000000 24.000000 m
24.000000 24.000000 l
24.000000 0.000000 l
0.000000 0.000000 l
0.000000 24.000000 l
h
f
n
Q
endstream
endobj
4 0 obj
232
endobj
5 0 obj
<< /XObject << /X1 1 0 R >>
/ExtGState << /E1 << /SMask << /Type /Mask
/G 3 0 R
/S /Alpha
>>
/Type /ExtGState
>> >>
>>
endobj
6 0 obj
<< /Length 7 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
/E1 gs
/X1 Do
Q
endstream
endobj
7 0 obj
46
endobj
8 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 24.000000 24.000000 ]
/Resources 5 0 R
/Contents 6 0 R
/Parent 9 0 R
>>
endobj
9 0 obj
<< /Kids [ 8 0 R ]
/Count 1
/Type /Pages
>>
endobj
10 0 obj
<< /Pages 9 0 R
/Type /Catalog
>>
endobj
xref
0 11
0000000000 65535 f
0000000010 00000 n
0000008040 00000 n
0000008063 00000 n
0000008543 00000 n
0000008565 00000 n
0000008863 00000 n
0000008965 00000 n
0000008986 00000 n
0000009159 00000 n
0000009233 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 10 0 R
/Size 11
>>
startxref
9293
%%EOF

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "icon_bin.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,99 @@
%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.488892 19.632660 cm
0.000000 0.000000 0.000000 scn
22.014719 4.367340 m
1.007468 4.367340 l
0.451059 4.367340 0.000000 3.940892 0.000000 3.414841 c
0.000000 0.952485 l
0.000000 0.426434 0.451059 -0.000014 1.007468 -0.000014 c
22.014719 -0.000014 l
22.571127 -0.000014 23.022186 0.426434 23.022186 0.952485 c
23.022186 3.414841 l
23.022186 3.940892 22.571127 4.367340 22.014719 4.367340 c
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 0.488892 6.667847 cm
0.000000 0.000000 0.000000 scn
20.294537 10.664303 m
2.732070 10.664303 l
2.628341 10.664284 2.525786 10.643614 2.431059 10.603654 c
2.336332 10.563694 2.251548 10.505341 2.182249 10.432368 c
2.112950 10.359396 2.060672 10.273441 2.028817 10.180111 c
1.996962 10.086781 1.986233 9.988169 1.997347 9.890663 c
3.884717 -6.048100 l
3.904239 -6.218344 3.989554 -6.375778 4.124343 -6.490164 c
4.259133 -6.604548 4.433859 -6.667818 4.614983 -6.667847 c
18.411621 -6.667847 l
18.592745 -6.667818 18.767473 -6.604548 18.902264 -6.490164 c
19.037052 -6.375778 19.122368 -6.218344 19.141890 -6.048100 c
21.029259 9.890663 l
21.040373 9.988169 21.029642 10.086781 20.997787 10.180111 c
20.965933 10.273441 20.913654 10.359396 20.844357 10.432368 c
20.775057 10.505341 20.690273 10.563694 20.595547 10.603654 c
20.500818 10.643614 20.398264 10.664284 20.294537 10.664303 c
h
f
n
Q
endstream
endobj
3 0 obj
1394
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 24.000000 24.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
0000001484 00000 n
0000001507 00000 n
0000001680 00000 n
0000001754 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
1813
%%EOF

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "icon_help.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,89 @@
%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 3.902100 7.436493 cm
0.000000 0.000000 0.000000 scn
8.337853 16.563507 m
3.334153 16.563507 0.104244 14.230644 0.000000 8.687475 c
4.550323 8.687475 l
4.793558 11.728733 6.287726 12.540161 8.337853 12.540161 c
10.387981 12.540161 11.428761 11.289207 11.428761 9.803192 c
11.428761 7.267470 10.601424 6.760327 6.148726 3.920319 c
6.148726 0.000008 l
10.735459 0.000008 l
10.735459 3.345551 l
13.305151 4.596507 16.195831 6.625084 16.195831 10.308723 c
16.195831 13.992363 13.478892 16.563507 8.337853 16.563507 c
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 3.902100 19.166840 cm
0.000000 0.000000 0.000000 scn
11.011788 -14.333673 m
5.731754 -14.333673 l
5.731754 -19.166840 l
11.011788 -19.166840 l
11.011788 -14.333673 l
h
f
n
Q
endstream
endobj
3 0 obj
800
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 24.000000 24.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
0000000890 00000 n
0000000912 00000 n
0000001085 00000 n
0000001159 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
1218
%%EOF

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "icon_invite.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,122 @@
%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 11.287659 cm
0.000000 0.000000 0.000000 scn
10.038038 0.000012 m
13.518059 0.000012 16.353167 2.849327 16.353167 6.356177 c
16.353167 9.863026 13.518059 12.712341 10.038038 12.712341 c
6.558018 12.712341 3.722911 9.863026 3.722911 6.356177 c
3.722911 2.849327 6.553830 0.000012 10.038038 0.000012 c
h
10.038038 11.026356 m
12.596754 11.026356 14.678066 8.931520 14.678066 6.356177 c
14.678066 3.780835 12.596754 1.685998 10.038038 1.685998 c
7.479322 1.685998 5.398011 3.780835 5.398011 6.356177 c
5.398011 8.931520 7.479322 11.026356 10.038038 11.026356 c
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 0.000000 13.251831 cm
0.000000 0.000000 0.000000 scn
23.216888 -7.093771 m
19.435352 -7.093771 l
19.435352 -3.287659 l
19.435352 -2.853517 19.087769 -2.503675 18.656429 -2.503675 c
18.225090 -2.503675 17.877508 -2.853517 17.877508 -3.287659 c
17.877508 -7.093771 l
14.095969 -7.093771 l
13.664631 -7.093771 13.317047 -7.443611 13.317047 -7.877752 c
13.317047 -8.311893 13.664631 -8.661736 14.095969 -8.661736 c
17.877508 -8.661736 l
17.877508 -12.467850 l
17.877508 -12.901989 18.225090 -13.251831 18.656429 -13.251831 c
19.087769 -13.251831 19.435352 -12.901989 19.435352 -12.467850 c
19.435352 -8.661736 l
23.216888 -8.661736 l
23.648228 -8.661736 23.995811 -8.311893 23.995811 -7.877752 c
23.995811 -7.443611 23.648228 -7.093771 23.216888 -7.093771 c
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 0.000000 15.359314 cm
0.000000 0.000000 0.000000 scn
16.206596 -7.515268 m
16.206596 -6.280284 l
15.377421 -5.888292 14.460304 -5.664898 13.484558 -5.664898 c
6.432385 -5.664898 l
2.876985 -5.664898 0.000000 -8.564793 0.000000 -12.139082 c
0.000000 -13.841927 l
0.000000 -14.099041 0.205200 -14.305574 0.460653 -14.305574 c
1.210260 -14.305574 l
1.465713 -14.305574 1.670913 -14.099041 1.670913 -13.841927 c
1.670913 -12.139082 l
1.670913 -9.492085 3.802478 -7.350883 6.428198 -7.350883 c
13.476182 -7.350883 l
13.899145 -7.350883 14.305356 -7.409895 14.699005 -7.515268 c
16.206596 -7.515268 l
h
f
n
Q
endstream
endobj
3 0 obj
2084
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 24.000000 24.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
0000002174 00000 n
0000002197 00000 n
0000002370 00000 n
0000002444 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
2503
%%EOF

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "icon_link.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,119 @@
%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 5.000000 4.957031 cm
0.000000 0.000000 0.000000 scn
13.180191 13.115493 m
12.402289 13.892069 11.323112 14.042969 9.946011 14.042969 c
4.134184 14.042969 l
2.776993 14.042969 1.696493 13.892069 0.918559 13.115493 c
0.141978 12.338914 0.000000 11.268697 0.000000 9.914982 c
0.000000 4.146585 l
0.000000 2.766711 0.141978 1.702695 0.918559 0.927503 c
1.697854 0.149537 2.776993 -0.000006 4.146584 -0.000006 c
9.946011 -0.000006 l
11.323112 -0.000006 12.403645 0.149537 13.180191 0.927503 c
13.956801 1.704049 14.098795 2.766711 14.098795 4.146585 c
14.098795 9.896383 l
14.098795 11.274897 13.956801 12.346476 13.180191 13.115493 c
h
12.617570 10.108065 m
12.617570 3.941111 l
12.617570 3.149404 12.517962 2.432404 12.093529 2.006616 c
11.675289 1.589731 10.943192 1.481156 10.159034 1.481156 c
3.941103 1.481156 l
3.156964 1.481156 2.423473 1.589731 1.999047 2.006616 c
1.582175 2.432404 1.481173 3.149404 1.481173 3.941111 c
1.481173 10.089472 l
1.481173 10.887365 1.582175 11.616772 1.999047 12.035005 c
2.423473 12.459431 3.163163 12.561794 3.959702 12.561794 c
10.159034 12.561794 l
10.943192 12.561794 11.675289 12.453232 12.093529 12.035005 c
12.517962 11.610572 12.617570 10.893565 12.617570 10.108065 c
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 5.000000 13.060150 cm
0.000000 0.000000 0.000000 scn
9.412357 -3.042511 m
9.788599 -3.042511 10.030975 -2.756910 10.030975 -2.357380 c
10.030975 1.161995 l
10.030975 1.678799 9.741376 1.911201 9.272816 1.911201 c
5.733462 1.911201 l
5.323707 1.911201 5.062879 1.668818 5.062879 1.292628 c
5.062879 0.916439 5.328545 0.674062 5.741778 0.674062 c
7.018399 0.674062 l
8.055644 0.795024 l
6.932081 -0.231801 l
4.283275 -2.886775 l
4.155662 -3.014382 4.070536 -3.192824 4.070536 -3.369849 c
4.070536 -3.768606 4.344208 -4.028660 4.727204 -4.028660 c
4.931782 -4.028660 5.099916 -3.953823 5.235697 -3.819378 c
7.877652 -1.178787 l
8.898316 -0.067582 l
8.787611 -1.159884 l
8.787611 -2.367121 l
8.787611 -2.775490 9.029987 -3.042511 9.412357 -3.042511 c
h
f
n
Q
endstream
endobj
3 0 obj
2079
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 24.000000 24.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
0000002169 00000 n
0000002192 00000 n
0000002365 00000 n
0000002439 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
2498
%%EOF

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "icon_msg.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,91 @@
%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 1.000000 cm
0.000000 0.000000 0.000000 scn
0.914983 0.008142 m
0.796035 0.008142 0.677086 0.024427 0.567288 0.065142 c
0.219595 0.187283 0.000000 0.488562 0.000000 0.822412 c
0.000000 17.922062 l
0.000000 19.615742 1.546320 21.000000 3.458635 21.000000 c
20.541365 21.000000 l
22.444529 21.000000 24.000000 19.623884 24.000000 17.922062 c
24.000000 6.791004 l
24.000000 5.097324 22.453680 3.713068 20.541365 3.713068 c
5.416698 3.713068 l
1.573768 0.244282 l
1.399922 0.089571 1.162027 0.000000 0.924131 0.000000 c
0.914983 0.008142 l
h
3.458635 19.371462 m
2.561951 19.371462 1.829966 18.720047 1.829966 17.922062 c
1.829966 2.801086 l
4.373618 5.097324 l
4.547464 5.252036 4.776209 5.341606 5.023254 5.341606 c
20.532221 5.341606 l
21.428904 5.341606 22.160889 5.993020 22.160889 6.791004 c
22.160889 17.922062 l
22.160889 18.720047 21.428904 19.371462 20.532221 19.371462 c
3.449486 19.371462 l
3.458635 19.371462 l
h
f
n
Q
endstream
endobj
3 0 obj
1003
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 24.000000 24.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
0000001093 00000 n
0000001116 00000 n
0000001289 00000 n
0000001363 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
1422
%%EOF

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "icon_msg_req.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,121 @@
%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 1.500000 cm
0.000000 0.000000 0.000000 scn
0.914983 0.008142 m
0.796035 0.008142 0.677086 0.024427 0.567288 0.065142 c
0.219595 0.187283 0.000000 0.488562 0.000000 0.822412 c
0.000000 17.922062 l
0.000000 19.615742 1.546320 21.000000 3.458635 21.000000 c
20.541365 21.000000 l
22.444529 21.000000 24.000000 19.623884 24.000000 17.922062 c
24.000000 6.791004 l
24.000000 5.097324 22.453680 3.713068 20.541365 3.713068 c
5.416698 3.713068 l
1.573768 0.244282 l
1.399922 0.089571 1.162027 0.000000 0.924131 0.000000 c
0.914983 0.008142 l
h
3.458635 19.371462 m
2.561951 19.371462 1.829966 18.720047 1.829966 17.922062 c
1.829966 2.801086 l
4.373618 5.097324 l
4.547464 5.252036 4.776209 5.341606 5.023254 5.341606 c
20.532221 5.341606 l
21.428904 5.341606 22.160889 5.993020 22.160889 6.791004 c
22.160889 17.922062 l
22.160889 18.720047 21.428904 19.371462 20.532221 19.371462 c
3.449486 19.371462 l
3.458635 19.371462 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 9.209106 12.630783 cm
0.000000 0.000000 0.000000 scn
2.873591 5.708511 m
1.149096 5.708511 0.035927 4.904504 0.000000 2.994084 c
1.568242 2.994084 l
1.652071 4.042235 2.167027 4.321889 2.873591 4.321889 c
3.580156 4.321889 3.938854 3.890755 3.938854 3.378609 c
3.938854 2.504688 3.653718 2.329904 2.119122 1.351112 c
2.119122 0.000000 l
3.699912 0.000000 l
3.699912 1.153022 l
4.585541 1.584157 5.581797 2.283293 5.581797 3.552838 c
5.581797 4.822382 4.645420 5.708511 2.873591 5.708511 c
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 9.209106 16.673569 cm
0.000000 0.000000 0.000000 scn
3.795147 -4.940009 m
1.975415 -4.940009 l
1.975415 -6.605731 l
3.795147 -6.605731 l
3.795147 -4.940009 l
h
f
n
Q
endstream
endobj
3 0 obj
1744
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 24.000000 24.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
0000001834 00000 n
0000001857 00000 n
0000002030 00000 n
0000002104 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
2163
%%EOF

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "icon_privacy.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -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 3.315186 18.125109 cm
0.000000 0.000000 0.000000 scn
8.682752 -7.852200 m
7.766013 -7.852200 7.022931 -8.595794 7.022931 -9.513163 c
7.022931 -10.200179 7.438895 -10.790205 8.036592 -11.044806 c
8.036592 -12.855295 l
8.036592 -13.061399 8.202171 -13.227093 8.408134 -13.227093 c
8.965447 -13.227093 l
9.171411 -13.227093 9.336988 -13.061399 9.336988 -12.855295 c
9.336988 -11.044806 l
9.930647 -10.790205 10.350650 -10.204220 10.350650 -9.513163 c
10.350650 -8.595794 9.607568 -7.852200 8.690829 -7.852200 c
8.682752 -7.852200 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 3.315186 0.000000 cm
0.000000 0.000000 0.000000 scn
15.281665 14.217197 m
15.281665 16.900602 l
15.281665 20.537746 12.321448 23.500000 8.682764 23.500000 c
5.044080 23.500000 2.087902 20.537746 2.087902 16.900602 c
2.087902 14.217197 l
0.840007 13.465521 0.000000 12.103611 0.000000 10.543680 c
0.000000 4.287790 l
0.000000 1.923645 1.922323 0.000000 4.284843 0.000000 c
13.084723 0.000000 l
15.447243 0.000000 17.369566 1.923645 17.369566 4.287790 c
17.369566 10.543680 l
17.369566 12.103611 16.529560 13.469562 15.281665 14.217197 c
h
4.107149 16.900602 m
4.107149 19.426397 6.158705 21.479364 8.682764 21.479364 c
11.206823 21.479364 13.258379 19.426397 13.258379 16.900602 c
13.258379 14.879966 l
4.107149 14.879966 l
4.107149 16.900602 l
h
15.350318 4.287790 m
15.350318 3.039038 14.332619 2.020638 13.084723 2.020638 c
4.284843 2.020638 l
3.036948 2.020638 2.019248 3.039038 2.019248 4.287790 c
2.019248 10.543680 l
2.019248 11.792434 3.036948 12.810834 4.284843 12.810834 c
13.084723 12.810834 l
14.332619 12.810834 15.350318 11.792434 15.350318 10.543680 c
15.350318 4.287790 l
h
f
n
Q
endstream
endobj
3 0 obj
1738
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 24.000000 24.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
0000001828 00000 n
0000001851 00000 n
0000002024 00000 n
0000002098 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
2157
%%EOF

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "icon_recovery.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,211 @@
%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 1.906494 0.000031 cm
0.000000 0.000000 0.000000 scn
10.088854 23.999969 m
9.792789 23.999969 9.500896 23.933001 9.221511 23.803249 c
8.925447 23.665125 8.625214 23.535374 8.324979 23.401436 c
8.141503 23.321909 7.958026 23.238199 7.778720 23.158672 c
7.745361 23.141932 l
7.641113 23.091703 l
7.578564 23.062405 l
6.089904 22.396902 l
4.446957 21.664431 2.808179 20.931957 1.165232 20.199486 c
0.393797 19.843714 -0.031534 19.157284 0.001825 18.345285 c
0.005995 18.211348 0.001825 18.060667 0.001825 17.897430 c
0.001825 17.784420 0.001825 17.667225 0.001825 17.554214 c
0.001825 14.059277 l
0.001825 13.967196 0.001825 13.875113 0.001825 13.783031 c
0.001825 13.716063 0.001825 13.653279 0.001825 13.586310 c
0.001825 12.870581 -0.006515 12.121366 0.093563 11.330296 c
0.147772 10.865699 0.239510 10.426215 0.327079 9.999289 c
0.352098 9.873722 0.377118 9.752341 0.402137 9.626775 c
0.422987 9.530507 l
0.452176 9.434239 l
0.514725 9.241704 l
0.681521 8.722695 0.852488 8.186944 1.086003 7.638638 c
1.365388 6.989876 1.707321 6.336927 2.161842 5.587713 c
2.224391 5.483074 l
2.282769 5.416107 l
3.592124 3.444712 5.293450 1.921169 7.340879 0.891523 c
7.353388 0.891523 l
7.365899 0.878965 l
8.083124 0.531565 8.808690 0.259504 9.521746 0.071156 c
9.717732 0.020927 9.901208 0.000000 10.080514 0.000000 c
10.259821 0.000000 10.447467 0.020927 10.630943 0.066967 c
10.647622 0.066967 l
10.664303 0.075340 l
11.427398 0.280432 12.123775 0.569235 12.707562 0.828739 c
12.770110 0.858038 l
12.832660 0.891523 l
12.870189 0.912451 12.911888 0.937565 12.949417 0.958492 c
14.146183 1.573769 15.242870 2.377394 16.214462 3.356813 c
16.806589 3.955349 17.361189 4.641779 17.957487 5.520744 c
17.982506 5.554232 l
18.003355 5.587713 l
18.507914 6.412270 18.895718 7.169855 19.191782 7.906511 c
19.412786 8.467377 19.583754 9.011498 19.733871 9.522136 c
19.750551 9.572362 l
19.763062 9.622591 l
19.938196 10.371804 20.138353 11.367966 20.159203 12.418540 c
20.171713 12.816168 20.175882 13.226352 20.180054 13.632351 c
20.180054 14.029979 l
20.184221 14.050906 l
20.184221 14.071834 l
20.171711 15.214491 20.171711 16.378075 20.184221 17.520731 c
20.184221 17.646297 20.184221 17.755123 20.180054 17.859760 c
20.180054 17.985327 20.171713 18.102524 20.180054 18.177864 c
20.250940 19.077757 19.783909 19.852085 18.929077 20.232971 c
17.394548 20.915216 15.864188 21.601646 14.333828 22.283892 c
12.411498 23.146116 l
12.002846 23.326096 l
11.648402 23.480961 11.293960 23.635826 10.947857 23.799063 c
10.664303 23.928816 10.380748 23.991598 10.093024 23.991598 c
10.088854 23.999969 l
h
10.080514 1.678406 m
10.047155 1.678406 10.001287 1.678406 9.942907 1.695150 c
9.334099 1.854200 8.708611 2.088591 8.087294 2.389950 c
6.302569 3.285660 4.813909 4.616667 3.667182 6.345301 c
3.617143 6.420639 l
3.583784 6.462496 l
3.170962 7.144741 2.862388 7.726534 2.620533 8.299955 c
2.416207 8.777108 2.266090 9.254260 2.103463 9.760713 c
2.040914 9.953248 l
2.015895 10.074629 1.990875 10.196011 1.961686 10.338319 c
1.878288 10.748504 1.799059 11.133574 1.749020 11.539574 c
1.661452 12.221819 1.665622 12.878951 1.669792 13.586310 c
1.669792 13.661651 1.669792 13.732804 1.669792 13.820701 c
1.669792 13.900226 1.669792 13.975566 1.669792 14.055092 c
1.669792 17.550030 l
1.669792 17.654669 1.669792 17.759308 1.669792 17.863947 c
1.669792 18.039740 1.678132 18.219719 1.669792 18.416439 c
1.669792 18.500151 1.661452 18.583862 1.840758 18.667572 c
3.483706 19.400045 5.126653 20.132517 6.769600 20.864988 c
8.258261 21.530493 l
8.291619 21.547234 l
8.354168 21.576534 l
8.458417 21.626760 l
8.637722 21.706285 8.812860 21.785810 9.008846 21.869522 c
9.313250 22.003460 9.613483 22.137398 9.934566 22.283892 c
10.009626 22.317377 10.059665 22.321562 10.093024 22.321562 c
10.126383 22.321562 10.176423 22.317377 10.251481 22.283892 c
10.605924 22.120655 10.960367 21.961605 11.331490 21.798368 c
11.735971 21.618389 l
13.658302 20.756165 l
15.192832 20.069735 16.723192 19.383303 18.257721 18.701057 c
18.524593 18.583862 18.532934 18.437368 18.524593 18.299244 c
18.512085 18.140194 18.516254 17.981142 18.524593 17.809534 c
18.524593 17.721638 18.528765 17.629555 18.528765 17.541658 c
18.516256 16.382259 18.516256 15.210304 18.528765 14.050906 c
18.528765 13.653279 l
18.520426 13.255651 18.516254 12.853838 18.503746 12.456210 c
18.482895 11.560501 18.303591 10.673164 18.149303 10.003476 c
18.007526 9.530508 17.849068 9.024055 17.657253 8.534346 c
17.398718 7.885584 17.048445 7.207525 16.593924 6.466682 c
16.056005 5.675611 15.559785 5.064520 15.042714 4.541325 c
14.196221 3.687471 13.241312 2.984301 12.203002 2.452736 c
12.144623 2.423435 l
12.086245 2.389950 l
12.086245 2.389950 12.057055 2.373209 12.044545 2.364838 c
11.523305 2.134632 10.897819 1.870943 10.247312 1.699335 c
10.193103 1.686779 10.134724 1.678406 10.084684 1.678406 c
10.080514 1.678406 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 1.906494 21.036652 cm
0.000000 0.000000 0.000000 scn
5.873068 -7.554950 m
5.059934 -7.554950 4.396918 -8.216269 4.396918 -9.036636 c
4.396918 -9.857005 5.055765 -10.518322 5.873068 -10.518322 c
6.690372 -10.518322 7.349218 -9.857005 7.349218 -9.036636 c
7.349218 -8.216269 6.690372 -7.554950 5.873068 -7.554950 c
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 1.906494 21.036652 cm
0.000000 0.000000 0.000000 scn
10.093023 -7.554950 m
9.279889 -7.554950 8.616873 -8.216269 8.616873 -9.036636 c
8.616873 -9.857005 9.275720 -10.518322 10.093023 -10.518322 c
10.910327 -10.518322 11.569174 -9.857005 11.569174 -9.036636 c
11.569174 -8.216269 10.910327 -7.554950 10.093023 -7.554950 c
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 1.906494 21.036652 cm
0.000000 0.000000 0.000000 scn
14.312980 -7.554950 m
13.499846 -7.554950 12.836828 -8.216269 12.836828 -9.036636 c
12.836828 -9.857005 13.495676 -10.518322 14.312980 -10.518322 c
15.130283 -10.518322 15.789130 -9.857005 15.789130 -9.036636 c
15.789130 -8.216269 15.130283 -7.554950 14.312980 -7.554950 c
h
f
n
Q
endstream
endobj
3 0 obj
6034
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 24.000000 24.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
0000006124 00000 n
0000006147 00000 n
0000006320 00000 n
0000006394 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
6453
%%EOF

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "icon_speaker.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,178 @@
%PDF-1.7
1 0 obj
<< /Type /XObject
/Length 2 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << >>
/BBox [ 0.000000 0.000000 24.000000 24.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 1.000000 -0.030197 cm
0.000000 0.000000 0.000000 scn
19.462608 0.030197 m
18.919228 0.031466 18.390785 0.200081 17.955881 0.510967 c
12.072273 4.652666 l
11.403143 5.124496 10.593321 5.379530 9.761348 5.380438 c
3.092020 5.380438 l
2.272341 5.381605 1.486594 5.692862 0.906993 6.245991 c
0.327392 6.799118 0.001222 7.548988 0.000000 8.331227 c
0.000000 15.750109 l
0.001222 16.532349 0.327392 17.282219 0.906993 17.835346 c
1.486594 18.388475 2.272341 18.699734 3.092020 18.700901 c
9.849164 18.700901 l
10.681964 18.705595 11.491492 18.963621 12.160089 19.437489 c
17.937405 23.548307 l
18.315399 23.817577 18.764448 23.981174 19.234310 24.020786 c
19.704172 24.060396 20.176323 23.974461 20.597929 23.772600 c
21.019535 23.570740 21.373953 23.260904 21.621571 22.877771 c
21.869188 22.494638 22.000217 22.053314 22.000000 21.603167 c
22.000000 2.460524 l
21.998779 1.816320 21.730082 1.198832 21.252760 0.743311 c
20.775436 0.287790 20.128420 0.031364 19.453384 0.030197 c
19.462608 0.030197 l
h
3.092020 16.495525 m
2.884861 16.495525 2.686188 16.416988 2.539705 16.277197 c
2.393222 16.137403 2.310926 15.947805 2.310926 15.750109 c
2.310926 8.331227 l
2.310926 8.133531 2.393222 7.943933 2.539705 7.804142 c
2.686188 7.664349 2.884861 7.585812 3.092020 7.585812 c
9.770600 7.585812 l
11.092910 7.582773 12.379868 7.178019 13.444978 6.430197 c
19.328585 2.284098 l
19.361866 2.258144 19.402451 2.242189 19.445232 2.238264 c
19.488014 2.234339 19.531078 2.242609 19.568930 2.262035 c
19.608538 2.279341 19.641914 2.307396 19.664928 2.342691 c
19.687941 2.377989 19.699558 2.418968 19.698328 2.460524 c
19.698328 21.603167 l
19.700840 21.644947 19.689758 21.686449 19.666592 21.721983 c
19.643423 21.757515 19.609318 21.785347 19.568930 21.801655 c
19.533316 21.824224 19.491510 21.836262 19.448759 21.836262 c
19.406008 21.836262 19.364201 21.824224 19.328585 21.801655 c
13.546645 17.686420 l
12.476994 16.928680 11.181296 16.517551 9.849164 16.513172 c
3.092020 16.495525 l
h
f*
n
Q
endstream
endobj
2 0 obj
2055
endobj
3 0 obj
<< /Type /XObject
/Length 4 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << >>
/BBox [ 0.000000 0.000000 24.000000 24.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.000000 0.000000 scn
0.000000 24.000000 m
24.000000 24.000000 l
24.000000 0.000000 l
0.000000 0.000000 l
0.000000 24.000000 l
h
f
n
Q
endstream
endobj
4 0 obj
232
endobj
5 0 obj
<< /XObject << /X1 1 0 R >>
/ExtGState << /E1 << /SMask << /Type /Mask
/G 3 0 R
/S /Alpha
>>
/Type /ExtGState
>> >>
>>
endobj
6 0 obj
<< /Length 7 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
/E1 gs
/X1 Do
Q
endstream
endobj
7 0 obj
46
endobj
8 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 24.000000 24.000000 ]
/Resources 5 0 R
/Contents 6 0 R
/Parent 9 0 R
>>
endobj
9 0 obj
<< /Kids [ 8 0 R ]
/Count 1
/Type /Pages
>>
endobj
10 0 obj
<< /Pages 9 0 R
/Type /Catalog
>>
endobj
xref
0 11
0000000000 65535 f
0000000010 00000 n
0000002313 00000 n
0000002336 00000 n
0000002816 00000 n
0000002838 00000 n
0000003136 00000 n
0000003238 00000 n
0000003259 00000 n
0000003432 00000 n
0000003506 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 10 0 R
/Size 11
>>
startxref
3566
%%EOF

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -733,14 +733,13 @@
"NOTIFICATIONS_SECTION_STRATEGY" = "Notification Strategy";
"NOTIFICATIONS_STRATEGY_FAST_MODE_TITLE" = "Use Fast Mode";
"NOTIFICATIONS_STRATEGY_FAST_MODE_DESCRIPTION" = "You'll be notified of new message reliably and immediately using Apple's notification servers.";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1" = "Go to ";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2" = "device notification settings";
"NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION" = "Go to device notification settings";
"NOTIFICATIONS_SECTION_STYLE" = "Notification Style";
"NOTIFICATIONS_STYLE_SOUND_TITLE" = "Sound";
"NOTIFICATIONS_STYLE_SOUND_WHEN_OPEN_TITLE" = "Sound When App is Open";
"NOTIFICATIONS_STYLE_CONTENT_TITLE" = "Notification Content";
"NOTIFICATIONS_STYLE_CONTENT_DESCRIPTION" = "The information shown in notifications.";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name and Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT" = "Name & Content";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY" = "Name Only";
"NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT" = "No Name or Content";
"CONVERSATION_SETTINGS_TITLE" = "Conversations";
@ -792,4 +791,6 @@
"modal_permission_microphone" = "microphone";
"modal_permission_library" = "library";
"DISAPPEARING_MESSAGES_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_OFF" = "Off";
"DISAPPEARING_MESSAGES_SUBTITLE_DISAPPEAR_AFTER" = "Disappear After: %@";
"COPY_GROUP_URL" = "Copy Group URL";

@ -169,8 +169,7 @@ final class DisplayNameVC: BaseVC {
queue: DispatchQueue.global(qos: .default),
profileName: displayName,
image: nil,
imageFilePath: nil,
requiredSync: false
imageFilePath: nil
)
let pnModeVC = PNModeVC()
navigationController?.pushViewController(pnModeVC, animated: true)

@ -68,8 +68,8 @@ final class FakeChatView: UIView {
bubbleView.set(.width, to: FakeChatView.bubbleWidth)
bubbleView.themeShadowColor = .black
bubbleView.layer.cornerRadius = FakeChatView.bubbleCornerRadius
bubbleView.layer.shadowRadius = isLightMode ? 4 : 8
bubbleView.layer.shadowOpacity = isLightMode ? 0.16 : 0.24
bubbleView.layer.shadowRadius = (ThemeManager.currentTheme.interfaceStyle == .light ? 4 : 8)
bubbleView.layer.shadowOpacity = (ThemeManager.currentTheme.interfaceStyle == .light ? 0.16 : 0.24)
bubbleView.layer.shadowOffset = CGSize.zero
bubbleView.themeBackgroundColor = (wasSentByCurrentUser ?

@ -38,18 +38,14 @@ class BlockedContactsViewController: BaseVC, UITableViewDelegate, UITableViewDat
private lazy var tableView: UITableView = {
let result: UITableView = UITableView()
result.translatesAutoresizingMaskIntoConstraints = false
result.clipsToBounds = true
result.separatorStyle = .none
result.themeBackgroundColor = .clear
result.showsVerticalScrollIndicator = false
result.contentInset = UIEdgeInsets(
top: 0,
left: 0,
bottom: Values.footerGradientHeight(window: UIApplication.shared.keyWindow),
right: 0
)
result.register(view: BlockedContactCell.self)
result.dataSource = self
result.delegate = self
result.layer.cornerRadius = SettingsCell.cornerRadius
if #available(iOS 15.0, *) {
result.sectionHeaderTopPadding = 0
@ -75,11 +71,11 @@ class BlockedContactsViewController: BaseVC, UITableViewDelegate, UITableViewDat
private lazy var fadeView: GradientView = {
let result: GradientView = GradientView()
result.themeBackgroundGradient = [
.value(.backgroundSecondary, alpha: 0), // Want this to take up 20% (~25pt)
.backgroundSecondary,
.backgroundSecondary,
.backgroundSecondary,
.backgroundSecondary
.value(.backgroundPrimary, alpha: 0), // Want this to take up 20% (~25pt)
.backgroundPrimary,
.backgroundPrimary,
.backgroundPrimary,
.backgroundPrimary
]
result.set(.height, to: Values.footerGradientHeight(window: UIApplication.shared.keyWindow))
@ -99,6 +95,8 @@ class BlockedContactsViewController: BaseVC, UITableViewDelegate, UITableViewDat
override func viewDidLoad() {
super.viewDidLoad()
view.themeBackgroundColor = .backgroundPrimary
ViewControllerUtilities.setUpDefaultSessionStyle(
for: self,
@ -162,9 +160,9 @@ class BlockedContactsViewController: BaseVC, UITableViewDelegate, UITableViewDat
private func setupLayout() {
NSLayoutConstraint.activate([
tableView.topAnchor.constraint(equalTo: view.topAnchor, constant: Values.smallSpacing),
tableView.leftAnchor.constraint(equalTo: view.leftAnchor),
tableView.rightAnchor.constraint(equalTo: view.rightAnchor),
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
tableView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: Values.largeSpacing),
tableView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -Values.largeSpacing),
tableView.bottomAnchor.constraint(equalTo: unblockButton.topAnchor, constant: -Values.largeSpacing),
emptyStateLabel.topAnchor.constraint(equalTo: view.topAnchor, constant: Values.massiveSpacing),
emptyStateLabel.leftAnchor.constraint(equalTo: view.leftAnchor, constant: Values.mediumSpacing),

@ -80,7 +80,7 @@ class ConversationSettingsViewModel: SettingsTableViewModel<NoNav, ConversationS
title: "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE".localized(),
action: .push(
showChevron: false,
textColor: .danger,
tintColor: .danger,
shouldHaveBackground: false
) { BlockedContactsViewController() }
)

@ -72,25 +72,7 @@ class NotificationSettingsViewModel: SettingsTableViewModel<NoNav, NotificationS
SyncPushTokensJob.run(uploadOnlyIfStale: false)
}
),
extraActionTitle: { theme, primaryColor in
NSMutableAttributedString()
.appending(
NSAttributedString(
string: "NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_1".localized(),
attributes: [
.foregroundColor: primaryColor.color
]
)
)
.appending(
NSAttributedString(
string: "NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION_2".localized(),
attributes: [
.foregroundColor: (theme.color(for: .textPrimary) ?? .white)
]
)
)
},
extraActionTitle: "NOTIFICATIONS_STRATEGY_FAST_MODE_ACTION".localized(),
onExtraAction: { UIApplication.shared.openSystemSettings() }
)
]

@ -7,6 +7,19 @@ import SessionMessagingKit
import SignalUtilitiesKit
final class NukeDataModal: Modal {
// MARK: - Initialization
override init(afterClosed: (() -> ())? = nil) {
super.init(afterClosed: afterClosed)
self.modalPresentationStyle = .overFullScreen
self.modalTransitionStyle = .crossDissolve
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Components
private lazy var titleLabel: UILabel = {

@ -7,7 +7,7 @@ import SessionUIKit
import SessionMessagingKit
import SessionUtilitiesKit
class PrivacySettingsViewModel: SettingsTableViewModel<PrivacySettingsViewModel.NavButton, PrivacySettingsViewModel.Section, PrivacySettingsViewModel.Section> {
class PrivacySettingsViewModel: SettingsTableViewModel<PrivacySettingsViewModel.NavButton, PrivacySettingsViewModel.Section, PrivacySettingsViewModel.Item> {
// MARK: - Initialization
init(shouldShowCloseButton: Bool = false) {
@ -21,8 +21,7 @@ class PrivacySettingsViewModel: SettingsTableViewModel<PrivacySettingsViewModel.
}
public enum Section: SettingSection {
case screenLock
case screenshotNotifications
case screenSecurity
case readReceipts
case typingIndicators
case linkPreviews
@ -30,8 +29,7 @@ class PrivacySettingsViewModel: SettingsTableViewModel<PrivacySettingsViewModel.
var title: String? {
switch self {
case .screenLock: return "PRIVACY_SECTION_SCREEN_SECURITY".localized()
case .screenshotNotifications: return nil
case .screenSecurity: return "PRIVACY_SECTION_SCREEN_SECURITY".localized()
case .readReceipts: return "PRIVACY_SECTION_READ_RECEIPTS".localized()
case .typingIndicators: return "PRIVACY_SECTION_TYPING_INDICATORS".localized()
case .linkPreviews: return "PRIVACY_SECTION_LINK_PREVIEWS".localized()
@ -39,12 +37,16 @@ class PrivacySettingsViewModel: SettingsTableViewModel<PrivacySettingsViewModel.
}
}
var style: SettingSectionHeaderStyle {
switch self {
case .screenshotNotifications: return .padding
default: return .title
}
}
var style: SettingSectionHeaderStyle { return .title }
}
public enum Item: Differentiable {
case screenLock
case screenshotNotifications
case readReceipts
case typingIndicators
case linkPreviews
case calls
}
// MARK: - Content
@ -67,19 +69,14 @@ class PrivacySettingsViewModel: SettingsTableViewModel<PrivacySettingsViewModel.
.trackingConstantRegion { db -> [SectionModel] in
return [
SectionModel(
model: .screenLock,
model: .screenSecurity,
elements: [
SettingInfo(
id: .screenLock,
title: "PRIVACY_SCREEN_SECURITY_LOCK_SESSION_TITLE".localized(),
subtitle: "PRIVACY_SCREEN_SECURITY_LOCK_SESSION_DESCRIPTION".localized(),
action: .settingBool(key: .isScreenLockEnabled)
)
]
),
SectionModel(
model: .screenshotNotifications,
elements: [
),
SettingInfo(
id: .screenshotNotifications,
title: "PRIVACY_SCREEN_SECURITY_SCREENSHOT_NOTIFICATIONS_TITLE".localized(),

@ -14,6 +14,19 @@ final class SeedModal: Modal {
return Mnemonic.encode(hexEncodedString: Identity.fetchUserPrivateKey()!.toHexString())
}()
// MARK: - Initialization
override init(afterClosed: (() -> ())? = nil) {
super.init(afterClosed: afterClosed)
self.modalPresentationStyle = .overFullScreen
self.modalTransitionStyle = .crossDissolve
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Components
private let titleLabel: UILabel = {

@ -204,6 +204,25 @@ class SettingsTableViewController<NavItemId: Equatable, Section: SettingSection,
}
.store(in: &disposables)
viewModel.transitionToScreen
.receive(on: DispatchQueue.main)
.sink { [weak self] viewController, transitionType in
switch transitionType {
case .push:
self?.navigationController?.pushViewController(viewController, animated: true)
case .present:
if UIDevice.current.isIPad {
viewController.popoverPresentationController?.permittedArrowDirections = []
viewController.popoverPresentationController?.sourceView = self?.view
viewController.popoverPresentationController?.sourceRect = (self?.view.bounds ?? UIScreen.main.bounds)
}
self?.present(viewController, animated: true)
}
}
.store(in: &disposables)
viewModel.leftNavItems
.receiveOnMain(immediately: true)
.sink { [weak self] maybeItems in
@ -215,6 +234,7 @@ class SettingsTableViewController<NavItemId: Equatable, Section: SettingSection,
buttonItem.tapPublisher
.map { _ in item.id }
.handleEvents(receiveOutput: { _ in item.action?() })
.sink(into: self?.viewModel.navItemTapped)
.store(in: &buttonItem.disposables)
@ -237,6 +257,7 @@ class SettingsTableViewController<NavItemId: Equatable, Section: SettingSection,
buttonItem.tapPublisher
.map { _ in item.id }
.handleEvents(receiveOutput: { _ in item.action?() })
.sink(into: self?.viewModel.navItemTapped)
.store(in: &buttonItem.disposables)
@ -276,22 +297,18 @@ class SettingsTableViewController<NavItemId: Equatable, Section: SettingSection,
let settingInfo: SettingInfo<SettingItem> = section.elements[indexPath.row]
switch settingInfo.action {
case .threadInfo(let threadViewModel, let style, let createAvatarTapDestination, let titleTapped, let titleChanged):
case .threadInfo(let threadViewModel, let style, let avatarTapped, let titleTapped, let titleChanged):
let cell: SettingsAvatarCell = tableView.dequeue(type: SettingsAvatarCell.self, for: indexPath)
cell.update(
threadViewModel: threadViewModel,
style: style
style: style,
viewController: self
)
cell.update(isEditing: self.isEditing, animated: false)
cell.profilePictureTapPublisher
.sink(receiveValue: { [weak self] _ in
guard let viewController: UIViewController = createAvatarTapDestination?() else {
return
}
self?.present(viewController, animated: true, completion: nil)
})
.filter { _ in threadViewModel.threadVariant == .contact }
.sink(receiveValue: { _ in avatarTapped?() })
.store(in: &cell.disposables)
cell.displayNameTapPublisher
@ -319,8 +336,15 @@ class SettingsTableViewController<NavItemId: Equatable, Section: SettingSection,
action: settingInfo.action,
extraActionTitle: settingInfo.extraActionTitle,
onExtraAction: settingInfo.onExtraAction,
isFirstInSection: (indexPath.row == 0),
isLastInSection: (indexPath.row == (section.elements.count - 1))
position: {
guard section.elements.count > 1 else { return .individual }
switch indexPath.row {
case 0: return .top
case (section.elements.count - 1): return .bottom
default: return .middle
}
}()
)
cell.update(isEditing: self.isEditing, animated: false)
@ -338,7 +362,7 @@ class SettingsTableViewController<NavItemId: Equatable, Section: SettingSection,
case .padding, .title:
let result: SettingHeaderView = tableView.dequeueHeaderFooterView(type: SettingHeaderView.self)
result.update(
with: section.model.title,
title: section.model.title,
hasSeparator: (section.elements.first?.action.shouldHaveBackground != false)
)
@ -466,7 +490,7 @@ class SettingsTableViewController<NavItemId: Equatable, Section: SettingSection,
let viewController: UIViewController = createDestination()
navigationController?.pushViewController(viewController, animated: true)
case .present(let createDestination):
case .present(_, let createDestination):
let viewController: UIViewController = createDestination()
if UIDevice.current.isIPad {
@ -527,8 +551,15 @@ class SettingsTableViewController<NavItemId: Equatable, Section: SettingSection,
action: settingInfo.action,
extraActionTitle: settingInfo.extraActionTitle,
onExtraAction: settingInfo.onExtraAction,
isFirstInSection: (indexPath.row == 0),
isLastInSection: (indexPath.row == (section.elements.count - 1))
position: {
guard section.elements.count > 1 else { return .individual }
switch indexPath.row {
case 0: return .top
case (section.elements.count - 1): return .bottom
default: return .middle
}
}()
)
}
else {

@ -29,6 +29,10 @@ class SettingsTableViewModel<NavItemId: Equatable, Section: SettingSection, Sett
.removeDuplicates()
.shareReplay(1)
private let _transitionToScreen: PassthroughSubject<(UIViewController, TransitionType), Never> = PassthroughSubject()
lazy var transitionToScreen: AnyPublisher<(UIViewController, TransitionType), Never> = _transitionToScreen
.shareReplay(0)
// MARK: - Navigation
open var leftNavItems: AnyPublisher<[NavItem]?, Never> {
@ -71,6 +75,10 @@ class SettingsTableViewModel<NavItemId: Equatable, Section: SettingSection, Sett
func setIsEditing(_ isEditing: Bool) {
_isEditing.send(isEditing)
}
func transitionToScreen(_ viewController: UIViewController, transitionType: TransitionType = .push) {
_transitionToScreen.send((viewController, transitionType))
}
}
// MARK: - NavItem
@ -84,32 +92,37 @@ extension SettingsTableViewModel {
let style: UIBarButtonItem.Style
let systemItem: UIBarButtonItem.SystemItem?
let accessibilityIdentifier: String
let action: (() -> Void)?
// MARK: - Initialization
public init(
id: NavItemId,
systemItem: UIBarButtonItem.SystemItem?,
accessibilityIdentifier: String
accessibilityIdentifier: String,
action: (() -> Void)? = nil
) {
self.id = id
self.image = nil
self.style = .plain
self.systemItem = systemItem
self.accessibilityIdentifier = accessibilityIdentifier
self.action = action
}
public init(
id: NavItemId,
image: UIImage?,
style: UIBarButtonItem.Style,
accessibilityIdentifier: String
accessibilityIdentifier: String,
action: (() -> Void)? = nil
) {
self.id = id
self.image = image
self.style = style
self.systemItem = nil
self.accessibilityIdentifier = accessibilityIdentifier
self.action = action
}
// MARK: - Functions
@ -159,16 +172,25 @@ extension SettingSection {
public enum IconSize: Differentiable {
case small
case medium
case large
var size: CGFloat {
switch self {
case .small: return 24
case .medium: return 32
case .large: return 80
}
}
}
// MARK: - TransitionType
public enum TransitionType {
case push
case present
}
// MARK: - SettingInfo
struct SettingInfo<ID: Hashable & Differentiable>: Equatable, Hashable, Differentiable {
@ -182,7 +204,7 @@ struct SettingInfo<ID: Hashable & Differentiable>: Equatable, Hashable, Differen
let accessibilityIdentifier: String?
let action: SettingsAction
let subtitleExtraViewGenerator: (() -> UIView)?
let extraActionTitle: ((Theme, Theme.PrimaryColor) -> NSAttributedString)?
let extraActionTitle: String?
let onExtraAction: (() -> Void)?
// MARK: - Initialization
@ -198,7 +220,7 @@ struct SettingInfo<ID: Hashable & Differentiable>: Equatable, Hashable, Differen
accessibilityIdentifier: String? = nil,
subtitleExtraViewGenerator: (() -> UIView)? = nil,
action: SettingsAction,
extraActionTitle: ((Theme, Theme.PrimaryColor) -> NSAttributedString)? = nil,
extraActionTitle: String? = nil,
onExtraAction: (() -> Void)? = nil
) {
self.id = id
@ -228,6 +250,7 @@ struct SettingInfo<ID: Hashable & Differentiable>: Equatable, Hashable, Differen
alignment.hash(into: &hasher)
accessibilityIdentifier.hash(into: &hasher)
action.hash(into: &hasher)
extraActionTitle.hash(into: &hasher)
}
static func == (lhs: SettingInfo<ID>, rhs: SettingInfo<ID>) -> Bool {
@ -239,7 +262,8 @@ struct SettingInfo<ID: Hashable & Differentiable>: Equatable, Hashable, Differen
lhs.subtitle == rhs.subtitle &&
lhs.alignment == rhs.alignment &&
lhs.accessibilityIdentifier == rhs.accessibilityIdentifier &&
lhs.action == rhs.action
lhs.action == rhs.action &&
lhs.extraActionTitle == rhs.extraActionTitle
)
}
@ -267,7 +291,7 @@ public enum SettingsAction: Hashable, Equatable {
case threadInfo(
threadViewModel: SessionThreadViewModel,
style: ThreadInfoStyle = ThreadInfoStyle(),
createAvatarTapDestination: (() -> UIViewController?)? = nil,
avatarTapped: (() -> Void)? = nil,
titleTapped: (() -> Void)? = nil,
titleChanged: ((String) -> Void)? = nil
)
@ -304,11 +328,14 @@ public enum SettingsAction: Hashable, Equatable {
)
case push(
showChevron: Bool = true,
textColor: ThemeValue = .textPrimary,
tintColor: ThemeValue = .textPrimary,
shouldHaveBackground: Bool = true,
createDestination: () -> UIViewController
)
case present(createDestination: () -> UIViewController)
case present(
tintColor: ThemeValue = .textPrimary,
createDestination: () -> UIViewController
)
case listSelection(
isSelected: () -> Bool,
storedSelection: Bool,
@ -413,12 +440,13 @@ public enum SettingsAction: Hashable, Equatable {
case .trigger(let showChevron, _):
showChevron.hash(into: &hasher)
case .push(let showChevron, let textColor, let shouldHaveBackground, _):
case .push(let showChevron, let tintColor, let shouldHaveBackground, _):
showChevron.hash(into: &hasher)
textColor.hash(into: &hasher)
tintColor.hash(into: &hasher)
shouldHaveBackground.hash(into: &hasher)
case .present(_): break
case .present(let tintColor, _):
tintColor.hash(into: &hasher)
case .listSelection(let isSelected, let storedSelection, let shouldAutoSave, _):
isSelected().hash(into: &hasher)
@ -470,14 +498,15 @@ public enum SettingsAction: Hashable, Equatable {
case (.trigger(let lhsShowChevron, _), .trigger(let rhsShowChevron, _)):
return (lhsShowChevron == rhsShowChevron)
case (.push(let lhsShowChevron, let lhsTextColor, let lhsHasBackground, _), .push(let rhsShowChevron, let rhsTextColor, let rhsHasBackground, _)):
case (.push(let lhsShowChevron, let lhsTintColor, let lhsHasBackground, _), .push(let rhsShowChevron, let rhsTintColor, let rhsHasBackground, _)):
return (
lhsShowChevron == rhsShowChevron &&
lhsTextColor == rhsTextColor &&
lhsTintColor == rhsTintColor &&
lhsHasBackground == rhsHasBackground
)
case (.present(_), .present(_)): return true
case (.present(let lhsTintColor, _), .present(let rhsTintColor, _)):
return (lhsTintColor == rhsTintColor)
case (.listSelection(let lhsIsSelected, let lhsStoredSelection, let lhsShouldAutoSave, _), .listSelection(let rhsIsSelected, let rhsStoredSelection, let rhsShouldAutoSave, _)):
return (
@ -505,7 +534,7 @@ public struct ThreadInfoStyle: Hashable, Equatable {
public struct Action: Hashable, Equatable {
let title: String
let run: () -> ()
let run: (OutlineButton?) -> ()
public func hash(into hasher: inout Hasher) {
title.hash(into: &hasher)

@ -382,7 +382,6 @@ final class SettingsVC: BaseVC, AvatarViewHelperDelegate {
profileName: (name ?? ""),
image: profilePicture,
imageFilePath: imageFilePath,
requiredSync: true,
success: { db, updatedProfile in
if displayNameToBeUploaded != nil {
userDefaults[.lastDisplayNameUpdate] = Date()
@ -431,29 +430,6 @@ final class SettingsVC: BaseVC, AvatarViewHelperDelegate {
dismiss(animated: true, completion: nil)
}
@objc private func switchAppMode() {
let alertVC = UIAlertController.init(title: nil, message: nil, preferredStyle: .actionSheet)
let systemModeAction = UIAlertAction.init(title: NSLocalizedString("system_mode_theme", comment: ""), style: .default) { _ in
AppModeManager.shared.setAppModeToSystemDefault()
}
alertVC.addAction(systemModeAction)
let darkModeAction = UIAlertAction.init(title: NSLocalizedString("dark_mode_theme", comment: ""), style: .default) { _ in
AppModeManager.shared.setCurrentAppMode(to: .dark)
}
alertVC.addAction(darkModeAction)
let lightModeAction = UIAlertAction.init(title: NSLocalizedString("light_mode_theme", comment: ""), style: .default) { _ in
AppModeManager.shared.setCurrentAppMode(to: .light)
}
alertVC.addAction(lightModeAction)
let cancelAction = UIAlertAction.init(title: NSLocalizedString("TXT_CANCEL_TITLE", comment: ""), style: .cancel) {_ in }
alertVC.addAction(cancelAction)
self.presentAlert(alertVC)
}
@objc private func showQRCode() {
let qrCodeVC = QRCodeVC()
navigationController!.pushViewController(qrCodeVC, animated: true)

@ -0,0 +1,547 @@
// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import Foundation
import Combine
import GRDB
import DifferenceKit
import SessionUIKit
import SessionMessagingKit
import SessionUtilitiesKit
import SignalUtilitiesKit
class SettingsViewModel: SettingsTableViewModel<SettingsViewModel.NavButton, SettingsViewModel.Section, SettingsViewModel.Item> {
// MARK: - Config
enum NavState {
case standard
case editing
}
enum NavButton: Equatable {
case close
case qrCode
case cancel
case done
}
public enum Section: SettingSection {
case profileInfo
case menus
case footer
}
public enum Item: Differentiable {
case profileInfo
case path
case privacy
case notifications
case conversations
case messageRequests
case appearance
case inviteAFriend
case recoveryPhrase
case help
case clearData
}
// MARK: - Variables
private let userSessionId: String
private lazy var imagePickerHandler: ImagePickerHandler = ImagePickerHandler(viewModel: self)
fileprivate var oldDisplayName: String
private var editedDisplayName: String?
// MARK: - Initialization
init() {
self.userSessionId = getUserHexEncodedPublicKey()
self.oldDisplayName = Profile.fetchOrCreateCurrentUser().name
super.init(closeNavItemId: .close)
}
// MARK: - Navigation
lazy var navState: AnyPublisher<NavState, Never> = {
Publishers
.MergeMany(
isEditing
.filter { $0 }
.map { _ in .editing }
.eraseToAnyPublisher(),
navItemTapped
.filter { $0 == .cancel }
.map { _ in .standard }
.handleEvents(receiveOutput: { [weak self] _ in
self?.setIsEditing(false)
self?.editedDisplayName = self?.oldDisplayName
})
.eraseToAnyPublisher(),
navItemTapped
.filter { $0 == .done }
.handleEvents(receiveOutput: { [weak self] _ in
let updatedNickname: String = (self?.editedDisplayName ?? "")
.trimmingCharacters(in: .whitespacesAndNewlines)
guard !updatedNickname.isEmpty else {
self?.transitionToScreen(
ConfirmationModal(
info: ConfirmationModal.Info(
title: "vc_settings_display_name_missing_error".localized(),
cancelTitle: "BUTTON_OK".localized(),
cancelStyle: .textPrimary
)
),
transitionType: .present
)
return
}
guard !ProfileManager.isToLong(profileName: updatedNickname) else {
self?.transitionToScreen(
ConfirmationModal(
info: ConfirmationModal.Info(
title: "vc_settings_display_name_too_long_error".localized(),
cancelTitle: "BUTTON_OK".localized(),
cancelStyle: .textPrimary
)
),
transitionType: .present
)
return
}
self?.setIsEditing(false)
self?.oldDisplayName = updatedNickname
self?.updateProfile(
name: updatedNickname,
profilePicture: nil,
profilePictureFilePath: nil,
isUpdatingDisplayName: true,
isUpdatingProfilePicture: false
)
})
.map { _ in .standard }
.eraseToAnyPublisher()
)
.removeDuplicates()
.prepend(.standard) // Initial value
.eraseToAnyPublisher()
}()
override var leftNavItems: AnyPublisher<[NavItem]?, Never> {
navState
.map { navState -> [NavItem] in
switch navState {
case .standard:
return [
NavItem(
id: .close,
image: UIImage(named: "X")?
.withRenderingMode(.alwaysTemplate),
style: .plain,
accessibilityIdentifier: "Close button"
)
]
case .editing:
return [
NavItem(
id: .cancel,
systemItem: .cancel,
accessibilityIdentifier: "Cancel button"
)
]
}
}
.eraseToAnyPublisher()
}
override var rightNavItems: AnyPublisher<[NavItem]?, Never> {
navState
.map { [weak self] navState -> [NavItem] in
switch navState {
case .standard:
return [
NavItem(
id: .qrCode,
image: UIImage(named: "QRCode")?
.withRenderingMode(.alwaysTemplate),
style: .plain,
accessibilityIdentifier: "Show QR code button",
action: { [weak self] in
self?.transitionToScreen(QRCodeVC())
}
)
]
case .editing:
return [
NavItem(
id: .done,
systemItem: .done,
accessibilityIdentifier: "Done button"
)
]
}
}
.eraseToAnyPublisher()
}
// MARK: - Content
override var title: String { "vc_settings_title".localized() }
private var _settingsData: [SectionModel] = []
public override var settingsData: [SectionModel] { _settingsData }
public override var observableSettingsData: ObservableData { _observableSettingsData }
/// This is all the data the screen needs to populate itself, please see the following link for tips to help optimise
/// performance https://github.com/groue/GRDB.swift#valueobservation-performance
///
/// **Note:** This observation will be triggered twice immediately (and be de-duped by the `removeDuplicates`)
/// this is due to the behaviour of `ValueConcurrentObserver.asyncStartObservation` which triggers it's own
/// fetch (after the ones in `ValueConcurrentObserver.asyncStart`/`ValueConcurrentObserver.syncStart`)
/// just in case the database has changed between the two reads - unfortunately it doesn't look like there is a way to prevent this
private lazy var _observableSettingsData: ObservableData = ValueObservation
.trackingConstantRegion { db -> [SectionModel] in
let userPublicKey: String = getUserHexEncodedPublicKey(db)
let profile: Profile = Profile.fetchOrCreateCurrentUser(db)
return [
SectionModel(
model: .profileInfo,
elements: [
SettingInfo(
id: .profileInfo,
title: profile.displayName(),
action: .threadInfo(
threadViewModel: SessionThreadViewModel(
threadId: profile.id,
threadIsNoteToSelf: true,
contactProfile: profile
),
style: ThreadInfoStyle(
separatorTitle: "your_session_id".localized(),
descriptionStyle: .monoLarge,
descriptionActions: [
ThreadInfoStyle.Action(
title: "copy".localized(),
run: { [weak self] button in
self?.copySessionId(profile.id, button: button)
}
),
ThreadInfoStyle.Action(
title: "share".localized(),
run: { [weak self] _ in
self?.shareSessionId(profile.id)
}
)
]
),
avatarTapped: { [weak self] in self?.updateProfilePicture() },
titleTapped: { [weak self] in self?.setIsEditing(true) },
titleChanged: { [weak self] text in self?.editedDisplayName = text }
)
)
]
),
SectionModel(
model: .menus,
elements: [
SettingInfo(
id: .privacy,
icon: UIImage(named: "icon_privacy")?.withRenderingMode(.alwaysTemplate),
title: "vc_settings_privacy_button_title".localized(),
action: .push(showChevron: false) {
SettingsTableViewController(viewModel: PrivacySettingsViewModel())
}
),
SettingInfo(
id: .notifications,
icon: UIImage(named: "icon_speaker")?.withRenderingMode(.alwaysTemplate),
title: "vc_settings_notifications_button_title".localized(),
action: .push(showChevron: false) {
SettingsTableViewController(viewModel: NotificationSettingsViewModel())
}
),
SettingInfo(
id: .conversations,
icon: UIImage(named: "icon_msg")?.withRenderingMode(.alwaysTemplate),
title: "CONVERSATION_SETTINGS_TITLE".localized(),
action: .push(showChevron: false) {
SettingsTableViewController(viewModel: ConversationSettingsViewModel())
}
),
SettingInfo(
id: .messageRequests,
icon: UIImage(named: "icon_msg_req")?.withRenderingMode(.alwaysTemplate),
title: "MESSAGE_REQUESTS_TITLE".localized(),
action: .push(showChevron: false) {
MessageRequestsViewController()
}
),
SettingInfo(
id: .appearance,
icon: UIImage(named: "icon_apperance")?.withRenderingMode(.alwaysTemplate),
title: "APPEARANCE_TITLE".localized(),
action: .push(showChevron: false) {
AppearanceViewController()
}
),
SettingInfo(
id: .inviteAFriend,
icon: UIImage(named: "icon_invite")?.withRenderingMode(.alwaysTemplate),
title: "vc_settings_invite_a_friend_button_title".localized(),
action: .present {
let invitation: String = "Hey, I've been using Session to chat with complete privacy and security. Come join me! Download it at https://getsession.org/. My Session ID is \(profile.id) !"
return UIActivityViewController(
activityItems: [ invitation ],
applicationActivities: nil
)
}
),
SettingInfo(
id: .recoveryPhrase,
icon: UIImage(named: "icon_recovery")?.withRenderingMode(.alwaysTemplate),
title: "vc_settings_recovery_phrase_button_title".localized(),
action: .present {
SeedModal()
}
),
SettingInfo(
id: .help,
icon: UIImage(named: "icon_help")?.withRenderingMode(.alwaysTemplate),
title: "HELP_TITLE".localized(),
action: .push(showChevron: false) {
SettingsTableViewController(
viewModel: HelpViewModel()
)
}
),
SettingInfo(
id: .clearData,
icon: UIImage(named: "icon_bin")?.withRenderingMode(.alwaysTemplate),
title: "vc_settings_clear_all_data_button_title".localized(),
action: .present(tintColor: .danger) {
NukeDataModal()
}
)
]
)
]
}
.removeDuplicates()
.publisher(in: Storage.shared)
// MARK: - Functions
public override func updateSettings(_ updatedSettings: [SectionModel]) {
self._settingsData = updatedSettings
}
private func updateProfilePicture() {
let actionSheet: UIAlertController = UIAlertController(
title: "Update Profile Picture",
message: nil,
preferredStyle: .actionSheet
)
actionSheet.addAction(UIAlertAction(
title: "MEDIA_FROM_LIBRARY_BUTTON".localized(),
style: .default,
handler: { [weak self] _ in
self?.showPhotoLibraryForAvatar()
}
))
actionSheet.addAction(UIAlertAction(title: "cancel".localized(), style: .cancel, handler: nil))
self.transitionToScreen(actionSheet, transitionType: .present)
}
private func showPhotoLibraryForAvatar() {
Permissions.requestLibraryPermissionIfNeeded { [weak self] in
let picker: UIImagePickerController = UIImagePickerController()
picker.sourceType = .photoLibrary
picker.mediaTypes = [ "public.image" ]
picker.delegate = self?.imagePickerHandler
self?.transitionToScreen(picker, transitionType: .present)
}
}
fileprivate func updateProfile(
name: String,
profilePicture: UIImage?,
profilePictureFilePath: String?,
isUpdatingDisplayName: Bool,
isUpdatingProfilePicture: Bool
) {
let imageFilePath: String? = (
profilePictureFilePath ??
ProfileManager.profileAvatarFilepath(id: self.userSessionId)
)
let viewController = ModalActivityIndicatorViewController(canCancel: false) { [weak self] modalActivityIndicator in
ProfileManager.updateLocal(
queue: DispatchQueue.global(qos: .default),
profileName: name,
image: profilePicture,
imageFilePath: imageFilePath,
success: { db, updatedProfile in
if isUpdatingDisplayName {
UserDefaults.standard[.lastDisplayNameUpdate] = Date()
}
if isUpdatingProfilePicture {
UserDefaults.standard[.lastProfilePictureUpdate] = Date()
}
try MessageSender.syncConfiguration(db, forceSyncNow: true).retainUntilComplete()
// Wait for the database transaction to complete before updating the UI
db.afterNextTransactionCommit { _ in
DispatchQueue.main.async {
modalActivityIndicator.dismiss(completion: {})
}
}
},
failure: { [weak self] error in
DispatchQueue.main.async {
modalActivityIndicator.dismiss {
let isMaxFileSizeExceeded: Bool = (error == .avatarUploadMaxFileSizeExceeded)
self?.transitionToScreen(
ConfirmationModal(
info: ConfirmationModal.Info(
title: (isMaxFileSizeExceeded ?
"Maximum File Size Exceeded" :
"Couldn't Update Profile"
),
explanation: (isMaxFileSizeExceeded ?
"Please select a smaller photo and try again" :
"Please check your internet connection and try again"
),
cancelTitle: "BUTTON_OK".localized(),
cancelStyle: .textPrimary
)
),
transitionType: .present
)
}
}
}
)
}
self.transitionToScreen(viewController, transitionType: .present)
}
private func copySessionId(_ sessionId: String, button: OutlineButton?) {
UIPasteboard.general.string = sessionId
guard let button: OutlineButton = button else { return }
// Ensure we are on the main thread just in case
DispatchQueue.main.async {
button.isUserInteractionEnabled = false
UIView.transition(
with: button,
duration: 0.25,
options: .transitionCrossDissolve,
animations: {
button.setTitle("copied".localized(), for: .normal)
},
completion: { _ in
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4)) {
button.isUserInteractionEnabled = true
UIView.transition(
with: button,
duration: 0.25,
options: .transitionCrossDissolve,
animations: {
button.setTitle("copy".localized(), for: .normal)
},
completion: nil
)
}
}
)
}
}
private func shareSessionId(_ sessionId: String) {
let shareVC = UIActivityViewController(
activityItems: [ sessionId ],
applicationActivities: nil
)
self.transitionToScreen(shareVC, transitionType: .present)
}
}
// MARK: - ImagePickerHandler
class ImagePickerHandler: NSObject, UIImagePickerControllerDelegate & UINavigationControllerDelegate {
private let viewModel: SettingsViewModel
// MARK: - Initialization
init(viewModel: SettingsViewModel) {
self.viewModel = viewModel
}
// MARK: - UIImagePickerControllerDelegate
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
guard
let imageUrl: URL = info[.imageURL] as? URL,
let rawAvatar: UIImage = info[.originalImage] as? UIImage
else {
picker.presentingViewController?.dismiss(animated: true)
return
}
let name: String = self.viewModel.oldDisplayName
picker.presentingViewController?.dismiss(animated: true) { [weak self] in
// Check if the user selected an animated image (if so then don't crop, just
// set the avatar directly
guard
let type: Any = try? imageUrl.resourceValues(forKeys: [.typeIdentifierKey])
.allValues
.first,
let typeString: String = type as? String,
MIMETypeUtil.supportedAnimatedImageUTITypes().contains(typeString)
else {
let viewController: CropScaleImageViewController = CropScaleImageViewController(
srcImage: rawAvatar,
successCompletion: { resultImage in
self?.viewModel.updateProfile(
name: name,
profilePicture: resultImage,
profilePictureFilePath: nil,
isUpdatingDisplayName: false,
isUpdatingProfilePicture: true
)
}
)
self?.viewModel.transitionToScreen(viewController, transitionType: .present)
return
}
self?.viewModel.updateProfile(
name: name,
profilePicture: nil,
profilePictureFilePath: imageUrl.path,
isUpdatingDisplayName: false,
isUpdatingProfilePicture: true
)
}
}
}

@ -63,20 +63,33 @@ class SettingHeaderView: UITableViewHeaderFooterView {
// MARK: - Content
public func update(with title: String?, hasSeparator: Bool) {
public func update(
style: SettingsCell.Style = .rounded,
title: String?,
hasSeparator: Bool
) {
let titleIsEmpty: Bool = (title ?? "").isEmpty
let edgePadding: CGFloat = {
switch style {
case .rounded:
// Align to the start of the text in the cell
return (Values.largeSpacing + Values.mediumSpacing)
case .edgeToEdge: return Values.largeSpacing
}
}()
titleLabel.text = title
titleLabel.isHidden = titleIsEmpty
stackView.layoutMargins = UIEdgeInsets(
top: (titleIsEmpty ? Values.verySmallSpacing : Values.mediumSpacing),
left: Values.largeSpacing,
left: edgePadding,
bottom: (titleIsEmpty ? Values.verySmallSpacing : Values.mediumSpacing),
right: Values.largeSpacing
right: edgePadding
)
emptyHeightConstraint.isActive = titleIsEmpty
filledHeightConstraint.isActive = !titleIsEmpty
separator.isHidden = !hasSeparator
separator.isHidden = (style == .rounded || !hasSeparator)
self.layoutIfNeeded()
}

@ -194,7 +194,8 @@ class SettingsAvatarCell: UITableViewCell {
func update(
threadViewModel: SessionThreadViewModel,
style: ThreadInfoStyle
style: ThreadInfoStyle,
viewController: UIViewController
) {
profilePictureView.update(
publicKey: threadViewModel.threadId,
@ -245,7 +246,7 @@ class SettingsAvatarCell: UITableViewCell {
result.setTitle(action.title, for: UIControl.State.normal)
result.tapPublisher
.receive(on: DispatchQueue.main)
.sink(receiveValue: { _ in action.run() })
.sink(receiveValue: { [weak result] _ in action.run(result) })
.store(in: &self.disposables)
descriptionActionStackView.addArrangedSubview(result)

@ -5,15 +5,47 @@ import GRDB
import SessionUIKit
class SettingsCell: UITableViewCell {
public static let cornerRadius: CGFloat = 17
enum Style {
case rounded
case edgeToEdge
}
/// This value is here to allow the theming update callback to be released when preparing for reuse
private var instanceView: UIView = UIView()
private var position: Position?
private var subtitleExtraView: UIView?
private var onExtraAction: (() -> Void)?
// MARK: - UI
private var backgroundLeftConstraint: NSLayoutConstraint = NSLayoutConstraint()
private var backgroundRightConstraint: NSLayoutConstraint = NSLayoutConstraint()
private var topSeparatorLeftConstraint: NSLayoutConstraint = NSLayoutConstraint()
private var topSeparatorRightConstraint: NSLayoutConstraint = NSLayoutConstraint()
private var botSeparatorLeftConstraint: NSLayoutConstraint = NSLayoutConstraint()
private var botSeparatorRightConstraint: NSLayoutConstraint = NSLayoutConstraint()
private lazy var stackViewImageHeightConstraint: NSLayoutConstraint = contentStackView.heightAnchor.constraint(equalTo: iconImageView.heightAnchor)
private let cellBackgroundView: UIView = {
let result: UIView = UIView()
result.translatesAutoresizingMaskIntoConstraints = false
result.clipsToBounds = true
result.themeBackgroundColor = .settings_tabBackground
return result
}()
private let cellSelectedBackgroundView: UIView = {
let result: UIView = UIView()
result.translatesAutoresizingMaskIntoConstraints = false
result.themeBackgroundColor = .settings_tabHighlight
result.alpha = 0
return result
}()
private let topSeparator: UIView = {
let result: UIView = UIView.separator()
result.translatesAutoresizingMaskIntoConstraints = false
@ -52,6 +84,8 @@ class SettingsCell: UITableViewCell {
result.axis = .vertical
result.distribution = .equalSpacing
result.alignment = .fill
result.setCompressionResistanceHorizontalLow()
result.setContentHuggingLow()
return result
}()
@ -62,6 +96,8 @@ class SettingsCell: UITableViewCell {
result.font = .boldSystemFont(ofSize: Values.mediumFontSize)
result.themeTextColor = .textPrimary
result.numberOfLines = 0
result.setCompressionResistanceHorizontalLow()
result.setContentHuggingLow()
return result
}()
@ -73,14 +109,19 @@ class SettingsCell: UITableViewCell {
result.themeTextColor = .textPrimary
result.numberOfLines = 0
result.isHidden = true
result.setCompressionResistanceHorizontalLow()
result.setContentHuggingLow()
return result
}()
private lazy var extraActionTopSpacingView: UIView = UIView.spacer(withHeight: Values.smallSpacing)
private lazy var extraActionButton: UIButton = {
let result: UIButton = UIButton()
result.translatesAutoresizingMaskIntoConstraints = false
result.titleLabel?.font = .boldSystemFont(ofSize: Values.smallFontSize)
result.titleLabel?.numberOfLines = 0
result.contentHorizontalAlignment = .left
result.contentEdgeInsets = UIEdgeInsets(
top: 8,
@ -91,13 +132,12 @@ class SettingsCell: UITableViewCell {
result.addTarget(self, action: #selector(extraActionTapped), for: .touchUpInside)
result.isHidden = true
return result
}()
private let actionContainerView: UIView = {
let result: UIView = UIView()
result.translatesAutoresizingMaskIntoConstraints = false
result.isHidden = true
ThemeManager.onThemeChange(observer: result) { [weak result] theme, _ in
switch theme.interfaceStyle {
case .light: result?.setThemeTitleColor(.textPrimary, for: .normal)
default: result?.setThemeTitleColor(.primary, for: .normal)
}
}
return result
}()
@ -107,6 +147,8 @@ class SettingsCell: UITableViewCell {
result.translatesAutoresizingMaskIntoConstraints = false
result.themeTintColor = .textPrimary
result.isHidden = true
result.setContentHuggingHigh()
result.setCompressionResistanceHigh()
return result
}()
@ -117,6 +159,20 @@ class SettingsCell: UITableViewCell {
result.isUserInteractionEnabled = false // Triggered by didSelectCell instead
result.themeOnTintColor = .primary
result.isHidden = true
result.setContentHuggingHigh()
result.setCompressionResistanceHigh()
return result
}()
private let dropDownStackView: UIStackView = {
let result: UIStackView = UIStackView()
result.translatesAutoresizingMaskIntoConstraints = false
result.axis = .horizontal
result.distribution = .fill
result.alignment = .center
result.spacing = Values.verySmallSpacing
result.isHidden = true
return result
}()
@ -125,7 +181,8 @@ class SettingsCell: UITableViewCell {
let result: UIImageView = UIImageView(image: UIImage(systemName: "arrowtriangle.down.fill"))
result.translatesAutoresizingMaskIntoConstraints = false
result.themeTintColor = .textPrimary
result.isHidden = true
result.set(.width, to: 10)
result.set(.height, to: 10)
return result
}()
@ -135,7 +192,8 @@ class SettingsCell: UITableViewCell {
result.translatesAutoresizingMaskIntoConstraints = false
result.font = .systemFont(ofSize: Values.smallFontSize, weight: .medium)
result.themeTextColor = .textPrimary
result.isHidden = true
result.setContentHuggingHigh()
result.setCompressionResistanceHigh()
return result
}()
@ -145,6 +203,8 @@ class SettingsCell: UITableViewCell {
result.translatesAutoresizingMaskIntoConstraints = false
result.themeTintColor = .primary
result.isHidden = true
result.setContentHuggingHigh()
result.setCompressionResistanceHigh()
return result
}()
@ -164,6 +224,8 @@ class SettingsCell: UITableViewCell {
result.translatesAutoresizingMaskIntoConstraints = false
result.font = .boldSystemFont(ofSize: Values.smallFontSize)
result.themeTextColor = .textPrimary
result.setContentHuggingHigh()
result.setCompressionResistanceHigh()
return result
}()
@ -191,24 +253,30 @@ class SettingsCell: UITableViewCell {
}
private func setupViewHierarchy() {
contentView.addSubview(topSeparator)
contentView.addSubview(contentStackView)
contentView.addSubview(botSeparator)
self.themeBackgroundColor = .clear
self.selectedBackgroundView = UIView()
contentView.addSubview(cellBackgroundView)
cellBackgroundView.addSubview(cellSelectedBackgroundView)
cellBackgroundView.addSubview(topSeparator)
cellBackgroundView.addSubview(contentStackView)
cellBackgroundView.addSubview(botSeparator)
contentStackView.addArrangedSubview(iconImageView)
contentStackView.addArrangedSubview(titleStackView)
contentStackView.addArrangedSubview(actionContainerView)
contentStackView.addArrangedSubview(pushChevronImageView)
contentStackView.addArrangedSubview(toggleSwitch)
contentStackView.addArrangedSubview(tickImageView)
contentStackView.addArrangedSubview(dropDownStackView)
contentStackView.addArrangedSubview(rightActionButtonContainerView)
titleStackView.addArrangedSubview(titleLabel)
titleStackView.addArrangedSubview(subtitleLabel)
titleStackView.addArrangedSubview(extraActionTopSpacingView)
titleStackView.addArrangedSubview(extraActionButton)
actionContainerView.addSubview(dropDownImageView)
actionContainerView.addSubview(dropDownLabel)
actionContainerView.addSubview(rightActionButtonContainerView)
dropDownStackView.addArrangedSubview(dropDownImageView)
dropDownStackView.addArrangedSubview(dropDownLabel)
rightActionButtonContainerView.addSubview(rightActionButtonLabel)
@ -216,50 +284,24 @@ class SettingsCell: UITableViewCell {
}
private func setupLayout() {
topSeparator.pin(.top, to: .top, of: contentView)
topSeparator.pin(.left, to: .left, of: contentView)
topSeparator.pin(.right, to: .right, of: contentView)
contentStackView.pin(to: contentView)
titleLabel.setCompressionResistanceHorizontalLow()
subtitleLabel.setCompressionResistanceHorizontalLow()
cellBackgroundView.pin(.top, to: .top, of: contentView)
backgroundLeftConstraint = cellBackgroundView.pin(.leading, to: .leading, of: contentView)
backgroundRightConstraint = cellBackgroundView.pin(.trailing, to: .trailing, of: contentView)
cellBackgroundView.pin(.bottom, to: .bottom, of: contentView)
pushChevronImageView.setContentHuggingHigh()
pushChevronImageView.setCompressionResistanceHigh()
cellSelectedBackgroundView.pin(to: cellBackgroundView)
toggleSwitch.setContentHuggingHigh()
toggleSwitch.setCompressionResistanceHigh()
topSeparator.pin(.top, to: .top, of: cellBackgroundView)
topSeparatorLeftConstraint = topSeparator.pin(.left, to: .left, of: cellBackgroundView)
topSeparatorRightConstraint = topSeparator.pin(.right, to: .right, of: cellBackgroundView)
contentStackView.pin(to: cellBackgroundView)
tickImageView.setContentHuggingHigh()
tickImageView.setCompressionResistanceHigh()
actionContainerView.setContentHuggingHigh()
actionContainerView.setCompressionResistanceHigh()
actionContainerView.set(.height, to: .height, of: contentStackView)
dropDownImageView.center(.vertical, in: actionContainerView)
dropDownImageView.pin(.left, to: .left, of: actionContainerView)
dropDownImageView.set(.width, to: 10)
dropDownImageView.set(.height, to: 10)
dropDownLabel.setContentHuggingHigh()
dropDownLabel.setCompressionResistanceHigh()
dropDownLabel.center(.vertical, in: actionContainerView)
dropDownLabel.pin(.left, to: .right, of: dropDownImageView, withInset: Values.verySmallSpacing)
dropDownLabel.pin(.right, to: .right, of: actionContainerView)
rightActionButtonContainerView.center(.vertical, in: actionContainerView)
rightActionButtonContainerView.pin(.left, to: .left, of: actionContainerView)
rightActionButtonContainerView.pin(.right, to: .right, of: actionContainerView)
rightActionButtonLabel.setContentHuggingHigh()
rightActionButtonLabel.setCompressionResistanceHigh()
rightActionButtonContainerView.center(.vertical, in: contentStackView)
rightActionButtonLabel.pin(to: rightActionButtonContainerView, withInset: Values.smallSpacing)
botSeparator.pin(.left, to: .left, of: contentView)
botSeparator.pin(.right, to: .right, of: contentView)
botSeparator.pin(.bottom, to: .bottom, of: contentView)
botSeparatorLeftConstraint = botSeparator.pin(.left, to: .left, of: cellBackgroundView)
botSeparatorRightConstraint = botSeparator.pin(.right, to: .right, of: cellBackgroundView)
botSeparator.pin(.bottom, to: .bottom, of: cellBackgroundView)
}
override func layoutSubviews() {
@ -324,15 +366,15 @@ class SettingsCell: UITableViewCell {
override func prepareForReuse() {
super.prepareForReuse()
self.themeBackgroundColor = nil
self.selectedBackgroundView = nil
self.instanceView = UIView()
self.position = nil
self.onExtraAction = nil
self.accessibilityIdentifier = nil
stackViewImageHeightConstraint.isActive = false
iconImageView.removeConstraints(iconImageView.constraints)
iconImageView.image = nil
iconImageView.themeTintColor = .textPrimary
titleLabel.text = ""
titleLabel.themeTextColor = .textPrimary
subtitleLabel.text = ""
@ -341,12 +383,12 @@ class SettingsCell: UITableViewCell {
topSeparator.isHidden = true
iconImageView.isHidden = true
subtitleLabel.isHidden = true
extraActionTopSpacingView.isHidden = true
extraActionButton.setTitle("", for: .normal)
extraActionButton.isHidden = true
actionContainerView.isHidden = true
pushChevronImageView.isHidden = true
toggleSwitch.isHidden = true
dropDownImageView.isHidden = true
dropDownLabel.isHidden = true
dropDownStackView.isHidden = true
tickImageView.isHidden = true
tickImageView.alpha = 1
rightActionButtonContainerView.isHidden = true
@ -357,6 +399,7 @@ class SettingsCell: UITableViewCell {
}
public func update(
style: Style = .rounded,
icon: UIImage?,
iconSize: IconSize,
iconSetter: ((UIImageView) -> Void)?,
@ -366,19 +409,19 @@ class SettingsCell: UITableViewCell {
accessibilityIdentifier: String?,
subtitleExtraViewGenerator: (() -> UIView)?,
action: SettingsAction,
extraActionTitle: ((Theme, Theme.PrimaryColor) -> NSAttributedString)?,
extraActionTitle: String?,
onExtraAction: (() -> Void)?,
isFirstInSection: Bool,
isLastInSection: Bool
position: Position
) {
self.instanceView = UIView()
self.position = position
self.subtitleExtraView = subtitleExtraViewGenerator?()
self.onExtraAction = onExtraAction
self.accessibilityIdentifier = accessibilityIdentifier
stackViewImageHeightConstraint.isActive = {
switch iconSize {
case .small: return false
case .small, .medium: return false
case .large: return true // Edge-to-edge in this case
}
}()
@ -386,7 +429,7 @@ class SettingsCell: UITableViewCell {
top: Values.mediumSpacing,
leading: {
switch iconSize {
case .small: return Values.largeSpacing
case .small, .medium: return Values.largeSpacing
case .large: return 0 // Edge-to-edge in this case
}
}(),
@ -403,30 +446,52 @@ class SettingsCell: UITableViewCell {
titleLabel.textAlignment = alignment
subtitleLabel.text = subtitle
subtitleLabel.isHidden = (subtitle == nil)
extraActionTopSpacingView.isHidden = (extraActionTitle == nil)
extraActionButton.setTitle(extraActionTitle, for: .normal)
extraActionButton.isHidden = (extraActionTitle == nil)
// Call the iconSetter closure if provided to set the icon
iconSetter?(iconImageView)
// Separator/background Visibility
if action.shouldHaveBackground {
self.themeBackgroundColor = .settings_tabBackground
topSeparator.isHidden = isFirstInSection
botSeparator.isHidden = !isLastInSection
}
else {
self.themeBackgroundColor = nil
topSeparator.isHidden = true
botSeparator.isHidden = true
// Styling and positioning
cellBackgroundView.themeBackgroundColor = (action.shouldHaveBackground ?
.settings_tabBackground :
nil
)
cellSelectedBackgroundView.isHidden = !action.shouldHaveBackground
backgroundLeftConstraint.constant = (style == .rounded ? Values.largeSpacing : 0)
backgroundRightConstraint.constant = (style == .rounded ? -Values.largeSpacing : 0)
topSeparatorLeftConstraint.constant = (style == .rounded ? Values.mediumSpacing : 0)
topSeparatorRightConstraint.constant = (style == .rounded ? -Values.mediumSpacing : 0)
botSeparatorLeftConstraint.constant = (style == .rounded ? Values.mediumSpacing : 0)
botSeparatorRightConstraint.constant = (style == .rounded ? -Values.mediumSpacing : 0)
cellBackgroundView.layer.cornerRadius = (style == .rounded ? SettingsCell.cornerRadius : 0)
switch position {
case .top:
cellBackgroundView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
topSeparator.isHidden = true
botSeparator.isHidden = false
case .middle:
cellBackgroundView.layer.maskedCorners = []
topSeparator.isHidden = true
botSeparator.isHidden = false
case .bottom:
cellBackgroundView.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]
botSeparator.isHidden = false
botSeparator.isHidden = true
case .individual:
cellBackgroundView.layer.maskedCorners = [
.layerMinXMinYCorner, .layerMaxXMinYCorner,
.layerMinXMaxYCorner, .layerMaxXMaxYCorner
]
topSeparator.isHidden = true
botSeparator.isHidden = true
}
// Highlight
let selectedBackgroundView = UIView()
selectedBackgroundView.themeBackgroundColor = .settings_tabHighlight
self.selectedBackgroundView = selectedBackgroundView
// Action Behaviours
switch action {
case .threadInfo: break
@ -436,9 +501,7 @@ class SettingsCell: UITableViewCell {
toggleSwitch.isEnabled = isEnabled
// Remove the selection view if the setting is disabled
if !isEnabled {
self.selectedBackgroundView = UIView()
}
cellSelectedBackgroundView.isHidden = !isEnabled
let newValue: Bool = defaults.bool(forKey: key)
@ -451,9 +514,7 @@ class SettingsCell: UITableViewCell {
toggleSwitch.isEnabled = isEnabled
// Remove the selection view if the setting is disabled
if !isEnabled {
self.selectedBackgroundView = UIView()
}
cellSelectedBackgroundView.isHidden = !isEnabled
let newValue: Bool = Storage.shared[key]
@ -466,18 +527,14 @@ class SettingsCell: UITableViewCell {
toggleSwitch.isEnabled = isEnabled
// Remove the selection view if the setting is disabled
if !isEnabled {
self.selectedBackgroundView = UIView()
}
cellSelectedBackgroundView.isHidden = !isEnabled
if value != toggleSwitch.isOn {
toggleSwitch.setOn(value, animated: true)
}
case .settingEnum(_, let value, _), .generalEnum(let value, _):
actionContainerView.isHidden = false
dropDownImageView.isHidden = false
dropDownLabel.isHidden = false
dropDownStackView.isHidden = false
dropDownLabel.text = value
case .listSelection(let isSelected, let storedSelection, _, _):
@ -487,27 +544,19 @@ class SettingsCell: UITableViewCell {
case .trigger(let showChevron, _):
pushChevronImageView.isHidden = !showChevron
case .push(let showChevron, let textColor, _, _):
titleLabel.themeTextColor = textColor
case .push(let showChevron, let tintColor, _, _):
titleLabel.themeTextColor = tintColor
iconImageView.themeTintColor = tintColor
pushChevronImageView.isHidden = !showChevron
case .present(_): break
case .present(let tintColor, _):
titleLabel.themeTextColor = tintColor
iconImageView.themeTintColor = tintColor
case .rightButtonAction(let title, _):
actionContainerView.isHidden = false
rightActionButtonContainerView.isHidden = false
rightActionButtonLabel.text = title
}
// Extra action
if let extraActionTitle: ((Theme, Theme.PrimaryColor) -> NSAttributedString) = extraActionTitle {
ThemeManager.onThemeChange(observer: instanceView) { [weak extraActionButton] theme, primaryColor in
extraActionButton?.setAttributedTitle(
extraActionTitle(theme, primaryColor),
for: .normal
)
}
}
}
public func update(isEditing: Bool, animated: Bool) {}
@ -516,7 +565,14 @@ class SettingsCell: UITableViewCell {
override func setHighlighted(_ highlighted: Bool, animated: Bool) {
super.setHighlighted(highlighted, animated: animated)
// If the 'cellSelectedBackgroundView' is hidden then there is no background so we
// should update the titleLabel to indicate the highlighted state
if cellSelectedBackgroundView.isHidden {
titleLabel.alpha = (highlighted ? 0.8 : 1)
}
cellSelectedBackgroundView.alpha = (highlighted ? 1 : 0)
rightActionButtonContainerView.themeBackgroundColor = (highlighted ?
.solidButton_highlight :
.solidButton_background

@ -606,7 +606,7 @@ public final class FullConversationCell: UITableViewCell {
let authorPrefix: NSAttributedString = NSAttributedString(
string: "\(authorName): ...",
attributes: [ .foregroundColor: Colors.text ]
attributes: [ .foregroundColor: textColor ]
)
return authorPrefix

@ -1,19 +1,23 @@
// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import UIKit
enum QRCode {
static func generate(for string: String, isInverted: Bool = false, hasBackground: Bool = false) -> UIImage {
static func generate(for string: String, hasBackground: Bool = false) -> UIImage {
let data = string.data(using: .utf8)
var qrCodeAsCIImage: CIImage
let filter1 = CIFilter(name: "CIQRCodeGenerator")!
filter1.setValue(data, forKey: "inputMessage")
qrCodeAsCIImage = filter1.outputImage!
if hasBackground {
let filter2 = CIFilter(name: "CIFalseColor")!
filter2.setValue(qrCodeAsCIImage, forKey: "inputImage")
filter2.setValue(CIColor(color: UIColor(hex: isInverted ? 0xFFFFFF : 0x000000)), forKey: "inputColor0")
filter2.setValue(CIColor(color: UIColor(hex: isInverted ? 0x1B1B1B : 0xFFFFFF)), forKey: "inputColor1")
filter2.setValue(CIColor(color: .black), forKey: "inputColor0")
filter2.setValue(CIColor(color: .white), forKey: "inputColor1")
qrCodeAsCIImage = filter2.outputImage!
} else {
}
else {
let filter2 = CIFilter(name: "CIColorInvert")!
filter2.setValue(qrCodeAsCIImage, forKey: "inputImage")
qrCodeAsCIImage = filter2.outputImage!
@ -21,6 +25,7 @@ enum QRCode {
filter3.setValue(qrCodeAsCIImage, forKey: "inputImage")
qrCodeAsCIImage = filter3.outputImage!
}
let scaledQRCodeAsCIImage = qrCodeAsCIImage.transformed(by: CGAffineTransform(scaleX: 6.4, y: 6.4))
return UIImage(ciImage: scaledQRCodeAsCIImage)
}

@ -246,7 +246,7 @@ public extension Profile {
private static func defaultFor(_ id: String) -> Profile {
return Profile(
id: id,
name: id,
name: "",
nickname: nil,
profilePictureUrl: nil,
profilePictureFileName: nil,

@ -51,8 +51,9 @@ public enum UpdateProfilePictureJob: JobExecutor {
profileName: profile.name,
image: nil,
imageFilePath: profileFilePath,
requiredSync: true,
success: { _, _ in
success: { db, _ in
try MessageSender.syncConfiguration(db, forceSyncNow: true).retainUntilComplete()
// Need to call the 'success' closure asynchronously on the queue to prevent a reentrancy
// issue as it will write to the database and this closure is already called within
// another database write

@ -3,6 +3,7 @@
import Foundation
import GRDB
import DifferenceKit
import SessionUIKit
import SessionUtilitiesKit
fileprivate typealias ViewModel = MessageViewModel
@ -45,12 +46,6 @@ public struct MessageViewModel: FetchableRecordWithRowId, Decodable, Equatable,
public static let linkPreviewString: String = CodingKeys.linkPreview.stringValue
public static let linkPreviewAttachmentString: String = CodingKeys.linkPreviewAttachment.stringValue
public enum Position: Int, Decodable, Equatable, Hashable, DatabaseValueConvertible {
case top
case middle
case bottom
}
public enum CellType: Int, Decodable, Equatable, Hashable, DatabaseValueConvertible {
case textOnlyMessage
case mediaMessage

@ -236,6 +236,8 @@ public extension SessionThreadViewModel {
init(
threadId: String? = nil,
threadVariant: SessionThread.Variant? = nil,
threadIsNoteToSelf: Bool = false,
contactProfile: Profile? = nil,
currentUserIsClosedGroupMember: Bool? = nil,
unreadCount: UInt = 0
) {
@ -245,7 +247,7 @@ public extension SessionThreadViewModel {
self.threadCreationDateTimestamp = 0
self.threadMemberNames = nil
self.threadIsNoteToSelf = false
self.threadIsNoteToSelf = threadIsNoteToSelf
self.threadIsMessageRequest = false
self.threadRequiresApproval = false
self.threadShouldBeVisible = false
@ -261,7 +263,7 @@ public extension SessionThreadViewModel {
// Thread display info
self.contactProfile = nil
self.contactProfile = contactProfile
self.closedGroupProfileFront = nil
self.closedGroupProfileBack = nil
self.closedGroupProfileBackFallback = nil

@ -109,9 +109,9 @@ public enum Preferences {
public var name: String {
switch self {
case .nameAndPreview: return "NOTIFICATIONS_SENDER_AND_MESSAGE".localized()
case .nameNoPreview: return "NOTIFICATIONS_SENDER_ONLY".localized()
case .noNameNoPreview: return "NOTIFICATIONS_NONE".localized()
case .nameAndPreview: return "NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_AND_CONTENT".localized()
case .nameNoPreview: return "NOTIFICATIONS_STYLE_CONTENT_OPTION_NAME_ONLY".localized()
case .noNameNoPreview: return "NOTIFICATIONS_STYLE_CONTENT_OPTION_NO_NAME_OR_CONTENT".localized()
}
}
}

@ -237,7 +237,6 @@ public struct ProfileManager {
profileName: String,
image: UIImage?,
imageFilePath: String?,
requiredSync: Bool,
success: ((Database, Profile) throws -> ())? = nil,
failure: ((ProfileManagerError) -> ())? = nil
) {
@ -296,7 +295,7 @@ public struct ProfileManager {
failure?(profileManagerError)
}
return
}
}
guard let data: Data = avatarImageData else {
// If we have no image then we need to make sure to remove it from the profile

@ -6,7 +6,7 @@ import PromiseKit
import SignalUtilitiesKit
import SessionUIKit
final class ShareVC: UINavigationController, ShareViewDelegate, AppModeManagerDelegate {
final class ShareVC: UINavigationController, ShareViewDelegate {
private var areVersionMigrationsComplete = false
public static var attachmentPrepPromise: Promise<[SignalAttachment]>?
@ -163,18 +163,9 @@ final class ShareVC: UINavigationController, ShareViewDelegate, AppModeManagerDe
// we can't easily clean up.
ExitShareExtension()
}
// MARK: - App Mode
public func setCurrentAppMode(to appMode: AppMode) {
return // Not applicable to share extensions
}
public func setAppModeToSystemDefault() {
return // Not applicable to share extensions
}
// MARK: - Updating
// MARK: Updating
private func showLockScreenOrMainContent() {
if Storage.shared[.isScreenLockEnabled] {
showLockScreen()

@ -1,83 +0,0 @@
import UIKit
@objc(LKAppModeManager)
public final class AppModeManager : NSObject {
private let delegate: AppModeManagerDelegate
public var currentAppMode: AppMode {
return AppModeManager.getAppModeOrSystemDefault()
}
public static var shared: AppModeManager!
@objc(configureWithDelegate:)
public static func configure(delegate: AppModeManagerDelegate) {
shared = AppModeManager(delegate: delegate)
}
private init(delegate: AppModeManagerDelegate) {
self.delegate = delegate
super.init()
}
private override init() { preconditionFailure("Use init(delegate:) instead.") }
public func setCurrentAppMode(to appMode: AppMode) {
delegate.setCurrentAppMode(to: appMode)
}
public func setAppModeToSystemDefault() {
delegate.setAppModeToSystemDefault()
}
@objc public static func getAppModeOrSystemDefault() -> AppMode {
let userDefaults = UserDefaults.standard
guard userDefaults.dictionaryRepresentation().keys.contains("appMode") else {
return (UITraitCollection.current.userInterfaceStyle == .dark ? .dark : .light)
}
let mode = userDefaults.integer(forKey: "appMode")
return AppMode(rawValue: mode) ?? .light
}
}
@objc(LKAppModeManagerDelegate)
public protocol AppModeManagerDelegate {
@objc(setCurrentAppMode:)
func setCurrentAppMode(to appMode: AppMode)
func setAppModeToSystemDefault()
}
@objc(LKAppMode)
public enum AppMode: Int {
case light, dark
}
public var isSystemDefault: Bool {
return !UserDefaults.standard.dictionaryRepresentation().keys.contains("appMode")
}
public var isLightMode: Bool {
return AppModeManager.shared.currentAppMode == .light
}
public var isDarkMode: Bool {
return AppModeManager.shared.currentAppMode == .dark
}
@objc public final class LKAppModeUtilities : NSObject {
@objc public static var isSystemDefault: Bool {
return !UserDefaults.standard.dictionaryRepresentation().keys.contains("appMode")
}
@objc public static var isLightMode: Bool {
return AppModeManager.shared.currentAppMode == .light
}
@objc public static var isDarkMode: Bool {
return AppModeManager.shared.currentAppMode == .dark
}
}

@ -1,56 +0,0 @@
import UIKit
@objc public extension UIColor {
@objc convenience init(hex value: UInt) {
let red = CGFloat((value >> 16) & 0xff) / 255
let green = CGFloat((value >> 8) & 0xff) / 255
let blue = CGFloat((value >> 0) & 0xff) / 255
self.init(red: red, green: green, blue: blue, alpha: 1)
}
}
@objc(LKColors)
public final class Colors : NSObject {
@objc public static var grey: UIColor { UIColor(named: "session_grey")! }
@objc public static var accent: UIColor { UIColor(named: "session_accent")! }
@objc public static var text: UIColor { UIColor(named: "session_text")! }
@objc public static var destructive: UIColor { UIColor(named: "session_destructive")! }
@objc public static var unimportant: UIColor { UIColor(named: "session_unimportant")! }
@objc public static var border: UIColor { UIColor(named: "session_border")! }
@objc public static var cellBackground: UIColor { UIColor(named: "session_cell_background")! }
@objc public static var cellSelected: UIColor { UIColor(named: "session_cell_selected")! }
@objc public static var cellPinned: UIColor { UIColor(named: "session_cell_pinned")! }
@objc public static var navigationBarBackground: UIColor { UIColor(named: "session_navigation_bar_background")! }
@objc public static var searchBarPlaceholder: UIColor { UIColor(named: "session_search_bar_placeholder")! } // Also used for the icons
@objc public static var searchBarBackground: UIColor { UIColor(named: "session_search_bar_background")! }
@objc public static var expandedButtonGlowColor: UIColor { UIColor(named: "session_expanded_button_glow_color")! }
@objc public static var separator: UIColor { UIColor(named: "session_separator")! }
@objc public static var unimportantButtonBackground: UIColor { UIColor(named: "session_unimportant_button_background")! }
@objc public static var buttonBackground: UIColor { UIColor(named: "session_button_background")! }
@objc public static var settingButtonSelected: UIColor { UIColor(named: "session_setting_button_selected")! }
@objc public static var modalBackground: UIColor { UIColor(named: "session_modal_background")! }
@objc public static var modalBorder: UIColor { UIColor(named: "session_modal_border")! }
@objc public static var fakeChatBubbleBackground: UIColor { UIColor(named: "session_fake_chat_bubble_background")! }
@objc public static var fakeChatBubbleText: UIColor { UIColor(named: "session_fake_chat_bubble_text")! }
@objc public static var composeViewBackground: UIColor { UIColor(named: "session_compose_view_background")! }
@objc public static var composeViewTextFieldBackground: UIColor { UIColor(named: "session_compose_view_text_field_background")! }
@objc public static var receivedMessageBackground: UIColor { UIColor(named: "session_received_message_background")! }
@objc public static var sentMessageBackground: UIColor { UIColor(named: "session_sent_message_background")! }
@objc public static var newConversationButtonCollapsedBackground: UIColor { UIColor(named: "session_new_conversation_button_collapsed_background")! }
@objc public static var pnOptionBackground: UIColor { UIColor(named: "session_pn_option_background")! }
@objc public static var pnOptionBorder: UIColor { UIColor(named: "session_pn_option_border")! }
@objc public static var pathsBuilding: UIColor { UIColor(named: "session_paths_building")! }
@objc public static var callMessageBackground: UIColor { UIColor(named: "session_call_message_background")! }
@objc public static var pinIcon: UIColor { UIColor(named: "session_pin_icon")! }
@objc public static var sessionHeading: UIColor { UIColor(named: "session_heading")! }
@objc public static var sessionMessageRequestsBubble: UIColor { UIColor(named: "session_message_requests_bubble")! }
@objc public static var sessionMessageRequestsIcon: UIColor { UIColor(named: "session_message_requests_icon")! }
@objc public static var sessionMessageRequestsTitle: UIColor { UIColor(named: "session_message_requests_title")! }
@objc public static var sessionMessageRequestsInfoText: UIColor { UIColor(named: "session_message_requests_info_text")! }
@objc public static var blockActionBackground: UIColor { UIColor(named: "session_block_action_background")! }
@objc public static var sessionEmojiPlusButtonBackground: UIColor { UIColor(named: "session_emoji_plus_button_background")! }
@objc public static var sessionContactsSearchBarBackground: UIColor { UIColor(named: "session_contacts_search_bar_background")! }
@objc public static var sessionNewConversationCellBackground: UIColor { UIColor(named: "session_new_conversation_cell_background")! }
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x7B",
"green" : "0xE9",
"red" : "0x00"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x82",
"green" : "0xF7",
"red" : "0x00"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x6D",
"green" : "0x6D",
"red" : "0x6D"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x2D",
"green" : "0x2D",
"red" : "0x2D"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,20 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x97",
"green" : "0x97",
"red" : "0x97"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xFC",
"green" : "0xFC",
"red" : "0xFC"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x1B",
"green" : "0x1B",
"red" : "0x1B"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xF5",
"green" : "0xF5",
"red" : "0xF5"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x21",
"green" : "0x21",
"red" : "0x21"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xFC",
"green" : "0xFC",
"red" : "0xFC"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x16",
"green" : "0x16",
"red" : "0x16"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "247",
"green" : "247",
"red" : "247"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x1C",
"green" : "0x1C",
"red" : "0x1C"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xDF",
"green" : "0xDF",
"red" : "0xDF"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x0C",
"green" : "0x0C",
"red" : "0x0C"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xFC",
"green" : "0xFC",
"red" : "0xFC"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x1B",
"green" : "0x1B",
"red" : "0x1B"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xED",
"green" : "0xED",
"red" : "0xED"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x14",
"green" : "0x14",
"red" : "0x14"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xFF",
"green" : "0xFF",
"red" : "0xFF"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x00",
"green" : "0x00",
"red" : "0x00"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,20 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x3A",
"green" : "0x3A",
"red" : "0xFF"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xFF",
"green" : "0xFF",
"red" : "0xFF"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x23",
"green" : "0x23",
"red" : "0x23"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,20 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x44",
"green" : "0x7C",
"red" : "0x07"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xF5",
"green" : "0xF5",
"red" : "0xF5"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x46",
"green" : "0x41",
"red" : "0x3F"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,20 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x00",
"green" : "0x00",
"red" : "0x00"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x30",
"green" : "0x2F",
"red" : "0x31"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xF9",
"green" : "0xF9",
"red" : "0xF9"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x00",
"green" : "0x00",
"red" : "0x00"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x82",
"green" : "0xF7",
"red" : "0x00"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x58",
"green" : "0x58",
"red" : "0x58"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x43",
"green" : "0x43",
"red" : "0x43"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xFF",
"green" : "0xFF",
"red" : "0xFF"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xAD",
"green" : "0xAD",
"red" : "0xAD"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,20 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x9F",
"green" : "0x9F",
"red" : "0x9F"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -1,38 +0,0 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x00",
"green" : "0x00",
"red" : "0x00"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xAD",
"green" : "0xAD",
"red" : "0xAD"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save