From b04f476e282369299696fbbb7ca19ebde70bf7da Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 21 Feb 2018 16:10:38 +0100 Subject: [PATCH] Room: Inform user when they cannot post to a room because of low power level Use DisabledRoomInputToolbarView for such permission issue --- Riot/Assets/en.lproj/Vector.strings | 1 + Riot/ViewController/RoomViewController.m | 92 ++++++++++++++++++------ 2 files changed, 71 insertions(+), 22 deletions(-) diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index 3b0f40275..bbb4c8301 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -233,6 +233,7 @@ "room_two_users_are_typing" = "%@ & %@ are typing…"; "room_many_users_are_typing" = "%@, %@ & others are typing…"; "room_message_placeholder" = "Send a message (unencrypted)…"; +"room_do_not_have_permission_to_post" = "You do not have permission to post to this room"; "encrypted_room_message_placeholder" = "Send an encrypted message…"; "room_message_short_placeholder" = "Send a message…"; "room_offline_notification" = "Connectivity to the server has been lost."; diff --git a/Riot/ViewController/RoomViewController.m b/Riot/ViewController/RoomViewController.m index d8bdd27c6..004881301 100644 --- a/Riot/ViewController/RoomViewController.m +++ b/Riot/ViewController/RoomViewController.m @@ -23,6 +23,7 @@ #import "AppDelegate.h" #import "RoomInputToolbarView.h" +#import "DisabledRoomInputToolbarView.h" #import "RoomActivitiesView.h" @@ -348,10 +349,10 @@ // Replace the default input toolbar view. // Note: this operation will force the layout of subviews. That is why cell view classes must be registered before. - [self setRoomInputToolbarViewClass:RoomInputToolbarView.class]; + [self setRoomInputToolbarViewClass]; // Update the inputToolBar height. - CGFloat height = (self.inputToolbarView ? ((RoomInputToolbarView*)self.inputToolbarView).mainToolbarMinHeightConstraint.constant : 0); + CGFloat height = [self inputToolbarHeight]; // Disable animation during the update [UIView setAnimationsEnabled:NO]; [self roomInputToolbarView:self.inputToolbarView heightDidChanged:height completion:nil]; @@ -867,10 +868,10 @@ // Restore tool bar view and room activities view if none if (!self.inputToolbarView) { - [self setRoomInputToolbarViewClass:RoomInputToolbarView.class]; + [self setRoomInputToolbarViewClass]; // Update the inputToolBar height. - CGFloat height = (self.inputToolbarView ? ((RoomInputToolbarView*)self.inputToolbarView).mainToolbarMinHeightConstraint.constant : 0); + CGFloat height = [self inputToolbarHeight]; // Disable animation during the update [UIView setAnimationsEnabled:NO]; [self roomInputToolbarView:self.inputToolbarView heightDidChanged:height completion:nil]; @@ -905,8 +906,24 @@ [super leaveRoomOnEvent:event]; } -- (void)setRoomInputToolbarViewClass:(Class)roomInputToolbarViewClass +// Set the input toolbar according to the current display +- (void)setRoomInputToolbarViewClass { + Class roomInputToolbarViewClass = RoomInputToolbarView.class; + + // Check the user has enough power to post message + if (self.roomDataSource.room.state) + { + MXRoomPowerLevels *powerLevels = self.roomDataSource.room.state.powerLevels; + NSInteger userPowerLevel = [powerLevels powerLevelOfUserWithUserID:self.mainSession.myUser.userId]; + + BOOL canSend = (userPowerLevel >= [powerLevels minimumPowerLevelForSendingEventAsMessage:kMXEventTypeStringRoomMessage]); + if (!canSend) + { + roomInputToolbarViewClass = DisabledRoomInputToolbarView.class; + } + } + // Do not show toolbar in case of preview if (self.isRoomPreview) { @@ -916,6 +933,23 @@ [super setRoomInputToolbarViewClass:roomInputToolbarViewClass]; } +// Get the height of the current room input toolbar +- (CGFloat)inputToolbarHeight +{ + CGFloat height = 0; + + if ([self.inputToolbarView isKindOfClass:RoomInputToolbarView.class]) + { + height = ((RoomInputToolbarView*)self.inputToolbarView).mainToolbarMinHeightConstraint.constant; + } + else if ([self.inputToolbarView isKindOfClass:DisabledRoomInputToolbarView.class]) + { + height = ((DisabledRoomInputToolbarView*)self.inputToolbarView).mainToolbarMinHeightConstraint.constant; + } + + return height; +} + - (void)setRoomActivitiesViewClass:(Class)roomActivitiesViewClass { // Do not show room activities in case of preview (FIXME: show it when live events will be supported during peeking) @@ -1271,6 +1305,8 @@ - (void)refreshRoomInputToolbar { + MXKImageView *userPictureView; + // Check whether the input toolbar is ready before updating it. if (self.inputToolbarView && [self.inputToolbarView isKindOfClass:RoomInputToolbarView.class]) { @@ -1279,22 +1315,8 @@ // Check whether the call option is supported roomInputToolbarView.supportCallOption = self.roomDataSource.mxSession.callManager && self.roomDataSource.room.state.joinedMembers.count >= 2; - // Set user picture in input toolbar - MXKImageView *userPictureView = roomInputToolbarView.pictureView; - if (userPictureView) - { - UIImage *preview = [AvatarGenerator generateAvatarForMatrixItem:self.mainSession.myUser.userId withDisplayName:self.mainSession.myUser.displayname]; - NSString *avatarThumbURL = nil; - if (self.mainSession.myUser.avatarUrl) - { - // Suppose this url is a matrix content uri, we use SDK to get the well adapted thumbnail from server - avatarThumbURL = [self.mainSession.matrixRestClient urlOfContentThumbnail:self.mainSession.myUser.avatarUrl toFitViewSize:userPictureView.frame.size withMethod:MXThumbnailingMethodCrop]; - } - userPictureView.enableInMemoryCache = YES; - [userPictureView setImageURL:avatarThumbURL withType:nil andImageOrientation:UIImageOrientationUp previewImage:preview]; - [userPictureView.layer setCornerRadius:userPictureView.frame.size.width / 2]; - userPictureView.clipsToBounds = YES; - } + // Get user picture view in input toolbar + userPictureView = roomInputToolbarView.pictureView; // Show the hangup button if there is an active call or an active jitsi // conference call in the current room @@ -1319,6 +1341,32 @@ roomInputToolbarView.isEncryptionEnabled = (self.mainSession.crypto != nil); } } + else if (self.inputToolbarView && [self.inputToolbarView isKindOfClass:DisabledRoomInputToolbarView.class]) + { + DisabledRoomInputToolbarView *roomInputToolbarView = (DisabledRoomInputToolbarView*)self.inputToolbarView; + + // Get user picture view in input toolbar + userPictureView = roomInputToolbarView.pictureView; + + // For the moment, there is only one reason to use `DisabledRoomInputToolbarView` + [roomInputToolbarView setDisabledReason:NSLocalizedStringFromTable(@"room_do_not_have_permission_to_post", @"Vector", nil)]; + } + + // Set user picture in input toolbar + if (userPictureView) + { + UIImage *preview = [AvatarGenerator generateAvatarForMatrixItem:self.mainSession.myUser.userId withDisplayName:self.mainSession.myUser.displayname]; + NSString *avatarThumbURL = nil; + if (self.mainSession.myUser.avatarUrl) + { + // Suppose this url is a matrix content uri, we use SDK to get the well adapted thumbnail from server + avatarThumbURL = [self.mainSession.matrixRestClient urlOfContentThumbnail:self.mainSession.myUser.avatarUrl toFitViewSize:userPictureView.frame.size withMethod:MXThumbnailingMethodCrop]; + } + userPictureView.enableInMemoryCache = YES; + [userPictureView setImageURL:avatarThumbURL withType:nil andImageOrientation:UIImageOrientationUp previewImage:preview]; + [userPictureView.layer setCornerRadius:userPictureView.frame.size.width / 2]; + userPictureView.clipsToBounds = YES; + } } - (void)onSwipeGesture:(UISwipeGestureRecognizer*)swipeGestureRecognizer @@ -3265,7 +3313,7 @@ [self setRoomInputToolbarViewClass:RoomInputToolbarView.class]; // Update the inputToolBar height. - CGFloat height = (self.inputToolbarView ? ((RoomInputToolbarView*)self.inputToolbarView).mainToolbarMinHeightConstraint.constant : 0); + CGFloat height = [self inputToolbarHeight]; // Disable animation during the update [UIView setAnimationsEnabled:NO]; [self roomInputToolbarView:self.inputToolbarView heightDidChanged:height completion:nil];