starting on Notification deep linking

parent 23c1cdb1
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="M4Y-Lb-cyx">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Notification View Controller-->
<scene sceneID="cwh-vc-ff4">
<objects>
<viewController id="M4Y-Lb-cyx" userLabel="Notification View Controller" customClass="NotificationViewController" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" simulatedAppContext="notificationCenter" id="S3S-Oj-5AN">
<rect key="frame" x="0.0" y="0.0" width="320" height="37"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="top" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Hello World" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="280" translatesAutoresizingMaskIntoConstraints="NO" id="GcN-lo-r42">
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" red="0.45882353186607361" green="0.74901962280273438" blue="0.66666668653488159" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="2BE-c3-nQJ" firstAttribute="bottom" secondItem="GcN-lo-r42" secondAttribute="bottom" constant="8" symbolic="YES" id="0Q0-KW-PJ6"/>
<constraint firstItem="GcN-lo-r42" firstAttribute="leading" secondItem="2BE-c3-nQJ" secondAttribute="leading" constant="20" symbolic="YES" id="6Vq-gs-PHe"/>
<constraint firstItem="2BE-c3-nQJ" firstAttribute="trailing" secondItem="GcN-lo-r42" secondAttribute="trailing" constant="20" symbolic="YES" id="L8K-9R-egU"/>
<constraint firstItem="GcN-lo-r42" firstAttribute="top" secondItem="2BE-c3-nQJ" secondAttribute="top" constant="8" symbolic="YES" id="mYS-Cv-VNx"/>
</constraints>
<viewLayoutGuide key="safeArea" id="2BE-c3-nQJ"/>
</view>
<extendedEdge key="edgesForExtendedLayout"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<size key="freeformSize" width="320" height="37"/>
<connections>
<outlet property="label" destination="GcN-lo-r42" id="lpW-cU-7IG"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="vXp-U4-Rya" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>AlertNotificationExtention</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>UNNotificationExtensionCategory</key>
<string>myNotificationCategory</string>
<key>UNNotificationExtensionInitialContentSizeRatio</key>
<real>1</real>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.usernotifications.content-extension</string>
</dict>
</dict>
</plist>
//
// NotificationViewController.swift
// AlertNotificationExtention
//
// Created by Zach Knox on 1/25/19.
// Copyright © 2019 SRCT. All rights reserved.
//
import UIKit
import UserNotifications
import UserNotificationsUI
class NotificationViewController: UIViewController, UNNotificationContentExtension {
@IBOutlet var label: UILabel?
override func viewDidLoad() {
super.viewDidLoad()
// Do any required interface initialization here.
}
func didReceive(_ notification: UNNotification) {
self.label?.text = notification.request.content.body
}
}
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0920"
version = "2.0">
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
......@@ -50,8 +50,7 @@
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES"
launchAutomaticallySubstyle = "1">
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
......
......@@ -8,8 +8,8 @@
import UIKit
import UserNotifications
import RealmSwift
import RealmSwift
import Fabric
import Crashlytics
......@@ -41,6 +41,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
}
application.setMinimumBackgroundFetchInterval(3600)
UNUserNotificationCenter.current().delegate = self
return true
}
......@@ -75,6 +76,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
}
}
func migrateDefaults() {
let oldDefaults = WOPDatabaseController.getDefaults()
if oldDefaults.integer(forKey: "migrated") <= 0 && oldDefaults.value(forKey: "mapsApp") != nil {
......@@ -262,29 +265,20 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
return
}
}
}
func applicationWillResignActive(_ application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
}
func applicationDidEnterBackground(_ application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
func applicationWillEnterForeground(_ application: UIApplication) {
// Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}
func applicationDidBecomeActive(_ application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
if response.actionIdentifier == UNNotificationDefaultActionIdentifier {
let notification = response.notification
NotificationCenter.default.post(name: Notification.Name(rawValue: "openAlert"), object: notification)
}
completionHandler()
}
func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification?) {
NotificationCenter.default.post(Notification(name: Notification.Name(rawValue: "launchToNotificationSettings"), object: notification, userInfo: nil))
}
}
......@@ -565,60 +565,6 @@
</objects>
<point key="canvasLocation" x="-6034.3999999999996" y="-349.47526236881561"/>
</scene>
<!--Alert Detail View Controller-->
<scene sceneID="fvA-S0-fxZ">
<objects>
<viewController storyboardIdentifier="alertDetail" useStoryboardIdentifierAsRestorationIdentifier="YES" id="CQV-Ih-fJc" customClass="AlertDetailViewController" customModule="WhatsOpen" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="qgs-Jx-pkN">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Major Alert" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.80000000000000004" translatesAutoresizingMaskIntoConstraints="NO" id="uww-Cq-IAo">
<rect key="frame" x="94" y="29.5" width="218.5" height="49"/>
<fontDescription key="fontDescription" type="system" weight="heavy" pointSize="41"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" editable="NO" textAlignment="natural" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="H2d-dH-ecC">
<rect key="frame" x="16" y="94" width="343" height="553"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<string key="text">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.</string>
<fontDescription key="fontDescription" type="system" pointSize="20"/>
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
<dataDetectorType key="dataDetectorTypes" phoneNumber="YES" link="YES"/>
</textView>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="major" translatesAutoresizingMaskIntoConstraints="NO" id="Wjw-gD-Oki">
<rect key="frame" x="16" y="22" width="64" height="64"/>
<constraints>
<constraint firstAttribute="width" secondItem="Wjw-gD-Oki" secondAttribute="height" multiplier="1:1" id="3sg-43-UAK"/>
<constraint firstAttribute="width" constant="64" id="aRP-E2-NVT"/>
<constraint firstAttribute="height" constant="64" id="yKT-sg-64x"/>
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="uww-Cq-IAo" firstAttribute="leading" secondItem="Wjw-gD-Oki" secondAttribute="trailing" constant="14" id="BFd-9D-ObM"/>
<constraint firstItem="H2d-dH-ecC" firstAttribute="top" secondItem="Wjw-gD-Oki" secondAttribute="bottom" constant="8" id="Bm1-Db-h28"/>
<constraint firstItem="0op-ia-1Jp" firstAttribute="trailing" secondItem="H2d-dH-ecC" secondAttribute="trailing" constant="16" id="Bvy-0L-Zya"/>
<constraint firstItem="Wjw-gD-Oki" firstAttribute="leading" secondItem="0op-ia-1Jp" secondAttribute="leading" constant="16" id="LUT-Q5-9xh"/>
<constraint firstItem="0op-ia-1Jp" firstAttribute="bottom" secondItem="H2d-dH-ecC" secondAttribute="bottom" constant="20" id="eXu-aN-yel"/>
<constraint firstItem="H2d-dH-ecC" firstAttribute="leading" secondItem="0op-ia-1Jp" secondAttribute="leading" constant="16" id="ktv-cw-uJW"/>
<constraint firstItem="Wjw-gD-Oki" firstAttribute="top" secondItem="0op-ia-1Jp" secondAttribute="top" constant="2" id="m6Z-EJ-92a"/>
<constraint firstItem="uww-Cq-IAo" firstAttribute="centerY" secondItem="Wjw-gD-Oki" secondAttribute="centerY" id="zn8-kj-wd1"/>
</constraints>
<viewLayoutGuide key="safeArea" id="0op-ia-1Jp"/>
</view>
<connections>
<outlet property="imageView" destination="Wjw-gD-Oki" id="EWb-jS-UDB"/>
<outlet property="messageView" destination="H2d-dH-ecC" id="GDe-bW-ZII"/>
<outlet property="nameLabel" destination="uww-Cq-IAo" id="Bpb-CV-Ts7"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="cyE-FJ-bCs" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-7327.1999999999998" y="-1887.7061469265368"/>
</scene>
<!--Pulling View Controller-->
<scene sceneID="9g0-2V-iaL">
<objects>
......@@ -690,7 +636,7 @@
<!--Settings Navigation-->
<scene sceneID="4nY-5A-CmH">
<objects>
<navigationController title="Settings Navigation" automaticallyAdjustsScrollViewInsets="NO" id="Uxx-wt-GfY" sceneMemberID="viewController">
<navigationController storyboardIdentifier="settings" title="Settings Navigation" automaticallyAdjustsScrollViewInsets="NO" useStoryboardIdentifierAsRestorationIdentifier="YES" id="Uxx-wt-GfY" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" id="U3x-0f-mCs">
<rect key="frame" x="0.0" y="20" width="375" height="44"/>
......@@ -850,10 +796,9 @@
<image name="downPull" width="108" height="32"/>
<image name="heart_empty" width="27" height="27"/>
<image name="info" width="63.840000152587891" height="63.840000152587891"/>
<image name="major" width="63.840000152587891" height="63.840000152587891"/>
</resources>
<inferredMetricsTieBreakers>
<segue reference="lwF-fe-hI5"/>
<segue reference="FRf-a6-Dgs"/>
</inferredMetricsTieBreakers>
<color key="tintColor" red="0.0" green="0.40000000000000002" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
</document>
......@@ -7,6 +7,7 @@
//
import UIKit
import UserNotifications
import DeckTransition
import RealmSwift
import StoreKit
......@@ -159,7 +160,7 @@ class FacilitiesListViewController: UIViewController, UICollectionViewDelegate,
self.presentDetailView(destination!, tapped: tapped)
}
else {
let destination = self.storyboard?.instantiateViewController(withIdentifier: "alertDetail") as? AlertDetailViewController
let destination = self.storyboard?.instantiateViewController(withIdentifier: "alertDetail") as? WOPAlertDetailViewController
let tapped = self.LocationsList.cellForItem(at: indexPath!) as! AlertCollectionViewCell
destination?.alert = tapped.alert
self.presentDetailView(destination!, tapped: tapped)
......@@ -252,6 +253,42 @@ class FacilitiesListViewController: UIViewController, UICollectionViewDelegate,
present(finalDestination!, animated: true, completion: nil)
}
}
@objc func toAlertFromNotification(_ notification: Notification) {
let notification = notification.object as? UNNotification
let alert = realm.objects(WOPFacilitiesModel.self)[0].alerts.filter(NSPredicate(format: "id = \" \((notification?.request.content.userInfo["alertID"])!) \"")).first
if(alert == nil) {
return // don't do anything
}
let storyboard = UIStoryboard(name: "WOPSharedUI", bundle: Bundle(for: WOPAlertDetailViewController.self))
let dest = storyboard.instantiateViewController(withIdentifier: "alertDetail") as! WOPAlertDetailViewController
dest.alert = alert!
let finalDestination = self.storyboard?.instantiateViewController(withIdentifier: "pulling") as? PullingViewController // Fox only, no items
finalDestination?.currentViewController = dest
let destDelegate = DeckTransitioningDelegate(isSwipeToDismissEnabled: true, dismissCompletion: begForReviews)
finalDestination?.modalPresentationStyle = .custom
finalDestination?.transitioningDelegate = destDelegate
// present the detail view over the search controller if we're searching
if searchController.isActive {
searchController.present(finalDestination!, animated: true, completion: nil)
}
else {
present(finalDestination!, animated: true, completion: nil)
}
}
@objc func toSettingsFromNotification(_ notification: Notification) {
let settings = self.storyboard?.instantiateViewController(withIdentifier: "settings")
present(settings!, animated: true) {
NotificationCenter.default.post(Notification(name: Notification.Name(rawValue: "openNotificationsPane"), object: notification, userInfo: nil))
}
}
func presentDetailView(_ destination: UIViewController, tapped: UICollectionViewCell) {
var trueDest: UIViewController
......@@ -333,6 +370,8 @@ class FacilitiesListViewController: UIViewController, UICollectionViewDelegate,
override func viewDidLoad() {
NotificationCenter.default.addObserver(self, selector: #selector(toDetailFromSearch(_:)), name: NSNotification.Name(rawValue: "launchToFacility"), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(toDetailFromURL(_:)), name: NSNotification.Name(rawValue: "openFacilityFromURL"), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(toSettingsFromNotification(_:)), name: NSNotification.Name(rawValue: "launchToNotificationSettings"), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(toAlertFromNotification(_:)), name: NSNotification.Name(rawValue: "openAlert"), object: nil)
super.viewDidLoad()
let nc = NotificationCenter.default
......@@ -952,7 +991,8 @@ class FacilitiesListViewController: UIViewController, UICollectionViewDelegate,
}
else {
let cell = LocationsList?.cellForItem(at: indexPath) as? AlertCollectionViewCell
guard let detailView = storyboard?.instantiateViewController(withIdentifier: "alertDetail") as? AlertDetailViewController else { return nil }
let storyboard = UIStoryboard(name: "WOPSharedUI", bundle: Bundle(for: WOPAlertDetailViewController.self))
guard let detailView = storyboard.instantiateViewController(withIdentifier: "alertDetail") as? WOPAlertDetailViewController else { return nil }
detailView.alert = cell?.alert
return detailView
}
......
......@@ -26,9 +26,21 @@ class SettingsTableViewController: UITableViewController, MFMailComposeViewContr
tableView.reloadData()
}
@objc func toNotifications(_ notification: Notification?) {
let destination = self.storyboard?.instantiateViewController(withIdentifier: "filtersVC") as! FilterSelectionTableViewController
destination.navigationItem.title = "Alert Notifications"
destination.getFunc = WOPUtilities.getAlertNotificationDefaults
destination.selectFunc = WOPUtilities.setAlertNotificationDefaults
destination.selectAllFunc = WOPUtilities.setAllAlertNotificationDefaults
destination.updateFacilities = updateFacilities
self.show(destination, sender: self)
}
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(toNotifications(_:)), name: NSNotification.Name(rawValue: "openNotificationsPane"), object: nil)
tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableView.automaticDimension
......@@ -195,13 +207,7 @@ class SettingsTableViewController: UITableViewController, MFMailComposeViewContr
present(mailvc, animated: true)
}
} else if settingcell.textLabel?.text == "Alert Notifications" {
let destination = self.storyboard?.instantiateViewController(withIdentifier: "filtersVC") as! FilterSelectionTableViewController
destination.navigationItem.title = "Alert Notifications"
destination.getFunc = WOPUtilities.getAlertNotificationDefaults
destination.selectFunc = WOPUtilities.setAlertNotificationDefaults
destination.selectAllFunc = WOPUtilities.setAllAlertNotificationDefaults
destination.updateFacilities = updateFacilities
self.show(destination, sender: self)
toNotifications(nil)
}
else if settingcell.textLabel?.text == "Select App Icon" {
let vc = self.storyboard?.instantiateViewController(withIdentifier: "setAppIcon")
......
......@@ -6,17 +6,17 @@
// Copyright © 2018 SRCT. All rights reserved.
//
#if os(iOS)
import UIKit
import WhatsOpenKit
class AlertDetailViewController: UIViewController {
public class WOPAlertDetailViewController: UIViewController {
@IBOutlet var imageView: UIImageView!
@IBOutlet var nameLabel: UILabel!
@IBOutlet var messageView: UITextView!
var alert: WOPAlert!
@IBOutlet public var imageView: UIImageView!
@IBOutlet public var nameLabel: UILabel!
@IBOutlet public var messageView: UITextView!
public var alert: WOPAlert!
override func viewDidLoad() {
override public func viewDidLoad() {
super.viewDidLoad()
switch alert.urgency {
......@@ -44,7 +44,7 @@ class AlertDetailViewController: UIViewController {
self.messageView.font = UIFont.preferredFont(forTextStyle: .body)
}
override func didReceiveMemoryWarning() {
override public func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
......@@ -61,3 +61,4 @@ class AlertDetailViewController: UIViewController {
*/
}
#endif
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14313.18" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14283.14"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
......@@ -122,5 +122,62 @@
</objects>
<point key="canvasLocation" x="-6655.1999999999998" y="-1883.2083958020992"/>
</scene>
<!--Alert Detail View Controller-->
<scene sceneID="UpQ-cU-zvH">
<objects>
<viewController storyboardIdentifier="alertDetail" useStoryboardIdentifierAsRestorationIdentifier="YES" id="Ymm-w4-EUQ" customClass="WOPAlertDetailViewController" customModule="WhatsOpenKit" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="fFH-fI-fwh">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Major Alert" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.80000001192092896" translatesAutoresizingMaskIntoConstraints="NO" id="lSK-qc-Uis">
<rect key="frame" x="94" y="29.5" width="218.5" height="49"/>
<fontDescription key="fontDescription" type="system" weight="heavy" pointSize="41"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" editable="NO" textAlignment="natural" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="RN8-f7-qjd">
<rect key="frame" x="16" y="94" width="343" height="553"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<string key="text">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.</string>
<fontDescription key="fontDescription" type="system" pointSize="20"/>
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
<dataDetectorType key="dataDetectorTypes" phoneNumber="YES" link="YES"/>
</textView>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="major" translatesAutoresizingMaskIntoConstraints="NO" id="7p3-a2-wz4">
<rect key="frame" x="16" y="22" width="64" height="64"/>
<constraints>
<constraint firstAttribute="height" constant="64" id="1nu-jt-fRN"/>
<constraint firstAttribute="width" secondItem="7p3-a2-wz4" secondAttribute="height" multiplier="1:1" id="B2B-vq-Zv7"/>
<constraint firstAttribute="width" constant="64" id="esw-La-iPn"/>
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="KTh-gG-Ygq" firstAttribute="bottom" secondItem="RN8-f7-qjd" secondAttribute="bottom" constant="20" id="9Q1-0E-LoL"/>
<constraint firstItem="RN8-f7-qjd" firstAttribute="leading" secondItem="KTh-gG-Ygq" secondAttribute="leading" constant="16" id="BTq-qf-AKg"/>
<constraint firstItem="7p3-a2-wz4" firstAttribute="leading" secondItem="KTh-gG-Ygq" secondAttribute="leading" constant="16" id="BXV-c8-S4r"/>
<constraint firstItem="lSK-qc-Uis" firstAttribute="centerY" secondItem="7p3-a2-wz4" secondAttribute="centerY" id="Dyn-aP-deC"/>
<constraint firstItem="lSK-qc-Uis" firstAttribute="leading" secondItem="7p3-a2-wz4" secondAttribute="trailing" constant="14" id="Xwb-sw-cs7"/>
<constraint firstItem="7p3-a2-wz4" firstAttribute="top" secondItem="KTh-gG-Ygq" secondAttribute="top" constant="2" id="YLy-ft-VT1"/>
<constraint firstItem="RN8-f7-qjd" firstAttribute="top" secondItem="7p3-a2-wz4" secondAttribute="bottom" constant="8" id="gaU-iy-WQX"/>
<constraint firstItem="KTh-gG-Ygq" firstAttribute="trailing" secondItem="RN8-f7-qjd" secondAttribute="trailing" constant="16" id="xgt-os-3zp"/>
</constraints>
<viewLayoutGuide key="safeArea" id="KTh-gG-Ygq"/>
</view>
<connections>
<outlet property="imageView" destination="7p3-a2-wz4" id="JMM-fp-c0W"/>
<outlet property="messageView" destination="RN8-f7-qjd" id="3JO-GP-IVW"/>
<outlet property="nameLabel" destination="lSK-qc-Uis" id="GJ3-wT-jaa"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="JLp-Vz-5uj" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-7327.1999999999998" y="-1887.7061469265368"/>
</scene>
</scenes>
<resources>
<image name="major" width="63.840000152587891" height="63.840000152587891"/>
</resources>
</document>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment