{"action":"created","comment":{"url":"https://api.github.com/repos/signalapp/Signal-iOS/pulls/comments/230890471","pull_request_review_id":171732213,"id":230890471,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzMDg5MDQ3MQ==","diff_hunk":"@@ -0,0 +1,439 @@\n+//\n+//  Copyright (c) 2018 Open Whisper Systems. All rights reserved.\n+//\n+\n+import Foundation\n+import Photos\n+import PromiseKit\n+\n+@objc(OWSImagePickerControllerDelegate)\n+protocol ImagePickerControllerDelegate {\n+    func imagePicker(_ imagePicker: ImagePickerGridController, didPickImageAttachments attachments: [SignalAttachment])\n+}\n+\n+@objc(OWSImagePickerGridController)\n+class ImagePickerGridController: UICollectionViewController, PhotoLibraryDelegate {\n+\n+    @objc\n+    weak var delegate: ImagePickerControllerDelegate?\n+\n+    private let library: PhotoLibrary = PhotoLibrary()\n+    private let libraryAlbum: PhotoLibraryAlbum\n+\n+    var availableWidth: CGFloat = 0\n+\n+    var collectionViewFlowLayout: UICollectionViewFlowLayout\n+\n+    init() {\n+        collectionViewFlowLayout = type(of: self).buildLayout()\n+        libraryAlbum = library.albumForAllPhotos()\n+        super.init(collectionViewLayout: collectionViewFlowLayout)\n+    }\n+\n+    required init?(coder aDecoder: NSCoder) {\n+        fatalError(\"init(coder:) has not been implemented\")\n+    }\n+\n+    // MARK: View Lifecycle\n+\n+    override func viewDidLoad() {\n+        super.viewDidLoad()\n+\n+        self.title = libraryAlbum.localizedTitle\n+\n+        library.delegate = self\n+\n+        guard let collectionView = collectionView else {\n+            owsFailDebug(\"collectionView was unexpectedly nil\")\n+            return\n+        }\n+\n+        collectionView.register(PhotoGridViewCell.self, forCellWithReuseIdentifier: PhotoGridViewCell.reuseIdentifier)\n+\n+        navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel,\n+                                                           target: self,\n+                                                           action: #selector(didPressCancel))\n+        let featureFlag_isMultiselectEnabled = true\n+        if featureFlag_isMultiselectEnabled {\n+            updateSelectButton()\n+        }\n+\n+        collectionView.backgroundColor = Theme.backgroundColor\n+    }\n+\n+    override func viewWillLayoutSubviews() {\n+        super.viewWillLayoutSubviews()\n+        updateLayout()\n+    }\n+\n+    override func viewWillAppear(_ animated: Bool) {\n+        super.viewWillAppear(animated)\n+\n+        // Determine the size of the thumbnails to request\n+        let scale = UIScreen.main.scale\n+        let cellSize = collectionViewFlowLayout.itemSize\n+        libraryAlbum.thumbnailSize = CGSize(width: cellSize.width * scale, height: cellSize.height * scale)\n+    }\n+\n+    // MARK: Actions\n+\n+    @objc\n+    func didPressCancel(sender: UIBarButtonItem) {\n+        self.dismiss(animated: true)\n+    }\n+\n+    // MARK: Layout\n+\n+    static let kInterItemSpacing: CGFloat = 2\n+    private class func buildLayout() -> UICollectionViewFlowLayout {\n+        let layout = UICollectionViewFlowLayout()\n+\n+        if #available(iOS 11, *) {\n+            layout.sectionInsetReference = .fromSafeArea\n+        }\n+        layout.minimumInteritemSpacing = kInterItemSpacing\n+        layout.minimumLineSpacing = kInterItemSpacing\n+        layout.sectionHeadersPinToVisibleBounds = true\n+\n+        return layout\n+    }\n+\n+    func updateLayout() {\n+        let containerWidth: CGFloat\n+        if #available(iOS 11.0, *) {\n+            containerWidth = self.view.safeAreaLayoutGuide.layoutFrame.size.width\n+        } else {\n+            containerWidth = self.view.frame.size.width\n+        }\n+\n+        let kItemsPerPortraitRow = 4\n+        let screenWidth = min(UIScreen.main.bounds.width, UIScreen.main.bounds.height)\n+        let approxItemWidth = screenWidth / CGFloat(kItemsPerPortraitRow)\n+\n+        let itemCount = round(containerWidth / approxItemWidth)\n+        let spaceWidth = (itemCount + 1) * type(of: self).kInterItemSpacing\n+        let availableWidth = containerWidth - spaceWidth\n+\n+        let itemWidth = floor(availableWidth / CGFloat(itemCount))\n+        let newItemSize = CGSize(width: itemWidth, height: itemWidth)\n+\n+        if (newItemSize != collectionViewFlowLayout.itemSize) {\n+            collectionViewFlowLayout.itemSize = newItemSize\n+            collectionViewFlowLayout.invalidateLayout()\n+        }\n+    }\n+\n+    // MARK: Batch Selection\n+\n+    lazy var doneButton: UIBarButtonItem = {\n+        return UIBarButtonItem(barButtonSystemItem: .done,\n+                               target: self,\n+                               action: #selector(didPressDone))\n+    }()\n+\n+    lazy var selectButton: UIBarButtonItem = {\n+        return UIBarButtonItem(title: NSLocalizedString(\"BUTTON_SELECT\", comment: \"Button text to enable batch selection mode\"),\n+                               style: .plain,\n+                               target: self,\n+                               action: #selector(didTapSelect))\n+    }()\n+\n+    var isInBatchSelectMode = false {\n+        didSet {\n+            collectionView!.allowsMultipleSelection = isInBatchSelectMode\n+            updateSelectButton()\n+            updateDoneButton()\n+        }\n+    }\n+\n+    @objc\n+    func didPressDone(_ sender: Any) {\n+        Logger.debug(\"\")\n+\n+        guard let collectionView = self.collectionView else {\n+            owsFailDebug(\"collectionView was unexpectedly nil\")\n+            return\n+        }\n+\n+        guard let indexPaths = collectionView.indexPathsForSelectedItems else {\n+            owsFailDebug(\"indexPaths was unexpectedly nil\")\n+            return\n+        }\n+\n+        let assets: [PHAsset] = indexPaths.compactMap { return self.libraryAlbum.asset(at: $0.row) }\n+        let promises = assets.map { return libraryAlbum.outgoingAttachment(for: $0) }\n+        when(fulfilled: promises).map { attachments in\n+            self.dismiss(animated: true) {\n+                self.delegate?.imagePicker(self, didPickImageAttachments: attachments)\n+            }\n+        }.retainUntilComplete()\n+    }\n+\n+    func updateDoneButton() {\n+        guard let collectionView = self.collectionView else {\n+            owsFailDebug(\"collectionView was unexpectedly nil\")\n+            return\n+        }\n+\n+        if let count = collectionView.indexPathsForSelectedItems?.count, count > 0 {\n+            self.doneButton.isEnabled = true\n+        } else {\n+            self.doneButton.isEnabled = false\n+        }\n+    }\n+\n+    func updateSelectButton() {\n+        navigationItem.rightBarButtonItem = isInBatchSelectMode ? doneButton : selectButton\n+    }\n+\n+    @objc\n+    func didTapSelect(_ sender: Any) {\n+        isInBatchSelectMode = true\n+\n+        // disabled until at least one item is selected\n+        self.doneButton.isEnabled = false\n+\n+        // Don't allow the user to leave mid-selection, so they realized they have\n+        // to cancel (lose) their selection if they leave.\n+        self.navigationItem.hidesBackButton = true","path":"Signal/src/ViewControllers/ImagePickerController.swift","position":198,"original_position":198,"commit_id":"84ef5f850e813a3f1c504011e63bdfeb76df5519","original_commit_id":"84ef5f850e813a3f1c504011e63bdfeb76df5519","user":{"login":"charlesmchen-signal","id":36971147,"node_id":"MDQ6VXNlcjM2OTcxMTQ3","avatar_url":"https://avatars0.githubusercontent.com/u/36971147?v=4","gravatar_id":"","url":"https://api.github.com/users/charlesmchen-signal","html_url":"https://github.com/charlesmchen-signal","followers_url":"https://api.github.com/users/charlesmchen-signal/followers","following_url":"https://api.github.com/users/charlesmchen-signal/following{/other_user}","gists_url":"https://api.github.com/users/charlesmchen-signal/gists{/gist_id}","starred_url":"https://api.github.com/users/charlesmchen-signal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/charlesmchen-signal/subscriptions","organizations_url":"https://api.github.com/users/charlesmchen-signal/orgs","repos_url":"https://api.github.com/users/charlesmchen-signal/repos","events_url":"https://api.github.com/users/charlesmchen-signal/events{/privacy}","received_events_url":"https://api.github.com/users/charlesmchen-signal/received_events","type":"User","site_admin":false},"body":"So if a user selects a photo, they can't hit back until they unselect that photo? That doesn't sound right, but I think I'm misunderstanding.","created_at":"2018-11-05T19:56:31Z","updated_at":"2018-11-05T19:56:31Z","html_url":"https://github.com/signalapp/Signal-iOS/pull/3987#discussion_r230890471","pull_request_url":"https://api.github.com/repos/signalapp/Signal-iOS/pulls/3987","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/signalapp/Signal-iOS/pulls/comments/230890471"},"html":{"href":"https://github.com/signalapp/Signal-iOS/pull/3987#discussion_r230890471"},"pull_request":{"href":"https://api.github.com/repos/signalapp/Signal-iOS/pulls/3987"}}},"pull_request":{"url":"https://api.github.com/repos/signalapp/Signal-iOS/pulls/3987","id":228431502,"node_id":"MDExOlB1bGxSZXF1ZXN0MjI4NDMxNTAy","html_url":"https://github.com/signalapp/Signal-iOS/pull/3987","diff_url":"https://github.com/signalapp/Signal-iOS/pull/3987.diff","patch_url":"https://github.com/signalapp/Signal-iOS/pull/3987.patch","issue_url":"https://api.github.com/repos/signalapp/Signal-iOS/issues/3987","number":3987,"state":"open","locked":false,"title":"Custom photo picker, respects theme/call banner","user":{"login":"michaelkirk-signal","id":36971200,"node_id":"MDQ6VXNlcjM2OTcxMjAw","avatar_url":"https://avatars3.githubusercontent.com/u/36971200?v=4","gravatar_id":"","url":"https://api.github.com/users/michaelkirk-signal","html_url":"https://github.com/michaelkirk-signal","followers_url":"https://api.github.com/users/michaelkirk-signal/followers","following_url":"https://api.github.com/users/michaelkirk-signal/following{/other_user}","gists_url":"https://api.github.com/users/michaelkirk-signal/gists{/gist_id}","starred_url":"https://api.github.com/users/michaelkirk-signal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaelkirk-signal/subscriptions","organizations_url":"https://api.github.com/users/michaelkirk-signal/orgs","repos_url":"https://api.github.com/users/michaelkirk-signal/repos","events_url":"https://api.github.com/users/michaelkirk-signal/events{/privacy}","received_events_url":"https://api.github.com/users/michaelkirk-signal/received_events","type":"User","site_admin":false},"body":"Custom photo picker, respects theme/call banner\r\n    \r\n- share GridViewCell\r\n- multi-select. Since the approval/send flow doesn't yet support multiple attachments, this is behind a feature flag.\r\n\r\n![multiselect](https://user-images.githubusercontent.com/36971200/48015026-ad0d4880-e0ed-11e8-9ddf-8818eacecfdb.jpeg)\r\n\r\nPTAL @charlesmchen-signal \r\n","created_at":"2018-11-05T17:28:42Z","updated_at":"2018-11-05T19:56:31Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e9d5afe667bb54668d2a184ecc40c2327f70fbfb","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/signalapp/Signal-iOS/pulls/3987/commits","review_comments_url":"https://api.github.com/repos/signalapp/Signal-iOS/pulls/3987/comments","review_comment_url":"https://api.github.com/repos/signalapp/Signal-iOS/pulls/comments{/number}","comments_url":"https://api.github.com/repos/signalapp/Signal-iOS/issues/3987/comments","statuses_url":"https://api.github.com/repos/signalapp/Signal-iOS/statuses/84ef5f850e813a3f1c504011e63bdfeb76df5519","head":{"label":"signalapp:mkirk/multi-image-send","ref":"mkirk/multi-image-send","sha":"84ef5f850e813a3f1c504011e63bdfeb76df5519","user":{"login":"signalapp","id":702459,"node_id":"MDEyOk9yZ2FuaXphdGlvbjcwMjQ1OQ==","avatar_url":"https://avatars2.githubusercontent.com/u/702459?v=4","gravatar_id":"","url":"https://api.github.com/users/signalapp","html_url":"https://github.com/signalapp","followers_url":"https://api.github.com/users/signalapp/followers","following_url":"https://api.github.com/users/signalapp/following{/other_user}","gists_url":"https://api.github.com/users/signalapp/gists{/gist_id}","starred_url":"https://api.github.com/users/signalapp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/signalapp/subscriptions","organizations_url":"https://api.github.com/users/signalapp/orgs","repos_url":"https://api.github.com/users/signalapp/repos","events_url":"https://api.github.com/users/signalapp/events{/privacy}","received_events_url":"https://api.github.com/users/signalapp/received_events","type":"Organization","site_admin":false},"repo":{"id":19429698,"node_id":"MDEwOlJlcG9zaXRvcnkxOTQyOTY5OA==","name":"Signal-iOS","full_name":"signalapp/Signal-iOS","private":false,"owner":{"login":"signalapp","id":702459,"node_id":"MDEyOk9yZ2FuaXphdGlvbjcwMjQ1OQ==","avatar_url":"https://avatars2.githubusercontent.com/u/702459?v=4","gravatar_id":"","url":"https://api.github.com/users/signalapp","html_url":"https://github.com/signalapp","followers_url":"https://api.github.com/users/signalapp/followers","following_url":"https://api.github.com/users/signalapp/following{/other_user}","gists_url":"https://api.github.com/users/signalapp/gists{/gist_id}","starred_url":"https://api.github.com/users/signalapp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/signalapp/subscriptions","organizations_url":"https://api.github.com/users/signalapp/orgs","repos_url":"https://api.github.com/users/signalapp/repos","events_url":"https://api.github.com/users/signalapp/events{/privacy}","received_events_url":"https://api.github.com/users/signalapp/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/signalapp/Signal-iOS","description":"A private messenger for iOS.","fork":false,"url":"https://api.github.com/repos/signalapp/Signal-iOS","forks_url":"https://api.github.com/repos/signalapp/Signal-iOS/forks","keys_url":"https://api.github.com/repos/signalapp/Signal-iOS/keys{/key_id}","collaborators_url":"https://api.github.com/repos/signalapp/Signal-iOS/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/signalapp/Signal-iOS/teams","hooks_url":"https://api.github.com/repos/signalapp/Signal-iOS/hooks","issue_events_url":"https://api.github.com/repos/signalapp/Signal-iOS/issues/events{/number}","events_url":"https://api.github.com/repos/signalapp/Signal-iOS/events","assignees_url":"https://api.github.com/repos/signalapp/Signal-iOS/assignees{/user}","branches_url":"https://api.github.com/repos/signalapp/Signal-iOS/branches{/branch}","tags_url":"https://api.github.com/repos/signalapp/Signal-iOS/tags","blobs_url":"https://api.github.com/repos/signalapp/Signal-iOS/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/signalapp/Signal-iOS/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/signalapp/Signal-iOS/git/refs{/sha}","trees_url":"https://api.github.com/repos/signalapp/Signal-iOS/git/trees{/sha}","statuses_url":"https://api.github.com/repos/signalapp/Signal-iOS/statuses/{sha}","languages_url":"https://api.github.com/repos/signalapp/Signal-iOS/languages","stargazers_url":"https://api.github.com/repos/signalapp/Signal-iOS/stargazers","contributors_url":"https://api.github.com/repos/signalapp/Signal-iOS/contributors","subscribers_url":"https://api.github.com/repos/signalapp/Signal-iOS/subscribers","subscription_url":"https://api.github.com/repos/signalapp/Signal-iOS/subscription","commits_url":"https://api.github.com/repos/signalapp/Signal-iOS/commits{/sha}","git_commits_url":"https://api.github.com/repos/signalapp/Signal-iOS/git/commits{/sha}","comments_url":"https://api.github.com/repos/signalapp/Signal-iOS/comments{/number}","issue_comment_url":"https://api.github.com/repos/signalapp/Signal-iOS/issues/comments{/number}","contents_url":"https://api.github.com/repos/signalapp/Signal-iOS/contents/{+path}","compare_url":"https://api.github.com/repos/signalapp/Signal-iOS/compare/{base}...{head}","merges_url":"https://api.github.com/repos/signalapp/Signal-iOS/merges","archive_url":"https://api.github.com/repos/signalapp/Signal-iOS/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/signalapp/Signal-iOS/downloads","issues_url":"https://api.github.com/repos/signalapp/Signal-iOS/issues{/number}","pulls_url":"https://api.github.com/repos/signalapp/Signal-iOS/pulls{/number}","milestones_url":"https://api.github.com/repos/signalapp/Signal-iOS/milestones{/number}","notifications_url":"https://api.github.com/repos/signalapp/Signal-iOS/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/signalapp/Signal-iOS/labels{/name}","releases_url":"https://api.github.com/repos/signalapp/Signal-iOS/releases{/id}","deployments_url":"https://api.github.com/repos/signalapp/Signal-iOS/deployments","created_at":"2014-05-04T15:42:40Z","updated_at":"2018-11-05T14:16:43Z","pushed_at":"2018-11-05T17:28:42Z","git_url":"git://github.com/signalapp/Signal-iOS.git","ssh_url":"git@github.com:signalapp/Signal-iOS.git","clone_url":"https://github.com/signalapp/Signal-iOS.git","svn_url":"https://github.com/signalapp/Signal-iOS","homepage":"https://signal.org","size":493784,"stargazers_count":3727,"watchers_count":3727,"language":"Objective-C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":914,"mirror_url":null,"archived":false,"open_issues_count":425,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":914,"open_issues":425,"watchers":3727,"default_branch":"master"}},"base":{"label":"signalapp:master","ref":"master","sha":"43eda866e2099e4f8c81358b14517929b8936aa6","user":{"login":"signalapp","id":702459,"node_id":"MDEyOk9yZ2FuaXphdGlvbjcwMjQ1OQ==","avatar_url":"https://avatars2.githubusercontent.com/u/702459?v=4","gravatar_id":"","url":"https://api.github.com/users/signalapp","html_url":"https://github.com/signalapp","followers_url":"https://api.github.com/users/signalapp/followers","following_url":"https://api.github.com/users/signalapp/following{/other_user}","gists_url":"https://api.github.com/users/signalapp/gists{/gist_id}","starred_url":"https://api.github.com/users/signalapp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/signalapp/subscriptions","organizations_url":"https://api.github.com/users/signalapp/orgs","repos_url":"https://api.github.com/users/signalapp/repos","events_url":"https://api.github.com/users/signalapp/events{/privacy}","received_events_url":"https://api.github.com/users/signalapp/received_events","type":"Organization","site_admin":false},"repo":{"id":19429698,"node_id":"MDEwOlJlcG9zaXRvcnkxOTQyOTY5OA==","name":"Signal-iOS","full_name":"signalapp/Signal-iOS","private":false,"owner":{"login":"signalapp","id":702459,"node_id":"MDEyOk9yZ2FuaXphdGlvbjcwMjQ1OQ==","avatar_url":"https://avatars2.githubusercontent.com/u/702459?v=4","gravatar_id":"","url":"https://api.github.com/users/signalapp","html_url":"https://github.com/signalapp","followers_url":"https://api.github.com/users/signalapp/followers","following_url":"https://api.github.com/users/signalapp/following{/other_user}","gists_url":"https://api.github.com/users/signalapp/gists{/gist_id}","starred_url":"https://api.github.com/users/signalapp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/signalapp/subscriptions","organizations_url":"https://api.github.com/users/signalapp/orgs","repos_url":"https://api.github.com/users/signalapp/repos","events_url":"https://api.github.com/users/signalapp/events{/privacy}","received_events_url":"https://api.github.com/users/signalapp/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/signalapp/Signal-iOS","description":"A private messenger for iOS.","fork":false,"url":"https://api.github.com/repos/signalapp/Signal-iOS","forks_url":"https://api.github.com/repos/signalapp/Signal-iOS/forks","keys_url":"https://api.github.com/repos/signalapp/Signal-iOS/keys{/key_id}","collaborators_url":"https://api.github.com/repos/signalapp/Signal-iOS/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/signalapp/Signal-iOS/teams","hooks_url":"https://api.github.com/repos/signalapp/Signal-iOS/hooks","issue_events_url":"https://api.github.com/repos/signalapp/Signal-iOS/issues/events{/number}","events_url":"https://api.github.com/repos/signalapp/Signal-iOS/events","assignees_url":"https://api.github.com/repos/signalapp/Signal-iOS/assignees{/user}","branches_url":"https://api.github.com/repos/signalapp/Signal-iOS/branches{/branch}","tags_url":"https://api.github.com/repos/signalapp/Signal-iOS/tags","blobs_url":"https://api.github.com/repos/signalapp/Signal-iOS/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/signalapp/Signal-iOS/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/signalapp/Signal-iOS/git/refs{/sha}","trees_url":"https://api.github.com/repos/signalapp/Signal-iOS/git/trees{/sha}","statuses_url":"https://api.github.com/repos/signalapp/Signal-iOS/statuses/{sha}","languages_url":"https://api.github.com/repos/signalapp/Signal-iOS/languages","stargazers_url":"https://api.github.com/repos/signalapp/Signal-iOS/stargazers","contributors_url":"https://api.github.com/repos/signalapp/Signal-iOS/contributors","subscribers_url":"https://api.github.com/repos/signalapp/Signal-iOS/subscribers","subscription_url":"https://api.github.com/repos/signalapp/Signal-iOS/subscription","commits_url":"https://api.github.com/repos/signalapp/Signal-iOS/commits{/sha}","git_commits_url":"https://api.github.com/repos/signalapp/Signal-iOS/git/commits{/sha}","comments_url":"https://api.github.com/repos/signalapp/Signal-iOS/comments{/number}","issue_comment_url":"https://api.github.com/repos/signalapp/Signal-iOS/issues/comments{/number}","contents_url":"https://api.github.com/repos/signalapp/Signal-iOS/contents/{+path}","compare_url":"https://api.github.com/repos/signalapp/Signal-iOS/compare/{base}...{head}","merges_url":"https://api.github.com/repos/signalapp/Signal-iOS/merges","archive_url":"https://api.github.com/repos/signalapp/Signal-iOS/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/signalapp/Signal-iOS/downloads","issues_url":"https://api.github.com/repos/signalapp/Signal-iOS/issues{/number}","pulls_url":"https://api.github.com/repos/signalapp/Signal-iOS/pulls{/number}","milestones_url":"https://api.github.com/repos/signalapp/Signal-iOS/milestones{/number}","notifications_url":"https://api.github.com/repos/signalapp/Signal-iOS/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/signalapp/Signal-iOS/labels{/name}","releases_url":"https://api.github.com/repos/signalapp/Signal-iOS/releases{/id}","deployments_url":"https://api.github.com/repos/signalapp/Signal-iOS/deployments","created_at":"2014-05-04T15:42:40Z","updated_at":"2018-11-05T14:16:43Z","pushed_at":"2018-11-05T17:28:42Z","git_url":"git://github.com/signalapp/Signal-iOS.git","ssh_url":"git@github.com:signalapp/Signal-iOS.git","clone_url":"https://github.com/signalapp/Signal-iOS.git","svn_url":"https://github.com/signalapp/Signal-iOS","homepage":"https://signal.org","size":493784,"stargazers_count":3727,"watchers_count":3727,"language":"Objective-C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":914,"mirror_url":null,"archived":false,"open_issues_count":425,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":914,"open_issues":425,"watchers":3727,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/signalapp/Signal-iOS/pulls/3987"},"html":{"href":"https://github.com/signalapp/Signal-iOS/pull/3987"},"issue":{"href":"https://api.github.com/repos/signalapp/Signal-iOS/issues/3987"},"comments":{"href":"https://api.github.com/repos/signalapp/Signal-iOS/issues/3987/comments"},"review_comments":{"href":"https://api.github.com/repos/signalapp/Signal-iOS/pulls/3987/comments"},"review_comment":{"href":"https://api.github.com/repos/signalapp/Signal-iOS/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/signalapp/Signal-iOS/pulls/3987/commits"},"statuses":{"href":"https://api.github.com/repos/signalapp/Signal-iOS/statuses/84ef5f850e813a3f1c504011e63bdfeb76df5519"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"charlesmchen-signal"}}