From 280ee809f0c6dcb3dfd80a4e8dfbcc879464b688 Mon Sep 17 00:00:00 2001 From: giomfo Date: Tue, 12 Jul 2016 17:22:06 +0200 Subject: [PATCH] Room Settings: Add "Addresses" section #412 - Add a notice "To link to a room it must have an address." when the user let anyone who knows the room's link access the room, whereas no address is defined --- Vector/Assets/en.lproj/Vector.strings | 1 + .../RoomSettingsViewController.m | 205 +++++++++++++----- 2 files changed, 148 insertions(+), 58 deletions(-) diff --git a/Vector/Assets/en.lproj/Vector.strings b/Vector/Assets/en.lproj/Vector.strings index 51b5c79dc..3a2c846ef 100644 --- a/Vector/Assets/en.lproj/Vector.strings +++ b/Vector/Assets/en.lproj/Vector.strings @@ -253,6 +253,7 @@ "room_details_access_section_invited_only"="Only people who have been invited"; "room_details_access_section_anyone_apart_from_guest"="Anyone who knows the room's link, apart from guests"; "room_details_access_section_anyone"="Anyone who knows the room's link, including guests"; +"room_details_access_section_no_address_warning" = "To link to a room it must have an address"; "room_details_access_section_directory_toggle"="List this room in room directory"; "room_details_history_section"="Who can read history?"; "room_details_history_section_anyone"="Anyone"; diff --git a/Vector/ViewController/RoomSettingsViewController.m b/Vector/ViewController/RoomSettingsViewController.m index 091cf05c3..b31b9910c 100644 --- a/Vector/ViewController/RoomSettingsViewController.m +++ b/Vector/ViewController/RoomSettingsViewController.m @@ -50,8 +50,7 @@ #define ROOM_SETTINGS_ROOM_ACCESS_SECTION_ROW_INVITED_ONLY 0 #define ROOM_SETTINGS_ROOM_ACCESS_SECTION_ROW_ANYONE_APART_FROM_GUEST 1 #define ROOM_SETTINGS_ROOM_ACCESS_SECTION_ROW_ANYONE 2 -#define ROOM_SETTINGS_ROOM_ACCESS_SECTION_ROW_DIRECTORY_TOGGLE 3 -#define ROOM_SETTINGS_ROOM_ACCESS_SECTION_ROW_COUNT 4 +#define ROOM_SETTINGS_ROOM_ACCESS_SECTION_ROW_SUB_COUNT 3 #define ROOM_SETTINGS_HISTORY_VISIBILITY_SECTION_ROW_ANYONE 0 #define ROOM_SETTINGS_HISTORY_VISIBILITY_SECTION_ROW_MEMBERS_ONLY 1 @@ -77,6 +76,7 @@ NSString *const kRoomSettingsCanonicalAliasKey = @"kRoomSettingsCanonicalAliasKe NSString *const kRoomSettingsNameCellViewIdentifier = @"kRoomSettingsNameCellViewIdentifier"; NSString *const kRoomSettingsTopicCellViewIdentifier = @"kRoomSettingsTopicCellViewIdentifier"; +NSString *const kRoomSettingsWarningCellViewIdentifier = @"kRoomSettingsWarningCellViewIdentifier"; NSString *const kRoomSettingsNewAddressCellViewIdentifier = @"kRoomSettingsNewAddressCellViewIdentifier"; NSString *const kRoomSettingsAddressCellViewIdentifier = @"kRoomSettingsAddressCellViewIdentifier"; NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvancedCellViewIdentifier"; @@ -94,6 +94,8 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance TableViewCellWithCheckBoxes *roomTagCell; // Room Access items + NSInteger directoryVisibilityIndex; + NSInteger missingAddressWarningIndex; TableViewCellWithCheckBoxAndLabel *accessInvitedOnlyTickCell; TableViewCellWithCheckBoxAndLabel *accessAnyoneApartGuestTickCell; TableViewCellWithCheckBoxAndLabel *accessAnyoneTickCell; @@ -175,6 +177,7 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance [self.tableView registerClass:TableViewCellWithLabelAndLargeTextView.class forCellReuseIdentifier:kRoomSettingsTopicCellViewIdentifier]; [self.tableView registerClass:MXKTableViewCellWithLabelAndTextField.class forCellReuseIdentifier:kRoomSettingsNewAddressCellViewIdentifier]; [self.tableView registerClass:UITableViewCell.class forCellReuseIdentifier:kRoomSettingsAddressCellViewIdentifier]; + [self.tableView registerClass:UITableViewCell.class forCellReuseIdentifier:kRoomSettingsWarningCellViewIdentifier]; [self.tableView registerClass:MXKTableViewCellWithButton.class forCellReuseIdentifier:[MXKTableViewCellWithButton defaultReuseIdentifier]]; [self.tableView registerClass:TableViewCellWithCheckBoxes.class forCellReuseIdentifier:[TableViewCellWithCheckBoxes defaultReuseIdentifier]]; @@ -1404,62 +1407,86 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + // Refresh here the room addresses list + [roomAddresses removeAllObjects]; + localAddressesCount = 0; + + NSArray *removedAliases = [updatedItemsDict objectForKey:kRoomSettingsRemovedAliasesKey]; + + NSArray *aliases = mxRoomState.aliases; + if (aliases) + { + for (NSString *alias in aliases) + { + // Check whether the user did not remove it + if (!removedAliases || [removedAliases indexOfObject:alias] == NSNotFound) + { + // Add it + if ([alias hasSuffix:self.mainSession.matrixRestClient.homeserverSuffix]) + { + [roomAddresses insertObject:alias atIndex:localAddressesCount]; + localAddressesCount++; + } + else + { + [roomAddresses addObject:alias]; + } + } + } + } + + aliases = [updatedItemsDict objectForKey:kRoomSettingsNewAliasesKey]; + for (NSString *alias in aliases) + { + // Add this new alias to local addresses + [roomAddresses insertObject:alias atIndex:localAddressesCount]; + localAddressesCount++; + } + + // Return the fixed number of sections return ROOM_SETTINGS_SECTION_COUNT; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + NSInteger count = 0; + if (section == ROOM_SETTINGS_MAIN_SECTION_INDEX) { - return ROOM_SETTINGS_MAIN_SECTION_ROW_COUNT; + count = ROOM_SETTINGS_MAIN_SECTION_ROW_COUNT; } else if (section == ROOM_SETTINGS_ROOM_ACCESS_SECTION_INDEX) { - return ROOM_SETTINGS_ROOM_ACCESS_SECTION_ROW_COUNT; + missingAddressWarningIndex = -1; + directoryVisibilityIndex = -1; + + count = ROOM_SETTINGS_ROOM_ACCESS_SECTION_ROW_SUB_COUNT; + + // Check whether a room address is required for the current join rule + NSString *joinRule = [updatedItemsDict objectForKey:kRoomSettingsJoinRuleKey]; + if (!joinRule) + { + // Use the actual values if no change is pending. + joinRule = mxRoomState.joinRule; + } + + if ([joinRule isEqualToString:kMXRoomJoinRulePublic] && !roomAddresses.count) + { + // Notify the user that a room address is required. + missingAddressWarningIndex = count++; + } + + directoryVisibilityIndex = count++; } else if (section == ROOM_SETTINGS_HISTORY_VISIBILITY_SECTION_INDEX) { - return ROOM_SETTINGS_HISTORY_VISIBILITY_SECTION_ROW_COUNT; + count = ROOM_SETTINGS_HISTORY_VISIBILITY_SECTION_ROW_COUNT; } else if (section == ROOM_SETTINGS_ROOM_ADDRESSES_SECTION_INDEX) { - [roomAddresses removeAllObjects]; - localAddressesCount = 0; roomAddressNewAliasIndex = -1; - NSArray *removedAliases = [updatedItemsDict objectForKey:kRoomSettingsRemovedAliasesKey]; - - NSArray *aliases = mxRoomState.aliases; - if (aliases) - { - for (NSString *alias in aliases) - { - // Check whether the user did not remove it - if (!removedAliases || [removedAliases indexOfObject:alias] == NSNotFound) - { - // Add it - if ([alias hasSuffix:self.mainSession.matrixRestClient.homeserverSuffix]) - { - [roomAddresses insertObject:alias atIndex:localAddressesCount]; - localAddressesCount++; - } - else - { - [roomAddresses addObject:alias]; - } - } - } - } - - aliases = [updatedItemsDict objectForKey:kRoomSettingsNewAliasesKey]; - for (NSString *alias in aliases) - { - // Add this new alias to local addresses - [roomAddresses insertObject:alias atIndex:localAddressesCount]; - localAddressesCount++; - } - - NSInteger count = (localAddressesCount ? roomAddresses.count : roomAddresses.count + 1); + count = (localAddressesCount ? roomAddresses.count : roomAddresses.count + 1); if (self.mainSession) { @@ -1472,15 +1499,13 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance roomAddressNewAliasIndex = count++; } } - - return count; } else if (section == ROOM_SETTINGS_ADVANCED_SECTION_INDEX) { - return 1; + count = 1; } - return 0; + return count; } - (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section @@ -1723,7 +1748,7 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance } else if (indexPath.section == ROOM_SETTINGS_ROOM_ACCESS_SECTION_INDEX) { - if (indexPath.row == ROOM_SETTINGS_ROOM_ACCESS_SECTION_ROW_DIRECTORY_TOGGLE) + if (indexPath.row == directoryVisibilityIndex) { MXKTableViewCellWithLabelAndSwitch *directoryToggleCell = [tableView dequeueReusableCellWithIdentifier:[MXKTableViewCellWithLabelAndSwitch defaultReuseIdentifier] forIndexPath:indexPath]; @@ -1753,6 +1778,18 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance cell = directoryToggleCell; } + else if (indexPath.row == missingAddressWarningIndex) + { + cell = [tableView dequeueReusableCellWithIdentifier:kRoomSettingsWarningCellViewIdentifier forIndexPath:indexPath]; + + cell.textLabel.font = [UIFont systemFontOfSize:17]; + cell.textLabel.textColor = kVectorColorPinkRed; + cell.textLabel.lineBreakMode = NSLineBreakByTruncatingMiddle; + cell.accessoryView = nil; + cell.accessoryType = UITableViewCellAccessoryNone; + cell.selectionStyle = UITableViewCellSelectionStyleNone; + cell.textLabel.text = NSLocalizedStringFromTable(@"room_details_access_section_no_address_warning", @"Vector", nil); + } else { TableViewCellWithCheckBoxAndLabel *roomAccessCell = [tableView dequeueReusableCellWithIdentifier:[TableViewCellWithCheckBoxAndLabel defaultReuseIdentifier] forIndexPath:indexPath]; @@ -2040,6 +2077,8 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance } else if (indexPath.section == ROOM_SETTINGS_ROOM_ACCESS_SECTION_INDEX) { + BOOL isUpdated = NO; + if (indexPath.row == ROOM_SETTINGS_ROOM_ACCESS_SECTION_ROW_INVITED_ONLY) { // Ignore the selection if the option is already enabled @@ -2073,6 +2112,8 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance [updatedItemsDict setObject:kMXRoomGuestAccessCanJoin forKey:kRoomSettingsGuestAccessKey]; } } + + isUpdated = YES; } } else if (indexPath.row == ROOM_SETTINGS_ROOM_ACCESS_SECTION_ROW_ANYONE_APART_FROM_GUEST) @@ -2113,6 +2154,8 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance [updatedItemsDict setObject:kMXRoomGuestAccessForbidden forKey:kRoomSettingsGuestAccessKey]; } } + + isUpdated = YES; } } else if (indexPath.row == ROOM_SETTINGS_ROOM_ACCESS_SECTION_ROW_ANYONE) @@ -2153,10 +2196,24 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance [updatedItemsDict setObject:kMXRoomGuestAccessCanJoin forKey:kRoomSettingsGuestAccessKey]; } } + + isUpdated = YES; } } + else if (indexPath.row == missingAddressWarningIndex) + { + // Scroll to room addresses section + NSIndexPath *addressIndexPath = [NSIndexPath indexPathForRow:0 inSection:ROOM_SETTINGS_ROOM_ADDRESSES_SECTION_INDEX]; + [tableView scrollToRowAtIndexPath:addressIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; + } - [self getNavigationItem].rightBarButtonItem.enabled = (updatedItemsDict.count != 0); + if (isUpdated) + { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:ROOM_SETTINGS_ROOM_ACCESS_SECTION_INDEX]; + [self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationNone]; + + [self getNavigationItem].rightBarButtonItem.enabled = (updatedItemsDict.count != 0); + } } else if (indexPath.section == ROOM_SETTINGS_HISTORY_VISIBILITY_SECTION_INDEX) { @@ -2224,11 +2281,12 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance { if ([alias isEqualToString:canonicalAlias]) { - // Prompt user before removing the current main address + // Prompt user before removing the current main address (use dispatch_async here to not be stuck by the table refresh). dispatch_async(dispatch_get_main_queue(), ^{ + [self shouldRemoveCanonicalAlias:nil]; + }); - } else { @@ -2242,7 +2300,7 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance [updatedItemsDict setObject:alias forKey:kRoomSettingsCanonicalAliasKey]; } - NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(ROOM_SETTINGS_ROOM_ADDRESSES_SECTION_INDEX, 1)]; + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:ROOM_SETTINGS_ROOM_ADDRESSES_SECTION_INDEX]; [self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationNone]; [self getNavigationItem].rightBarButtonItem.enabled = (updatedItemsDict.count != 0); @@ -2256,7 +2314,12 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; if (cell) { - [self promptUserToCopyRoomId:cell.detailTextLabel]; + // Prompt user to copy the room id (use dispatch_async here to not be stuck by the table refresh). + dispatch_async(dispatch_get_main_queue(), ^{ + + [self promptUserToCopyRoomId:cell.detailTextLabel]; + + }); } } @@ -2384,7 +2447,7 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance // Remove the canonical address [strongSelf->updatedItemsDict setObject:@"" forKey:kRoomSettingsCanonicalAliasKey]; - NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(ROOM_SETTINGS_ROOM_ADDRESSES_SECTION_INDEX, 1)]; + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:ROOM_SETTINGS_ROOM_ADDRESSES_SECTION_INDEX]; [strongSelf.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationNone]; [strongSelf getNavigationItem].rightBarButtonItem.enabled = (strongSelf->updatedItemsDict.count != 0); @@ -2611,8 +2674,16 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance [removedAlias addObject:roomAlias]; } - NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(ROOM_SETTINGS_ROOM_ADDRESSES_SECTION_INDEX, 1)]; - [self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationNone]; + NSMutableIndexSet *mutableIndexSet = [NSMutableIndexSet indexSet]; + + if (roomAddresses.count <= 1) + { + // The user remove here all the room addresses, reload the room access section to display potential warning message + [mutableIndexSet addIndex:ROOM_SETTINGS_ROOM_ACCESS_SECTION_INDEX]; + } + + [mutableIndexSet addIndex:ROOM_SETTINGS_ROOM_ADDRESSES_SECTION_INDEX]; + [self.tableView reloadSections:mutableIndexSet withRowAnimation:UITableViewRowAnimationAutomatic]; [self getNavigationItem].rightBarButtonItem.enabled = (updatedItemsDict.count != 0); } @@ -2645,16 +2716,34 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance } [addedAlias addObject:roomAlias]; - - if (!roomAddresses.count) + } + + NSMutableIndexSet *mutableIndexSet = [NSMutableIndexSet indexSet]; + + if (!roomAddresses.count) + { + // The first added alias is defined as the main address by default. + // Update the current canonical address. + NSString *currentCanonicalAlias = mxRoomState.canonicalAlias; + if (currentCanonicalAlias && [roomAlias isEqualToString:currentCanonicalAlias]) + { + // The right canonical alias is already defined + [updatedItemsDict removeObjectForKey:kRoomSettingsCanonicalAliasKey]; + } + else { - // The first created alias is defined as the main address by default [updatedItemsDict setObject:roomAlias forKey:kRoomSettingsCanonicalAliasKey]; } + + if (missingAddressWarningIndex != -1) + { + // Reload room access section to remove warning message + [mutableIndexSet addIndex:ROOM_SETTINGS_ROOM_ACCESS_SECTION_INDEX]; + } } - NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(ROOM_SETTINGS_ROOM_ADDRESSES_SECTION_INDEX, 1)]; - [self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationNone]; + [mutableIndexSet addIndex:ROOM_SETTINGS_ROOM_ADDRESSES_SECTION_INDEX]; + [self.tableView reloadSections:mutableIndexSet withRowAnimation:UITableViewRowAnimationAutomatic]; [self getNavigationItem].rightBarButtonItem.enabled = (updatedItemsDict.count != 0);