Skip to content

Commit d776dc0

Browse files
committed
Add gift auto save privacy
1 parent 6513887 commit d776dc0

File tree

16 files changed

+461
-128
lines changed

16 files changed

+461
-128
lines changed

Telegram/Telegram-iOS/en.lproj/Localizable.strings

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13231,3 +13231,14 @@ Sorry for the inconvenience.";
1323113231

1323213232
"Notification.StarGift.Bot.Subtitle" = "Display this gift on your page.";
1323313233
"Notification.StarGift.Bot.Subtitle.Displaying" = "You are displaying this gift on your page.";
13234+
13235+
"Privacy.Gifts" = "Gifts";
13236+
"Privacy.Gifts.WhoCanSeeMyBio" = "WHO CAN DISPLAY GIFTS ON MY PROFILE";
13237+
"Privacy.Gifts.CustomHelp" = "Choose whether gifts from specific senders need your approval before they’re visible to others on your profile.";
13238+
"Privacy.Gifts.AlwaysAllow.Title" = "Always Allow";
13239+
"Privacy.Gifts.NeverAllow.Title" = "Never Allow";
13240+
13241+
"PrivacySettings.ValueBots" = "Mini Apps";
13242+
"PrivacySettings.ValueBotsPlus" = "Mini Apps +%@";
13243+
13244+
"PrivacySettings.CategoryBots" = "Mini Apps";

submodules/AccountContext/Sources/PeerSelectionController.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,4 +165,5 @@ public enum SelectivePrivacySettingsKind {
165165
case voiceMessages
166166
case bio
167167
case birthday
168+
case giftsAutoSave
168169
}

submodules/Display/Source/DeviceMetrics.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,12 @@ public enum DeviceMetrics: CaseIterable, Equatable {
223223

224224
func safeInsets(inLandscape: Bool) -> UIEdgeInsets {
225225
switch self {
226-
case .iPhoneX, .iPhoneXSMax, .iPhoneXr, .iPhone12Mini, .iPhone12, .iPhone12ProMax, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone13ProMax, .iPhone14Pro, .iPhone14ProZoomed, .iPhone14ProMax, .iPhone14ProMaxZoomed, .iPhone16Pro, .iPhone16ProMax:
226+
case .iPhoneX, .iPhoneXSMax, .iPhoneXr, .iPhone14ProZoomed, .iPhone14ProMaxZoomed:
227227
return inLandscape ? UIEdgeInsets(top: 0.0, left: 44.0, bottom: 0.0, right: 44.0) : UIEdgeInsets(top: 44.0, left: 0.0, bottom: 0.0, right: 0.0)
228+
case .iPhone12Mini, .iPhone12, .iPhone12ProMax, .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone13ProMax:
229+
return inLandscape ? UIEdgeInsets(top: 0.0, left: 47.0, bottom: 0.0, right: 47.0) : UIEdgeInsets(top: 44.0, left: 0.0, bottom: 0.0, right: 0.0)
230+
case .iPhone14Pro, .iPhone14ProMax, .iPhone16Pro, .iPhone16ProMax:
231+
return inLandscape ? UIEdgeInsets(top: 0.0, left: 59.0, bottom: 0.0, right: 59.0) : UIEdgeInsets(top: 44.0, left: 0.0, bottom: 0.0, right: 0.0)
228232
default:
229233
return UIEdgeInsets.zero
230234
}

submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift

Lines changed: 70 additions & 22 deletions
Large diffs are not rendered by default.

submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsController.swift

Lines changed: 94 additions & 40 deletions
Large diffs are not rendered by default.

submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsPeersController.swift

Lines changed: 95 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import PresentationDataUtils
1010
import AccountContext
1111
import ItemListPeerItem
1212
import ItemListPeerActionItem
13+
import AvatarNode
1314

1415
private final class SelectivePrivacyPeersControllerArguments {
1516
let context: AccountContext
@@ -20,15 +21,17 @@ private final class SelectivePrivacyPeersControllerArguments {
2021
let openPeer: (EnginePeer) -> Void
2122
let deleteAll: () -> Void
2223
let removePremiumUsers: () -> Void
24+
let removeBots: () -> Void
2325

24-
init(context: AccountContext, setPeerIdWithRevealedOptions: @escaping (EnginePeer.Id?, EnginePeer.Id?) -> Void, removePeer: @escaping (EnginePeer.Id) -> Void, addPeer: @escaping () -> Void, openPeer: @escaping (EnginePeer) -> Void, deleteAll: @escaping () -> Void, removePremiumUsers: @escaping () -> Void) {
26+
init(context: AccountContext, setPeerIdWithRevealedOptions: @escaping (EnginePeer.Id?, EnginePeer.Id?) -> Void, removePeer: @escaping (EnginePeer.Id) -> Void, addPeer: @escaping () -> Void, openPeer: @escaping (EnginePeer) -> Void, deleteAll: @escaping () -> Void, removePremiumUsers: @escaping () -> Void, removeBots: @escaping () -> Void) {
2527
self.context = context
2628
self.setPeerIdWithRevealedOptions = setPeerIdWithRevealedOptions
2729
self.removePeer = removePeer
2830
self.addPeer = addPeer
2931
self.openPeer = openPeer
3032
self.deleteAll = deleteAll
3133
self.removePremiumUsers = removePremiumUsers
34+
self.removeBots = removeBots
3235
}
3336
}
3437

@@ -41,6 +44,7 @@ private enum SelectivePrivacyPeersEntryStableId: Hashable {
4144
case header
4245
case add
4346
case premiumUsers
47+
case bots
4448
case peer(EnginePeer.Id)
4549
case delete
4650
}
@@ -49,16 +53,21 @@ private let premiumAvatarIcon: UIImage? = {
4953
return generatePremiumCategoryIcon(size: CGSize(width: 31.0, height: 31.0), cornerRadius: 8.0)
5054
}()
5155

56+
private let botsIcon: UIImage? = {
57+
return generateAvatarImage(size: CGSize(width: 31.0, height: 31.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Bot"), color: .white), cornerRadius: 8.0, color: .violet)
58+
}()
59+
5260
private enum SelectivePrivacyPeersEntry: ItemListNodeEntry {
5361
case premiumUsersItem(ItemListPeerItemEditing, Bool)
62+
case botsItem(ItemListPeerItemEditing, Bool)
5463
case peerItem(Int32, PresentationDateTimeFormat, PresentationPersonNameOrder, SelectivePrivacyPeer, ItemListPeerItemEditing, Bool)
5564
case addItem(String, Bool)
5665
case headerItem(String)
5766
case deleteItem(String)
5867

5968
var section: ItemListSectionId {
6069
switch self {
61-
case .addItem, .premiumUsersItem, .peerItem, .headerItem:
70+
case .addItem, .premiumUsersItem, .botsItem, .peerItem, .headerItem:
6271
return SelectivePrivacyPeersSection.peers.rawValue
6372
case .deleteItem:
6473
return SelectivePrivacyPeersSection.delete.rawValue
@@ -69,6 +78,8 @@ private enum SelectivePrivacyPeersEntry: ItemListNodeEntry {
6978
switch self {
7079
case .premiumUsersItem:
7180
return .premiumUsers
81+
case .botsItem:
82+
return .bots
7283
case let .peerItem(_, _, _, peer, _, _):
7384
return .peer(peer.peer.id)
7485
case .addItem:
@@ -88,6 +99,12 @@ private enum SelectivePrivacyPeersEntry: ItemListNodeEntry {
8899
} else {
89100
return false
90101
}
102+
case let .botsItem(editing, isEnabled):
103+
if case .botsItem(editing, isEnabled) = rhs {
104+
return true
105+
} else {
106+
return false
107+
}
91108
case let .peerItem(lhsIndex, lhsDateTimeFormat, lhsNameOrder, lhsPeer, lhsEditing, lhsEnabled):
92109
if case let .peerItem(rhsIndex, rhsDateTimeFormat, rhsNameOrder, rhsPeer, rhsEditing, rhsEnabled) = rhs {
93110
if lhsIndex != rhsIndex {
@@ -143,26 +160,33 @@ private enum SelectivePrivacyPeersEntry: ItemListNodeEntry {
143160
return true
144161
case let .peerItem(rhsIndex, _, _, _, _, _):
145162
return index < rhsIndex
146-
case .addItem, .headerItem, .premiumUsersItem:
163+
case .addItem, .headerItem, .premiumUsersItem, .botsItem:
147164
return false
148165
}
149166
case .premiumUsersItem:
150167
switch rhs {
151-
case .peerItem, .deleteItem:
168+
case .peerItem, .deleteItem, .botsItem:
152169
return true
153170
case .premiumUsersItem, .addItem, .headerItem:
154171
return false
155172
}
173+
case .botsItem:
174+
switch rhs {
175+
case .peerItem, .deleteItem:
176+
return true
177+
case .botsItem, .premiumUsersItem, .addItem, .headerItem:
178+
return false
179+
}
156180
case .addItem:
157181
switch rhs {
158-
case .peerItem, .deleteItem, .premiumUsersItem:
182+
case .peerItem, .deleteItem, .botsItem, .premiumUsersItem:
159183
return true
160184
case .addItem, .headerItem:
161185
return false
162186
}
163187
case .headerItem:
164188
switch rhs {
165-
case .peerItem, .deleteItem, .premiumUsersItem, .addItem:
189+
case .peerItem, .deleteItem, .botsItem, .premiumUsersItem, .addItem:
166190
return true
167191
case .headerItem:
168192
return false
@@ -182,6 +206,15 @@ private enum SelectivePrivacyPeersEntry: ItemListNodeEntry {
182206
}, removePeer: { peerId in
183207
arguments.removePremiumUsers()
184208
})
209+
case let .botsItem(editing, enabled):
210+
let peer: EnginePeer = .user(TelegramUser(
211+
id: EnginePeer.Id(namespace: Namespaces.Peer.CloudUser, id: EnginePeer.Id.Id._internalFromInt64Value(2)), accessHash: nil, firstName: presentationData.strings.PrivacySettings_CategoryBots, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil, usernames: [], storiesHidden: nil, nameColor: nil, backgroundEmojiId: nil, profileColor: nil, profileBackgroundEmojiId: nil, subscriberCount: nil))
212+
return ItemListPeerItem(presentationData: presentationData, dateTimeFormat: PresentationDateTimeFormat(), nameDisplayOrder: .firstLast, context: arguments.context, peer: peer, customAvatarIcon: botsIcon, presence: nil, text: .none, label: .none, editing: editing, switchValue: nil, enabled: enabled, selectable: true, sectionId: self.section, action: {
213+
}, setPeerIdWithRevealedOptions: { previousId, id in
214+
arguments.setPeerIdWithRevealedOptions(previousId, id)
215+
}, removePeer: { peerId in
216+
arguments.removeBots()
217+
})
185218
case let .peerItem(_, dateTimeFormat, nameDisplayOrder, peer, editing, enabled):
186219
var text: ItemListPeerItemText = .none
187220
if let group = peer.peer as? TelegramGroup {
@@ -221,11 +254,13 @@ private enum SelectivePrivacyPeersEntry: ItemListNodeEntry {
221254

222255
private struct SelectivePrivacyPeersControllerState: Equatable {
223256
var enableForPremium: Bool
257+
var enableForBots: Bool
224258
var editing: Bool
225259
var peerIdWithRevealedOptions: EnginePeer.Id?
226260

227-
init(enableForPremium: Bool, editing: Bool, peerIdWithRevealedOptions: EnginePeer.Id?) {
261+
init(enableForPremium: Bool, enableForBots: Bool, editing: Bool, peerIdWithRevealedOptions: EnginePeer.Id?) {
228262
self.enableForPremium = enableForPremium
263+
self.enableForBots = enableForBots
229264
self.editing = editing
230265
self.peerIdWithRevealedOptions = peerIdWithRevealedOptions
231266
}
@@ -247,6 +282,10 @@ private func selectivePrivacyPeersControllerEntries(presentationData: Presentati
247282
entries.append(.premiumUsersItem(ItemListPeerItemEditing(editable: true, editing: state.editing, revealed: state.peerIdWithRevealedOptions?.id._internalGetInt64Value() == 1), true))
248283
}
249284

285+
if state.enableForBots {
286+
entries.append(.botsItem(ItemListPeerItemEditing(editable: true, editing: state.editing, revealed: state.peerIdWithRevealedOptions?.id._internalGetInt64Value() == 2), true))
287+
}
288+
250289
var index: Int32 = 0
251290
for peer in peers {
252291
entries.append(.peerItem(index, presentationData.dateTimeFormat, presentationData.nameDisplayOrder, peer, ItemListPeerItemEditing(editable: true, editing: state.editing, revealed: peer.peer.id == state.peerIdWithRevealedOptions), true))
@@ -260,8 +299,8 @@ private func selectivePrivacyPeersControllerEntries(presentationData: Presentati
260299
return entries
261300
}
262301

263-
public func selectivePrivacyPeersController(context: AccountContext, title: String, initialPeers: [EnginePeer.Id: SelectivePrivacyPeer], initialEnableForPremium: Bool, displayPremiumCategory: Bool, updated: @escaping ([EnginePeer.Id: SelectivePrivacyPeer], Bool) -> Void) -> ViewController {
264-
let initialState = SelectivePrivacyPeersControllerState(enableForPremium: initialEnableForPremium, editing: false, peerIdWithRevealedOptions: nil)
302+
public func selectivePrivacyPeersController(context: AccountContext, title: String, initialPeers: [EnginePeer.Id: SelectivePrivacyPeer], initialEnableForPremium: Bool, displayPremiumCategory: Bool, initialEnableForBots: Bool, displayBotsCategory: Bool, updated: @escaping ([EnginePeer.Id: SelectivePrivacyPeer], Bool, Bool) -> Void) -> ViewController {
303+
let initialState = SelectivePrivacyPeersControllerState(enableForPremium: initialEnableForPremium, enableForBots: initialEnableForBots, editing: false, peerIdWithRevealedOptions: nil)
265304
let statePromise = ValuePromise(initialState, ignoreRepeated: true)
266305
let stateValue = Atomic(value: initialState)
267306
let updateState: ((SelectivePrivacyPeersControllerState) -> SelectivePrivacyPeersControllerState) -> Void = { f in
@@ -311,7 +350,7 @@ public func selectivePrivacyPeersController(context: AccountContext, title: Stri
311350
for peer in updatedPeers {
312351
updatedPeerDict[peer.peer.id] = peer
313352
}
314-
updated(updatedPeerDict, stateValue.with({ $0 }).enableForPremium)
353+
updated(updatedPeerDict, stateValue.with({ $0 }).enableForPremium, stateValue.with({ $0 }).enableForBots)
315354

316355
if updatedPeerDict.isEmpty {
317356
dismissImpl?()
@@ -324,6 +363,7 @@ public func selectivePrivacyPeersController(context: AccountContext, title: Stri
324363
}, addPeer: {
325364
enum AdditionalCategoryId: Int {
326365
case premiumUsers
366+
case bots
327367
}
328368

329369
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
@@ -341,6 +381,17 @@ public func selectivePrivacyPeersController(context: AccountContext, title: Stri
341381
)
342382
]
343383
}
384+
if displayBotsCategory {
385+
additionalCategories = [
386+
ChatListNodeAdditionalCategory(
387+
id: AdditionalCategoryId.bots.rawValue,
388+
icon: generateAvatarImage(size: CGSize(width: 40.0, height: 40.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Bot"), color: .white), cornerRadius: 12.0, color: .violet),
389+
smallIcon: generateAvatarImage(size: CGSize(width: 22.0, height: 22.0), icon: generateTintedImage(image: UIImage(bundleImageName: "Chat List/Filters/Bot"), color: .white), iconScale: 0.6, cornerRadius: 6.0, circleCorners: true, color: .violet),
390+
title: presentationData.strings.PrivacySettings_CategoryBots,
391+
appearance: .option(sectionTitle: presentationData.strings.PrivacySettings_SearchUserTypesHeader)
392+
)
393+
]
394+
}
344395
var selectedCategories = Set<Int>()
345396
if stateValue.with({ $0 }).enableForPremium {
346397
selectedCategories.insert(AdditionalCategoryId.premiumUsers.rawValue)
@@ -361,9 +412,11 @@ public func selectivePrivacyPeersController(context: AccountContext, title: Stri
361412
|> deliverOnMainQueue).start(next: { [weak controller] result in
362413
var peerIds: [ContactListPeerId] = []
363414
var premiumSelected = false
415+
var botsSelected = false
364416
if case let .result(peerIdsValue, additionalOptionIds) = result {
365417
peerIds = peerIdsValue
366418
premiumSelected = additionalOptionIds.contains(AdditionalCategoryId.premiumUsers.rawValue)
419+
botsSelected = additionalOptionIds.contains(AdditionalCategoryId.bots.rawValue)
367420
} else {
368421
return
369422
}
@@ -412,11 +465,12 @@ public func selectivePrivacyPeersController(context: AccountContext, title: Stri
412465
for peer in updatedPeers {
413466
updatedPeerDict[peer.peer.id] = peer
414467
}
415-
updated(updatedPeerDict, premiumSelected)
468+
updated(updatedPeerDict, premiumSelected, botsSelected)
416469

417470
updateState { state in
418471
var state = state
419472
state.enableForPremium = premiumSelected
473+
state.enableForBots = botsSelected
420474
return state
421475
}
422476

@@ -451,7 +505,7 @@ public func selectivePrivacyPeersController(context: AccountContext, title: Stri
451505
}
452506

453507
peersPromise.set(.single([]))
454-
updated([:], false)
508+
updated([:], false, false)
455509

456510
dismissImpl?()
457511

@@ -483,9 +537,36 @@ public func selectivePrivacyPeersController(context: AccountContext, title: Stri
483537
for peer in updatedPeers {
484538
updatedPeerDict[peer.peer.id] = peer
485539
}
486-
updated(updatedPeerDict, false)
540+
updated(updatedPeerDict, stateValue.with({ $0 }).enableForPremium, stateValue.with({ $0 }).enableForBots)
541+
542+
if updatedPeerDict.isEmpty && !stateValue.with({ $0 }).enableForPremium && !stateValue.with({ $0 }).enableForBots {
543+
dismissImpl?()
544+
}
545+
546+
return .complete()
547+
}
548+
549+
removePeerDisposable.set(applyPeers.start())
550+
}, removeBots: {
551+
updateState { state in
552+
var state = state
553+
state.enableForBots = false
554+
return state
555+
}
556+
let applyPeers: Signal<Void, NoError> = peersPromise.get()
557+
|> take(1)
558+
|> deliverOnMainQueue
559+
|> mapToSignal { peers -> Signal<Void, NoError> in
560+
let updatedPeers = peers
561+
peersPromise.set(.single(updatedPeers))
562+
563+
var updatedPeerDict: [EnginePeer.Id: SelectivePrivacyPeer] = [:]
564+
for peer in updatedPeers {
565+
updatedPeerDict[peer.peer.id] = peer
566+
}
567+
updated(updatedPeerDict, stateValue.with({ $0 }).enableForPremium, stateValue.with({ $0 }).enableForBots)
487568

488-
if updatedPeerDict.isEmpty && !stateValue.with({ $0 }).enableForPremium {
569+
if updatedPeerDict.isEmpty && !stateValue.with({ $0 }).enableForPremium && !stateValue.with({ $0 }).enableForBots {
489570
dismissImpl?()
490571
}
491572

submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,8 @@ private func privacySearchableItems(context: AccountContext, privacySettings: Ac
597597
current = info.bio
598598
case .birthday:
599599
current = info.birthday
600+
case .giftsAutoSave:
601+
current = info.giftsAutoSave
600602
}
601603

602604
present(.push, selectivePrivacySettingsController(context: context, kind: kind, current: current, callSettings: callSettings != nil ? (info.voiceCallsP2P, callSettings!.0) : nil, voipConfiguration: callSettings?.1, callIntegrationAvailable: CallKitIntegration.isAvailable, updated: { updated, updatedCallSettings, _, _ in

0 commit comments

Comments
 (0)