Index: remoting/ios/app/host_view_controller.mm |
diff --git a/remoting/ios/app/host_view_controller.mm b/remoting/ios/app/host_view_controller.mm |
index 30b19c417349ef07c04fe3de32afb30e462b3490..4cdfb8866aa1d892f5f0d2b8ecc82701844d8191 100644 |
--- a/remoting/ios/app/host_view_controller.mm |
+++ b/remoting/ios/app/host_view_controller.mm |
@@ -14,17 +14,20 @@ |
#import "ios/third_party/material_components_ios/src/components/Buttons/src/MaterialButtons.h" |
#import "remoting/ios/client_gestures.h" |
+#import "remoting/ios/client_keyboard.h" |
#import "remoting/ios/session/remoting_client.h" |
#include "remoting/client/gesture_interpreter.h" |
static const CGFloat kFabInset = 15.f; |
+static const CGFloat kKeyboardAnimationTime = 0.3; |
@interface HostViewController () { |
RemotingClient* _client; |
MDCFloatingButton* _floatingButton; |
- |
ClientGestures* _clientGestures; |
+ ClientKeyboard* _clientKeyboard; |
+ CGSize _keyboardSize; |
} |
@end |
@@ -34,6 +37,7 @@ static const CGFloat kFabInset = 15.f; |
self = [super init]; |
if (self) { |
_client = client; |
+ _keyboardSize = CGSizeZero; |
} |
return self; |
} |
@@ -85,12 +89,24 @@ static const CGFloat kFabInset = 15.f; |
_clientGestures = |
[[ClientGestures alloc] initWithView:self.view client:_client]; |
+ [[NSNotificationCenter defaultCenter] |
+ addObserver:self |
+ selector:@selector(keyboardWillShow:) |
+ name:UIKeyboardWillShowNotification |
+ object:nil]; |
+ |
+ [[NSNotificationCenter defaultCenter] |
+ addObserver:self |
+ selector:@selector(keyboardWillHide:) |
+ name:UIKeyboardWillHideNotification |
+ object:nil]; |
} |
- (void)viewWillDisappear:(BOOL)animated { |
[super viewWillDisappear:animated]; |
_clientGestures = nil; |
+ [[NSNotificationCenter defaultCenter] removeObserver:self]; |
} |
- (void)viewDidLayoutSubviews { |
@@ -105,14 +121,95 @@ static const CGFloat kFabInset = 15.f; |
btnSize.width, btnSize.height); |
} |
+#pragma mark - Keyboard |
+ |
+- (BOOL)isKeyboardActive { |
+ if (_clientKeyboard) { |
+ return [_clientKeyboard isFirstResponder]; |
+ } |
+ return NO; |
+} |
+ |
+- (void)showKeyboard { |
+ if (!_clientKeyboard) { |
+ _clientKeyboard = [[ClientKeyboard alloc] init]; |
+ [self.view addSubview:_clientKeyboard]; |
+ // TODO(nicholss): need to pass some keyboard injection interface here. |
+ } |
+ [_clientKeyboard becomeFirstResponder]; |
+} |
+ |
+- (void)hideKeyboard { |
+ [_clientKeyboard resignFirstResponder]; |
+} |
+ |
+#pragma mark - Keyboard Notifications |
+ |
+- (void)keyboardWillShow:(NSNotification*)notification { |
+ CGSize keyboardSize = |
+ [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] |
Yuwei
2017/05/13 01:58:57
You should use UIKeyboardFrameEndUserInfoKey inste
|
+ CGRectValue] |
+ .size; |
+ if (_keyboardSize.height != keyboardSize.height) { |
+ CGFloat deltaHeight = keyboardSize.height - _keyboardSize.height; |
+ [UIView animateWithDuration:0.3 |
Yuwei
2017/05/13 01:58:57
This should use kKeyboardAnimationTime
nicholss
2017/05/15 15:34:13
Done.
|
+ animations:^{ |
+ CGRect f = self.view.frame; |
+ f.size.height += deltaHeight; |
Yuwei
2017/05/13 01:58:57
Should be -=
nicholss
2017/05/15 15:34:13
Delta can be negative. So I think the math works o
Yuwei
2017/05/15 18:20:53
I think the problem here is this is the delta of t
|
+ self.view.frame = f; |
+ }]; |
+ _keyboardSize = keyboardSize; |
+ } |
+} |
+ |
+- (void)keyboardWillHide:(NSNotification*)notification { |
+ [UIView animateWithDuration:kKeyboardAnimationTime |
+ animations:^{ |
+ CGRect f = self.view.frame; |
+ f.size.height += _keyboardSize.height; |
+ self.view.frame = f; |
+ }]; |
+ _keyboardSize = CGSizeZero; |
+} |
+ |
#pragma mark - Private |
- (void)didTap:(id)sender { |
- // TODO(nicholss): The FAB is being used to close the window at the moment |
- // just as a demo as the integration continues. This will not be the case |
- // in the final app. |
- [_client disconnectFromHost]; |
- [self dismissViewControllerAnimated:YES completion:nil]; |
+ // TODO(nicholss): The FAB is being used to launch an alert window with |
+ // more options. This is not ideal but it gets us an easy way to make a |
+ // modal window option selector. Replace this with a real menu later. |
+ |
+ UIAlertController* alert = |
+ [UIAlertController alertControllerWithTitle:@"Remote Settings" |
+ message:nil |
+ preferredStyle:UIAlertControllerStyleAlert]; |
+ |
+ if ([self isKeyboardActive]) { |
+ void (^hideKeyboardHandler)(UIAlertAction*) = ^(UIAlertAction*) { |
+ NSLog(@"Will hide keyboard."); |
+ [self hideKeyboard]; |
+ }; |
+ [alert addAction:[UIAlertAction actionWithTitle:@"Hide Keyboard" |
+ style:UIAlertActionStyleDefault |
+ handler:hideKeyboardHandler]]; |
+ } else { |
+ void (^showKeyboardHandler)(UIAlertAction*) = ^(UIAlertAction*) { |
+ NSLog(@"Will show keyboard."); |
+ [self showKeyboard]; |
+ }; |
+ [alert addAction:[UIAlertAction actionWithTitle:@"Show Keyboard" |
+ style:UIAlertActionStyleDefault |
+ handler:showKeyboardHandler]]; |
+ } |
+ void (^disconnectHandler)(UIAlertAction*) = ^(UIAlertAction*) { |
+ [_client disconnectFromHost]; |
+ [self dismissViewControllerAnimated:YES completion:nil]; |
+ }; |
+ [alert addAction:[UIAlertAction actionWithTitle:@"Disconnect" |
+ style:UIAlertActionStyleCancel |
+ handler:disconnectHandler]]; |
+ |
+ [self presentViewController:alert animated:YES completion:nil]; |
} |
@end |