import PromiseKit
final class PNModeVC : BaseVC , OptionViewDelegate {
private var optionViews : [ OptionView ] {
[ apnsOptionView , backgroundPollingOptionView ]
}
private var selectedOptionView : OptionView ? {
return optionViews . first { $0 . isSelected }
}
// MARK: C o m p o n e n t s
private lazy var apnsOptionView : OptionView = {
let explanation = " You’ ll be notified of new messages reliably and immediately using Apple’ s notification servers. The contents of your messages, and who you’ re messaging, are never exposed to Apple. "
let result = OptionView ( title : " Fast Mode " , explanation : explanation , delegate : self , isRecommended : true )
result . accessibilityLabel = " Fast mode option "
return result
} ( )
private lazy var backgroundPollingOptionView : OptionView = {
let explanation = " Session will occasionally check for new messages in the background. Full metadata protection is guaranteed, but message notifications will be unreliable. "
let result = OptionView ( title : " Slow Mode " , explanation : explanation , delegate : self )
result . accessibilityLabel = " Slow mode option "
return result
} ( )
// MARK: L i f e c y c l e
override func viewDidLoad ( ) {
super . viewDidLoad ( )
setUpGradientBackground ( )
setUpNavBarStyle ( )
setUpNavBarSessionIcon ( )
let learnMoreButton = UIBarButtonItem ( image : # imageLiteral ( resourceName : " ic_info " ) , style : . plain , target : self , action : #selector ( learnMore ) )
learnMoreButton . tintColor = Colors . text
navigationItem . rightBarButtonItem = learnMoreButton
// S e t u p t i t l e l a b e l
let titleLabel = UILabel ( )
titleLabel . textColor = Colors . text
titleLabel . font = . boldSystemFont ( ofSize : isIPhone5OrSmaller ? Values . largeFontSize : Values . veryLargeFontSize )
titleLabel . text = " Message Notifications "
titleLabel . numberOfLines = 0
titleLabel . lineBreakMode = . byWordWrapping
// S e t u p e x p l a n a t i o n l a b e l
let explanationLabel = UILabel ( )
explanationLabel . textColor = Colors . text
explanationLabel . font = . systemFont ( ofSize : Values . smallFontSize )
explanationLabel . text = " There are two ways Session can notify you of new messages. "
explanationLabel . numberOfLines = 0
explanationLabel . lineBreakMode = . byWordWrapping
// S e t u p s p a c e r s
let topSpacer = UIView . vStretchingSpacer ( )
let bottomSpacer = UIView . vStretchingSpacer ( )
let registerButtonBottomOffsetSpacer = UIView ( )
registerButtonBottomOffsetSpacer . set ( . height , to : Values . onboardingButtonBottomOffset )
// S e t u p r e g i s t e r b u t t o n
let registerButton = Button ( style : . prominentFilled , size : . large )
registerButton . setTitle ( NSLocalizedString ( " continue_2 " , comment : " " ) , for : UIControl . State . normal )
registerButton . titleLabel ! . font = . boldSystemFont ( ofSize : Values . mediumFontSize )
registerButton . addTarget ( self , action : #selector ( register ) , for : UIControl . Event . touchUpInside )
// S e t u p r e g i s t e r b u t t o n c o n t a i n e r
let registerButtonContainer = UIView ( wrapping : registerButton , withInsets : UIEdgeInsets ( top : 0 , leading : Values . massiveSpacing , bottom : 0 , trailing : Values . massiveSpacing ) )
// S e t u p o p t i o n s s t a c k v i e w
let optionsStackView = UIStackView ( arrangedSubviews : optionViews )
optionsStackView . axis = . vertical
optionsStackView . spacing = Values . smallSpacing
optionsStackView . alignment = . fill
// S e t u p t o p s t a c k v i e w
let topStackView = UIStackView ( arrangedSubviews : [ titleLabel , UIView . spacer ( withHeight : isIPhone6OrSmaller ? Values . mediumSpacing : Values . veryLargeSpacing ) ,
explanationLabel , UIView . spacer ( withHeight : isIPhone6OrSmaller ? Values . mediumSpacing : Values . veryLargeSpacing ) , optionsStackView ] )
topStackView . axis = . vertical
topStackView . alignment = . fill
// S e t u p t o p s t a c k v i e w c o n t a i n e r
let topStackViewContainer = UIView ( wrapping : topStackView , withInsets : UIEdgeInsets ( top : 0 , leading : Values . veryLargeSpacing , bottom : 0 , trailing : Values . veryLargeSpacing ) )
// S e t u p m a i n s t a c k v i e w
let mainStackView = UIStackView ( arrangedSubviews : [ topSpacer , topStackViewContainer , bottomSpacer , registerButtonContainer , registerButtonBottomOffsetSpacer ] )
mainStackView . axis = . vertical
mainStackView . alignment = . fill
view . addSubview ( mainStackView )
mainStackView . pin ( to : view )
topSpacer . heightAnchor . constraint ( equalTo : bottomSpacer . heightAnchor , multiplier : 1 ) . isActive = true
}
// MARK: I n t e r a c t i o n
@objc private func learnMore ( ) {
let urlAsString = " https://getsession.org/faq/#privacy "
let url = URL ( string : urlAsString ) !
UIApplication . shared . open ( url )
}
func optionViewDidActivate ( _ optionView : OptionView ) {
optionViews . filter { $0 != optionView } . forEach { $0 . isSelected = false }
}
@objc private func register ( ) {
guard selectedOptionView != nil else {
let title = NSLocalizedString ( " vc_pn_mode_no_option_picked_modal_title " , comment : " " )
let alert = UIAlertController ( title : title , message : nil , preferredStyle : . alert )
alert . addAction ( UIAlertAction ( title : NSLocalizedString ( " OK " , comment : " " ) , style : . default , handler : nil ) )
return present ( alert , animated : true , completion : nil )
}
UserDefaults . standard [ . isUsingFullAPNs ] = ( selectedOptionView = = apnsOptionView )
TSAccountManager . sharedInstance ( ) . didRegister ( )
let homeVC = HomeVC ( )
navigationController ! . setViewControllers ( [ homeVC ] , animated : true )
let syncTokensJob = SyncPushTokensJob ( accountManager : AppEnvironment . shared . accountManager , preferences : Environment . shared . preferences )
syncTokensJob . uploadOnlyIfStale = false
let _ : Promise < Void > = syncTokensJob . run ( )
}
}