From e174c43bece91997e6c2dc79889548c670defcf9 Mon Sep 17 00:00:00 2001
From: JRoberts <8711996+jr-simplex@users.noreply.github.com>
Date: Thu, 12 May 2022 11:08:14 +0400
Subject: [PATCH 1/6] android: fix compose/send message not resetting some
state (#639)
---
.../app/src/main/java/chat/simplex/app/views/TerminalView.kt | 1 +
.../app/src/main/java/chat/simplex/app/views/chat/ComposeView.kt | 1 +
2 files changed, 2 insertions(+)
diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/TerminalView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/TerminalView.kt
index 93ed18039c..08c86f7cb7 100644
--- a/apps/android/app/src/main/java/chat/simplex/app/views/TerminalView.kt
+++ b/apps/android/app/src/main/java/chat/simplex/app/views/TerminalView.kt
@@ -35,6 +35,7 @@ fun TerminalView(chatModel: ChatModel, close: () -> Unit) {
withApi {
// show "in progress"
chatModel.controller.sendCmd(CC.Console(composeState.value.message))
+ composeState.value = ComposeState()
// hide "in progress"
}
},
diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/chat/ComposeView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/chat/ComposeView.kt
index d187cf0344..34995d8e9e 100644
--- a/apps/android/app/src/main/java/chat/simplex/app/views/chat/ComposeView.kt
+++ b/apps/android/app/src/main/java/chat/simplex/app/views/chat/ComposeView.kt
@@ -185,6 +185,7 @@ fun ComposeView(
fun clearState() {
composeState.value = ComposeState()
+ textStyle.value = smallFont
chosenImage.value = null
chosenFile.value = null
linkUrl.value = null
From 53e330dac9da8684b329fc5f7053cccbcbe1431e Mon Sep 17 00:00:00 2001
From: JRoberts <8711996+jr-simplex@users.noreply.github.com>
Date: Thu, 12 May 2022 17:37:09 +0400
Subject: [PATCH 2/6] core: add missing status transitions for group file
transfer; fix group file delivery race condition (#640)
---
docs/rfcs/files.mmd | 129 ++++++++++++++++++++++++++++++++++++++
src/Simplex/Chat.hs | 18 +++---
src/Simplex/Chat/Store.hs | 10 +--
3 files changed, 144 insertions(+), 13 deletions(-)
create mode 100644 docs/rfcs/files.mmd
diff --git a/docs/rfcs/files.mmd b/docs/rfcs/files.mmd
new file mode 100644
index 0000000000..4431726b77
--- /dev/null
+++ b/docs/rfcs/files.mmd
@@ -0,0 +1,129 @@
+sequenceDiagram
+ participant AU as Alice's
chat UI
+ participant AC as Alice's
chat core
+ participant AA as Alice's
agent
+ participant BA as Bob's
agent
+ participant BC as Bob's
chat
+ participant BU as Bob's
chat UI
+
+ note over AU, AA: Alice's app
+ note over BA, BU: Bob's app
+
+ note over AU, BU: Direct file transfer handshake
+
+ note over AU: Send message with file
+ AU ->> AC: APISendMessage with filePath
+ AC ->> AA: createConnection
+ AA ->> AC: connId, fileConnReq
+ note left of AC: createSndFileTransfer
files.ci_file_status = CIFSSndStored
snd_files.file_status = FSNew
connections.conn_type = ConnSndFile
connections.conn_status = ConnNew
+ AC ->> BC: XMsgNew with FileInvitation, fileConnReq = fileConnReq
+ note right of BC: createRcvFileTransfer
files.ci_file_status = CIFSRcvInvitation
rcv_files.file_status = FSNew
rcv_files.file_queue_info = fileConnReq
+ BC ->> BU: CRNewChatItem
+ note over BU: Accept file
+ BU ->> BC: ReceiveFile
+ BC ->> BA: joinConnection with ConnInfo = XFileAcpt
+ BA ->> BC: connId
+ note right of BC: acceptRcvFileTransfer
files.ci_file_status = CIFSRcvAccepted
rcv_files.file_status = FSAccepted
connections.conn_type = ConnRcvFile
connections.conn_status = ConnJoined
+ BA ->> AC: CONF with XFileAcpt
+ note left of AC: snd_files.file_status = FSAccepted
+ AC ->> AA: allowConnection
+ note left of AC: connections.conn_status = ConnAccepted
+ note over AA, BA: ...
Connection handshake
...
+ par Alice connected
+ AA ->> AC: CON
+ note left of AC: connections.conn_status = ConnReady
snd_files.file_status = FSConnected
files.ci_file_status = CIFSSndTransfer
+ AC ->> AU: CRSndFileStart
+ note over AC: sendFileChunk
+ and Bob Connected
+ BA ->> BC: CON
+ note right of BC: connections.conn_status = ConnReady
rcv_files.file_status = FSConnected
files.ci_file_status = CIFSRcvTransfer
+ BC ->> BU: CRRcvFileStart
+ end
+
+ note over AU, BU: Group file transfer handshake
+
+ note over AU: Send message with file
+ AU ->> AC: APISendMessage with filePath
+ note left of AC: createSndGroupFileTransfer
files.ci_file_status = CIFSSndStored
+ AC ->> BC: XMsgNew with FileInvitation, fileConnReq = Nothing
+ note right of BC: createRcvGroupFileTransfer
files.ci_file_status = CIFSRcvInvitation
rcv_files.file_status = FSNew
rcv_files.file_queue_info = NULL
+ BC ->> BU: CRNewChatItem
+ note over BU: Accept file
+ BU ->> BC: ReceiveFile
+ BC ->> BA: createConnection
+ BA ->> BC: connId, fileInvConnReq
+ note right of BC: acceptRcvFileTransfer
files.ci_file_status = CIFSRcvAccepted
rcv_files.file_status = FSAccepted
connections.conn_type = ConnRcvFile
connections.conn_status = ConnNew
+ BC ->> AC: XFileAcptInv sharedMsgId fileInvConnReq
+ AC ->> AA: joinConnection with ConnInfo = XOk
+ AA ->> AC: connId
+ note left of AC: createSndGroupFileTransferConnection
connections.conn_type = ConnSndFile
connections.conn_status = ConnNew
snd_files.file_status = FSAccepted
+ AA ->> BC: CONF with XOk
+ BC ->> BA: allowConnection
+ note right of BC: connections.conn_status = ConnAccepted
+ note over AA, BA: ...
Connection handshake
...
+ par Alice connected
+ AA ->> AC: CON
+ note left of AC: connections.conn_status = ConnReady
snd_files.file_status = FSConnected
files.ci_file_status = CIFSSndTransfer
+ AC ->> AU: CRSndFileStart
+ note over AC: sendFileChunk
+ and Bob Connected
+ BA ->> BC: CON
+ note right of BC: connections.conn_status = ConnReady
rcv_files.file_status = FSConnected
files.ci_file_status = CIFSRcvTransfer
+ BC ->> BU: CRRcvFileStart
+ end
+
+ note over AU, BU: File transfer
+
+ loop while createSndFileChunk returns chunkNo
+ AC ->> BC: FileChunk
+ AA ->> AC: SENT
+ note over BC: appendFileChunk
+ end
+ opt receiver cancelled file transfer
+ note over BU: Cancel file
+ BU ->> BC: CancelFile
+ note right of BC: files.cancelled = true
files.ci_file_status = CIFSRcvCancelled
rcv_files.file_status = FSCancelled
deleteRcvFileChunks
+ BC ->> BA: deleteConnection
+ BC ->> BU: CRRcvFileSndCancelled
+ note over AA, BA: connection is deleted
+ AC ->> BA: FileChunk
+ BA ->> AA: MERR AUTH
+ AA ->> AC: MERR
+ note over AC: cancelSndFileTransfer
+ alt AUTH
+ AC ->> AU: CRSndFileRcvCancelled
+ else other error, possibly not due to cancel
+ AC ->> AU: CEFileSend
+ end
+ end
+ AC ->> BC: Final FileChunk
+ note left of AC: snd_files.file_status = FSComplete
deleteSndFileChunks
files.ci_file_status = CIFSSndComplete
+ AC ->> AU: CRSndFileComplete
+ AC ->> AA: deleteConnection
+ note over BC: appendFileChunk
+ note right of BC: rcv_files.file_status = FSComplete
files.ci_file_status = CIFSRcvComplete
deleteRcvFileChunks
+ BC ->> BU: CRRcvFileComplete
+ BC ->> BA: deleteConnection
+
+ note over AU, BU: Sender cancels file transfer
+
+ note over AU: Cancel file
+ AU ->> AC: CancelFile
+ note left of AC: files.cancelled = true
files.ci_file_status = CIFSSndCancelled
snd_files.file_status = FSCancelled
deleteSndFileChunks
+ AC ->> BA: FileChunkCancel (over file connection)
+ note left of AC: deleteConnection
+ AC ->> BA: XFileCancel (over direct/group connection)
+ AC ->> AU: CRSndGroupFileCancelled
+ par FileChunkCancel
+ BA ->> BC: FileChunkCancel
+ note over BC: Cancel file (if it wasn't already cancelled)
+ note right of BC: files.cancelled = true
files.ci_file_status = CIFSRcvCancelled
rcv_files.file_status = FSCancelled
deleteRcvFileChunks
+ BC ->> BA: deleteConnection
+ BC ->> BU: CRRcvFileSndCancelled
+ and XFileCancel
+ BA ->> BC: XFileCancel
+ note over BC: Cancel file (if it wasn't already cancelled)
+ note right of BC: files.cancelled = true
files.ci_file_status = CIFSRcvCancelled
rcv_files.file_status = FSCancelled
deleteRcvFileChunks
+ BC ->> BA: deleteConnection
+ BC ->> BU: CRRcvFileSndCancelled
+ end
diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs
index 2bd6bdfd00..bbc8000c28 100644
--- a/src/Simplex/Chat.hs
+++ b/src/Simplex/Chat.hs
@@ -842,7 +842,7 @@ acceptFileReceive user@User {userId} RcvFileTransfer {fileId, fileInvitation = F
tryError (withAgent $ \a -> joinConnection a connReq . directMessage $ XFileAcpt fName) >>= \case
Right agentConnId -> do
filePath <- getRcvFilePath filePath_ fName
- withStore $ \st -> acceptRcvFileTransfer st user fileId agentConnId filePath
+ withStore $ \st -> acceptRcvFileTransfer st user fileId agentConnId ConnJoined filePath
Left e -> throwError e
-- group file protocol
Nothing ->
@@ -855,7 +855,7 @@ acceptFileReceive user@User {userId} RcvFileTransfer {fileId, fileInvitation = F
sharedMsgId <- withStore $ \st -> getSharedMsgIdByFileId st userId fileId
(agentConnId, fileInvConnReq) <- withAgent (`createConnection` SCMInvitation)
filePath <- getRcvFilePath filePath_ fName
- ci <- withStore $ \st -> acceptRcvFileTransfer st user fileId agentConnId filePath
+ ci <- withStore $ \st -> acceptRcvFileTransfer st user fileId agentConnId ConnNew filePath
void $ sendDirectMessage conn (XFileAcptInv sharedMsgId fileInvConnReq fName) (GroupId groupId)
pure ci
_ -> throwChatError $ CEFileInternal "member connection not active"
@@ -1836,16 +1836,18 @@ parseFileChunk msg =
appendFileChunk :: ChatMonad m => RcvFileTransfer -> Integer -> ByteString -> m ()
appendFileChunk ft@RcvFileTransfer {fileId, fileStatus} chunkNo chunk =
case fileStatus of
- RFSConnected RcvFileInfo {filePath} -> do
- fsFilePath <- toFSFilePath filePath
- append_ filePath fsFilePath
+ RFSConnected RcvFileInfo {filePath} -> append_ filePath
+ -- sometimes update of file transfer status to FSConnected
+ -- doesn't complete in time before MSG with first file chunk
+ RFSAccepted RcvFileInfo {filePath} -> append_ filePath
RFSCancelled _ -> pure ()
_ -> throwChatError $ CEFileInternal "receiving file transfer not in progress"
where
- append_ fPath fPathUsed = do
- h <- getFileHandle fileId fPathUsed rcvFiles AppendMode
+ append_ filePath = do
+ fsFilePath <- toFSFilePath filePath
+ h <- getFileHandle fileId fsFilePath rcvFiles AppendMode
E.try (liftIO $ B.hPut h chunk >> hFlush h) >>= \case
- Left (e :: E.SomeException) -> throwChatError . CEFileWrite fPath $ show e
+ Left (e :: E.SomeException) -> throwChatError . CEFileWrite fsFilePath $ show e
Right () -> withStore $ \st -> updatedRcvFileChunkStored st ft chunkNo
getFileHandle :: ChatMonad m => Int64 -> FilePath -> (ChatController -> TVar (Map Int64 Handle)) -> IOMode -> m Handle
diff --git a/src/Simplex/Chat/Store.hs b/src/Simplex/Chat/Store.hs
index 30e8f8a4d2..c08406646a 100644
--- a/src/Simplex/Chat/Store.hs
+++ b/src/Simplex/Chat/Store.hs
@@ -2025,8 +2025,8 @@ createRcvGroupFileTransfer st userId GroupMember {groupId, groupMemberId, localD
currentTs <- getCurrentTime
DB.execute
db
- "INSERT INTO files (user_id, group_id, file_name, file_size, chunk_size, created_at, updated_at) VALUES (?,?,?,?,?,?,?)"
- (userId, groupId, fileName, fileSize, chunkSize, currentTs, currentTs)
+ "INSERT INTO files (user_id, group_id, file_name, file_size, chunk_size, ci_file_status, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?)"
+ (userId, groupId, fileName, fileSize, chunkSize, CIFSRcvInvitation, currentTs, currentTs)
fileId <- insertedRowId db
DB.execute
db
@@ -2082,8 +2082,8 @@ getRcvFileTransfer_ db userId fileId =
cancelled = fromMaybe False cancelled_
rcvFileTransfer _ = Left $ SERcvFileNotFound fileId
-acceptRcvFileTransfer :: StoreMonad m => SQLiteStore -> User -> Int64 -> ConnId -> FilePath -> m AChatItem
-acceptRcvFileTransfer st user@User {userId} fileId agentConnId filePath =
+acceptRcvFileTransfer :: StoreMonad m => SQLiteStore -> User -> Int64 -> ConnId -> ConnStatus -> FilePath -> m AChatItem
+acceptRcvFileTransfer st user@User {userId} fileId agentConnId connStatus filePath =
liftIOEither . withTransaction st $ \db -> do
currentTs <- getCurrentTime
DB.execute
@@ -2097,7 +2097,7 @@ acceptRcvFileTransfer st user@User {userId} fileId agentConnId filePath =
DB.execute
db
"INSERT INTO connections (agent_conn_id, conn_status, conn_type, rcv_file_id, user_id, created_at, updated_at) VALUES (?,?,?,?,?,?,?)"
- (agentConnId, ConnJoined, ConnRcvFile, fileId, userId, currentTs, currentTs)
+ (agentConnId, connStatus, ConnRcvFile, fileId, userId, currentTs, currentTs)
getChatItemByFileId_ db user fileId
updateRcvFileStatus :: MonadUnliftIO m => SQLiteStore -> RcvFileTransfer -> FileStatus -> m ()
From 6aebb93f7f14be011f851d27c8a903ca5a5d39cd Mon Sep 17 00:00:00 2001
From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com>
Date: Thu, 12 May 2022 15:07:28 +0100
Subject: [PATCH 3/6] mobile: prevent adding spaces to display name (#643)
* mobile: prevent adding spaces to display name
* android: save enabled
Co-authored-by: JRoberts <8711996+jr-simplex@users.noreply.github.com>
---
.../app/views/usersettings/UserProfileView.kt | 30 +++++++++++++++----
.../Views/Onboarding/CreateProfile.swift | 8 ++---
.../Views/UserSettings/UserProfile.swift | 11 ++++++-
3 files changed, 39 insertions(+), 10 deletions(-)
diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/UserProfileView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/UserProfileView.kt
index 60b99c620f..967ec73f2f 100644
--- a/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/UserProfileView.kt
+++ b/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/UserProfileView.kt
@@ -10,8 +10,7 @@ import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.outlined.Close
-import androidx.compose.material.icons.outlined.PhotoCamera
+import androidx.compose.material.icons.outlined.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@@ -25,8 +24,10 @@ import androidx.compose.ui.unit.sp
import chat.simplex.app.R
import chat.simplex.app.model.ChatModel
import chat.simplex.app.model.Profile
+import chat.simplex.app.ui.theme.HighOrLowlight
import chat.simplex.app.ui.theme.SimpleXTheme
import chat.simplex.app.views.helpers.*
+import chat.simplex.app.views.isValidDisplayName
import com.google.accompanist.insets.ProvideWindowInsets
import com.google.accompanist.insets.navigationBarsWithImePadding
import kotlinx.coroutines.launch
@@ -128,7 +129,12 @@ fun UserProfileLayout(
}
}
}
- ProfileNameTextField(displayName)
+ Box {
+ if (!isValidDisplayName(displayName.value)) {
+ Icon(Icons.Outlined.Info, tint = Color.Red, contentDescription = stringResource(R.string.display_name_cannot_contain_whitespace))
+ }
+ ProfileNameTextField(displayName)
+ }
ProfileNameTextField(fullName)
Row {
TextButton(stringResource(R.string.cancel_verb)) {
@@ -138,9 +144,22 @@ fun UserProfileLayout(
editProfile.value = false
}
Spacer(Modifier.padding(horizontal = 8.dp))
- TextButton(stringResource(R.string.save_and_notify_contacts)) {
- saveProfile(displayName.value, fullName.value, profileImage.value)
+ val enabled = displayName.value.isNotEmpty() && isValidDisplayName(displayName.value)
+ val saveModifier: Modifier
+ val saveColor: Color
+ if (enabled) {
+ saveModifier = Modifier
+ .clickable { saveProfile(displayName.value, fullName.value, profileImage.value) }
+ saveColor = MaterialTheme.colors.primary
+ } else {
+ saveModifier = Modifier
+ saveColor = HighOrLowlight
}
+ Text(
+ stringResource(R.string.save_and_notify_contacts),
+ modifier = saveModifier,
+ color = saveColor
+ )
}
}
} else {
@@ -187,6 +206,7 @@ private fun ProfileNameTextField(name: MutableState) {
onValueChange = { name.value = it },
modifier = Modifier
.padding(bottom = 24.dp)
+ .padding(start = 28.dp)
.fillMaxWidth(),
textStyle = MaterialTheme.typography.body1.copy(color = MaterialTheme.colors.onBackground),
keyboardOptions = KeyboardOptions(
diff --git a/apps/ios/Shared/Views/Onboarding/CreateProfile.swift b/apps/ios/Shared/Views/Onboarding/CreateProfile.swift
index cae263e938..639a161adf 100644
--- a/apps/ios/Shared/Views/Onboarding/CreateProfile.swift
+++ b/apps/ios/Shared/Views/Onboarding/CreateProfile.swift
@@ -106,15 +106,15 @@ struct CreateProfile: View {
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
- func validDisplayName(_ name: String) -> Bool {
- name.firstIndex(of: " ") == nil
- }
-
func canCreateProfile() -> Bool {
displayName != "" && validDisplayName(displayName)
}
}
+func validDisplayName(_ name: String) -> Bool {
+ name.firstIndex(of: " ") == nil
+}
+
struct CreateProfile_Previews: PreviewProvider {
static var previews: some View {
CreateProfile()
diff --git a/apps/ios/Shared/Views/UserSettings/UserProfile.swift b/apps/ios/Shared/Views/UserSettings/UserProfile.swift
index 4de7695136..3ac68f75dc 100644
--- a/apps/ios/Shared/Views/UserSettings/UserProfile.swift
+++ b/apps/ios/Shared/Views/UserSettings/UserProfile.swift
@@ -45,11 +45,19 @@ struct UserProfile: View {
.frame(maxWidth: .infinity, alignment: .center)
VStack(alignment: .leading) {
- profileNameTextEdit("Display name", $profile.displayName)
+ ZStack(alignment: .leading) {
+ if !validDisplayName(profile.displayName) {
+ Image(systemName: "exclamationmark.circle")
+ .foregroundColor(.red)
+ .padding(.bottom, 10)
+ }
+ profileNameTextEdit("Display name", $profile.displayName)
+ }
profileNameTextEdit("Full name (optional)", $profile.fullName)
HStack(spacing: 20) {
Button("Cancel") { editProfile = false }
Button("Save (and notify contacts)") { saveProfile() }
+ .disabled(profile.displayName == "" || !validDisplayName(profile.displayName))
}
}
.frame(maxWidth: .infinity, minHeight: 120, alignment: .leading)
@@ -111,6 +119,7 @@ struct UserProfile: View {
.textInputAutocapitalization(.never)
.disableAutocorrection(true)
.padding(.bottom)
+ .padding(.leading, 28)
}
func profileNameView(_ label: String, _ name: String) -> some View {
From 66284a954b2db4c711461671b05191bf58472bd0 Mon Sep 17 00:00:00 2001
From: JRoberts <8711996+jr-simplex@users.noreply.github.com>
Date: Thu, 12 May 2022 18:51:05 +0400
Subject: [PATCH 4/6] ios: version 2.0.1 (46)
---
apps/ios/SimpleX.xcodeproj/project.pbxproj | 66 +++++++++-------------
1 file changed, 28 insertions(+), 38 deletions(-)
diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj
index bccca3627b..8e0d9867c9 100644
--- a/apps/ios/SimpleX.xcodeproj/project.pbxproj
+++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj
@@ -16,16 +16,6 @@
5C116CDC27AABE0400E66D01 /* ContactRequestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C116CDB27AABE0400E66D01 /* ContactRequestView.swift */; };
5C13730B28156D2700F43030 /* ContactConnectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C13730A28156D2700F43030 /* ContactConnectionView.swift */; };
5C1A4C1E27A715B700EAD5AD /* ChatItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */; };
- 5C293B582829490C00CB16C0 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C293B532829490C00CB16C0 /* libffi.a */; };
- 5C293B592829490C00CB16C0 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C293B532829490C00CB16C0 /* libffi.a */; };
- 5C293B5A2829490C00CB16C0 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C293B542829490C00CB16C0 /* libgmpxx.a */; };
- 5C293B5B2829490C00CB16C0 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C293B542829490C00CB16C0 /* libgmpxx.a */; };
- 5C293B5C2829490C00CB16C0 /* libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C293B552829490C00CB16C0 /* libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M-ghc8.10.7.a */; };
- 5C293B5D2829490C00CB16C0 /* libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C293B552829490C00CB16C0 /* libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M-ghc8.10.7.a */; };
- 5C293B5E2829490C00CB16C0 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C293B562829490C00CB16C0 /* libgmp.a */; };
- 5C293B5F2829490C00CB16C0 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C293B562829490C00CB16C0 /* libgmp.a */; };
- 5C293B602829490C00CB16C0 /* libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C293B572829490C00CB16C0 /* libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M.a */; };
- 5C293B612829490C00CB16C0 /* libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C293B572829490C00CB16C0 /* libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M.a */; };
5C2E260727A2941F00F70299 /* SimpleXAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260627A2941F00F70299 /* SimpleXAPI.swift */; };
5C2E260B27A30CFA00F70299 /* ChatListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260A27A30CFA00F70299 /* ChatListView.swift */; };
5C2E260F27A30FDC00F70299 /* ChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260E27A30FDC00F70299 /* ChatView.swift */; };
@@ -100,6 +90,11 @@
5CE4407927ADB701007B033A /* EmojiItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CE4407827ADB701007B033A /* EmojiItemView.swift */; };
5CEACCE327DE9246000BD591 /* ComposeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEACCE227DE9246000BD591 /* ComposeView.swift */; };
5CEACCED27DEA495000BD591 /* MsgContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEACCEC27DEA495000BD591 /* MsgContentView.swift */; };
+ 640DA1A5282D50D700AB8E8D /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 640DA1A0282D50D700AB8E8D /* libffi.a */; };
+ 640DA1A6282D50D700AB8E8D /* libHSsimplex-chat-2.0.0-JAEoKkoXJYeE6TLyZconIN-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 640DA1A1282D50D700AB8E8D /* libHSsimplex-chat-2.0.0-JAEoKkoXJYeE6TLyZconIN-ghc8.10.7.a */; };
+ 640DA1A7282D50D700AB8E8D /* libHSsimplex-chat-2.0.0-JAEoKkoXJYeE6TLyZconIN.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 640DA1A2282D50D700AB8E8D /* libHSsimplex-chat-2.0.0-JAEoKkoXJYeE6TLyZconIN.a */; };
+ 640DA1A8282D50D700AB8E8D /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 640DA1A3282D50D700AB8E8D /* libgmpxx.a */; };
+ 640DA1A9282D50D700AB8E8D /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 640DA1A4282D50D700AB8E8D /* libgmp.a */; };
640F50E327CF991C001E05C2 /* SMPServers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 640F50E227CF991C001E05C2 /* SMPServers.swift */; };
6454036F2822A9750090DDFF /* ComposeFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6454036E2822A9750090DDFF /* ComposeFileView.swift */; };
648010AB281ADD15009009B9 /* CIFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 648010AA281ADD15009009B9 /* CIFileView.swift */; };
@@ -131,11 +126,6 @@
5C13730A28156D2700F43030 /* ContactConnectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactConnectionView.swift; sourceTree = ""; };
5C13730C2815740A00F43030 /* DebugJSON.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = DebugJSON.playground; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatItemView.swift; sourceTree = ""; };
- 5C293B532829490C00CB16C0 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; };
- 5C293B542829490C00CB16C0 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; };
- 5C293B552829490C00CB16C0 /* libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M-ghc8.10.7.a"; sourceTree = ""; };
- 5C293B562829490C00CB16C0 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; };
- 5C293B572829490C00CB16C0 /* libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M.a"; sourceTree = ""; };
5C2E260627A2941F00F70299 /* SimpleXAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleXAPI.swift; sourceTree = ""; };
5C2E260A27A30CFA00F70299 /* ChatListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatListView.swift; sourceTree = ""; };
5C2E260E27A30FDC00F70299 /* ChatView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatView.swift; sourceTree = ""; };
@@ -209,6 +199,11 @@
5CE4407827ADB701007B033A /* EmojiItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiItemView.swift; sourceTree = ""; };
5CEACCE227DE9246000BD591 /* ComposeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeView.swift; sourceTree = ""; };
5CEACCEC27DEA495000BD591 /* MsgContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MsgContentView.swift; sourceTree = ""; };
+ 640DA1A0282D50D700AB8E8D /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; };
+ 640DA1A1282D50D700AB8E8D /* libHSsimplex-chat-2.0.0-JAEoKkoXJYeE6TLyZconIN-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-2.0.0-JAEoKkoXJYeE6TLyZconIN-ghc8.10.7.a"; sourceTree = ""; };
+ 640DA1A2282D50D700AB8E8D /* libHSsimplex-chat-2.0.0-JAEoKkoXJYeE6TLyZconIN.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-2.0.0-JAEoKkoXJYeE6TLyZconIN.a"; sourceTree = ""; };
+ 640DA1A3282D50D700AB8E8D /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; };
+ 640DA1A4282D50D700AB8E8D /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; };
640F50E227CF991C001E05C2 /* SMPServers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SMPServers.swift; sourceTree = ""; };
6454036E2822A9750090DDFF /* ComposeFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeFileView.swift; sourceTree = ""; };
648010AA281ADD15009009B9 /* CIFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIFileView.swift; sourceTree = ""; };
@@ -225,14 +220,14 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 640DA1A6282D50D700AB8E8D /* libHSsimplex-chat-2.0.0-JAEoKkoXJYeE6TLyZconIN-ghc8.10.7.a in Frameworks */,
5C8F01CD27A6F0D8007D2C8D /* CodeScanner in Frameworks */,
- 5C293B5E2829490C00CB16C0 /* libgmp.a in Frameworks */,
- 5C293B5C2829490C00CB16C0 /* libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M-ghc8.10.7.a in Frameworks */,
- 5C293B5A2829490C00CB16C0 /* libgmpxx.a in Frameworks */,
- 5C293B602829490C00CB16C0 /* libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M.a in Frameworks */,
+ 640DA1A9282D50D700AB8E8D /* libgmp.a in Frameworks */,
5C764E83279C748B000C6508 /* libz.tbd in Frameworks */,
5C764E82279C748B000C6508 /* libiconv.tbd in Frameworks */,
- 5C293B582829490C00CB16C0 /* libffi.a in Frameworks */,
+ 640DA1A5282D50D700AB8E8D /* libffi.a in Frameworks */,
+ 640DA1A7282D50D700AB8E8D /* libHSsimplex-chat-2.0.0-JAEoKkoXJYeE6TLyZconIN.a in Frameworks */,
+ 640DA1A8282D50D700AB8E8D /* libgmpxx.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -247,12 +242,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 5C293B5B2829490C00CB16C0 /* libgmpxx.a in Frameworks */,
5CDCAD5F28187D6900503DA2 /* libiconv.tbd in Frameworks */,
- 5C293B592829490C00CB16C0 /* libffi.a in Frameworks */,
- 5C293B5D2829490C00CB16C0 /* libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M-ghc8.10.7.a in Frameworks */,
- 5C293B5F2829490C00CB16C0 /* libgmp.a in Frameworks */,
- 5C293B612829490C00CB16C0 /* libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M.a in Frameworks */,
5CDCAD6128187D8000503DA2 /* libz.tbd in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -302,11 +292,11 @@
5C764E5C279C70B7000C6508 /* Libraries */ = {
isa = PBXGroup;
children = (
- 5C293B532829490C00CB16C0 /* libffi.a */,
- 5C293B562829490C00CB16C0 /* libgmp.a */,
- 5C293B542829490C00CB16C0 /* libgmpxx.a */,
- 5C293B552829490C00CB16C0 /* libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M-ghc8.10.7.a */,
- 5C293B572829490C00CB16C0 /* libHSsimplex-chat-1.6.0-H7MppEuDeVu3ntZTT7iY0M.a */,
+ 640DA1A0282D50D700AB8E8D /* libffi.a */,
+ 640DA1A4282D50D700AB8E8D /* libgmp.a */,
+ 640DA1A3282D50D700AB8E8D /* libgmpxx.a */,
+ 640DA1A1282D50D700AB8E8D /* libHSsimplex-chat-2.0.0-JAEoKkoXJYeE6TLyZconIN-ghc8.10.7.a */,
+ 640DA1A2282D50D700AB8E8D /* libHSsimplex-chat-2.0.0-JAEoKkoXJYeE6TLyZconIN.a */,
);
path = Libraries;
sourceTree = "";
@@ -913,7 +903,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 45;
+ CURRENT_PROJECT_VERSION = 46;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_PREVIEWS = YES;
@@ -935,7 +925,7 @@
);
"LIBRARY_SEARCH_PATHS[sdk=iphoneos*]" = "$(PROJECT_DIR)/Libraries/ios";
"LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*]" = "$(PROJECT_DIR)/Libraries/sim";
- MARKETING_VERSION = 2.0;
+ MARKETING_VERSION = 2.0.1;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
SDKROOT = iphoneos;
@@ -955,7 +945,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 45;
+ CURRENT_PROJECT_VERSION = 46;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_PREVIEWS = YES;
@@ -977,7 +967,7 @@
);
"LIBRARY_SEARCH_PATHS[sdk=iphoneos*]" = "$(PROJECT_DIR)/Libraries/ios";
"LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*]" = "$(PROJECT_DIR)/Libraries/sim";
- MARKETING_VERSION = 2.0;
+ MARKETING_VERSION = 2.0.1;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
SDKROOT = iphoneos;
@@ -1036,7 +1026,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 45;
+ CURRENT_PROJECT_VERSION = 46;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
GENERATE_INFOPLIST_FILE = YES;
@@ -1057,7 +1047,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Libraries/sim",
);
- MARKETING_VERSION = 2.0;
+ MARKETING_VERSION = 2.0.1;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
@@ -1076,7 +1066,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 45;
+ CURRENT_PROJECT_VERSION = 46;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
GENERATE_INFOPLIST_FILE = YES;
@@ -1097,7 +1087,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Libraries/sim",
);
- MARKETING_VERSION = 2.0;
+ MARKETING_VERSION = 2.0.1;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
From e958e45652432db7161f63e3bbd61208b8709b39 Mon Sep 17 00:00:00 2001
From: JRoberts <8711996+jr-simplex@users.noreply.github.com>
Date: Thu, 12 May 2022 19:03:02 +0400
Subject: [PATCH 5/6] terminal: version 2.0.1
---
package.yaml | 2 +-
simplex-chat.cabal | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.yaml b/package.yaml
index 6877733594..f9a05bfc5c 100644
--- a/package.yaml
+++ b/package.yaml
@@ -1,5 +1,5 @@
name: simplex-chat
-version: 2.0.0
+version: 2.0.1
#synopsis:
#description:
homepage: https://github.com/simplex-chat/simplex-chat#readme
diff --git a/simplex-chat.cabal b/simplex-chat.cabal
index abba53b214..e1c5c46cf7 100644
--- a/simplex-chat.cabal
+++ b/simplex-chat.cabal
@@ -5,7 +5,7 @@ cabal-version: 1.12
-- see: https://github.com/sol/hpack
name: simplex-chat
-version: 2.0.0
+version: 2.0.1
category: Web, System, Services, Cryptography
homepage: https://github.com/simplex-chat/simplex-chat#readme
author: simplex.chat
From da793bbf4f4ec1ae56e3e69f0c7db75be156be4a Mon Sep 17 00:00:00 2001
From: JRoberts <8711996+jr-simplex@users.noreply.github.com>
Date: Fri, 13 May 2022 09:32:34 +0400
Subject: [PATCH 6/6] android: version 2.0.1 (31)
---
apps/android/app/build.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/apps/android/app/build.gradle b/apps/android/app/build.gradle
index eb53bce58d..15b66cfe36 100644
--- a/apps/android/app/build.gradle
+++ b/apps/android/app/build.gradle
@@ -11,8 +11,8 @@ android {
applicationId "chat.simplex.app"
minSdk 29
targetSdk 32
- versionCode 30
- versionName "2.0"
+ versionCode 31
+ versionName "2.0.1"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {