Updated migration numbers as a result from merge and bug fixes
Updated the CallVC to support an animated profile picture Fixed a button layout issue with the landing screen Fixed a bug where the input view could appear above the call UI when the app returns to the foreground Fixed a bug where the push notification registration could incorrectly get triggered during onboarding when recovering from an onboarding crase
This commit is contained in:
parent
9ddfbefd72
commit
a8c4c3eb76
|
@ -710,7 +710,7 @@
|
|||
FD7728982849E8110018502F /* UITableView+ReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD7728972849E8110018502F /* UITableView+ReusableView.swift */; };
|
||||
FD77289A284AF1BD0018502F /* Sodium+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD772899284AF1BD0018502F /* Sodium+Utilities.swift */; };
|
||||
FD77289E284EF1C50018502F /* Sodium+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD77289D284EF1C50018502F /* Sodium+Utilities.swift */; };
|
||||
FD778B6429B189FF001BAC6B /* _013_GenerateInitialUserConfigDumps.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD778B6329B189FF001BAC6B /* _013_GenerateInitialUserConfigDumps.swift */; };
|
||||
FD778B6429B189FF001BAC6B /* _014_GenerateInitialUserConfigDumps.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD778B6329B189FF001BAC6B /* _014_GenerateInitialUserConfigDumps.swift */; };
|
||||
FD83B9B327CF200A005E1583 /* SessionUtilitiesKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3C2A679255388CC00C340D1 /* SessionUtilitiesKit.framework */; platformFilter = ios; };
|
||||
FD83B9BB27CF20AF005E1583 /* SessionIdSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD83B9BA27CF20AF005E1583 /* SessionIdSpec.swift */; };
|
||||
FD83B9BF27CF2294005E1583 /* TestConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD83B9BD27CF2243005E1583 /* TestConstants.swift */; };
|
||||
|
@ -739,7 +739,7 @@
|
|||
FD87DD0428B8727D00AF0F98 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD87DD0328B8727D00AF0F98 /* Configuration.swift */; };
|
||||
FD8ECF7929340F7200C0D1BB /* libsession-util.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD8ECF7829340F7100C0D1BB /* libsession-util.xcframework */; };
|
||||
FD8ECF7B29340FFD00C0D1BB /* SessionUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD8ECF7A29340FFD00C0D1BB /* SessionUtil.swift */; };
|
||||
FD8ECF7D2934293A00C0D1BB /* _012_SessionUtilChanges.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD8ECF7C2934293A00C0D1BB /* _012_SessionUtilChanges.swift */; };
|
||||
FD8ECF7D2934293A00C0D1BB /* _013_SessionUtilChanges.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD8ECF7C2934293A00C0D1BB /* _013_SessionUtilChanges.swift */; };
|
||||
FD8ECF7F2934298100C0D1BB /* ConfigDump.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD8ECF7E2934298100C0D1BB /* ConfigDump.swift */; };
|
||||
FD8ECF822934387A00C0D1BB /* ConfigUserProfileSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD8ECF812934387A00C0D1BB /* ConfigUserProfileSpec.swift */; };
|
||||
FD8ECF892935AB7200C0D1BB /* SessionUtilError.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD8ECF882935AB7200C0D1BB /* SessionUtilError.swift */; };
|
||||
|
@ -1840,7 +1840,7 @@
|
|||
FD7728972849E8110018502F /* UITableView+ReusableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UITableView+ReusableView.swift"; sourceTree = "<group>"; };
|
||||
FD772899284AF1BD0018502F /* Sodium+Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Sodium+Utilities.swift"; sourceTree = "<group>"; };
|
||||
FD77289D284EF1C50018502F /* Sodium+Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Sodium+Utilities.swift"; sourceTree = "<group>"; };
|
||||
FD778B6329B189FF001BAC6B /* _013_GenerateInitialUserConfigDumps.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = _013_GenerateInitialUserConfigDumps.swift; sourceTree = "<group>"; };
|
||||
FD778B6329B189FF001BAC6B /* _014_GenerateInitialUserConfigDumps.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = _014_GenerateInitialUserConfigDumps.swift; sourceTree = "<group>"; };
|
||||
FD83B9AF27CF200A005E1583 /* SessionUtilitiesKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SessionUtilitiesKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
FD83B9BA27CF20AF005E1583 /* SessionIdSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionIdSpec.swift; sourceTree = "<group>"; };
|
||||
FD83B9BD27CF2243005E1583 /* TestConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestConstants.swift; sourceTree = "<group>"; };
|
||||
|
@ -1871,7 +1871,7 @@
|
|||
FD87DD0328B8727D00AF0F98 /* Configuration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Configuration.swift; sourceTree = "<group>"; };
|
||||
FD8ECF7829340F7100C0D1BB /* libsession-util.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = "libsession-util.xcframework"; sourceTree = "<group>"; };
|
||||
FD8ECF7A29340FFD00C0D1BB /* SessionUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionUtil.swift; sourceTree = "<group>"; };
|
||||
FD8ECF7C2934293A00C0D1BB /* _012_SessionUtilChanges.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = _012_SessionUtilChanges.swift; sourceTree = "<group>"; };
|
||||
FD8ECF7C2934293A00C0D1BB /* _013_SessionUtilChanges.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = _013_SessionUtilChanges.swift; sourceTree = "<group>"; };
|
||||
FD8ECF7E2934298100C0D1BB /* ConfigDump.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigDump.swift; sourceTree = "<group>"; };
|
||||
FD8ECF812934387A00C0D1BB /* ConfigUserProfileSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigUserProfileSpec.swift; sourceTree = "<group>"; };
|
||||
FD8ECF882935AB7200C0D1BB /* SessionUtilError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionUtilError.swift; sourceTree = "<group>"; };
|
||||
|
@ -3634,9 +3634,9 @@
|
|||
7BAA7B6528D2DE4700AE1489 /* _009_OpenGroupPermission.swift */,
|
||||
FD7115F128C6CB3900B47552 /* _010_AddThreadIdToFTS.swift */,
|
||||
FD432431299C6933008A0213 /* _011_AddPendingReadReceipts.swift */,
|
||||
FD8ECF7C2934293A00C0D1BB /* _012_SessionUtilChanges.swift */,
|
||||
FD778B6329B189FF001BAC6B /* _013_GenerateInitialUserConfigDumps.swift */,
|
||||
7B521E0729BFEAFF00C3C36A /* _012_AddFTSIfNeeded.swift */,
|
||||
FD8ECF7C2934293A00C0D1BB /* _013_SessionUtilChanges.swift */,
|
||||
FD778B6329B189FF001BAC6B /* _014_GenerateInitialUserConfigDumps.swift */,
|
||||
);
|
||||
path = Migrations;
|
||||
sourceTree = "<group>";
|
||||
|
@ -5756,7 +5756,7 @@
|
|||
FD43EE9F297E2EE0009C87C5 /* SessionUtil+ConvoInfoVolatile.swift in Sources */,
|
||||
B8EB20EE2640F28000773E52 /* VisibleMessage+OpenGroupInvitation.swift in Sources */,
|
||||
FDF8487F29405994007DCAE5 /* HTTPHeader+OpenGroup.swift in Sources */,
|
||||
FD8ECF7D2934293A00C0D1BB /* _012_SessionUtilChanges.swift in Sources */,
|
||||
FD8ECF7D2934293A00C0D1BB /* _013_SessionUtilChanges.swift in Sources */,
|
||||
FD17D7A227F40F0500122BE0 /* _001_InitialSetupMigration.swift in Sources */,
|
||||
FD245C5D2850660F00B966DD /* OWSAudioPlayer.m in Sources */,
|
||||
FDF0B7582807F368004C14C5 /* MessageReceiverError.swift in Sources */,
|
||||
|
@ -5801,7 +5801,7 @@
|
|||
FD09796E27FA6D0000936362 /* Contact.swift in Sources */,
|
||||
C38D5E8D2575011E00B6A65C /* MessageSender+ClosedGroups.swift in Sources */,
|
||||
FD5C72F7284F0E560029977D /* MessageReceiver+ReadReceipts.swift in Sources */,
|
||||
FD778B6429B189FF001BAC6B /* _013_GenerateInitialUserConfigDumps.swift in Sources */,
|
||||
FD778B6429B189FF001BAC6B /* _014_GenerateInitialUserConfigDumps.swift in Sources */,
|
||||
C32C598A256D0664003C73A2 /* SNProtoEnvelope+Conversion.swift in Sources */,
|
||||
FDC438CB27BB7DB100C60D73 /* UpdateMessageRequest.swift in Sources */,
|
||||
FD8ECF7F2934298100C0D1BB /* ConfigDump.swift in Sources */,
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
|
||||
|
||||
import Foundation
|
||||
import UIKit
|
||||
import YYImage
|
||||
import Combine
|
||||
import CallKit
|
||||
import GRDB
|
||||
|
@ -25,6 +26,7 @@ public final class SessionCall: CurrentCallProtocol, WebRTCSessionDelegate {
|
|||
|
||||
let contactName: String
|
||||
let profilePicture: UIImage
|
||||
let animatedProfilePicture: YYImage?
|
||||
|
||||
// MARK: - Control
|
||||
|
||||
|
@ -151,10 +153,18 @@ public final class SessionCall: CurrentCallProtocol, WebRTCSessionDelegate {
|
|||
self.webRTCSession = WebRTCSession.current ?? WebRTCSession(for: sessionId, with: uuid)
|
||||
self.isOutgoing = outgoing
|
||||
|
||||
let avatarData: Data? = ProfileManager.profileAvatar(db, id: sessionId)
|
||||
self.contactName = Profile.displayName(db, id: sessionId, threadVariant: .contact)
|
||||
self.profilePicture = ProfileManager.profileAvatar(db, id: sessionId)
|
||||
self.profilePicture = avatarData
|
||||
.map { UIImage(data: $0) }
|
||||
.defaulting(to: Identicon.generatePlaceholderIcon(seed: sessionId, text: self.contactName, size: 300))
|
||||
self.animatedProfilePicture = avatarData
|
||||
.map { data in
|
||||
switch data.guessedImageFormat {
|
||||
case .gif, .webp: return YYImage(data: data)
|
||||
default: return nil
|
||||
}
|
||||
}
|
||||
|
||||
WebRTCSession.current = self.webRTCSession
|
||||
self.webRTCSession.delegate = self
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
|
||||
|
||||
import UIKit
|
||||
import YYImage
|
||||
import MediaPlayer
|
||||
import WebRTC
|
||||
import SessionUIKit
|
||||
|
@ -8,6 +9,8 @@ import SessionMessagingKit
|
|||
import SessionUtilitiesKit
|
||||
|
||||
final class CallVC: UIViewController, VideoPreviewDelegate {
|
||||
private static let avatarRadius: CGFloat = (isIPhone6OrSmaller ? 100 : 120)
|
||||
|
||||
let call: SessionCall
|
||||
var latestKnownAudioOutputDeviceName: String?
|
||||
var durationTimer: Timer?
|
||||
|
@ -63,17 +66,29 @@ final class CallVC: UIViewController, VideoPreviewDelegate {
|
|||
|
||||
private lazy var profilePictureView: UIImageView = {
|
||||
let result = UIImageView()
|
||||
let radius: CGFloat = isIPhone6OrSmaller ? 100 : 120
|
||||
result.image = self.call.profilePicture
|
||||
result.set(.width, to: radius * 2)
|
||||
result.set(.height, to: radius * 2)
|
||||
result.layer.cornerRadius = radius
|
||||
result.set(.width, to: CallVC.avatarRadius * 2)
|
||||
result.set(.height, to: CallVC.avatarRadius * 2)
|
||||
result.layer.cornerRadius = CallVC.avatarRadius
|
||||
result.layer.masksToBounds = true
|
||||
result.contentMode = .scaleAspectFill
|
||||
|
||||
return result
|
||||
}()
|
||||
|
||||
private lazy var animatedImageView: YYAnimatedImageView = {
|
||||
let result: YYAnimatedImageView = YYAnimatedImageView()
|
||||
result.image = self.call.animatedProfilePicture
|
||||
result.set(.width, to: CallVC.avatarRadius * 2)
|
||||
result.set(.height, to: CallVC.avatarRadius * 2)
|
||||
result.layer.cornerRadius = CallVC.avatarRadius
|
||||
result.layer.masksToBounds = true
|
||||
result.contentMode = .scaleAspectFill
|
||||
result.isHidden = (self.call.animatedProfilePicture == nil)
|
||||
|
||||
return result
|
||||
}()
|
||||
|
||||
private lazy var minimizeButton: UIButton = {
|
||||
let result = UIButton(type: .custom)
|
||||
result.setImage(
|
||||
|
@ -416,7 +431,9 @@ final class CallVC: UIViewController, VideoPreviewDelegate {
|
|||
profilePictureContainer.pin(.bottom, to: .top, of: operationPanel)
|
||||
profilePictureContainer.pin([ UIView.HorizontalEdge.left, UIView.HorizontalEdge.right ], to: view)
|
||||
profilePictureContainer.addSubview(profilePictureView)
|
||||
profilePictureContainer.addSubview(animatedImageView)
|
||||
profilePictureView.center(in: profilePictureContainer)
|
||||
animatedImageView.center(in: profilePictureContainer)
|
||||
|
||||
// Call info label
|
||||
let callInfoLabelContainer = UIView()
|
||||
|
|
|
@ -551,7 +551,7 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl
|
|||
startObservingChanges(didReturnFromBackground: true)
|
||||
recoverInputView()
|
||||
|
||||
if !isShowingSearchUI {
|
||||
if !isShowingSearchUI && self.presentedViewController == nil {
|
||||
if !self.isFirstResponder {
|
||||
self.becomeFirstResponder()
|
||||
}
|
||||
|
|
|
@ -24,7 +24,12 @@ public enum SyncPushTokensJob: JobExecutor {
|
|||
// Don't run when inactive or not in main app or if the user doesn't exist yet
|
||||
guard
|
||||
(UserDefaults.sharedLokiProject?[.isMainAppActive]).defaulting(to: false),
|
||||
Identity.userExists()
|
||||
Identity.userExists(),
|
||||
// If we have no display name then the user will be asked to enter one (this
|
||||
// can happen if the app crashed during onboarding which would leave the user
|
||||
// in an invalid state with no display name - the user is likely going to be
|
||||
// taken to the PN registration screen next which will re-trigger this job)
|
||||
!Profile.fetchOrCreateCurrentUser().name.isEmpty
|
||||
else {
|
||||
deferred(job) // Don't need to do anything if it's not the main app
|
||||
return
|
||||
|
|
|
@ -29,11 +29,11 @@ public enum SNMessagingKit { // Just to make the external API nice
|
|||
[
|
||||
_011_AddPendingReadReceipts.self,
|
||||
_012_AddFTSIfNeeded.self,
|
||||
_012_SessionUtilChanges.self,
|
||||
_013_SessionUtilChanges.self,
|
||||
// Wait until the feature is turned on before doing the migration that generates
|
||||
// the config dump data
|
||||
(Features.useSharedUtilForUserConfig ?
|
||||
_013_GenerateInitialUserConfigDumps.self :
|
||||
_014_GenerateInitialUserConfigDumps.self :
|
||||
(nil as Migration.Type?)
|
||||
)
|
||||
].compactMap { $0 }
|
||||
|
|
|
@ -7,7 +7,7 @@ import SessionUtil
|
|||
import SessionUtilitiesKit
|
||||
|
||||
/// This migration makes the neccessary changes to support the updated user config syncing system
|
||||
enum _012_SessionUtilChanges: Migration {
|
||||
enum _013_SessionUtilChanges: Migration {
|
||||
static let target: TargetMigrations.Identifier = .messagingKit
|
||||
static let identifier: String = "SessionUtilChanges"
|
||||
static let needsConfigSync: Bool = true
|
||||
|
@ -160,18 +160,6 @@ enum _012_SessionUtilChanges: Migration {
|
|||
SessionThread.Columns.pinnedPriority.set(to: 1)
|
||||
)
|
||||
|
||||
// There seems to have been an issue where the interaction FTS table might have been dropped
|
||||
// so if it has we should recreate it
|
||||
if try db.tableExists(Interaction.fullTextSearchTableName) == false {
|
||||
try db.create(virtualTable: Interaction.fullTextSearchTableName, using: FTS5()) { t in
|
||||
t.synchronize(withTable: Interaction.databaseTableName)
|
||||
t.tokenizer = _001_InitialSetupMigration.fullTextSearchTokenizer
|
||||
|
||||
t.column(Interaction.Columns.body.name)
|
||||
t.column(Interaction.Columns.threadId.name)
|
||||
}
|
||||
}
|
||||
|
||||
// If we don't have an ed25519 key then no need to create cached dump data
|
||||
let userPublicKey: String = getUserHexEncodedPublicKey(db)
|
||||
|
|
@ -8,7 +8,7 @@ import SessionUtilitiesKit
|
|||
/// This migration goes through the current state of the database and generates config dumps for the user config types
|
||||
///
|
||||
/// **Note:** This migration won't be run until the `useSharedUtilForUserConfig` feature flag is enabled
|
||||
enum _013_GenerateInitialUserConfigDumps: Migration {
|
||||
enum _014_GenerateInitialUserConfigDumps: Migration {
|
||||
static let target: TargetMigrations.Identifier = .messagingKit
|
||||
static let identifier: String = "GenerateInitialUserConfigDumps"
|
||||
static let needsConfigSync: Bool = true
|
|
@ -651,6 +651,8 @@ public final class MessageSender {
|
|||
switch updatedMessage {
|
||||
case is VisibleMessage, is UnsendRequest: return !isSyncMessage
|
||||
case let callMessage as CallMessage:
|
||||
// Note: Other 'CallMessage' types are too big to send as push notifications
|
||||
// so only send the 'preOffer' message as a notification
|
||||
switch callMessage.kind {
|
||||
case .preOffer: return true
|
||||
default: return false
|
||||
|
|
|
@ -54,7 +54,7 @@ public final class Values : NSObject {
|
|||
|
||||
// MARK: - iPad Sizes
|
||||
@objc public static let iPadModalWidth = UIScreen.main.bounds.width / 2
|
||||
@objc public static let iPadButtonWidth = CGFloat(196)
|
||||
@objc public static let iPadButtonWidth = CGFloat(240)
|
||||
@objc public static let iPadButtonSpacing = CGFloat(32)
|
||||
@objc public static let iPadUserSessionIdContainerWidth = iPadButtonWidth * 2 + iPadButtonSpacing
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue