mirror of
https://github.com/signalapp/Signal-iOS.git
synced 2025-12-05 01:10:41 +00:00
Add call summary support for all calls
This commit is contained in:
4
Podfile
4
Podfile
@@ -15,8 +15,8 @@ ENV['LIBSIGNAL_FFI_PREBUILD_CHECKSUM'] = '39d2dd642c433d14d3bf0bdead848ea3248037
|
||||
pod 'LibSignalClient', git: 'https://github.com/signalapp/libsignal.git', tag: 'v0.86.4', testspecs: ["Tests"]
|
||||
# pod 'LibSignalClient', path: '../libsignal', testspecs: ["Tests"]
|
||||
|
||||
ENV['RINGRTC_PREBUILD_CHECKSUM'] = 'b4a56a4d548cf2ea0215664f5a64c127c725ccf2ec360cbebe790da689286837'
|
||||
pod 'SignalRingRTC', git: 'https://github.com/signalapp/ringrtc', tag: 'v2.59.3', inhibit_warnings: true
|
||||
ENV['RINGRTC_PREBUILD_CHECKSUM'] = 'a6a179d697778d4bf306ae4f749ee988c31ca6449bb07ad329e5e3989068b2ae'
|
||||
pod 'SignalRingRTC', git: 'https://github.com/signalapp/ringrtc', tag: 'v2.60.5', inhibit_warnings: true
|
||||
# pod 'SignalRingRTC', path: '../ringrtc', testspecs: ["Tests"]
|
||||
|
||||
pod 'GRDB.swift/SQLCipher'
|
||||
|
||||
16
Podfile.lock
16
Podfile.lock
@@ -39,9 +39,9 @@ PODS:
|
||||
- SDWebImageWebPCoder (0.14.6):
|
||||
- libwebp (~> 1.0)
|
||||
- SDWebImage/Core (~> 5.17)
|
||||
- SignalRingRTC (2.59.3):
|
||||
- SignalRingRTC/WebRTC (= 2.59.3)
|
||||
- SignalRingRTC/WebRTC (2.59.3)
|
||||
- SignalRingRTC (2.60.5):
|
||||
- SignalRingRTC/WebRTC (= 2.60.5)
|
||||
- SignalRingRTC/WebRTC (2.60.5)
|
||||
- SQLCipher (4.6.1):
|
||||
- SQLCipher/standard (= 4.6.1)
|
||||
- SQLCipher/common (4.6.1)
|
||||
@@ -66,7 +66,7 @@ DEPENDENCIES:
|
||||
- Reachability
|
||||
- SDWebImage
|
||||
- SDWebImageWebPCoder
|
||||
- SignalRingRTC (from `https://github.com/signalapp/ringrtc`, tag `v2.59.3`)
|
||||
- SignalRingRTC (from `https://github.com/signalapp/ringrtc`, tag `v2.60.5`)
|
||||
- SQLCipher (from `https://github.com/signalapp/sqlcipher.git`, tag `v4.6.1-f_barrierfsync`)
|
||||
- SwiftProtobuf (= 1.31.1)
|
||||
|
||||
@@ -105,7 +105,7 @@ EXTERNAL SOURCES:
|
||||
:tag: v6.0.3
|
||||
SignalRingRTC:
|
||||
:git: https://github.com/signalapp/ringrtc
|
||||
:tag: v2.59.3
|
||||
:tag: v2.60.5
|
||||
SQLCipher:
|
||||
:git: https://github.com/signalapp/sqlcipher.git
|
||||
:tag: v4.6.1-f_barrierfsync
|
||||
@@ -132,7 +132,7 @@ CHECKOUT OPTIONS:
|
||||
:tag: v6.0.3
|
||||
SignalRingRTC:
|
||||
:git: https://github.com/signalapp/ringrtc
|
||||
:tag: v2.59.3
|
||||
:tag: v2.60.5
|
||||
SQLCipher:
|
||||
:git: https://github.com/signalapp/sqlcipher.git
|
||||
:tag: v4.6.1-f_barrierfsync
|
||||
@@ -154,10 +154,10 @@ SPEC CHECKSUMS:
|
||||
Reachability: fd0ecd23705e2599e4cceeb943222ae02296cbc6
|
||||
SDWebImage: 9f177d83116802728e122410fb25ad88f5c7608a
|
||||
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
|
||||
SignalRingRTC: 8fa61457ba96231dcf8913bfd2a53d8a1aa0e510
|
||||
SignalRingRTC: 184d29a8b625e5e3c64d0807588eb8cf34d77f04
|
||||
SQLCipher: ff2f045b20d675a73a70f7329395ddd4a2580063
|
||||
SwiftProtobuf: e02f51c8c2df5845657aee2d4de9d61bf50ef788
|
||||
|
||||
PODFILE CHECKSUM: 59876cee69aacbf8909777ef18ff1ae29281717a
|
||||
PODFILE CHECKSUM: 3c2bc39810ece143d74e3428cc6bc3d7f074bf30
|
||||
|
||||
COCOAPODS: 1.15.2
|
||||
|
||||
2
Pods
2
Pods
Submodule Pods updated: 253eabbc47...32ff19b073
@@ -125,7 +125,7 @@ class CallAudioService: IndividualCallObserver, GroupCallObserver {
|
||||
|
||||
}
|
||||
|
||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
||||
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||
stopPlayingAnySounds()
|
||||
ensureProperAudioSession(call: call)
|
||||
}
|
||||
|
||||
@@ -976,7 +976,7 @@ extension CallService: GroupCallObserver {
|
||||
}
|
||||
}
|
||||
|
||||
func groupCallEnded(_ groupCall: GroupCall, reason: GroupCallEndReason) {
|
||||
func groupCallEnded(_ groupCall: GroupCall, reason: CallEndReason) {
|
||||
groupCallAccessoryMessageDelegate.localDeviceGroupCallDidEnd()
|
||||
|
||||
let call = callServiceState.currentCall
|
||||
@@ -1283,6 +1283,22 @@ extension CallService: CallManagerDelegate {
|
||||
)
|
||||
}
|
||||
|
||||
func callManager(
|
||||
_ callManager: SignalRingRTC.CallManager<SignalCall, CallService>,
|
||||
onCallEnded call: SignalCall,
|
||||
callId: UInt64,
|
||||
reason: CallEndReason,
|
||||
summary: CallSummary
|
||||
) {
|
||||
individualCallService.callManager(
|
||||
callManager,
|
||||
onCallEnded: call,
|
||||
callId: callId,
|
||||
reason: reason,
|
||||
summary: summary
|
||||
)
|
||||
}
|
||||
|
||||
public func callManager(
|
||||
_ callManager: CallManager<SignalCall, CallService>,
|
||||
onEvent call: SignalCall,
|
||||
|
||||
@@ -20,7 +20,7 @@ protocol GroupCallObserver: AnyObject {
|
||||
func groupCallPeekChanged(_ call: GroupCall)
|
||||
|
||||
@MainActor
|
||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason)
|
||||
func groupCallEnded(_ call: GroupCall, reason: CallEndReason)
|
||||
func groupCallReceivedReactions(_ call: GroupCall, reactions: [SignalRingRTC.Reaction])
|
||||
func groupCallReceivedRaisedHands(_ call: GroupCall, raisedHands: [DemuxId])
|
||||
|
||||
@@ -33,7 +33,7 @@ extension GroupCallObserver {
|
||||
func groupCallLocalDeviceStateChanged(_ call: GroupCall) {}
|
||||
func groupCallRemoteDeviceStatesChanged(_ call: GroupCall) {}
|
||||
func groupCallPeekChanged(_ call: GroupCall) {}
|
||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {}
|
||||
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {}
|
||||
func groupCallReceivedReactions(_ call: GroupCall, reactions: [SignalRingRTC.Reaction]) {}
|
||||
func groupCallReceivedRaisedHands(_ call: GroupCall, raisedHands: [DemuxId]) {}
|
||||
func handleUntrustedIdentityError(_ call: GroupCall) {}
|
||||
@@ -213,9 +213,10 @@ class GroupCall: SignalRingRTC.GroupCallDelegate {
|
||||
}
|
||||
|
||||
@MainActor
|
||||
func groupCall(onEnded groupCall: SignalRingRTC.GroupCall, reason: GroupCallEndReason) {
|
||||
func groupCall(onEnded groupCall: SignalRingRTC.GroupCall, reason: CallEndReason, summary: CallSummary) {
|
||||
self.hasInvokedConnectMethod = false
|
||||
|
||||
// TODO: Handle the call summary.
|
||||
observers.elements.forEach { $0.groupCallEnded(self, reason: reason) }
|
||||
}
|
||||
|
||||
|
||||
@@ -136,7 +136,7 @@ extension GroupCallRemoteVideoManager: GroupCallObserver {
|
||||
}
|
||||
}
|
||||
|
||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
||||
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||
videoViews.keys.forEach { destroyRemoteVideoView(for: $0) }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -455,38 +455,13 @@ final class IndividualCallService: CallServiceStateObserver {
|
||||
}
|
||||
|
||||
@MainActor
|
||||
public func callManager(_ callManager: CallService.CallManagerType, onEvent call: SignalCall, event: CallManagerEvent) {
|
||||
Logger.info("call: \(call), onEvent: \(event)")
|
||||
public func callManager(_ callManager: CallService.CallManagerType, onCallEnded call: SignalCall, callId: UInt64, reason: CallEndReason, summary: CallSummary) {
|
||||
Logger.info("call: \(call), onCallEnded: \(reason)")
|
||||
|
||||
switch event {
|
||||
case .ringingLocal:
|
||||
handleRinging(call: call)
|
||||
// TODO: Handle the call summary.
|
||||
|
||||
case .ringingRemote:
|
||||
handleRinging(call: call)
|
||||
|
||||
case .connectedLocal:
|
||||
Logger.debug("")
|
||||
// nothing further to do - already handled in handleAcceptCall().
|
||||
|
||||
case .connectedRemote:
|
||||
defer {
|
||||
callUIAdapter.recipientAcceptedCall(call.mode)
|
||||
}
|
||||
|
||||
guard call === callServiceState.currentCall else {
|
||||
cleanUpStaleCall(call)
|
||||
return
|
||||
}
|
||||
|
||||
// Set the audio session configuration before audio is enabled in WebRTC
|
||||
// via recipientAcceptedCall().
|
||||
handleConnected(call: call)
|
||||
|
||||
// Update the call interaction now that we've connected.
|
||||
call.individualCall.createOrUpdateCallInteractionAsync(callType: .outgoing)
|
||||
|
||||
case .endedLocalHangup:
|
||||
switch reason {
|
||||
case .localHangup:
|
||||
guard call === callServiceState.currentCall else {
|
||||
cleanUpStaleCall(call)
|
||||
return
|
||||
@@ -513,7 +488,7 @@ final class IndividualCallService: CallServiceStateObserver {
|
||||
|
||||
callServiceState.terminateCall(call)
|
||||
|
||||
case .endedRemoteHangup:
|
||||
case .remoteHangup:
|
||||
guard call === callServiceState.currentCall else {
|
||||
cleanUpStaleCall(call)
|
||||
return
|
||||
@@ -537,7 +512,7 @@ final class IndividualCallService: CallServiceStateObserver {
|
||||
|
||||
callServiceState.terminateCall(call)
|
||||
|
||||
case .endedRemoteHangupNeedPermission:
|
||||
case .remoteHangupNeedPermission:
|
||||
guard call === callServiceState.currentCall else {
|
||||
cleanUpStaleCall(call)
|
||||
return
|
||||
@@ -559,7 +534,7 @@ final class IndividualCallService: CallServiceStateObserver {
|
||||
|
||||
callServiceState.terminateCall(call)
|
||||
|
||||
case .endedRemoteHangupAccepted:
|
||||
case .remoteHangupAccepted:
|
||||
guard call === callServiceState.currentCall else {
|
||||
cleanUpStaleCall(call)
|
||||
return
|
||||
@@ -580,7 +555,7 @@ final class IndividualCallService: CallServiceStateObserver {
|
||||
Logger.info("ignoring 'endedRemoteHangupAccepted' since call is already finished")
|
||||
}
|
||||
|
||||
case .endedRemoteHangupDeclined:
|
||||
case .remoteHangupDeclined:
|
||||
guard call === callServiceState.currentCall else {
|
||||
cleanUpStaleCall(call)
|
||||
return
|
||||
@@ -601,7 +576,7 @@ final class IndividualCallService: CallServiceStateObserver {
|
||||
Logger.info("ignoring 'endedRemoteHangupDeclined' since call is already finished")
|
||||
}
|
||||
|
||||
case .endedRemoteHangupBusy:
|
||||
case .remoteHangupBusy:
|
||||
guard call === callServiceState.currentCall else {
|
||||
cleanUpStaleCall(call)
|
||||
return
|
||||
@@ -622,7 +597,7 @@ final class IndividualCallService: CallServiceStateObserver {
|
||||
Logger.info("ignoring 'endedRemoteHangupBusy' since call is already finished")
|
||||
}
|
||||
|
||||
case .endedRemoteBusy:
|
||||
case .remoteBusy:
|
||||
guard call === callServiceState.currentCall else {
|
||||
cleanUpStaleCall(call)
|
||||
return
|
||||
@@ -638,7 +613,7 @@ final class IndividualCallService: CallServiceStateObserver {
|
||||
|
||||
callServiceState.terminateCall(call)
|
||||
|
||||
case .endedRemoteGlare, .endedRemoteReCall:
|
||||
case .remoteGlare, .remoteReCall:
|
||||
guard call === callServiceState.currentCall else {
|
||||
cleanUpStaleCall(call)
|
||||
return
|
||||
@@ -669,7 +644,7 @@ final class IndividualCallService: CallServiceStateObserver {
|
||||
call.individualCall.state = .localHangup
|
||||
callServiceState.terminateCall(call)
|
||||
|
||||
case .endedTimeout:
|
||||
case .timeout:
|
||||
let description: String
|
||||
|
||||
if call.individualCall.direction == .outgoing {
|
||||
@@ -680,21 +655,74 @@ final class IndividualCallService: CallServiceStateObserver {
|
||||
|
||||
handleFailedCall(failedCall: call, error: CallError.timeout(description: description), shouldResetUI: true, shouldResetRingRTC: false)
|
||||
|
||||
case .endedSignalingFailure, .endedGlareHandlingFailure:
|
||||
handleFailedCall(failedCall: call, error: CallError.signaling, shouldResetUI: true, shouldResetRingRTC: false)
|
||||
|
||||
case .endedInternalFailure:
|
||||
case .internalFailure:
|
||||
handleFailedCall(failedCall: call, error: OWSAssertionError("call manager internal error"), shouldResetUI: true, shouldResetRingRTC: false)
|
||||
|
||||
case .endedConnectionFailure:
|
||||
case .signalingFailure:
|
||||
handleFailedCall(failedCall: call, error: CallError.signaling, shouldResetUI: true, shouldResetRingRTC: false)
|
||||
|
||||
case .connectionFailure:
|
||||
handleFailedCall(failedCall: call, error: CallError.disconnected, shouldResetUI: true, shouldResetRingRTC: false)
|
||||
|
||||
case .endedDropped:
|
||||
case .appDroppedCall:
|
||||
Logger.debug("")
|
||||
|
||||
// An incoming call was dropped, ignoring because we have already
|
||||
// failed the call on the screen.
|
||||
|
||||
case
|
||||
.deviceExplicitlyDisconnected,
|
||||
.serverExplicitlyDisconnected,
|
||||
.deniedRequestToJoinCall,
|
||||
.removedFromCall,
|
||||
.callManagerIsBusy,
|
||||
.sfuClientFailedToJoin,
|
||||
.failedToCreatePeerConnectionFactory,
|
||||
.failedToNegotiateSrtpKeys,
|
||||
.failedToCreatePeerConnection,
|
||||
.failedToStartPeerConnection,
|
||||
.failedToUpdatePeerConnection,
|
||||
.failedToSetMaxSendBitrate,
|
||||
.iceFailedWhileConnecting,
|
||||
.iceFailedAfterConnected,
|
||||
.serverChangedDemuxId,
|
||||
.hasMaxDevices:
|
||||
Logger.error("Received Group Call reason in a Direct Call context")
|
||||
}
|
||||
}
|
||||
|
||||
@MainActor
|
||||
public func callManager(_ callManager: CallService.CallManagerType, onEvent call: SignalCall, event: CallManagerEvent) {
|
||||
Logger.info("call: \(call), onEvent: \(event)")
|
||||
|
||||
switch event {
|
||||
case .ringingLocal:
|
||||
handleRinging(call: call)
|
||||
|
||||
case .ringingRemote:
|
||||
handleRinging(call: call)
|
||||
|
||||
case .connectedLocal:
|
||||
Logger.debug("")
|
||||
// nothing further to do - already handled in handleAcceptCall().
|
||||
|
||||
case .connectedRemote:
|
||||
defer {
|
||||
callUIAdapter.recipientAcceptedCall(call.mode)
|
||||
}
|
||||
|
||||
guard call === callServiceState.currentCall else {
|
||||
cleanUpStaleCall(call)
|
||||
return
|
||||
}
|
||||
|
||||
// Set the audio session configuration before audio is enabled in WebRTC
|
||||
// via recipientAcceptedCall().
|
||||
handleConnected(call: call)
|
||||
|
||||
// Update the call interaction now that we've connected.
|
||||
call.individualCall.createOrUpdateCallInteractionAsync(callType: .outgoing)
|
||||
|
||||
case .remoteAudioEnable:
|
||||
guard call === callServiceState.currentCall else {
|
||||
cleanUpStaleCall(call)
|
||||
@@ -768,6 +796,9 @@ final class IndividualCallService: CallServiceStateObserver {
|
||||
// TODO - This should not be a failure.
|
||||
call.individualCall.state = .localFailure
|
||||
callServiceState.terminateCall(call)
|
||||
|
||||
case .glareHandlingFailure:
|
||||
handleFailedCall(failedCall: call, error: CallError.signaling, shouldResetUI: true, shouldResetRingRTC: false)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -615,7 +615,7 @@ extension CallControlsViewModel: GroupCallObserver {
|
||||
refreshView?()
|
||||
}
|
||||
|
||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
||||
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||
refreshView?()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -173,7 +173,7 @@ extension GroupCallSheetDataSource: GroupCallObserver {
|
||||
observers.elements.forEach { $0.callSheetMembershipDidChange(self) }
|
||||
}
|
||||
|
||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
||||
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||
AssertIsOnMainThread()
|
||||
observers.elements.forEach { $0.callSheetMembershipDidChange(self) }
|
||||
}
|
||||
|
||||
@@ -509,7 +509,7 @@ extension CallHeader: GroupCallObserver {
|
||||
updateCallStatusLabel()
|
||||
}
|
||||
|
||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
||||
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||
updateCallStatusLabel()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -141,7 +141,7 @@ extension GroupCallNotificationView: GroupCallObserver {
|
||||
updateActiveMembers()
|
||||
}
|
||||
|
||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
||||
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||
AssertIsOnMainThread()
|
||||
|
||||
hasJoined = false
|
||||
|
||||
@@ -88,7 +88,7 @@ extension GroupCallVideoGrid: GroupCallObserver {
|
||||
reloadData()
|
||||
}
|
||||
|
||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
||||
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||
AssertIsOnMainThread()
|
||||
reloadData()
|
||||
}
|
||||
|
||||
@@ -223,7 +223,7 @@ extension GroupCallVideoOverflow: GroupCallObserver {
|
||||
reloadData()
|
||||
}
|
||||
|
||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
||||
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||
AssertIsOnMainThread()
|
||||
reloadData()
|
||||
}
|
||||
|
||||
@@ -1749,7 +1749,7 @@ extension GroupCallViewController: GroupCallObserver {
|
||||
updateCallUI()
|
||||
}
|
||||
|
||||
func groupCallEnded(_ call: GroupCall, reason: GroupCallEndReason) {
|
||||
func groupCallEnded(_ call: GroupCall, reason: CallEndReason) {
|
||||
AssertIsOnMainThread()
|
||||
owsPrecondition(self.groupCall === call)
|
||||
|
||||
@@ -1822,6 +1822,24 @@ extension GroupCallViewController: GroupCallObserver {
|
||||
)
|
||||
message = nil
|
||||
shouldDismissCallAfterDismissingActionSheet = false
|
||||
|
||||
case
|
||||
.localHangup,
|
||||
.remoteHangup,
|
||||
.remoteHangupNeedPermission,
|
||||
.remoteHangupAccepted,
|
||||
.remoteHangupDeclined,
|
||||
.remoteHangupBusy,
|
||||
.remoteBusy,
|
||||
.remoteGlare,
|
||||
.remoteReCall,
|
||||
.timeout,
|
||||
.internalFailure,
|
||||
.signalingFailure,
|
||||
.connectionFailure,
|
||||
.appDroppedCall:
|
||||
Logger.error("Received Direct Call reason in a Group Call context")
|
||||
return
|
||||
}
|
||||
|
||||
if self.isReadyToHandleObserver {
|
||||
|
||||
@@ -2446,7 +2446,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
<key>License</key>
|
||||
<string>ISC License</string>
|
||||
<key>Title</key>
|
||||
<string>cubeb 0.31.2, cubeb-core 0.31.2, cubeb-sys 0.31.2</string>
|
||||
<string>cubeb 0.33.0, cubeb-core 0.33.0, cubeb-sys 0.33.0</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
@@ -6783,7 +6783,7 @@ You should also get your employer (if you work as a programmer) or school, if an
|
||||
<key>License</key>
|
||||
<string>GNU Affero General Public License v3.0</string>
|
||||
<key>Title</key>
|
||||
<string>libsignal-account-keys 0.1.0, libsignal-core 0.1.0, mrp 2.59.3, partial-default-derive 0.1.0, protobuf 2.59.3, regex-aot 0.1.0, ringrtc 2.59.3</string>
|
||||
<string>libsignal-account-keys 0.1.0, libsignal-core 0.1.0, mrp 2.60.5, partial-default-derive 0.1.0, protobuf 2.60.5, regex-aot 0.1.0, ringrtc 2.60.5</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
@@ -13138,6 +13138,217 @@ For more information on this, and how to apply and follow the GNU AGPL, see
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string> Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [2019] [Mike Heffner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
</string>
|
||||
<key>License</key>
|
||||
<string>Apache License 2.0</string>
|
||||
<key>Title</key>
|
||||
<string>sketches-ddsketch 0.3.0</string>
|
||||
<key>Type</key>
|
||||
<string>PSGroupSpecifier</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>FooterText</key>
|
||||
<string>Copyright (c) 2019 Carl Lerche
|
||||
|
||||
Reference in New Issue
Block a user