@ -675,6 +675,19 @@ typedef enum : NSUInteger {
[ self ensureBannerState ] ;
}
/ / Returns a collection of the group members who are "no longer verified ".
- ( NSArray < NSString * > * ) noLongerVerifiedRecipientIds
{
NSMutableArray < NSString * > * result = [ NSMutableArray new ] ;
for ( NSString * recipientId in self . thread . recipientIdentifiers ) {
if ( [ [ OWSIdentityManager sharedManager ] verificationStateForRecipientId : recipientId ]
== OWSVerificationStateNoLongerVerified ) {
[ result addObject : recipientId ] ;
}
}
return result ;
}
- ( void ) ensureBannerState
{
/ / This method should be called rarely , so it ' s simplest to discard and
@ -686,14 +699,8 @@ typedef enum : NSUInteger {
return ;
}
/ / A collection of the group members who are "no longer verified ".
NSMutableArray < NSString * > * noLongerVerifiedRecipientIds = [ NSMutableArray new ] ;
for ( NSString * recipientId in self . thread . recipientIdentifiers ) {
if ( [ [ OWSIdentityManager sharedManager ] verificationStateForRecipientId : recipientId ]
== OWSVerificationStateNoLongerVerified ) {
[ noLongerVerifiedRecipientIds addObject : recipientId ] ;
}
}
NSArray < NSString * > * noLongerVerifiedRecipientIds = [ self noLongerVerifiedRecipientIds ] ;
if ( noLongerVerifiedRecipientIds . count > 0 ) {
NSString * message ;
if ( noLongerVerifiedRecipientIds . count > 1 ) {
@ -748,14 +755,6 @@ typedef enum : NSUInteger {
OWSAssert ( title . length > 0 ) ;
OWSAssert ( bannerColor ) ;
UILabel * label = [ UILabel new ] ;
label . font = [ UIFont ows_mediumFontWithSize : 14. f ] ;
label . text = title ;
label . textColor = [ UIColor whiteColor ] ;
label . numberOfLines = 0 ;
label . lineBreakMode = NSLineBreakByWordWrapping ;
label . textAlignment = NSTextAlignmentCenter ;
UIView * bannerView = [ UIView new ] ;
bannerView . backgroundColor = bannerColor ;
bannerView . layer . cornerRadius = 2.5 f ;
@ -766,12 +765,30 @@ typedef enum : NSUInteger {
bannerView . layer . shadowRadius = 2. f ;
bannerView . layer . shadowOpacity = 0.35 f ;
UILabel * label = [ UILabel new ] ;
label . font = [ UIFont ows_mediumFontWithSize : 14. f ] ;
label . text = title ;
label . textColor = [ UIColor whiteColor ] ;
label . numberOfLines = 0 ;
label . lineBreakMode = NSLineBreakByWordWrapping ;
label . textAlignment = NSTextAlignmentCenter ;
UIImage * closeIcon = [ UIImage imageNamed : @ "banner_close "] ;
UIImageView * closeButton = [ [ UIImageView alloc ] initWithImage : closeIcon ] ;
[ bannerView addSubview : closeButton ] ;
const CGFloat kBannerCloseButtonPadding = 8. f ;
[ closeButton autoPinEdgeToSuperviewEdge : ALEdgeTop withInset : kBannerCloseButtonPadding ] ;
[ closeButton autoPinEdgeToSuperviewEdge : ALEdgeRight withInset : kBannerCloseButtonPadding ] ;
[ closeButton autoSetDimension : ALDimensionWidth toSize : closeIcon . size . width ] ;
[ closeButton autoSetDimension : ALDimensionHeight toSize : closeIcon . size . height ] ;
[ bannerView addSubview : label ] ;
[ label autoPinEdgeToSuperviewEdge : ALEdgeTop withInset : 5 ] ;
[ label autoPinEdgeToSuperviewEdge : ALEdgeBottom withInset : 5 ] ;
const CGFloat kBannerHPadding = 15. f ;
[ label autoPinEdgeToSuperviewEdge : ALEdgeLeft withInset : kBannerHPadding ] ;
[ label autoPinEdgeToSuperviewEdge : ALEdgeRight withInset : kBannerHPadding ] ;
const CGFloat kBannerHSpacing = 10. f ;
[ label autoPinEdge : ALEdgeRight toEdge : ALEdgeLeft ofView : closeButton withOffset : - kBannerHSpacing ] ;
[ bannerView addGestureRecognizer : [ [ UITapGestureRecognizer alloc ] initWithTarget : self action : tapSelector ] ] ;
@ -780,7 +797,8 @@ typedef enum : NSUInteger {
[ bannerView autoHCenterInSuperview ] ;
CGFloat labelDesiredWidth = [ label sizeThatFits : CGSizeZero ] . width ;
CGFloat bannerDesiredWidth = labelDesiredWidth + kBannerHPadding * 2. f ;
CGFloat bannerDesiredWidth
= ( labelDesiredWidth + kBannerHPadding + kBannerHSpacing + closeIcon . size . width + kBannerCloseButtonPadding ) ;
const CGFloat kMinBannerHMargin = 20. f ;
if ( bannerDesiredWidth + kMinBannerHMargin * 2. f > = self . view . width ) {
[ bannerView autoPinWidthToSuperviewWithMargin : kMinBannerHMargin ] ;
@ -814,7 +832,59 @@ typedef enum : NSUInteger {
- ( void ) noLongerVerifiedBannerViewWasTapped : ( UIGestureRecognizer * ) sender
{
if ( sender . state == UIGestureRecognizerStateRecognized ) {
[ self showConversationSettingsAndShowVerification : YES ] ;
UIAlertController * actionSheetController =
[ UIAlertController alertControllerWithTitle : nil
message : nil
preferredStyle : UIAlertControllerStyleActionSheet ] ;
__weak MessagesViewController * weakSelf = self ;
UIAlertAction * unblockAction = [ UIAlertAction
actionWithTitle :
NSLocalizedString ( @ "VERIFY_PRIVACY ",
@ "Label for button or row which allows users to verify the safety number of another user . ")
style : UIAlertActionStyleDefault
handler : ^( UIAlertAction * _Nonnull action ) {
[ weakSelf showConversationSettingsAndShowVerification : YES ] ;
} ] ;
[ actionSheetController addAction : unblockAction ] ;
UIAlertAction * dismissAction =
[ UIAlertAction actionWithTitle : NSLocalizedString ( @ "DISMISS_BUTTON_TEXT ",
@ "Generic short text for button to dismiss a dialog ")
style : UIAlertActionStyleCancel
handler : ^( UIAlertAction * _Nonnull action ) {
[ weakSelf resetVerificationStateToDefault ] ;
} ] ;
[ actionSheetController addAction : dismissAction ] ;
[ self presentViewController : actionSheetController animated : YES completion : nil ] ;
}
}
- ( void ) resetVerificationStateToDefault
{
OWSAssert ( [ NSThread isMainThread ] ) ;
NSArray < NSString * > * noLongerVerifiedRecipientIds = [ self noLongerVerifiedRecipientIds ] ;
for ( NSString * recipientId in noLongerVerifiedRecipientIds ) {
OWSAssert ( recipientId . length > 0 ) ;
OWSRecipientIdentity * _Nullable recipientIdentity =
[ [ OWSIdentityManager sharedManager ] recipientIdentityForRecipientId : recipientId ] ;
OWSAssert ( recipientIdentity ) ;
/ / By capturing the identity key when we enter these views , we prevent the edge case
/ / where the user verifies a key that we learned about while this view was open .
NSData * identityKey = recipientIdentity . identityKey ;
OWSAssert ( identityKey . length > 0 ) ;
if ( identityKey . length < 1 ) {
continue ;
}
[ OWSIdentityManager . sharedManager setVerificationState : OWSVerificationStateDefault
identityKey : identityKey
recipientId : recipientId
sendSyncMessage : YES ] ;
}
}