let users know when members are removed

pull/78/head
Ryan ZHAO 5 years ago
parent 997b894125
commit 0df5f857a7

@ -48,6 +48,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, nullable) UIImage *groupAvatar;
@property (nonatomic, nullable) NSSet<NSString *> *previousMemberRecipientIds;
@property (nonatomic) NSMutableSet<NSString *> *memberRecipientIds;
@property (nonatomic) NSMutableSet<NSString *> *removedRecipientIds;
@property (nonatomic) BOOL hasUnsavedChanges;
@ -89,6 +90,7 @@ NS_ASSUME_NONNULL_BEGIN
_avatarViewHelper.delegate = self;
self.memberRecipientIds = [NSMutableSet new];
self.removedRecipientIds = [NSMutableSet new];
}
#pragma mark - View Lifecycle
@ -366,6 +368,7 @@ NS_ASSUME_NONNULL_BEGIN
OWSAssertDebug(recipientId.length > 0);
[self.memberRecipientIds removeObject:recipientId];
[self.removedRecipientIds addObject:recipientId];
[self updateTableContents];
}
@ -381,6 +384,7 @@ NS_ASSUME_NONNULL_BEGIN
image:self.groupAvatar
groupId:self.thread.groupModel.groupId
groupType:self.thread.groupModel.groupType];
groupModel.removedMembers = self.removedRecipientIds;
[self.conversationSettingsViewDelegate groupWasUpdated:groupModel];
}

@ -1020,6 +1020,15 @@
/* No comment provided by engineer. */
"GROUP_MEMBER_LEFT" = " %@ left the group. ";
/* No comment provided by engineer. */
"GROUP_MEMBER_REMOVED" = " %@ was removed from the group. ";
/* No comment provided by engineer. */
"GROUP_MEMBERS_REMOVED" = " %@ were removed from the group. ";
/* No comment provided by engineer. */
"YOU_WERE_REMOVED" = " You were removed from the group. ";
/* Button label to add information to an unknown contact */
"GROUP_MEMBERS_ADD_CONTACT_INFO" = "Add Contact";

@ -1296,6 +1296,8 @@ NS_ASSUME_NONNULL_BEGIN
OWSLogWarn(@"Ignoring 'Request Group Info' message for group we no longer belong to.");
return;
}
gThread.groupModel.removedMembers = [NSMutableSet setWithArray:dataMessage.group.removedMembers];
NSString *updateGroupInfo =
[gThread.groupModel getInfoStringAboutUpdateTo:gThread.groupModel contactsManager:self.contactsManager];
@ -1358,6 +1360,7 @@ NS_ASSUME_NONNULL_BEGIN
if (groupId.length > 0) {
NSMutableSet *newMemberIds = [NSMutableSet setWithArray:dataMessage.group.members];
NSMutableSet *removedMemberIds = [NSMutableSet setWithArray:dataMessage.group.removedMembers];
for (NSString *recipientId in newMemberIds) {
if (!recipientId.isValidE164) {
OWSLogVerbose(
@ -1396,6 +1399,7 @@ NS_ASSUME_NONNULL_BEGIN
image:oldGroupThread.groupModel.groupImage
groupId:dataMessage.group.id
groupType:oldGroupThread.groupModel.groupType];
newGroupModel.removedMembers = removedMemberIds;
NSString *updateGroupInfo = [newGroupThread.groupModel getInfoStringAboutUpdateTo:newGroupModel
contactsManager:self.contactsManager];
newGroupThread.groupModel = newGroupModel;

@ -4,6 +4,7 @@
#import "ContactsManagerProtocol.h"
#import "TSYapDatabaseObject.h"
#import "TSAccountManager.h"
NS_ASSUME_NONNULL_BEGIN
@ -23,6 +24,7 @@ extern const int32_t kGroupIdLength;
@property (nullable, readonly, nonatomic) NSString *groupName;
@property (readonly, nonatomic) NSData *groupId;
@property (nonatomic) GroupType groupType;
@property (nonatomic) NSMutableSet<NSString *> *removedMembers;
#if TARGET_OS_IOS
@property (nullable, nonatomic, strong) UIImage *groupImage;

@ -50,6 +50,14 @@ const int32_t kGroupIdLength = 16;
if (_groupMemberIds == nil) {
_groupMemberIds = [NSArray new];
}
if (_groupAdminIds == nil) {
_groupAdminIds = [NSArray new];
}
if (_removedMembers == nil) {
_removedMembers = [NSMutableSet new];
}
return self;
}
@ -114,6 +122,7 @@ const int32_t kGroupIdLength = 16;
NSMutableSet *membersWhoLeft = [NSMutableSet setWithSet:oldMembers];
[membersWhoLeft minusSet:newMembers];
[membersWhoLeft minusSet:_removedMembers];
if ([membersWhoLeft count] > 0) {
@ -134,6 +143,32 @@ const int32_t kGroupIdLength = 16;
stringByAppendingString:[NSString stringWithFormat:NSLocalizedString(@"GROUP_MEMBER_JOINED", @""),
[newMembersNames componentsJoinedByString:@", "]]];
}
if ([_removedMembers count] > 0) {
NSString *masterDeviceHexEncodedPublicKey = [NSUserDefaults.standardUserDefaults stringForKey:@"masterDeviceHexEncodedPublicKey"];
NSString *hexEncodedPublicKey = masterDeviceHexEncodedPublicKey != nil ? masterDeviceHexEncodedPublicKey : [TSAccountManager localNumber];
if ([_removedMembers containsObject:hexEncodedPublicKey]) {
updatedGroupInfoString = [updatedGroupInfoString
stringByAppendingString:NSLocalizedString(@"YOU_WERE_REMOVED", @"")];
}
else {
NSArray *removedMembersNames = [[_removedMembers allObjects] map:^NSString*(NSString* item) {
return [contactsManager displayNameForPhoneIdentifier:item];
}];
if ([removedMembersNames count] > 1) {
updatedGroupInfoString = [updatedGroupInfoString
stringByAppendingString:[NSString
stringWithFormat:NSLocalizedString(@"GROUP_MEMBERS_REMOVED", @""),
[removedMembersNames componentsJoinedByString:@", "]]];
}
else {
updatedGroupInfoString = [updatedGroupInfoString
stringByAppendingString:[NSString
stringWithFormat:NSLocalizedString(@"GROUP_MEMBER_REMOVED", @""),
[removedMembersNames componentsJoinedByString:@", "]]];
}
}
}
return updatedGroupInfoString;
}
@ -150,6 +185,11 @@ const int32_t kGroupIdLength = 16;
_groupAdminIds = groupAdminIds;
}
- (void)setRemovedMembers:(NSMutableSet<NSString *> *)removedMembers
{
_removedMembers = removedMembers;
}
@end
NS_ASSUME_NONNULL_END

@ -5674,6 +5674,7 @@ extension SSKProtoAttachmentPointer.SSKProtoAttachmentPointerBuilder {
if let _value = avatar {
builder.setAvatar(_value)
}
builder.setRemovedMembers(removedMembers)
return builder
}
@ -5707,10 +5708,25 @@ extension SSKProtoAttachmentPointer.SSKProtoAttachmentPointerBuilder {
items.append(valueParam)
proto.members = items
}
@objc public func removeMembers(_ valueParam: String) {
var items = proto.members
var removed = proto.removedMembers
if let index = items.index(of: valueParam) {
items.remove(at: index)
proto.members = items
removed.append(valueParam)
proto.removedMembers = removed
}
}
@objc public func setMembers(_ wrappedItems: [String]) {
proto.members = wrappedItems
}
@objc public func setRemovedMembers(_ wrappedItems: [String]) {
proto.removedMembers = wrappedItems
}
@objc public func setAvatar(_ valueParam: SSKProtoAttachmentPointer) {
proto.avatar = valueParam.proto
@ -5746,6 +5762,10 @@ extension SSKProtoAttachmentPointer.SSKProtoAttachmentPointerBuilder {
@objc public var members: [String] {
return proto.members
}
@objc public var removedMembers: [String] {
return proto.removedMembers
}
private init(proto: SignalServiceProtos_GroupContext,
id: Data,

@ -2309,6 +2309,11 @@ struct SignalServiceProtos_GroupContext {
get {return _storage._members}
set {_uniqueStorage()._members = newValue}
}
var removedMembers: [String] {
get {return _storage._removedMembers}
set {_uniqueStorage()._removedMembers = newValue}
}
var avatar: SignalServiceProtos_AttachmentPointer {
get {return _storage._avatar ?? SignalServiceProtos_AttachmentPointer()}
@ -4943,6 +4948,7 @@ extension SignalServiceProtos_GroupContext: SwiftProtobuf.Message, SwiftProtobuf
var _type: SignalServiceProtos_GroupContext.TypeEnum? = nil
var _name: String? = nil
var _members: [String] = []
var _removedMembers: [String] = []
var _avatar: SignalServiceProtos_AttachmentPointer? = nil
static let defaultInstance = _StorageClass()
@ -4955,6 +4961,7 @@ extension SignalServiceProtos_GroupContext: SwiftProtobuf.Message, SwiftProtobuf
_name = source._name
_members = source._members
_avatar = source._avatar
_removedMembers = source._removedMembers
}
}
@ -4975,6 +4982,7 @@ extension SignalServiceProtos_GroupContext: SwiftProtobuf.Message, SwiftProtobuf
case 3: try decoder.decodeSingularStringField(value: &_storage._name)
case 4: try decoder.decodeRepeatedStringField(value: &_storage._members)
case 5: try decoder.decodeSingularMessageField(value: &_storage._avatar)
case 6: try decoder.decodeRepeatedStringField(value: &_storage._removedMembers)
default: break
}
}

Loading…
Cancel
Save