Merge pull request #2212 from vector-im/keybackup_recover_banner

Key backup: recover reminder
This commit is contained in:
SBiOSoftWhare
2019-02-01 10:17:07 +01:00
committed by GitHub
11 changed files with 199 additions and 121 deletions
+1
View File
@@ -11,6 +11,7 @@ Improvements:
* Key backup: Implement recover screen (#2196).
* Key backup: Add a dedicated section to settings (#2193).
* Key backup: Implement setup reminder (#2211).
* Key backup: Implement recover reminder (#2206).
Bug fix:
* Use white scroll bar on dark themes (#2158).
+12 -20
View File
@@ -39,7 +39,7 @@
92726A471F58737A004AD26F /* IntentHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 92726A461F58737A004AD26F /* IntentHandler.m */; };
92726A4B1F58737A004AD26F /* SiriIntents.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 92726A431F58737A004AD26F /* SiriIntents.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
92726A511F587410004AD26F /* Intents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92726A501F587410004AD26F /* Intents.framework */; };
B104C2942203773C00D9F496 /* KeyBackupBannersPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = B104C2932203773B00D9F496 /* KeyBackupBannersPreferences.swift */; };
B104C2942203773C00D9F496 /* KeyBackupBannerPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = B104C2932203773B00D9F496 /* KeyBackupBannerPreferences.swift */; };
B1098BDF21ECE09F000DDA48 /* Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1098BDA21ECE09E000DDA48 /* Strings.swift */; };
B1098BE121ECE09F000DDA48 /* Images.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1098BDC21ECE09E000DDA48 /* Images.swift */; };
B1098BE321ECE09F000DDA48 /* RiotDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1098BDE21ECE09E000DDA48 /* RiotDefaults.swift */; };
@@ -60,8 +60,8 @@
B1098C0D21ED07E4000DDA48 /* NavigationRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1098C0821ED07E4000DDA48 /* NavigationRouter.swift */; };
B1098C1021ED07E4000DDA48 /* Presentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1098C0B21ED07E4000DDA48 /* Presentable.swift */; };
B1098C1121ED07E4000DDA48 /* NavigationRouterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1098C0C21ED07E4000DDA48 /* NavigationRouterType.swift */; };
B10B3B5B2201DD740072C76B /* KeyBackupSetupBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10B3B592201DD740072C76B /* KeyBackupSetupBannerCell.swift */; };
B10B3B5C2201DD740072C76B /* KeyBackupSetupBannerCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = B10B3B5A2201DD740072C76B /* KeyBackupSetupBannerCell.xib */; };
B10B3B5B2201DD740072C76B /* KeyBackupBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10B3B592201DD740072C76B /* KeyBackupBannerCell.swift */; };
B10B3B5C2201DD740072C76B /* KeyBackupBannerCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = B10B3B5A2201DD740072C76B /* KeyBackupBannerCell.xib */; };
B1107EC82200B0720038014B /* KeyBackupRecoverSuccessViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1107EC72200B0720038014B /* KeyBackupRecoverSuccessViewController.swift */; };
B1107ECA2200B09F0038014B /* KeyBackupRecoverSuccessViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B1107EC92200B09F0038014B /* KeyBackupRecoverSuccessViewController.storyboard */; };
B110871921EF8077003554A5 /* KeyBackupSetupRecoveryKeyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B110871821EF8077003554A5 /* KeyBackupSetupRecoveryKeyViewController.swift */; };
@@ -511,7 +511,7 @@
92726A481F58737A004AD26F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
92726A4F1F587393004AD26F /* SiriIntents.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = SiriIntents.entitlements; sourceTree = "<group>"; };
92726A501F587410004AD26F /* Intents.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Intents.framework; path = System/Library/Frameworks/Intents.framework; sourceTree = SDKROOT; };
B104C2932203773B00D9F496 /* KeyBackupBannersPreferences.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyBackupBannersPreferences.swift; sourceTree = "<group>"; };
B104C2932203773B00D9F496 /* KeyBackupBannerPreferences.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyBackupBannerPreferences.swift; sourceTree = "<group>"; };
B1098BDA21ECE09E000DDA48 /* Strings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Strings.swift; sourceTree = "<group>"; };
B1098BDC21ECE09E000DDA48 /* Images.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Images.swift; sourceTree = "<group>"; };
B1098BDE21ECE09E000DDA48 /* RiotDefaults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RiotDefaults.swift; sourceTree = "<group>"; };
@@ -532,8 +532,8 @@
B1098C0821ED07E4000DDA48 /* NavigationRouter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationRouter.swift; sourceTree = "<group>"; };
B1098C0B21ED07E4000DDA48 /* Presentable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Presentable.swift; sourceTree = "<group>"; };
B1098C0C21ED07E4000DDA48 /* NavigationRouterType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationRouterType.swift; sourceTree = "<group>"; };
B10B3B592201DD740072C76B /* KeyBackupSetupBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyBackupSetupBannerCell.swift; sourceTree = "<group>"; };
B10B3B5A2201DD740072C76B /* KeyBackupSetupBannerCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KeyBackupSetupBannerCell.xib; sourceTree = "<group>"; };
B10B3B592201DD740072C76B /* KeyBackupBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyBackupBannerCell.swift; sourceTree = "<group>"; };
B10B3B5A2201DD740072C76B /* KeyBackupBannerCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KeyBackupBannerCell.xib; sourceTree = "<group>"; };
B1107EC72200B0720038014B /* KeyBackupRecoverSuccessViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyBackupRecoverSuccessViewController.swift; sourceTree = "<group>"; };
B1107EC92200B09F0038014B /* KeyBackupRecoverSuccessViewController.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = KeyBackupRecoverSuccessViewController.storyboard; sourceTree = "<group>"; };
B110871821EF8077003554A5 /* KeyBackupSetupRecoveryKeyViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyBackupSetupRecoveryKeyViewController.swift; sourceTree = "<group>"; };
@@ -1330,21 +1330,13 @@
B1107ECB2201BE800038014B /* Banners */ = {
isa = PBXGroup;
children = (
B104C2932203773B00D9F496 /* KeyBackupBannersPreferences.swift */,
B1107ECC2201BEAF0038014B /* Setup */,
B104C2932203773B00D9F496 /* KeyBackupBannerPreferences.swift */,
B10B3B592201DD740072C76B /* KeyBackupBannerCell.swift */,
B10B3B5A2201DD740072C76B /* KeyBackupBannerCell.xib */,
);
path = Banners;
sourceTree = "<group>";
};
B1107ECC2201BEAF0038014B /* Setup */ = {
isa = PBXGroup;
children = (
B10B3B592201DD740072C76B /* KeyBackupSetupBannerCell.swift */,
B10B3B5A2201DD740072C76B /* KeyBackupSetupBannerCell.xib */,
);
path = Setup;
sourceTree = "<group>";
};
B110871E21F098EF003554A5 /* ActivityIndicator */ = {
isa = PBXGroup;
children = (
@@ -3231,7 +3223,7 @@
3284A35120A07C210044F922 /* postMessageAPI.js in Resources */,
B1B557A220EF58AD00210D55 /* ContactTableViewCell.xib in Resources */,
B1B558EB20EF768F00210D55 /* RoomIncomingTextMsgWithPaginationTitleBubbleCell.xib in Resources */,
B10B3B5C2201DD740072C76B /* KeyBackupSetupBannerCell.xib in Resources */,
B10B3B5C2201DD740072C76B /* KeyBackupBannerCell.xib in Resources */,
B1B5581820EF625800210D55 /* PreviewRoomTitleView.xib in Resources */,
B1B5583020EF66BA00210D55 /* RoomIdOrAliasTableViewCell.xib in Resources */,
B1B558BF20EF768F00210D55 /* RoomOutgoingEncryptedTextMsgWithoutSenderNameBubbleCell.xib in Resources */,
@@ -3567,7 +3559,7 @@
B1B5574120EE6C4D00210D55 /* RecentsViewController.m in Sources */,
B1D250D82118AA0A000F4E93 /* RoomPredecessorBubbleCell.m in Sources */,
B1B5577120EE702800210D55 /* StickerPickerViewController.m in Sources */,
B104C2942203773C00D9F496 /* KeyBackupBannersPreferences.swift in Sources */,
B104C2942203773C00D9F496 /* KeyBackupBannerPreferences.swift in Sources */,
B1B5572020EE6C4D00210D55 /* ContactsTableViewController.m in Sources */,
B1B5581920EF625800210D55 /* RoomTitleView.m in Sources */,
B1098BE321ECE09F000DDA48 /* RiotDefaults.swift in Sources */,
@@ -3579,7 +3571,7 @@
B1B5571E20EE6C4D00210D55 /* ContactDetailsViewController.m in Sources */,
B1798302211B13B3001FD722 /* OnBoardingManager.swift in Sources */,
B1B5573520EE6C4D00210D55 /* GroupDetailsViewController.m in Sources */,
B10B3B5B2201DD740072C76B /* KeyBackupSetupBannerCell.swift in Sources */,
B10B3B5B2201DD740072C76B /* KeyBackupBannerCell.swift in Sources */,
B1098BFA21ECFE65000DDA48 /* KeyBackupSetupPassphraseViewModel.swift in Sources */,
B1B5575220EE6C4D00210D55 /* RoomKeyRequestViewController.m in Sources */,
F083BD1E1E7009ED00A9B29C /* AppDelegate.m in Sources */,
+5
View File
@@ -740,3 +740,8 @@
"key_backup_setup_banner_title_part1" = "Set up Secure Message Recovery";
"key_backup_setup_banner_title_part2" = " to never lose encrypted messages";
// MARK: Key backup recover banner
"key_backup_recover_banner_title_part1" = "Run Secure Message Recovery";
"key_backup_recover_banner_title_part2" = " to read encrypted message history on this device";
+8
View File
@@ -662,6 +662,14 @@ internal enum VectorL10n {
internal static var join: String {
return VectorL10n.tr("Vector", "join")
}
/// Run Secure Message Recovery
internal static var keyBackupRecoverBannerTitlePart1: String {
return VectorL10n.tr("Vector", "key_backup_recover_banner_title_part1")
}
/// to read encrypted message history on this device
internal static var keyBackupRecoverBannerTitlePart2: String {
return VectorL10n.tr("Vector", "key_backup_recover_banner_title_part2")
}
/// Done
internal static var keyBackupRecoverDoneAction: String {
return VectorL10n.tr("Vector", "key_backup_recover_done_action")
@@ -40,7 +40,7 @@
NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSourceTapOnDirectoryServerChange";
@interface RecentsDataSource() <KeyBackupSetupBannerCellDelegate>
@interface RecentsDataSource() <KeyBackupBannerCellDelegate>
{
NSMutableArray* invitesCellDataArray;
NSMutableArray* favoriteCellDataArray;
@@ -173,6 +173,8 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou
{
KeyBackupBannerPreferences *keyBackupBannersPreferences = KeyBackupBannerPreferences.shared;
NSString *keyBackupVersion = self.mxSession.crypto.backup.keyBackupVersion.version;
switch (self.mxSession.crypto.backup.state) {
case MXKeyBackupStateDisabled:
// Show key backup setup banner only if user has not hidden it once.
@@ -187,8 +189,15 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou
break;
case MXKeyBackupStateNotTrusted:
case MXKeyBackupStateWrongBackUpVersion:
// TODO: Show key backup recover banner.
keyBackupBanner = KeyBackupBannerNone;
// Show key backup recover banner only if user has not hidden it for the given version.
if (keyBackupVersion && [keyBackupBannersPreferences isRecoverBannerHiddenFor:keyBackupVersion])
{
keyBackupBanner = KeyBackupBannerNone;
}
else
{
keyBackupBanner = KeyBackupBannerRecover;
}
break;
default:
keyBackupBanner = KeyBackupBannerNone;
@@ -208,7 +217,13 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou
keyBackupBannersPreferences.hideSetupBanner = YES;
break;
case KeyBackupBannerRecover:
// TODO: Hide key backup recover banner.
{
NSString *keyBackupVersion = self.mxSession.crypto.backup.keyBackupVersion.version;
if (keyBackupVersion)
{
[keyBackupBannersPreferences hideRecoverBannerFor:keyBackupVersion];
}
}
break;
default:
break;
@@ -913,20 +928,10 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou
if (indexPath.section == self.keyBackupBannerSection)
{
UITableViewCell* cell;
switch (self.keyBackupBanner) {
case KeyBackupBannerSetup: {
KeyBackupSetupBannerCell* keyBackupSetupBannerCell = [tableView dequeueReusableCellWithIdentifier:KeyBackupSetupBannerCell.defaultReuseIdentifier forIndexPath:indexPath];
keyBackupSetupBannerCell.delegate = self;
cell = keyBackupSetupBannerCell;
}
break;
default:
break;
}
return cell;
KeyBackupBannerCell* keyBackupBannerCell = [tableView dequeueReusableCellWithIdentifier:KeyBackupBannerCell.defaultReuseIdentifier forIndexPath:indexPath];
[keyBackupBannerCell configureFor:self.keyBackupBanner];
keyBackupBannerCell.delegate = self;
return keyBackupBannerCell;
}
else if (indexPath.section == directorySection)
{
@@ -1717,7 +1722,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou
#pragma mark - KeyBackupSetupBannerCellDelegate
- (void)keyBackupSetupBannerCellDidTapCloseAction:(KeyBackupSetupBannerCell * _Nonnull)cell
- (void)keyBackupBannerCellDidTapCloseAction:(KeyBackupBannerCell * _Nonnull)cell
{
[self hideKeyBackupBanner:self.keyBackupBanner];
}
+43 -26
View File
@@ -27,7 +27,7 @@
#import "MXRoom+Riot.h"
@interface HomeViewController () <KeyBackupSetupCoordinatorBridgePresenterDelegate>
@interface HomeViewController () <KeyBackupSetupCoordinatorBridgePresenterDelegate, KeyBackupRecoverCoordinatorBridgePresenterDelegate>
{
RecentsDataSource *recentsDataSource;
@@ -42,7 +42,8 @@
}
@property (nonatomic, strong) KeyBackupSetupCoordinatorBridgePresenter *keyBackupSetupCoordinatorBridgePresenter;
@property (nonatomic, strong) KeyBackupSetupBannerCell *keyBackupSetupBannerPrototypeCell;
@property (nonatomic, strong) KeyBackupRecoverCoordinatorBridgePresenter *keyBackupRecoverCoordinatorBridgePresenter;
@property (nonatomic, strong) KeyBackupBannerCell *keyBackupBannerPrototypeCell;
@end
@@ -77,7 +78,7 @@
[self.recentsTableView registerClass:TableViewCellWithCollectionView.class forCellReuseIdentifier:TableViewCellWithCollectionView.defaultReuseIdentifier];
// Register key backup banner cells
[self.recentsTableView registerNib:KeyBackupSetupBannerCell.nib forCellReuseIdentifier:KeyBackupSetupBannerCell.defaultReuseIdentifier];
[self.recentsTableView registerNib:KeyBackupBannerCell.nib forCellReuseIdentifier:KeyBackupBannerCell.defaultReuseIdentifier];
// Change the table data source. It must be the home view controller itself.
self.recentsTableView.dataSource = self;
@@ -144,13 +145,13 @@
}
}
- (KeyBackupSetupBannerCell *)keyBackupSetupBannerPrototypeCell
- (KeyBackupBannerCell *)keyBackupBannerPrototypeCell
{
if (!_keyBackupSetupBannerPrototypeCell)
if (!_keyBackupBannerPrototypeCell)
{
_keyBackupSetupBannerPrototypeCell = [self.recentsTableView dequeueReusableCellWithIdentifier:KeyBackupSetupBannerCell.defaultReuseIdentifier];
_keyBackupBannerPrototypeCell = [self.recentsTableView dequeueReusableCellWithIdentifier:KeyBackupBannerCell.defaultReuseIdentifier];
}
return _keyBackupSetupBannerPrototypeCell;
return _keyBackupBannerPrototypeCell;
}
- (void)presentKeyBackupSetup
@@ -163,6 +164,19 @@
self.keyBackupSetupCoordinatorBridgePresenter = keyBackupSetupCoordinatorBridgePresenter;
}
- (void)presentKeyBackupRecover
{
MXKeyBackupVersion *keyBackupVersion = self.mainSession.crypto.backup.keyBackupVersion;
if (keyBackupVersion)
{
KeyBackupRecoverCoordinatorBridgePresenter *keyBackupRecoverCoordinatorBridgePresenter = [[KeyBackupRecoverCoordinatorBridgePresenter alloc] initWithSession:self.mainSession keyBackupVersion:keyBackupVersion];
keyBackupRecoverCoordinatorBridgePresenter.delegate = self;
[keyBackupRecoverCoordinatorBridgePresenter presentFrom:self animated:YES];
self.keyBackupRecoverCoordinatorBridgePresenter = keyBackupRecoverCoordinatorBridgePresenter;
}
}
#pragma mark - Override RecentsViewController
@@ -369,27 +383,17 @@
else if (indexPath.section == recentsDataSource.keyBackupBannerSection)
{
CGFloat height = 0.0;
UITableViewCell *sizingCell;
KeyBackupBannerCell *sizingCell = self.keyBackupBannerPrototypeCell;
switch (recentsDataSource.keyBackupBanner) {
case KeyBackupBannerSetup:
{
sizingCell = self.keyBackupSetupBannerPrototypeCell;
}
break;
default:
break;
}
[sizingCell configureFor:recentsDataSource.keyBackupBanner];
[sizingCell layoutIfNeeded];
CGSize fittingSize = UILayoutFittingCompressedSize;
fittingSize.width = CGRectGetWidth(tableView.frame);
height = [sizingCell systemLayoutSizeFittingSize:fittingSize withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:UILayoutPriorityFittingSizeLevel].height;
if (sizingCell)
{
[sizingCell layoutIfNeeded];
CGSize fittingSize = UILayoutFittingCompressedSize;
fittingSize.width = CGRectGetWidth(tableView.frame);
height = [sizingCell systemLayoutSizeFittingSize:fittingSize withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:UILayoutPriorityFittingSizeLevel].height;
}
return height;
}
@@ -428,6 +432,9 @@
case KeyBackupBannerSetup:
[self presentKeyBackupSetup];
break;
case KeyBackupBannerRecover:
[self presentKeyBackupRecover];
break;
default:
break;
}
@@ -693,4 +700,14 @@
self.keyBackupSetupCoordinatorBridgePresenter = nil;
}
- (void)keyBackupRecoverCoordinatorBridgePresenterDidCancel:(KeyBackupRecoverCoordinatorBridgePresenter * _Nonnull)keyBackupRecoverCoordinatorBridgePresenter {
[keyBackupRecoverCoordinatorBridgePresenter dismissWithAnimated:YES];
self.keyBackupRecoverCoordinatorBridgePresenter = nil;
}
- (void)keyBackupRecoverCoordinatorBridgePresenterDidRecover:(KeyBackupRecoverCoordinatorBridgePresenter * _Nonnull)keyBackupRecoverCoordinatorBridgePresenter {
[keyBackupRecoverCoordinatorBridgePresenter dismissWithAnimated:YES];
self.keyBackupRecoverCoordinatorBridgePresenter = nil;
}
@end
@@ -16,12 +16,12 @@
import UIKit
@objc protocol KeyBackupSetupBannerCellDelegate: class {
func keyBackupSetupBannerCellDidTapCloseAction(_ cell: KeyBackupSetupBannerCell)
@objc protocol KeyBackupBannerCellDelegate: class {
func keyBackupBannerCellDidTapCloseAction(_ cell: KeyBackupBannerCell)
}
@objcMembers
final class KeyBackupSetupBannerCell: MXKTableViewCell {
final class KeyBackupBannerCell: MXKTableViewCell {
// MARK: - Properties
@@ -33,7 +33,7 @@ final class KeyBackupSetupBannerCell: MXKTableViewCell {
// MARK: Public
weak var delegate: KeyBackupSetupBannerCellDelegate?
weak var delegate: KeyBackupBannerCellDelegate?
// MARK: - Overrides
@@ -70,9 +70,31 @@ final class KeyBackupSetupBannerCell: MXKTableViewCell {
self.closeButton.setImage(closeImage, for: .normal)
}
// MARK: - Public
func configure(for banner: KeyBackupBanner) {
let attributedTitle: NSAttributedString?
let theme = ThemeService.shared().theme
switch banner {
case .setup:
let setupAttributedTitle = NSMutableAttributedString(string: VectorL10n.keyBackupSetupBannerTitlePart1, attributes: [.foregroundColor: theme.tintColor])
setupAttributedTitle.append(NSAttributedString(string: VectorL10n.keyBackupSetupBannerTitlePart2, attributes: [.foregroundColor: theme.textPrimaryColor]))
attributedTitle = setupAttributedTitle
case .recover:
let recoverAttributedTitle = NSMutableAttributedString(string: VectorL10n.keyBackupRecoverBannerTitlePart1, attributes: [.foregroundColor: theme.tintColor])
recoverAttributedTitle.append(NSAttributedString(string: VectorL10n.keyBackupRecoverBannerTitlePart2, attributes: [.foregroundColor: theme.textPrimaryColor]))
attributedTitle = recoverAttributedTitle
case .none:
attributedTitle = nil
}
self.informationLabel.attributedText = attributedTitle
}
// MARK: - Actions
@IBAction private func closeButtonAction(_ sender: Any) {
self.delegate?.keyBackupSetupBannerCellDidTapCloseAction(self)
self.delegate?.keyBackupBannerCellDidTapCloseAction(self)
}
}
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="KGk-i7-Jjw" customClass="KeyBackupSetupBannerCell" customModule="Riot" customModuleProvider="target">
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="KGk-i7-Jjw" customClass="KeyBackupBannerCell" customModule="Riot" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="641" height="96"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
@@ -0,0 +1,77 @@
/*
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import Foundation
/// Key backup banner user preferences.
@objcMembers
final class KeyBackupBannerPreferences: NSObject {
// MARK: - Constants
private enum UserDefaultsKeys {
static let hideSetupBanner = "KeyBackupBannerPreferencesHideSetupBanner"
static let hiddenRecoverBannerKeyBackupVersions = "KeyBackupBannerPreferencesHiddenRecoverBannerKeyBackupVersions"
}
static let shared = KeyBackupBannerPreferences()
// MARK: - Properties
private var hiddenRecoverBannerKeyBackupVersions: [String] {
get {
return UserDefaults.standard.stringArray(forKey: UserDefaultsKeys.hiddenRecoverBannerKeyBackupVersions) ?? []
}
set {
UserDefaults.standard.set(newValue, forKey: UserDefaultsKeys.hiddenRecoverBannerKeyBackupVersions)
}
}
// MARK: - Public
/// Remember to hide key backup setup banner.
var hideSetupBanner: Bool {
get {
return UserDefaults.standard.bool(forKey: UserDefaultsKeys.hideSetupBanner)
}
set {
UserDefaults.standard.set(newValue, forKey: UserDefaultsKeys.hideSetupBanner)
}
}
/// Remember to hide key backup recover banner for specific key backup version.
///
/// - Parameter keyBackupVersion: Key backup version recover banner to hide.
func hideRecoverBanner(for keyBackupVersion: String) {
guard self.hiddenRecoverBannerKeyBackupVersions.contains(keyBackupVersion) == false else {
return
}
self.hiddenRecoverBannerKeyBackupVersions.append(keyBackupVersion)
}
/// Check if key backup recover banner should be hidden for key backup version.
///
/// - Parameter keyBackupVersion: Key backup version to check.
/// - Returns: true if recover banner should be hidden.
func isRecoverBannerHidden(for keyBackupVersion: String) -> Bool {
return self.hiddenRecoverBannerKeyBackupVersions.contains(keyBackupVersion)
}
/// Reset key backup banner preferences to default values
func reset() {
self.hideSetupBanner = false
self.hiddenRecoverBannerKeyBackupVersions = []
}
}
@@ -1,46 +0,0 @@
/*
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import Foundation
/// Key backup banner user preferences.
@objcMembers
final class KeyBackupBannerPreferences: NSObject {
// MARK: - Constants
private enum UserDefaultsKeys {
static let hideSetupBanner = "KeyBackupBannersManagerHideSetupBanner"
}
static let shared = KeyBackupBannerPreferences()
// MARK: - Public
/// Indicate to show key backup setup if needed.
var hideSetupBanner: Bool {
get {
return UserDefaults.standard.bool(forKey: UserDefaultsKeys.hideSetupBanner)
}
set {
UserDefaults.standard.set(newValue, forKey: UserDefaultsKeys.hideSetupBanner)
}
}
func reset() {
self.hideSetupBanner = false
}
}
@@ -9,3 +9,4 @@
#import "RiotNavigationController.h"
#import "ThemeService.h"
#import "TableViewCellWithCheckBoxAndLabel.h"
#import "RecentsDataSource.h"