forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[iOS] Disable voice search keyboard accessory view for VoiceOver
crrev.com/c/2005903 was an incomplete solution because the util functions generating the keyboard accessory views was only called once per OmniboxCoordinator's lifetime. This CL updates the coordinator to observe the voice search availability and reconfigure the keyboard accessory views when availability changes. Bug: 998524 Change-Id: Ica88b4690fac0ada1be6cc77bb6ca911f5a245e6 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2075045 Reviewed-by: Gauthier Ambard <gambard@chromium.org> Commit-Queue: Kurt Horimoto <kkhorimoto@chromium.org> Auto-Submit: Kurt Horimoto <kkhorimoto@chromium.org> Cr-Commit-Position: refs/heads/master@{#746855}
- Loading branch information
Kurt Horimoto
authored and
Commit Bot
committed
Mar 4, 2020
1 parent
9b5f028
commit baa0415
Showing
10 changed files
with
316 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
24 changes: 24 additions & 0 deletions
24
ios/chrome/browser/ui/toolbar/keyboard_assist/voice_search_keyboard_accessory_button.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
// Copyright 2020 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_KEYBOARD_ASSIST_VOICE_SEARCH_KEYBOARD_ACCESSORY_BUTTON_H_ | ||
#define IOS_CHROME_BROWSER_UI_TOOLBAR_KEYBOARD_ASSIST_VOICE_SEARCH_KEYBOARD_ACCESSORY_BUTTON_H_ | ||
|
||
#import <UIKit/UIKit.h> | ||
#include <memory> | ||
|
||
class VoiceSearchAvailability; | ||
|
||
// A custom button that disables itself when voice search becomes unavailable. | ||
@interface VoiceSearchKeyboardAccessoryButton : UIButton | ||
|
||
- (instancetype)initWithVoiceSearchAvailability: | ||
(std::unique_ptr<VoiceSearchAvailability>)availability | ||
NS_DESIGNATED_INITIALIZER; | ||
- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE; | ||
- (instancetype)initWithCoder:(NSCoder*)coder NS_UNAVAILABLE; | ||
|
||
@end | ||
|
||
#endif // IOS_CHROME_BROWSER_UI_TOOLBAR_KEYBOARD_ASSIST_VOICE_SEARCH_KEYBOARD_ACCESSORY_BUTTON_H_ |
57 changes: 57 additions & 0 deletions
57
ios/chrome/browser/ui/toolbar/keyboard_assist/voice_search_keyboard_accessory_button.mm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
// Copyright 2020 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#import "ios/chrome/browser/ui/toolbar/keyboard_assist/voice_search_keyboard_accessory_button.h" | ||
|
||
#include "base/logging.h" | ||
#import "ios/chrome/browser/voice/voice_search_availability.h" | ||
|
||
#if !defined(__has_feature) || !__has_feature(objc_arc) | ||
#error "This file requires ARC support." | ||
#endif | ||
|
||
@interface VoiceSearchKeyboardAccessoryButton () < | ||
VoiceSearchAvailabilityObserver> { | ||
std::unique_ptr<VoiceSearchAvailability> _availability; | ||
} | ||
@end | ||
|
||
@implementation VoiceSearchKeyboardAccessoryButton | ||
|
||
- (instancetype)initWithVoiceSearchAvailability: | ||
(std::unique_ptr<VoiceSearchAvailability>)availability { | ||
if (self = [super initWithFrame:CGRectZero]) { | ||
_availability = std::move(availability); | ||
DCHECK(_availability); | ||
_availability->AddObserver(self); | ||
} | ||
return self; | ||
} | ||
|
||
- (void)dealloc { | ||
_availability->RemoveObserver(self); | ||
} | ||
|
||
#pragma mark - UIView | ||
|
||
- (void)willMoveToSuperview:(UIView*)newSuperview { | ||
[self updateEnabledState]; | ||
} | ||
|
||
#pragma mark - VoiceSearchAvailabilityObserver | ||
|
||
- (void)voiceSearchAvailability:(VoiceSearchAvailability*)availability | ||
updatedAvailability:(BOOL)available { | ||
[self updateEnabledState]; | ||
} | ||
|
||
#pragma mark - Private | ||
|
||
// Updates the button's enabled state according to its voice search | ||
// availability. | ||
- (void)updateEnabledState { | ||
self.enabled = _availability->IsVoiceSearchAvailable(); | ||
} | ||
|
||
@end |
44 changes: 44 additions & 0 deletions
44
...ome/browser/ui/toolbar/keyboard_assist/voice_search_keyboard_accessory_button_unittest.mm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
// Copyright 2020 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#import "ios/chrome/browser/ui/toolbar/keyboard_assist/voice_search_keyboard_accessory_button.h" | ||
|
||
#import "ios/chrome/browser/voice/fake_voice_search_availability.h" | ||
#include "testing/platform_test.h" | ||
|
||
#if !defined(__has_feature) || !__has_feature(objc_arc) | ||
#error "This file requires ARC support." | ||
#endif | ||
|
||
// Test fixture for VoiceSearchKeyboardAccessoryButton. | ||
class VoiceSearchKeyboardAccessoryButtonTest : public PlatformTest { | ||
public: | ||
VoiceSearchKeyboardAccessoryButtonTest() | ||
: superview_([[UIView alloc] initWithFrame:CGRectZero]) { | ||
std::unique_ptr<FakeVoiceSearchAvailability> availability = | ||
std::make_unique<FakeVoiceSearchAvailability>(); | ||
availability_ = availability.get(); | ||
availability_->SetVoiceOverEnabled(false); | ||
availability_->SetVoiceProviderEnabled(true); | ||
button_ = [[VoiceSearchKeyboardAccessoryButton alloc] | ||
initWithVoiceSearchAvailability:std::move(availability)]; | ||
[superview_ addSubview:button_]; | ||
} | ||
|
||
protected: | ||
FakeVoiceSearchAvailability* availability_ = nullptr; | ||
UIView* superview_ = nil; | ||
VoiceSearchKeyboardAccessoryButton* button_ = nil; | ||
}; | ||
|
||
// Tests that the button is disabled when VoiceOver is enabled. | ||
TEST_F(VoiceSearchKeyboardAccessoryButtonTest, DisableForVoiceOver) { | ||
ASSERT_TRUE(button_.enabled); | ||
|
||
availability_->SetVoiceOverEnabled(true); | ||
EXPECT_FALSE(button_.enabled); | ||
|
||
availability_->SetVoiceOverEnabled(false); | ||
EXPECT_TRUE(button_.enabled); | ||
} |
31 changes: 31 additions & 0 deletions
31
ios/chrome/browser/ui/toolbar/keyboard_assist/voice_search_keyboard_bar_button_item.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
// Copyright 2020 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_KEYBOARD_ASSIST_VOICE_SEARCH_KEYBOARD_BAR_BUTTON_ITEM_H_ | ||
#define IOS_CHROME_BROWSER_UI_TOOLBAR_KEYBOARD_ASSIST_VOICE_SEARCH_KEYBOARD_BAR_BUTTON_ITEM_H_ | ||
|
||
#import <UIKit/UIKit.h> | ||
#include <memory> | ||
|
||
class VoiceSearchAvailability; | ||
|
||
// A custom bar button item that disables itself when voice search is | ||
// unavailable. | ||
@interface VoiceSearchKeyboardBarButtonItem : UIBarButtonItem | ||
|
||
// Initializer for an item that disables itself when |availability| returns | ||
// false for IsVoiceSearchAvailable(). | ||
- (instancetype)initWithImage:(UIImage*)image | ||
style:(UIBarButtonItemStyle)style | ||
target:(id)target | ||
action:(SEL)action | ||
voiceSearchAvailability: | ||
(std::unique_ptr<VoiceSearchAvailability>)availability | ||
NS_DESIGNATED_INITIALIZER; | ||
- (instancetype)init NS_UNAVAILABLE; | ||
- (instancetype)initWithCoder:(NSCoder*)coder NS_UNAVAILABLE; | ||
|
||
@end | ||
|
||
#endif // IOS_CHROME_BROWSER_UI_TOOLBAR_KEYBOARD_ASSIST_VOICE_SEARCH_KEYBOARD_BAR_BUTTON_ITEM_H_ |
57 changes: 57 additions & 0 deletions
57
ios/chrome/browser/ui/toolbar/keyboard_assist/voice_search_keyboard_bar_button_item.mm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
// Copyright 2020 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#import "ios/chrome/browser/ui/toolbar/keyboard_assist/voice_search_keyboard_bar_button_item.h" | ||
|
||
#import "ios/chrome/browser/voice/voice_search_availability.h" | ||
|
||
#if !defined(__has_feature) || !__has_feature(objc_arc) | ||
#error "This file requires ARC support." | ||
#endif | ||
|
||
@interface VoiceSearchKeyboardBarButtonItem () < | ||
VoiceSearchAvailabilityObserver> { | ||
std::unique_ptr<VoiceSearchAvailability> _availability; | ||
} | ||
@end | ||
|
||
@implementation VoiceSearchKeyboardBarButtonItem | ||
|
||
- (instancetype)initWithImage:(UIImage*)image | ||
style:(UIBarButtonItemStyle)style | ||
target:(id)target | ||
action:(SEL)action | ||
voiceSearchAvailability: | ||
(std::unique_ptr<VoiceSearchAvailability>)availability { | ||
if (self = [super init]) { | ||
self.image = image; | ||
self.style = style; | ||
self.target = target; | ||
self.action = action; | ||
_availability = std::move(availability); | ||
_availability->AddObserver(self); | ||
[self updateEnabledState]; | ||
} | ||
return self; | ||
} | ||
|
||
- (void)dealloc { | ||
_availability->RemoveObserver(self); | ||
} | ||
|
||
#pragma mark - VoiceSearchAvailabilityObserver | ||
|
||
- (void)voiceSearchAvailability:(VoiceSearchAvailability*)availability | ||
updatedAvailability:(BOOL)available { | ||
[self updateEnabledState]; | ||
} | ||
|
||
#pragma mark - Private | ||
|
||
// Updates the item's enabled state according to its voice search availability. | ||
- (void)updateEnabledState { | ||
self.enabled = _availability->IsVoiceSearchAvailable(); | ||
} | ||
|
||
@end |
Oops, something went wrong.