Merge branch 'stable'

This commit is contained in:
Evgeny Poberezkin 2023-08-12 21:21:45 +01:00
commit d0f4533a09
6 changed files with 24 additions and 66 deletions

View File

@ -1688,7 +1688,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Libraries/sim", "$(PROJECT_DIR)/Libraries/sim",
); );
MARKETING_VERSION = 5.2.2; MARKETING_VERSION = 5.3;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos; SDKROOT = iphoneos;
@ -1734,7 +1734,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Libraries/sim", "$(PROJECT_DIR)/Libraries/sim",
); );
MARKETING_VERSION = 5.2.2; MARKETING_VERSION = 5.3;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos; SDKROOT = iphoneos;

View File

@ -24,9 +24,8 @@
<application <application
android:name="SimplexApp" android:name="SimplexApp"
android:allowBackup="true" android:allowBackup="false"
android:fullBackupOnly="true" android:fullBackupOnly="false"
android:backupAgent="BackupAgent"
android:icon="@mipmap/icon" android:icon="@mipmap/icon"
android:label="${app_name}" android:label="${app_name}"
android:extractNativeLibs="${extract_native_libs}" android:extractNativeLibs="${extract_native_libs}"

View File

@ -1,18 +0,0 @@
package chat.simplex.app
import android.app.backup.BackupAgentHelper
import android.app.backup.FullBackupDataOutput
import android.content.Context
import chat.simplex.common.model.AppPreferences
import chat.simplex.common.model.AppPreferences.Companion.SHARED_PREFS_PRIVACY_FULL_BACKUP
class BackupAgent: BackupAgentHelper() {
override fun onFullBackup(data: FullBackupDataOutput?) {
if (applicationContext
.getSharedPreferences(AppPreferences.SHARED_PREFS_ID, Context.MODE_PRIVATE)
.getBoolean(SHARED_PREFS_PRIVACY_FULL_BACKUP, true)
) {
super.onFullBackup(data)
}
}
}

View File

@ -92,7 +92,6 @@ class AppPreferences {
set = fun(mode: SimplexLinkMode) { _simplexLinkMode.set(mode.name) } set = fun(mode: SimplexLinkMode) { _simplexLinkMode.set(mode.name) }
) )
val privacyDeliveryReceiptsSet = mkBoolPreference(SHARED_PREFS_PRIVACY_DELIVERY_RECEIPTS_SET, false) val privacyDeliveryReceiptsSet = mkBoolPreference(SHARED_PREFS_PRIVACY_DELIVERY_RECEIPTS_SET, false)
val privacyFullBackup = mkBoolPreference(SHARED_PREFS_PRIVACY_FULL_BACKUP, false)
val experimentalCalls = mkBoolPreference(SHARED_PREFS_EXPERIMENTAL_CALLS, false) val experimentalCalls = mkBoolPreference(SHARED_PREFS_EXPERIMENTAL_CALLS, false)
val showUnreadAndFavorites = mkBoolPreference(SHARED_PREFS_SHOW_UNREAD_AND_FAVORITES, false) val showUnreadAndFavorites = mkBoolPreference(SHARED_PREFS_SHOW_UNREAD_AND_FAVORITES, false)
val chatArchiveName = mkStrPreference(SHARED_PREFS_CHAT_ARCHIVE_NAME, null) val chatArchiveName = mkStrPreference(SHARED_PREFS_CHAT_ARCHIVE_NAME, null)

View File

@ -78,7 +78,6 @@ fun DatabaseView(
chatArchiveName, chatArchiveName,
chatArchiveTime, chatArchiveTime,
chatLastStart, chatLastStart,
m.controller.appPrefs.privacyFullBackup,
appFilesCountAndSize, appFilesCountAndSize,
chatItemTTL, chatItemTTL,
m.currentUser.value, m.currentUser.value,
@ -128,7 +127,6 @@ fun DatabaseLayout(
chatArchiveName: MutableState<String?>, chatArchiveName: MutableState<String?>,
chatArchiveTime: MutableState<Instant?>, chatArchiveTime: MutableState<Instant?>,
chatLastStart: MutableState<Instant?>, chatLastStart: MutableState<Instant?>,
privacyFullBackup: SharedPreference<Boolean>,
appFilesCountAndSize: MutableState<Pair<Int, Long>>, appFilesCountAndSize: MutableState<Pair<Int, Long>>,
chatItemTTL: MutableState<ChatItemTTL>, chatItemTTL: MutableState<ChatItemTTL>,
currentUser: User?, currentUser: User?,
@ -168,6 +166,13 @@ fun DatabaseLayout(
SectionView(stringResource(MR.strings.run_chat_section)) { SectionView(stringResource(MR.strings.run_chat_section)) {
RunChatSetting(runChat, stopped, startChat, stopChatAlert) RunChatSetting(runChat, stopped, startChat, stopChatAlert)
} }
SectionTextFooter(
if (stopped) {
stringResource(MR.strings.you_must_use_the_most_recent_version_of_database)
} else {
stringResource(MR.strings.stop_chat_to_enable_database_actions)
}
)
SectionDividerSpaced() SectionDividerSpaced()
SectionView(stringResource(MR.strings.chat_database_section)) { SectionView(stringResource(MR.strings.chat_database_section)) {
@ -180,8 +185,6 @@ fun DatabaseLayout(
iconColor = if (unencrypted) WarningOrange else MaterialTheme.colors.secondary, iconColor = if (unencrypted) WarningOrange else MaterialTheme.colors.secondary,
disabled = operationsDisabled disabled = operationsDisabled
) )
AppDataBackupPreference(privacyFullBackup, initialRandomDBPassphrase)
SectionDividerSpaced(maxBottomPadding = false)
SettingsActionItem( SettingsActionItem(
painterResource(MR.images.ic_ios_share), painterResource(MR.images.ic_ios_share),
stringResource(MR.strings.export_database), stringResource(MR.strings.export_database),
@ -225,13 +228,6 @@ fun DatabaseLayout(
disabled = operationsDisabled disabled = operationsDisabled
) )
} }
SectionTextFooter(
if (stopped) {
stringResource(MR.strings.you_must_use_the_most_recent_version_of_database)
} else {
stringResource(MR.strings.stop_chat_to_enable_database_actions)
}
)
SectionDividerSpaced(maxTopPadding = true) SectionDividerSpaced(maxTopPadding = true)
SectionView(stringResource(MR.strings.files_and_media_section).uppercase()) { SectionView(stringResource(MR.strings.files_and_media_section).uppercase()) {
@ -258,23 +254,6 @@ fun DatabaseLayout(
} }
} }
@Composable
private fun AppDataBackupPreference(privacyFullBackup: SharedPreference<Boolean>, initialRandomDBPassphrase: SharedPreference<Boolean>) {
SettingsPreferenceItem(
painterResource(MR.images.ic_backup),
iconColor = MaterialTheme.colors.secondary,
pref = privacyFullBackup,
text = stringResource(MR.strings.full_backup)
) {
if (initialRandomDBPassphrase.get()) {
exportProhibitedAlert()
privacyFullBackup.set(false)
} else {
privacyFullBackup.set(it)
}
}
}
private fun setChatItemTTLAlert( private fun setChatItemTTLAlert(
m: ChatModel, selectedChatItemTTL: MutableState<ChatItemTTL>, m: ChatModel, selectedChatItemTTL: MutableState<ChatItemTTL>,
progressIndicator: MutableState<Boolean>, progressIndicator: MutableState<Boolean>,
@ -683,7 +662,6 @@ fun PreviewDatabaseLayout() {
chatArchiveName = remember { mutableStateOf("dummy_archive") }, chatArchiveName = remember { mutableStateOf("dummy_archive") },
chatArchiveTime = remember { mutableStateOf(Clock.System.now()) }, chatArchiveTime = remember { mutableStateOf(Clock.System.now()) },
chatLastStart = remember { mutableStateOf(Clock.System.now()) }, chatLastStart = remember { mutableStateOf(Clock.System.now()) },
privacyFullBackup = SharedPreference({ true }, {}),
appFilesCountAndSize = remember { mutableStateOf(0 to 0L) }, appFilesCountAndSize = remember { mutableStateOf(0 to 0L) },
chatItemTTL = remember { mutableStateOf(ChatItemTTL.None) }, chatItemTTL = remember { mutableStateOf(ChatItemTTL.None) },
currentUser = User.sampleData, currentUser = User.sampleData,

View File

@ -242,11 +242,11 @@ getGroupAndMember db User {userId, userContactId} groupMemberId =
LEFT JOIN connections c ON c.connection_id = ( LEFT JOIN connections c ON c.connection_id = (
SELECT max(cc.connection_id) SELECT max(cc.connection_id)
FROM connections cc FROM connections cc
where cc.group_member_id = m.group_member_id where cc.user_id = ? AND cc.group_member_id = m.group_member_id
) )
WHERE m.group_member_id = ? AND g.user_id = ? AND mu.contact_id = ? WHERE m.group_member_id = ? AND g.user_id = ? AND mu.contact_id = ?
|] |]
(groupMemberId, userId, userContactId) (userId, groupMemberId, userId, userContactId)
where where
toGroupAndMember :: (GroupInfoRow :. GroupMemberRow :. MaybeConnectionRow) -> (GroupInfo, GroupMember) toGroupAndMember :: (GroupInfoRow :. GroupMemberRow :. MaybeConnectionRow) -> (GroupInfo, GroupMember)
toGroupAndMember (groupInfoRow :. memberRow :. connRow) = toGroupAndMember (groupInfoRow :. memberRow :. connRow) =
@ -530,7 +530,7 @@ groupMemberQuery =
LEFT JOIN connections c ON c.connection_id = ( LEFT JOIN connections c ON c.connection_id = (
SELECT max(cc.connection_id) SELECT max(cc.connection_id)
FROM connections cc FROM connections cc
where cc.group_member_id = m.group_member_id where cc.user_id = ? AND cc.group_member_id = m.group_member_id
) )
|] |]
@ -540,7 +540,7 @@ getGroupMember db user@User {userId} groupId groupMemberId =
DB.query DB.query
db db
(groupMemberQuery <> " WHERE m.group_id = ? AND m.group_member_id = ? AND m.user_id = ?") (groupMemberQuery <> " WHERE m.group_id = ? AND m.group_member_id = ? AND m.user_id = ?")
(groupId, groupMemberId, userId) (userId, groupId, groupMemberId, userId)
getGroupMemberById :: DB.Connection -> User -> GroupMemberId -> ExceptT StoreError IO GroupMember getGroupMemberById :: DB.Connection -> User -> GroupMemberId -> ExceptT StoreError IO GroupMember
getGroupMemberById db user@User {userId} groupMemberId = getGroupMemberById db user@User {userId} groupMemberId =
@ -548,7 +548,7 @@ getGroupMemberById db user@User {userId} groupMemberId =
DB.query DB.query
db db
(groupMemberQuery <> " WHERE m.group_member_id = ? AND m.user_id = ?") (groupMemberQuery <> " WHERE m.group_member_id = ? AND m.user_id = ?")
(groupMemberId, userId) (userId, groupMemberId, userId)
getGroupMembers :: DB.Connection -> User -> GroupInfo -> IO [GroupMember] getGroupMembers :: DB.Connection -> User -> GroupInfo -> IO [GroupMember]
getGroupMembers db user@User {userId, userContactId} GroupInfo {groupId} = do getGroupMembers db user@User {userId, userContactId} GroupInfo {groupId} = do
@ -556,7 +556,7 @@ getGroupMembers db user@User {userId, userContactId} GroupInfo {groupId} = do
<$> DB.query <$> DB.query
db db
(groupMemberQuery <> " WHERE m.group_id = ? AND m.user_id = ? AND (m.contact_id IS NULL OR m.contact_id != ?)") (groupMemberQuery <> " WHERE m.group_id = ? AND m.user_id = ? AND (m.contact_id IS NULL OR m.contact_id != ?)")
(groupId, userId, userContactId) (userId, groupId, userId, userContactId)
getGroupMembersForExpiration :: DB.Connection -> User -> GroupInfo -> IO [GroupMember] getGroupMembersForExpiration :: DB.Connection -> User -> GroupInfo -> IO [GroupMember]
getGroupMembersForExpiration db user@User {userId, userContactId} GroupInfo {groupId} = do getGroupMembersForExpiration db user@User {userId, userContactId} GroupInfo {groupId} = do
@ -572,7 +572,7 @@ getGroupMembersForExpiration db user@User {userId, userContactId} GroupInfo {gro
) )
|] |]
) )
(groupId, userId, userContactId, GSMemRemoved, GSMemLeft, GSMemGroupDeleted) (userId, groupId, userId, userContactId, GSMemRemoved, GSMemLeft, GSMemGroupDeleted)
toContactMember :: User -> (GroupMemberRow :. MaybeConnectionRow) -> GroupMember toContactMember :: User -> (GroupMemberRow :. MaybeConnectionRow) -> GroupMember
toContactMember User {userContactId} (memberRow :. connRow) = toContactMember User {userContactId} (memberRow :. connRow) =
@ -998,11 +998,11 @@ getViaGroupMember db User {userId, userContactId} Contact {contactId} =
LEFT JOIN connections c ON c.connection_id = ( LEFT JOIN connections c ON c.connection_id = (
SELECT max(cc.connection_id) SELECT max(cc.connection_id)
FROM connections cc FROM connections cc
where cc.group_member_id = m.group_member_id where cc.user_id = ? AND cc.group_member_id = m.group_member_id
) )
WHERE ct.user_id = ? AND ct.contact_id = ? AND mu.contact_id = ? AND ct.deleted = 0 WHERE ct.user_id = ? AND ct.contact_id = ? AND mu.contact_id = ? AND ct.deleted = 0
|] |]
(userId, contactId, userContactId) (userId, userId, contactId, userContactId)
where where
toGroupAndMember :: (GroupInfoRow :. GroupMemberRow :. MaybeConnectionRow) -> (GroupInfo, GroupMember) toGroupAndMember :: (GroupInfoRow :. GroupMemberRow :. MaybeConnectionRow) -> (GroupInfo, GroupMember)
toGroupAndMember (groupInfoRow :. memberRow :. connRow) = toGroupAndMember (groupInfoRow :. memberRow :. connRow) =
@ -1296,11 +1296,11 @@ getXGrpMemIntroContDirect db User {userId} Contact {contactId} = do
LEFT JOIN connections ch ON ch.connection_id = ( LEFT JOIN connections ch ON ch.connection_id = (
SELECT max(cc.connection_id) SELECT max(cc.connection_id)
FROM connections cc FROM connections cc
where cc.group_member_id = mh.group_member_id where cc.user_id = ? AND cc.group_member_id = mh.group_member_id
) )
WHERE ct.user_id = ? AND ct.contact_id = ? AND ct.deleted = 0 AND mh.member_category = ? WHERE ct.user_id = ? AND ct.contact_id = ? AND ct.deleted = 0 AND mh.member_category = ?
|] |]
(userId, contactId, GCHostMember) (userId, userId, contactId, GCHostMember)
where where
toCont :: (Int64, GroupId, GroupMemberId, MemberId, Maybe ConnReqInvitation) -> Maybe (Int64, XGrpMemIntroCont) toCont :: (Int64, GroupId, GroupMemberId, MemberId, Maybe ConnReqInvitation) -> Maybe (Int64, XGrpMemIntroCont)
toCont (hostConnId, groupId, groupMemberId, memberId, connReq_) = case connReq_ of toCont (hostConnId, groupId, groupMemberId, memberId, connReq_) = case connReq_ of
@ -1326,11 +1326,11 @@ getXGrpMemIntroContGroup db User {userId} GroupMember {groupMemberId} = do
LEFT JOIN connections ch ON ch.connection_id = ( LEFT JOIN connections ch ON ch.connection_id = (
SELECT max(cc.connection_id) SELECT max(cc.connection_id)
FROM connections cc FROM connections cc
where cc.group_member_id = mh.group_member_id where cc.user_id = ? AND cc.group_member_id = mh.group_member_id
) )
WHERE m.user_id = ? AND m.group_member_id = ? AND mh.member_category = ? AND ct.deleted = 0 WHERE m.user_id = ? AND m.group_member_id = ? AND mh.member_category = ? AND ct.deleted = 0
|] |]
(userId, groupMemberId, GCHostMember) (userId, userId, groupMemberId, GCHostMember)
where where
toCont :: (Int64, Maybe ConnReqInvitation) -> Maybe (Int64, ConnReqInvitation) toCont :: (Int64, Maybe ConnReqInvitation) -> Maybe (Int64, ConnReqInvitation)
toCont (hostConnId, connReq_) = case connReq_ of toCont (hostConnId, connReq_) = case connReq_ of