Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Side by Side Diff: ios/chrome/search_widget_extension/search_widget_view_controller.mm

Issue 2858253002: Adding search widget UI and functionality. (Closed)
Patch Set: addressing comments Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #import "ios/chrome/search_widget_extension/search_widget_view_controller.h" 5 #import "ios/chrome/search_widget_extension/search_widget_view_controller.h"
6 6
7 #import <NotificationCenter/NotificationCenter.h> 7 #import <NotificationCenter/NotificationCenter.h>
8 8
9 #include "base/ios/ios_util.h" 9 #include "base/ios/ios_util.h"
10 #include "base/mac/foundation_util.h" 10 #include "base/mac/foundation_util.h"
11 #include "base/strings/sys_string_conversions.h" 11 #include "base/strings/sys_string_conversions.h"
12 #include "components/open_from_clipboard/clipboard_recent_content_impl_ios.h" 12 #include "components/open_from_clipboard/clipboard_recent_content_impl_ios.h"
13 #include "ios/chrome/common/app_group/app_group_constants.h" 13 #include "ios/chrome/common/app_group/app_group_constants.h"
14 #import "ios/chrome/search_widget_extension/search_widget_view.h" 14 #import "ios/chrome/search_widget_extension/search_widget_view.h"
15 #import "ios/chrome/search_widget_extension/ui_util.h"
15 16
16 #if !defined(__has_feature) || !__has_feature(objc_arc) 17 #if !defined(__has_feature) || !__has_feature(objc_arc)
17 #error "This file requires ARC support." 18 #error "This file requires ARC support."
18 #endif 19 #endif
19 20
20 namespace { 21 namespace {
21 // Using GURL in the extension is not wanted as it includes ICU which makes the 22 // Using GURL in the extension is not wanted as it includes ICU which makes the
22 // extension binary much larger; therefore, ios/chrome/common/x_callback_url.h 23 // extension binary much larger; therefore, ios/chrome/common/x_callback_url.h
23 // cannot be used. This class makes a very basic use of x-callback-url, so no 24 // cannot be used. This class makes a very basic use of x-callback-url, so no
24 // full implementation is required. 25 // full implementation is required.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 delegate:nil]; 62 delegate:nil];
62 } 63 }
63 return self; 64 return self;
64 } 65 }
65 66
66 #pragma mark - UIViewController 67 #pragma mark - UIViewController
67 68
68 - (void)viewDidLoad { 69 - (void)viewDidLoad {
69 [super viewDidLoad]; 70 [super viewDidLoad];
70 71
72 UIVibrancyEffect* primary;
73 UIVibrancyEffect* secondary;
74 if (base::ios::IsRunningOnIOS10OrLater()) {
75 primary = [UIVibrancyEffect widgetPrimaryVibrancyEffect];
76 secondary = [UIVibrancyEffect widgetSecondaryVibrancyEffect];
77 } else {
78 primary = [UIVibrancyEffect notificationCenterVibrancyEffect];
79 secondary = [UIVibrancyEffect notificationCenterVibrancyEffect];
80 }
81
71 // A local variable is necessary here as the property is declared weak and the 82 // A local variable is necessary here as the property is declared weak and the
72 // object would be deallocated before being retained by the addSubview call. 83 // object would be deallocated before being retained by the addSubview call.
73 SearchWidgetView* widgetView = 84 SearchWidgetView* widgetView =
74 [[SearchWidgetView alloc] initWithActionTarget:self]; 85 [[SearchWidgetView alloc] initWithActionTarget:self
86 primaryVibrancyEffect:primary
87 secondaryVibrancyEffect:secondary];
75 self.widgetView = widgetView; 88 self.widgetView = widgetView;
76 [self.view addSubview:self.widgetView]; 89 [self.view addSubview:self.widgetView];
77 90
78 if (base::ios::IsRunningOnIOS10OrLater()) { 91 if (base::ios::IsRunningOnIOS10OrLater()) {
79 self.extensionContext.widgetLargestAvailableDisplayMode = 92 self.extensionContext.widgetLargestAvailableDisplayMode =
80 NCWidgetDisplayModeExpanded; 93 NCWidgetDisplayModeExpanded;
81 } 94 }
82 95
83 self.widgetView.translatesAutoresizingMaskIntoConstraints = NO; 96 self.widgetView.translatesAutoresizingMaskIntoConstraints = NO;
84 97
85 NSLayoutConstraint* heightAnchor = [self.widgetView.heightAnchor 98 [NSLayoutConstraint activateConstraints:ui_util::CreateSameConstraints(
86 constraintEqualToAnchor:self.view.heightAnchor]; 99 self.view, self.widgetView)];
87 heightAnchor.priority = 900;
88
89 [NSLayoutConstraint activateConstraints:@[
90 [self.widgetView.leadingAnchor
91 constraintEqualToAnchor:self.view.leadingAnchor],
92 [self.widgetView.widthAnchor constraintEqualToAnchor:self.view.widthAnchor],
93 [self.widgetView.trailingAnchor
94 constraintEqualToAnchor:self.view.trailingAnchor],
95 heightAnchor,
96 [self.widgetView.topAnchor constraintEqualToAnchor:self.view.topAnchor],
97 ]];
98 } 100 }
99 101
100 - (void)viewWillAppear:(BOOL)animated { 102 - (void)viewWillAppear:(BOOL)animated {
101 [super viewWillAppear:animated]; 103 [super viewWillAppear:animated];
102 [self updateWidget]; 104 [self updateWidget];
103 } 105 }
104 106
105 - (void)widgetPerformUpdateWithCompletionHandler: 107 - (void)widgetPerformUpdateWithCompletionHandler:
106 (void (^)(NCUpdateResult))completionHandler { 108 (void (^)(NCUpdateResult))completionHandler {
107 completionHandler([self updateWidget] ? NCUpdateResultNewData 109 completionHandler([self updateWidget] ? NCUpdateResultNewData
108 : NCUpdateResultNoData); 110 : NCUpdateResultNoData);
109 } 111 }
110 112
111 - (BOOL)updateWidget { 113 - (BOOL)updateWidget {
112 NSURL* url = [_clipboardRecentContent recentURLFromClipboard]; 114 NSURL* url = [_clipboardRecentContent recentURLFromClipboard];
113 115
114 if (![url isEqual:self.copiedURL]) { 116 if (![url isEqual:self.copiedURL]) {
115 self.copiedURL = url; 117 self.copiedURL = url;
116 [self.widgetView updateCopiedURL:self.copiedURL.absoluteString]; 118 [self.widgetView setCopiedURLString:self.copiedURL.absoluteString];
117 return YES; 119 return YES;
118 } 120 }
119 return NO; 121 return NO;
120 } 122 }
121 123
122 #pragma mark - NCWidgetProviding 124 #pragma mark - NCWidgetProviding
123 125
124 - (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode 126 - (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode
125 withMaximumSize:(CGSize)maxSize { 127 withMaximumSize:(CGSize)maxSize {
126 CGSize fittingSize = [self.widgetView 128 BOOL isVariableHeight = (activeDisplayMode == NCWidgetDisplayModeExpanded);
127 systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 129 // Set the copied URL section here so that the fitting size is correctly
128 if (fittingSize.height > maxSize.height) { 130 // calculated.
129 self.preferredContentSize = maxSize; 131 [self.widgetView setCopiedURLVisible:isVariableHeight];
130 } else { 132
131 self.preferredContentSize = fittingSize; 133 // If the widget's height is not variable, the preferredContentSize is the
134 // maxSize. Widgets cannot be shrunk, and this ensures the view will lay
135 // itself out according to the actual screen size. (This is only likely to
136 // happen if the accessibility option for larger font is used.) If the widget
137 // is not a fixed size, if the fitting size for the widget's contents is
138 // larger than the maximum size for the current widget display mode, this
139 // maximum size is used for the widget. Otherwise, the preferredContentSize is
140 // set to the fitting size so that the widget gets the correct height.
141 if (isVariableHeight) {
142 CGSize fittingSize = [self.widgetView
143 systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
144 if (fittingSize.height < maxSize.height) {
145 self.preferredContentSize = fittingSize;
146 return;
147 }
132 } 148 }
149 self.preferredContentSize = maxSize;
133 } 150 }
134 151
135 #pragma mark - WidgetViewActionTarget 152 #pragma mark - WidgetViewActionTarget
136 153
137 - (void)openSearch:(id)sender { 154 - (void)openSearch:(id)sender {
138 [self openAppWithCommand:base::SysUTF8ToNSString( 155 [self openAppWithCommand:base::SysUTF8ToNSString(
139 app_group::kChromeAppGroupFocusOmniboxCommand)]; 156 app_group::kChromeAppGroupFocusOmniboxCommand)];
140 } 157 }
141 158
142 - (void)openIncognito:(id)sender { 159 - (void)openIncognito:(id)sender {
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 }; 232 };
216 } 233 }
217 return @{ 234 return @{
218 timePrefKey : [NSDate date], 235 timePrefKey : [NSDate date],
219 appPrefKey : @"TodayExtension", 236 appPrefKey : @"TodayExtension",
220 commandPrefKey : command, 237 commandPrefKey : command,
221 }; 238 };
222 } 239 }
223 240
224 @end 241 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698