diff --git a/Riot/Modules/Call/PiP/CallPiPView.swift b/Riot/Modules/Call/PiP/CallPiPView.swift new file mode 100644 index 000000000..3feaa27a6 --- /dev/null +++ b/Riot/Modules/Call/PiP/CallPiPView.swift @@ -0,0 +1,119 @@ +// +// Copyright 2021 New Vector Ltd +// +// 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. +// + +import UIKit +import Reusable + +@objcMembers +class CallPiPView: UIView { + + private enum Constants { + static let viewWidth: CGFloat = 90 + static let smallDotWidth: CGFloat = 8 + static let bigDotWidth: CGFloat = 10 + static let spaceBetweenDots: CGFloat = 4 + } + + @IBOutlet private weak var bgImageView: MXKImageView! + + @IBOutlet private weak var stackView: UIStackView! + + @IBOutlet private weak var mainCallAvatarImageView: MXKImageView! + + @IBOutlet private weak var onHoldCallView: UIView! + @IBOutlet private weak var onHoldCallAvatarImageView: MXKImageView! + + @IBOutlet private weak var connectingView: DotsView! { + didSet { + connectingView.dotMinWidth = self.bounds.width * Constants.smallDotWidth/Constants.viewWidth + connectingView.dotMaxWidth = self.bounds.width * Constants.bigDotWidth/Constants.viewWidth + connectingView.interSpaceMargin = self.bounds.width * Constants.spaceBetweenDots/Constants.viewWidth + } + } + + private lazy var defaultProfileImage: UIImage = { + return Bundle.mxk_imageFromMXKAssetsBundle(withName: "default-profile") + }() + private var session: MXSession! + + static func instantiate(withSession session: MXSession) -> CallPiPView { + let view = self.loadFromNib() + view.session = session + return view + } + + func configure(withCall mainCall: MXCall, + peer: MXUser?, + onHoldCall: MXCall?, + onHoldPeer: MXUser?) { + switch mainCall.state { + case .fledgling, .waitLocalMedia, .createOffer, .inviteSent, .ringing, .createAnswer, .connecting: + stackView.isHidden = true + connectingView.isHidden = false + case .connected: + connectingView.isHidden = true + stackView.isHidden = false + onHoldCallView.isHidden = onHoldCall == nil + default: + break + } + + if let avatarUrl = peer?.avatarUrl { + bgImageView.mediaFolder = kMXMediaManagerAvatarThumbnailFolder + bgImageView.enableInMemoryCache = true + + bgImageView.setImageURI(avatarUrl, + withType: nil, + andImageOrientation: .up, + toFitViewSize: bgImageView.bounds.size, + with: MXThumbnailingMethodCrop, + previewImage: defaultProfileImage, + mediaManager: session.mediaManager) + + mainCallAvatarImageView.mediaFolder = kMXMediaManagerAvatarThumbnailFolder + mainCallAvatarImageView.enableInMemoryCache = true + + mainCallAvatarImageView.setImageURI(avatarUrl, + withType: nil, + andImageOrientation: .up, + toFitViewSize: bgImageView.bounds.size, + with: MXThumbnailingMethodCrop, + previewImage: defaultProfileImage, + mediaManager: session.mediaManager) + } else { + bgImageView.image = defaultProfileImage + mainCallAvatarImageView.image = defaultProfileImage + } + + if let avatarUrl = onHoldPeer?.avatarUrl { + onHoldCallAvatarImageView.mediaFolder = kMXMediaManagerAvatarThumbnailFolder + onHoldCallAvatarImageView.enableInMemoryCache = true + + onHoldCallAvatarImageView.setImageURI(avatarUrl, + withType: nil, + andImageOrientation: .up, + toFitViewSize: bgImageView.bounds.size, + with: MXThumbnailingMethodCrop, + previewImage: defaultProfileImage, + mediaManager: session.mediaManager) + } else { + onHoldCallAvatarImageView.image = defaultProfileImage + } + } + +} + +extension CallPiPView: NibReusable {} diff --git a/Riot/Modules/Call/PiP/CallPiPView.xib b/Riot/Modules/Call/PiP/CallPiPView.xib new file mode 100644 index 000000000..bd5440e71 --- /dev/null +++ b/Riot/Modules/Call/PiP/CallPiPView.xib @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + +