Signal-iOS/SignalUI/ViewControllers/Stories/SelectMyStoryRecipientsViewController.swift
Evan Hahn 370ff654e7
Change license to AGPL
Change license to AGPL

This commit:

- Updates the `LICENSE` file

- Start every file with something like:

      // Copyright YEAR_FIRST_PUBLISHED Signal Messenger, LLC
      // SPDX-License-Identifier: AGPL-3.0-only

---

First, I removed existing license headers with this Ruby 3.1.2 script:

    require 'set'

    EXTENSIONS_TO_CHECK = Set['.h', '.hpp', '.cpp', '.m', '.mm', '.pch', '.swift']

    same = 0
    different = 0

    all_files = `git ls-files`.lines.map { |line| line.strip }
    all_files.each do |relative_path|
      if relative_path == 'Pods'
        next
      end

      unless EXTENSIONS_TO_CHECK.include? File.extname(relative_path)
        next
      end

      path = File.expand_path(relative_path)

      contents = File.read(path)
      new_contents = contents.sub(/\/\/\n\/\/  Copyright .*\n\/\/\n\n/, '')

      if contents == new_contents
        same += 1
      else
        different += 1
      end

      File.write(path, new_contents)
    end

    puts "updated #{different} file(s), left #{same} untouched"

I'm sure this script could be improved, but it worked well enough.

Then, I created `Scripts/lint/lint-license-headers` and ran it to auto-
fix a lot of files. This changed the mode of some files, but I think
that's actually desirable. For example,
`SignalServiceKit/src/Util/AppContext.m` previously had a mode of
`0755/-rwxr-xr-x`, and it's now `0644/-rw-r--r--`.

Then I fixed some stragglers and updated the precommit script.

See [a similar change in the Desktop app][0].

[0]: 8bfaf598af
2022-10-13 08:25:37 -05:00

154 lines
5.3 KiB
Swift

//
// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
import SignalServiceKit
import SignalMessaging
@objc
public class SelectMyStoryRecipientsViewController: BaseMemberViewController {
let thread: TSPrivateStoryThread
let mode: TSThreadStoryViewMode
var recipientSet: OrderedSet<PickedRecipient>
let originalRecipientSet: OrderedSet<PickedRecipient>
public override var hasUnsavedChanges: Bool { originalRecipientSet != recipientSet }
let completionBlock: () -> Void
public required init(thread: TSPrivateStoryThread, mode: TSThreadStoryViewMode, completionBlock: @escaping () -> Void) {
self.thread = thread
self.mode = mode
if thread.storyViewMode == mode {
self.recipientSet = OrderedSet(thread.addresses.map { .for(address: $0) })
} else {
self.recipientSet = OrderedSet()
}
self.originalRecipientSet = self.recipientSet
self.completionBlock = completionBlock
super.init()
memberViewDelegate = self
}
// MARK: - View Lifecycle
@objc
public override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
updateBarButtons()
}
private func updateBarButtons() {
navigationItem.leftBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .cancel,
target: self,
action: #selector(dismissPressed))
navigationItem.rightBarButtonItem = UIBarButtonItem(
barButtonSystemItem: .save,
target: self,
action: #selector(savePressed))
navigationItem.rightBarButtonItem?.isEnabled = hasUnsavedChanges
switch mode {
case .explicit:
if recipientSet.isEmpty {
title = OWSLocalizedString(
"STORY_SELECT_ALLOWED_CONNECTIONS_VIEW_TITLE",
comment: "The title for the 'select connections for story' view.")
} else {
let format = OWSLocalizedString(
"STORY_SELECT_ALLOWED_CONNECTIONS_VIEW_TITLE_%d",
tableName: "PluralAware",
comment: "The title for the 'select connections for story' view if already some connections are selected. Embeds {{number}} of connections.")
title = String.localizedStringWithFormat(format, recipientSet.count)
}
case .blockList:
if recipientSet.isEmpty {
title = OWSLocalizedString(
"STORY_SELECT_EXCLUDED_CONNECTIONS_VIEW_TITLE",
comment: "The title for the 'select excluded connections for story' view.")
} else {
let format = OWSLocalizedString(
"STORY_SELECT_EXCLUDED_CONNECTIONS_VIEW_TITLE_%d",
tableName: "PluralAware",
comment: "The title for the 'select excluded connections for story' view if already some connections are selected. Embeds {{number}} of excluded connections.")
title = String.localizedStringWithFormat(format, recipientSet.count)
}
case .default, .disabled:
owsFailDebug("Unexpected mode")
}
}
// MARK: - Actions
@objc
func savePressed() {
AssertIsOnMainThread()
databaseStorage.write { transaction in
self.thread.updateWithStoryViewMode(
self.mode,
addresses: self.recipientSet.orderedMembers.compactMap { $0.address },
updateStorageService: true,
transaction: transaction
)
}
completionBlock()
dismiss(animated: true)
}
}
// MARK: -
extension SelectMyStoryRecipientsViewController: MemberViewDelegate {
public var memberViewRecipientSet: OrderedSet<PickedRecipient> { recipientSet }
public var memberViewHasUnsavedChanges: Bool { hasUnsavedChanges }
public func memberViewRemoveRecipient(_ recipient: PickedRecipient) {
recipientSet.remove(recipient)
updateBarButtons()
}
public func memberViewAddRecipient(_ recipient: PickedRecipient) {
recipientSet.append(recipient)
updateBarButtons()
}
public func memberViewCanAddRecipient(_ recipient: PickedRecipient) -> Bool { true }
public func memberViewWillRenderRecipient(_ recipient: PickedRecipient) {}
public func memberViewPrepareToSelectRecipient(_ recipient: PickedRecipient) -> AnyPromise { AnyPromise(Promise.value(())) }
public func memberViewNoUuidSubtitleForRecipient(_ recipient: PickedRecipient) -> String? { nil }
public func memberViewShouldShowMemberCount() -> Bool { false }
public func memberViewShouldAllowBlockedSelection() -> Bool { mode == .blockList }
public func memberViewMemberCountForDisplay() -> Int { recipientSet.count }
public func memberViewIsPreExistingMember(_ recipient: PickedRecipient, transaction: SDSAnyReadTransaction) -> Bool { false }
public func memberViewCustomIconNameForPickedMember(_ recipient: PickedRecipient) -> String? {
mode == .blockList ? "x-circle-solid-24" : nil
}
public func memberViewCustomIconColorForPickedMember(_ recipient: PickedRecipient) -> UIColor? {
mode == .blockList ? .ows_accentRed : nil
}
public func memberViewDismiss() {
dismiss(animated: true)
}
}