2
0

Move Spectre migration dialogs fully global & make closeable.

This commit is contained in:
Maarten Billemont 2021-11-01 21:16:00 -04:00
parent f27607e63c
commit 5de9b05299
5 changed files with 70 additions and 102 deletions

View File

@ -30,8 +30,6 @@
@property(nonatomic, strong) IBOutlet UIView *badNameTipContainer; @property(nonatomic, strong) IBOutlet UIView *badNameTipContainer;
@property(nonatomic, strong) IBOutlet UIView *popdownView; @property(nonatomic, strong) IBOutlet UIView *popdownView;
@property(nonatomic, strong) IBOutlet UIView *popdownContainer; @property(nonatomic, strong) IBOutlet UIView *popdownContainer;
@property(nonatomic, strong) IBOutlet UIView *spectreInstallAlert;
@property(nonatomic, strong) IBOutlet UIView *spectreMigrateAlert;
@property(assign, nonatomic) BOOL active; @property(assign, nonatomic) BOOL active;
@ -39,6 +37,5 @@
- (void)reloadSites; - (void)reloadSites;
- (IBAction)dismissPopdown:(id)sender; - (IBAction)dismissPopdown:(id)sender;
- (IBAction)upgradeSpectre:(UIButton *)sender;
@end @end

View File

@ -74,7 +74,6 @@ typedef NS_OPTIONS( NSUInteger, MPPasswordsTips ) {
[self registerObservers]; [self registerObservers];
[self updateConfigKey:nil]; [self updateConfigKey:nil];
[self updateSpectreAlerts];
static NSRegularExpression *bareHostRE = nil; static NSRegularExpression *bareHostRE = nil;
static dispatch_once_t once = 0; static dispatch_once_t once = 0;
@ -318,7 +317,6 @@ typedef NS_OPTIONS( NSUInteger, MPPasswordsTips ) {
PearlAddNotificationObserver( UIApplicationWillEnterForegroundNotification, nil, [NSOperationQueue mainQueue], PearlAddNotificationObserver( UIApplicationWillEnterForegroundNotification, nil, [NSOperationQueue mainQueue],
^(MPSitesViewController *self, NSNotification *note) { ^(MPSitesViewController *self, NSNotification *note) {
[self viewWillAppear:YES]; [self viewWillAppear:YES];
[self updateSpectreAlerts];
} ); } );
PearlAddNotificationObserver( MPSignedOutNotification, nil, nil, PearlAddNotificationObserver( MPSignedOutNotification, nil, nil,
^(MPSitesViewController *self, NSNotification *note) { ^(MPSitesViewController *self, NSNotification *note) {
@ -466,24 +464,4 @@ typedef NS_OPTIONS( NSUInteger, MPPasswordsTips ) {
self.popdownToTopConstraint.priority = UILayoutPriorityDefaultHigh; self.popdownToTopConstraint.priority = UILayoutPriorityDefaultHigh;
} }
- (IBAction)upgradeSpectre:(UIButton *)sender {
[[MPiOSAppDelegate get] migrateFor:[MPiOSAppDelegate get].activeUserForMainThread];
}
#pragma mark - Private
- (void)updateSpectreAlerts {
BOOL spectreInstalled = [UIApp canOpenURL:[[NSURL alloc] initWithString:@"spectre:"]];
if (spectreInstalled) {
self.spectreInstallAlert.visible = NO;
self.spectreMigrateAlert.visible = YES;
}
else {
self.spectreInstallAlert.visible = [MPiOSAppDelegate get].spectreViewController != nil;
self.spectreMigrateAlert.visible = NO;
}
}
@end @end

View File

@ -36,11 +36,13 @@
@property(weak, nonatomic) IBOutlet UIButton *previousAvatarButton; @property(weak, nonatomic) IBOutlet UIButton *previousAvatarButton;
@property(weak, nonatomic) IBOutlet NSLayoutConstraint *keyboardHeightConstraint; @property(weak, nonatomic) IBOutlet NSLayoutConstraint *keyboardHeightConstraint;
@property(weak, nonatomic) IBOutlet UIView *spectreInstallAlert; @property(weak, nonatomic) IBOutlet UIView *spectreInstallAlert;
@property(weak, nonatomic) IBOutlet UIView *spectreMigrateAlert;
@property(assign, nonatomic, readonly) BOOL active; @property(assign, nonatomic, readonly) BOOL active;
- (void)setActive:(BOOL)active animated:(BOOL)animated; - (void)setActive:(BOOL)active animated:(BOOL)animated;
- (IBAction)changeAvatar:(UIButton *)sender; - (IBAction)changeAvatar:(UIButton *)sender;
- (IBAction)upgradeSpectre:(UIButton *)sender; - (IBAction)upgradeSpectre:(UIButton *)sender;
- (IBAction)dismissSpectre:(UIButton *)sender;
@end @end

View File

@ -733,9 +733,11 @@ referenceSizeForFooterInSection:(NSInteger)section {
BOOL spectreInstalled = [UIApp canOpenURL:[[NSURL alloc] initWithString:@"spectre:"]]; BOOL spectreInstalled = [UIApp canOpenURL:[[NSURL alloc] initWithString:@"spectre:"]];
if (spectreInstalled) { if (spectreInstalled) {
self.spectreInstallAlert.visible = NO; self.spectreInstallAlert.visible = NO;
self.spectreMigrateAlert.visible = YES;
} }
else { else {
self.spectreInstallAlert.visible = [MPiOSAppDelegate get].spectreViewController != nil; self.spectreInstallAlert.visible = [MPiOSAppDelegate get].spectreViewController != nil;
self.spectreMigrateAlert.visible = NO;
} }
} }
@ -922,7 +924,13 @@ referenceSizeForFooterInSection:(NSInteger)section {
- (IBAction)upgradeSpectre:(UIButton *)sender { - (IBAction)upgradeSpectre:(UIButton *)sender {
[[MPiOSAppDelegate get] migrateFor:nil]; [[MPiOSAppDelegate get] migrateFor:[MPiOSAppDelegate get].activeUserForMainThread];
}
- (IBAction)dismissSpectre:(UIButton *)sender {
self.spectreInstallAlert.visible = NO;
self.spectreMigrateAlert.visible = NO;
} }
@end @end

View File

@ -387,7 +387,7 @@
<view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tOT-TZ-yse" userLabel="Install Spectre Tip"> <view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tOT-TZ-yse" userLabel="Install Spectre Tip">
<rect key="frame" x="0.0" y="740" width="414" height="156"/> <rect key="frame" x="0.0" y="740" width="414" height="156"/>
<subviews> <subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ded-Ii-gyf"> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ded-Ii-gyf" userLabel="Migrate">
<rect key="frame" x="8" y="8" width="398" height="106"/> <rect key="frame" x="8" y="8" width="398" height="106"/>
<state key="normal" backgroundImage="tip_alert_black"/> <state key="normal" backgroundImage="tip_alert_black"/>
<connections> <connections>
@ -395,7 +395,7 @@
</connections> </connections>
</button> </button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bqa-qH-Bia"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bqa-qH-Bia">
<rect key="frame" x="80" y="15" width="315" height="84"/> <rect key="frame" x="80" y="15" width="267" height="84"/>
<string key="text">The next generation of password security is now called «Spectre»: <string key="text">The next generation of password security is now called «Spectre»:
Tap to install the upgrade. Tap to install the upgrade.
@ -404,23 +404,74 @@ This app is now out of maintenance.</string>
<color key="textColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <color key="textColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
<button opaque="NO" contentMode="scaleToFill" horizontalCompressionResistancePriority="751" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="tDY-IR-ak2" userLabel="Close">
<rect key="frame" x="347" y="20" width="47" height="31"/>
<buttonConfiguration key="configuration" style="plain" title=""/>
<connections>
<action selector="dismissSpectre:" destination="S8q-YF-Kt9" eventType="touchUpInside" id="7a6-W3-NIK"/>
</connections>
</button>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="bqa-qH-Bia" firstAttribute="trailing" secondItem="ded-Ii-gyf" secondAttribute="trailing" constant="-11" id="2gN-5G-boh"/>
<constraint firstItem="ded-Ii-gyf" firstAttribute="leading" secondItem="tOT-TZ-yse" secondAttribute="leadingMargin" id="3fy-Qc-KlM"/> <constraint firstItem="ded-Ii-gyf" firstAttribute="leading" secondItem="tOT-TZ-yse" secondAttribute="leadingMargin" id="3fy-Qc-KlM"/>
<constraint firstItem="bqa-qH-Bia" firstAttribute="top" secondItem="ded-Ii-gyf" secondAttribute="top" constant="7" id="8Rd-qC-ttx"/> <constraint firstItem="bqa-qH-Bia" firstAttribute="top" secondItem="ded-Ii-gyf" secondAttribute="top" constant="7" id="8Rd-qC-ttx"/>
<constraint firstItem="bqa-qH-Bia" firstAttribute="bottom" secondItem="ded-Ii-gyf" secondAttribute="bottom" constant="-15" id="VLO-QZ-6Jf"/> <constraint firstItem="bqa-qH-Bia" firstAttribute="bottom" secondItem="ded-Ii-gyf" secondAttribute="bottom" constant="-15" id="VLO-QZ-6Jf"/>
<constraint firstItem="ded-Ii-gyf" firstAttribute="top" secondItem="tOT-TZ-yse" secondAttribute="topMargin" id="Y6k-Ep-Skv"/> <constraint firstItem="ded-Ii-gyf" firstAttribute="top" secondItem="tOT-TZ-yse" secondAttribute="topMargin" id="Y6k-Ep-Skv"/>
<constraint firstAttribute="trailingMargin" secondItem="ded-Ii-gyf" secondAttribute="trailing" id="d8e-pL-U3v"/> <constraint firstAttribute="trailingMargin" secondItem="ded-Ii-gyf" secondAttribute="trailing" id="d8e-pL-U3v"/>
<constraint firstAttribute="trailing" secondItem="tDY-IR-ak2" secondAttribute="trailing" constant="20" symbolic="YES" id="lb2-4g-zJV"/>
<constraint firstItem="bqa-qH-Bia" firstAttribute="leading" secondItem="ded-Ii-gyf" secondAttribute="leading" constant="72" id="nD7-ie-dHF"/> <constraint firstItem="bqa-qH-Bia" firstAttribute="leading" secondItem="ded-Ii-gyf" secondAttribute="leading" constant="72" id="nD7-ie-dHF"/>
<constraint firstItem="tDY-IR-ak2" firstAttribute="top" secondItem="tOT-TZ-yse" secondAttribute="top" constant="20" symbolic="YES" id="pDc-SL-x9W"/>
<constraint firstItem="tDY-IR-ak2" firstAttribute="leading" secondItem="bqa-qH-Bia" secondAttribute="trailing" id="suM-kx-xRY"/>
<constraint firstAttribute="bottomMargin" secondItem="ded-Ii-gyf" secondAttribute="bottom" id="xzD-vT-p1O"/> <constraint firstAttribute="bottomMargin" secondItem="ded-Ii-gyf" secondAttribute="bottom" id="xzD-vT-p1O"/>
</constraints> </constraints>
</view> </view>
<view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="e7i-8u-nyd" userLabel="Migrate Spectre Tip">
<rect key="frame" x="0.0" y="740" width="414" height="156"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="4s3-Ex-jpT" userLabel="Migrate">
<rect key="frame" x="8" y="8" width="398" height="106"/>
<state key="normal" backgroundImage="tip_alert_black"/>
<connections>
<action selector="upgradeSpectre:" destination="S8q-YF-Kt9" eventType="touchUpInside" id="059-Sa-0EF"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bWt-lb-7xL">
<rect key="frame" x="80" y="15" width="267" height="84"/>
<string key="text">The next generation of password security is now called «Spectre»:
Tap to copy your user into Spectre.
This app is now out of maintenance.</string>
<fontDescription key="fontDescription" name="Exo2.0-Regular" family="Exo 2.0" pointSize="14"/>
<color key="textColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" horizontalCompressionResistancePriority="751" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="3WO-6r-WEn" userLabel="Close">
<rect key="frame" x="347" y="20" width="47" height="31"/>
<buttonConfiguration key="configuration" style="plain" title=""/>
<connections>
<action selector="dismissSpectre:" destination="S8q-YF-Kt9" eventType="touchUpInside" id="aEC-nX-WeV"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="3WO-6r-WEn" firstAttribute="leading" secondItem="bWt-lb-7xL" secondAttribute="trailing" id="49f-Eg-XMb"/>
<constraint firstItem="bWt-lb-7xL" firstAttribute="leading" secondItem="4s3-Ex-jpT" secondAttribute="leading" constant="72" id="4rw-uH-p06"/>
<constraint firstItem="3WO-6r-WEn" firstAttribute="top" secondItem="e7i-8u-nyd" secondAttribute="top" constant="20" id="50L-TI-WJ8"/>
<constraint firstItem="bWt-lb-7xL" firstAttribute="top" secondItem="4s3-Ex-jpT" secondAttribute="top" constant="7" id="AwO-Pj-Wnr"/>
<constraint firstAttribute="bottomMargin" secondItem="4s3-Ex-jpT" secondAttribute="bottom" id="LWF-xQ-l5k"/>
<constraint firstItem="4s3-Ex-jpT" firstAttribute="leading" secondItem="e7i-8u-nyd" secondAttribute="leadingMargin" id="OKe-0I-vdR"/>
<constraint firstItem="4s3-Ex-jpT" firstAttribute="top" secondItem="e7i-8u-nyd" secondAttribute="topMargin" id="TRy-eS-Ch4"/>
<constraint firstAttribute="trailing" secondItem="3WO-6r-WEn" secondAttribute="trailing" constant="20" id="aPO-KL-k9X"/>
<constraint firstItem="bWt-lb-7xL" firstAttribute="bottom" secondItem="4s3-Ex-jpT" secondAttribute="bottom" constant="-15" id="cYX-vL-MKX"/>
<constraint firstAttribute="trailingMargin" secondItem="4s3-Ex-jpT" secondAttribute="trailing" id="lRd-Hq-SH2"/>
</constraints>
</view>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstAttribute="centerX" secondItem="VDd-oM-ZOO" secondAttribute="centerX" id="0j9-vM-WFA"/> <constraint firstAttribute="centerX" secondItem="VDd-oM-ZOO" secondAttribute="centerX" id="0j9-vM-WFA"/>
<constraint firstItem="cF4-TE-GEj" firstAttribute="bottom" secondItem="9u7-pu-Wtv" secondAttribute="top" priority="500" id="3oq-Zs-Ann"/> <constraint firstItem="cF4-TE-GEj" firstAttribute="bottom" secondItem="9u7-pu-Wtv" secondAttribute="top" priority="500" id="3oq-Zs-Ann"/>
<constraint firstItem="0Um-Ot-hI6" firstAttribute="top" secondItem="zCP-wo-gTl" secondAttribute="centerY" id="6zz-7f-HLz"/> <constraint firstItem="0Um-Ot-hI6" firstAttribute="top" secondItem="zCP-wo-gTl" secondAttribute="centerY" id="6zz-7f-HLz"/>
<constraint firstAttribute="bottom" secondItem="e7i-8u-nyd" secondAttribute="bottom" id="7Ar-nL-Xkt"/>
<constraint firstAttribute="trailing" secondItem="L6J-pd-gcp" secondAttribute="trailing" id="9fV-8e-y3E"/> <constraint firstAttribute="trailing" secondItem="L6J-pd-gcp" secondAttribute="trailing" id="9fV-8e-y3E"/>
<constraint firstItem="fUK-gJ-NRE" firstAttribute="centerY" relation="greaterThanOrEqual" secondItem="L6J-pd-gcp" secondAttribute="top" constant="60" id="ADW-TA-Iha"/> <constraint firstItem="fUK-gJ-NRE" firstAttribute="centerY" relation="greaterThanOrEqual" secondItem="L6J-pd-gcp" secondAttribute="top" constant="60" id="ADW-TA-Iha"/>
<constraint firstItem="9u7-pu-Wtv" firstAttribute="centerY" relation="greaterThanOrEqual" secondItem="L6J-pd-gcp" secondAttribute="top" constant="60" id="AQZ-W6-Xkf"/> <constraint firstItem="9u7-pu-Wtv" firstAttribute="centerY" relation="greaterThanOrEqual" secondItem="L6J-pd-gcp" secondAttribute="top" constant="60" id="AQZ-W6-Xkf"/>
@ -434,10 +485,12 @@ This app is now out of maintenance.</string>
<constraint firstAttribute="trailing" secondItem="fUK-gJ-NRE" secondAttribute="trailing" id="TBr-pS-kEK"/> <constraint firstAttribute="trailing" secondItem="fUK-gJ-NRE" secondAttribute="trailing" id="TBr-pS-kEK"/>
<constraint firstItem="tOT-TZ-yse" firstAttribute="leading" secondItem="rWM-08-aab" secondAttribute="leading" id="UKi-XP-1Kp"/> <constraint firstItem="tOT-TZ-yse" firstAttribute="leading" secondItem="rWM-08-aab" secondAttribute="leading" id="UKi-XP-1Kp"/>
<constraint firstItem="cF4-TE-GEj" firstAttribute="top" relation="greaterThanOrEqual" secondItem="L6J-pd-gcp" secondAttribute="top" constant="4" id="VHh-25-0mJ"/> <constraint firstItem="cF4-TE-GEj" firstAttribute="top" relation="greaterThanOrEqual" secondItem="L6J-pd-gcp" secondAttribute="top" constant="4" id="VHh-25-0mJ"/>
<constraint firstItem="e7i-8u-nyd" firstAttribute="leading" secondItem="rWM-08-aab" secondAttribute="leading" id="Xlw-Qz-6a5"/>
<constraint firstAttribute="trailing" secondItem="qp1-nX-o4i" secondAttribute="trailing" id="cOq-BS-Xmo"/> <constraint firstAttribute="trailing" secondItem="qp1-nX-o4i" secondAttribute="trailing" id="cOq-BS-Xmo"/>
<constraint firstAttribute="centerY" secondItem="VDd-oM-ZOO" secondAttribute="centerY" id="dxP-im-1dM"/> <constraint firstAttribute="centerY" secondItem="VDd-oM-ZOO" secondAttribute="centerY" id="dxP-im-1dM"/>
<constraint firstItem="zCP-wo-gTl" firstAttribute="leading" secondItem="rWM-08-aab" secondAttribute="leading" id="jBY-Gd-orW"/> <constraint firstItem="zCP-wo-gTl" firstAttribute="leading" secondItem="rWM-08-aab" secondAttribute="leading" id="jBY-Gd-orW"/>
<constraint firstAttribute="bottom" secondItem="L6J-pd-gcp" secondAttribute="bottom" id="jNR-Gp-sIv"/> <constraint firstAttribute="bottom" secondItem="L6J-pd-gcp" secondAttribute="bottom" id="jNR-Gp-sIv"/>
<constraint firstAttribute="trailing" secondItem="e7i-8u-nyd" secondAttribute="trailing" id="kOK-ch-Lxv"/>
<constraint firstItem="XEP-O3-ayG" firstAttribute="leading" secondItem="rWM-08-aab" secondAttribute="leading" id="pAt-0Y-LYv"/> <constraint firstItem="XEP-O3-ayG" firstAttribute="leading" secondItem="rWM-08-aab" secondAttribute="leading" id="pAt-0Y-LYv"/>
<constraint firstAttribute="trailing" secondItem="zCP-wo-gTl" secondAttribute="trailing" id="rGd-K4-pHL"/> <constraint firstAttribute="trailing" secondItem="zCP-wo-gTl" secondAttribute="trailing" id="rGd-K4-pHL"/>
<constraint firstAttribute="trailing" secondItem="XEP-O3-ayG" secondAttribute="trailing" id="raD-hD-OYt"/> <constraint firstAttribute="trailing" secondItem="XEP-O3-ayG" secondAttribute="trailing" id="raD-hD-OYt"/>
@ -477,6 +530,8 @@ This app is now out of maintenance.</string>
<outlet property="nextAvatarButton" destination="fUK-gJ-NRE" id="5qo-lK-rSa"/> <outlet property="nextAvatarButton" destination="fUK-gJ-NRE" id="5qo-lK-rSa"/>
<outlet property="preferencesTipContainer" destination="0Um-Ot-hI6" id="Cv8-Bp-ZZs"/> <outlet property="preferencesTipContainer" destination="0Um-Ot-hI6" id="Cv8-Bp-ZZs"/>
<outlet property="previousAvatarButton" destination="9u7-pu-Wtv" id="Hgv-lN-S1n"/> <outlet property="previousAvatarButton" destination="9u7-pu-Wtv" id="Hgv-lN-S1n"/>
<outlet property="spectreInstallAlert" destination="tOT-TZ-yse" id="2hk-xb-psR"/>
<outlet property="spectreMigrateAlert" destination="e7i-8u-nyd" id="6oI-L9-VgE"/>
<outlet property="storeLoadingActivity" destination="VDd-oM-ZOO" id="MJ7-2f-e8n"/> <outlet property="storeLoadingActivity" destination="VDd-oM-ZOO" id="MJ7-2f-e8n"/>
<outlet property="thanksTipContainer" destination="069-Pu-yXe" id="wWf-2X-Ryw"/> <outlet property="thanksTipContainer" destination="069-Pu-yXe" id="wWf-2X-Ryw"/>
<outlet property="userSelectionContainer" destination="rWM-08-aab" id="Yme-hX-8P0"/> <outlet property="userSelectionContainer" destination="rWM-08-aab" id="Yme-hX-8P0"/>
@ -484,7 +539,7 @@ This app is now out of maintenance.</string>
</viewController> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="8hZ-Tb-wZw" userLabel="First Responder" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="8hZ-Tb-wZw" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="2041" y="226"/> <point key="canvasLocation" x="2040.5797101449277" y="225.66964285714283"/>
</scene> </scene>
<!--Web View Controller--> <!--Web View Controller-->
<scene sceneID="JQz-u7-oA7"> <scene sceneID="JQz-u7-oA7">
@ -1707,70 +1762,6 @@ eg. apple.com, rmitchell@twitter.com</string>
</view> </view>
<blurEffect style="regular"/> <blurEffect style="regular"/>
</visualEffectView> </visualEffectView>
<view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="3ve-eR-1IW">
<rect key="frame" x="0.0" y="740" width="414" height="156"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="PWC-I5-RSl">
<rect key="frame" x="8" y="8" width="398" height="106"/>
<state key="normal" backgroundImage="tip_alert_black"/>
<connections>
<action selector="upgradeSpectre:" destination="nkY-z6-8jd" eventType="touchUpInside" id="8KJ-vm-3D0"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="XgC-Ky-oVC">
<rect key="frame" x="80" y="15" width="315" height="84"/>
<string key="text">The next generation of password security is now called «Spectre»:
Tap to install the upgrade.
This app is now out of maintenance.</string>
<fontDescription key="fontDescription" name="Exo2.0-Regular" family="Exo 2.0" pointSize="14"/>
<color key="textColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="PWC-I5-RSl" firstAttribute="top" secondItem="3ve-eR-1IW" secondAttribute="topMargin" id="0gi-j6-mfg"/>
<constraint firstItem="XgC-Ky-oVC" firstAttribute="leading" secondItem="PWC-I5-RSl" secondAttribute="leading" constant="72" id="E88-An-rzp"/>
<constraint firstAttribute="bottomMargin" secondItem="PWC-I5-RSl" secondAttribute="bottom" id="FrN-5c-k1V"/>
<constraint firstItem="XgC-Ky-oVC" firstAttribute="trailing" secondItem="PWC-I5-RSl" secondAttribute="trailing" constant="-11" id="Scl-zE-fTg"/>
<constraint firstAttribute="trailingMargin" secondItem="PWC-I5-RSl" secondAttribute="trailing" id="gwp-DL-I06"/>
<constraint firstItem="XgC-Ky-oVC" firstAttribute="bottom" secondItem="PWC-I5-RSl" secondAttribute="bottom" constant="-15" id="hFa-k3-yr9"/>
<constraint firstItem="PWC-I5-RSl" firstAttribute="leading" secondItem="3ve-eR-1IW" secondAttribute="leadingMargin" id="jod-TY-7Iu"/>
<constraint firstItem="XgC-Ky-oVC" firstAttribute="top" secondItem="PWC-I5-RSl" secondAttribute="top" constant="7" id="yjZ-x1-6JY"/>
</constraints>
</view>
<view opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="67c-5R-Foa">
<rect key="frame" x="0.0" y="740" width="414" height="156"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="EZK-er-8ql">
<rect key="frame" x="8" y="8" width="398" height="106"/>
<state key="normal" backgroundImage="tip_alert_black"/>
<connections>
<action selector="upgradeSpectre:" destination="nkY-z6-8jd" eventType="touchUpInside" id="P4a-tL-9yX"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fLB-gA-32p">
<rect key="frame" x="80" y="15" width="315" height="84"/>
<string key="text">The next generation of password security is now called «Spectre»:
Tap to copy this user into Spectre.
This app is now out of maintenance.</string>
<fontDescription key="fontDescription" name="Exo2.0-Regular" family="Exo 2.0" pointSize="14"/>
<color key="textColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="trailingMargin" secondItem="EZK-er-8ql" secondAttribute="trailing" id="2v6-0n-EXu"/>
<constraint firstItem="fLB-gA-32p" firstAttribute="bottom" secondItem="EZK-er-8ql" secondAttribute="bottom" constant="-15" id="KET-Ct-225"/>
<constraint firstAttribute="bottomMargin" secondItem="EZK-er-8ql" secondAttribute="bottom" id="LqJ-v9-IDf"/>
<constraint firstItem="fLB-gA-32p" firstAttribute="trailing" secondItem="EZK-er-8ql" secondAttribute="trailing" constant="-11" id="ivM-cA-Fn9"/>
<constraint firstItem="fLB-gA-32p" firstAttribute="leading" secondItem="EZK-er-8ql" secondAttribute="leading" constant="72" id="iwL-1a-Tgo"/>
<constraint firstItem="fLB-gA-32p" firstAttribute="top" secondItem="EZK-er-8ql" secondAttribute="top" constant="7" id="mHI-WQ-tMx"/>
<constraint firstItem="EZK-er-8ql" firstAttribute="top" secondItem="67c-5R-Foa" secondAttribute="topMargin" id="xMX-Iy-gkw"/>
<constraint firstItem="EZK-er-8ql" firstAttribute="leading" secondItem="67c-5R-Foa" secondAttribute="leadingMargin" id="ycd-o8-QVl"/>
</constraints>
</view>
<view opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XNM-XQ-rMe" userLabel="Popdown"> <view opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XNM-XQ-rMe" userLabel="Popdown">
<rect key="frame" x="0.0" y="-896" width="414" height="896"/> <rect key="frame" x="0.0" y="-896" width="414" height="896"/>
<subviews> <subviews>
@ -1814,13 +1805,8 @@ This app is now out of maintenance.</string>
</subviews> </subviews>
<color key="backgroundColor" red="0.1215686275" green="0.12941176469999999" blue="0.14117647059999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color key="backgroundColor" red="0.1215686275" green="0.12941176469999999" blue="0.14117647059999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints> <constraints>
<constraint firstAttribute="trailing" secondItem="67c-5R-Foa" secondAttribute="trailing" id="0mY-Tq-ZT4"/>
<constraint firstItem="cHF-cD-2Ge" firstAttribute="top" secondItem="XNM-XQ-rMe" secondAttribute="bottom" id="6V9-tX-50t"/> <constraint firstItem="cHF-cD-2Ge" firstAttribute="top" secondItem="XNM-XQ-rMe" secondAttribute="bottom" id="6V9-tX-50t"/>
<constraint firstAttribute="trailing" secondItem="3ve-eR-1IW" secondAttribute="trailing" id="7hd-C3-Akk"/>
<constraint firstAttribute="bottom" secondItem="67c-5R-Foa" secondAttribute="bottom" id="8xp-Si-tWG"/>
<constraint firstAttribute="top" secondItem="XNM-XQ-rMe" secondAttribute="bottom" priority="750" id="BdD-Kc-eHl"/> <constraint firstAttribute="top" secondItem="XNM-XQ-rMe" secondAttribute="bottom" priority="750" id="BdD-Kc-eHl"/>
<constraint firstItem="67c-5R-Foa" firstAttribute="leading" secondItem="tI8-OT-LrO" secondAttribute="leading" id="Ftn-Yi-mdI"/>
<constraint firstAttribute="bottom" secondItem="3ve-eR-1IW" secondAttribute="bottom" id="GOa-ky-jfJ"/>
<constraint firstItem="uuT-jm-2La" firstAttribute="bottom" secondItem="S9X-2T-e1e" secondAttribute="bottom" priority="500" constant="44" id="HAi-jL-BdJ"/> <constraint firstItem="uuT-jm-2La" firstAttribute="bottom" secondItem="S9X-2T-e1e" secondAttribute="bottom" priority="500" constant="44" id="HAi-jL-BdJ"/>
<constraint firstAttribute="trailing" secondItem="K2e-Gh-7hH" secondAttribute="trailing" id="Hnk-mU-GSd"/> <constraint firstAttribute="trailing" secondItem="K2e-Gh-7hH" secondAttribute="trailing" id="Hnk-mU-GSd"/>
<constraint firstAttribute="top" secondItem="cHF-cD-2Ge" secondAttribute="bottom" priority="1" id="JO5-ph-0ce"/> <constraint firstAttribute="top" secondItem="cHF-cD-2Ge" secondAttribute="bottom" priority="1" id="JO5-ph-0ce"/>
@ -1832,7 +1818,6 @@ This app is now out of maintenance.</string>
<constraint firstItem="cHF-cD-2Ge" firstAttribute="leading" secondItem="tI8-OT-LrO" secondAttribute="leading" id="TJC-eP-DDE"/> <constraint firstItem="cHF-cD-2Ge" firstAttribute="leading" secondItem="tI8-OT-LrO" secondAttribute="leading" id="TJC-eP-DDE"/>
<constraint firstItem="uuT-jm-2La" firstAttribute="bottom" secondItem="VOY-zU-XQR" secondAttribute="bottom" id="U4C-1P-lIR"/> <constraint firstItem="uuT-jm-2La" firstAttribute="bottom" secondItem="VOY-zU-XQR" secondAttribute="bottom" id="U4C-1P-lIR"/>
<constraint firstItem="K2e-Gh-7hH" firstAttribute="height" secondItem="tI8-OT-LrO" secondAttribute="height" id="Xfe-XT-eOn"/> <constraint firstItem="K2e-Gh-7hH" firstAttribute="height" secondItem="tI8-OT-LrO" secondAttribute="height" id="Xfe-XT-eOn"/>
<constraint firstItem="3ve-eR-1IW" firstAttribute="leading" secondItem="tI8-OT-LrO" secondAttribute="leading" id="bKZ-qF-SL5"/>
<constraint firstAttribute="trailing" secondItem="XNM-XQ-rMe" secondAttribute="trailing" id="bgl-u9-shU"/> <constraint firstAttribute="trailing" secondItem="XNM-XQ-rMe" secondAttribute="trailing" id="bgl-u9-shU"/>
<constraint firstItem="K2e-Gh-7hH" firstAttribute="top" secondItem="tI8-OT-LrO" secondAttribute="bottom" priority="1" id="dNt-uf-8BC"/> <constraint firstItem="K2e-Gh-7hH" firstAttribute="top" secondItem="tI8-OT-LrO" secondAttribute="bottom" priority="1" id="dNt-uf-8BC"/>
<constraint firstItem="K2e-Gh-7hH" firstAttribute="top" secondItem="tI8-OT-LrO" secondAttribute="top" priority="500" id="vtB-e4-L8o"/> <constraint firstItem="K2e-Gh-7hH" firstAttribute="top" secondItem="tI8-OT-LrO" secondAttribute="top" priority="500" id="vtB-e4-L8o"/>
@ -1851,8 +1836,6 @@ This app is now out of maintenance.</string>
<outlet property="popdownView" destination="XNM-XQ-rMe" id="FaW-4m-Fff"/> <outlet property="popdownView" destination="XNM-XQ-rMe" id="FaW-4m-Fff"/>
<outlet property="searchBar" destination="aGs-1S-aC3" id="rTp-DP-rIz"/> <outlet property="searchBar" destination="aGs-1S-aC3" id="rTp-DP-rIz"/>
<outlet property="sitesToBottomConstraint" destination="dNt-uf-8BC" id="Ta6-eL-z7w"/> <outlet property="sitesToBottomConstraint" destination="dNt-uf-8BC" id="Ta6-eL-z7w"/>
<outlet property="spectreInstallAlert" destination="3ve-eR-1IW" id="Ah5-OX-XhQ"/>
<outlet property="spectreMigrateAlert" destination="67c-5R-Foa" id="aTi-fu-opO"/>
<segue destination="z9O-w0-6oR" kind="modal" identifier="guide" id="Ql4-wf-T8u"/> <segue destination="z9O-w0-6oR" kind="modal" identifier="guide" id="Ql4-wf-T8u"/>
<segue destination="Foa-Er-RBr" kind="custom" identifier="message" customClass="MPOverlaySegue" id="Xne-Sm-HQt"/> <segue destination="Foa-Er-RBr" kind="custom" identifier="message" customClass="MPOverlaySegue" id="Xne-Sm-HQt"/>
</connections> </connections>