You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

237 lines
9.7 KiB

/*
* Copyright 2016 Google LLC. All rights reserved.
*
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
* file except in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
* ANY KIND, either express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
#import "GooglePlacesDemos/Samples/Autocomplete/AutocompleteBaseViewController.h"
#import "GooglePlacesDemos/Samples/PagingPhotoView.h"
@implementation AutocompleteBaseViewController {
PagingPhotoView *_photoView;
UIButton *_photoButton;
UITextView *_textView;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Configure a background color.
#if defined(__IPHONE_13_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0)
if (@available(iOS 13.0, *)) {
self.view.backgroundColor = [UIColor systemBackgroundColor];
} else {
self.view.backgroundColor = [UIColor whiteColor];
}
#else
self.view.backgroundColor = [UIColor whiteColor];
#endif // defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
// Configure the UI. Tell our superclass we want a button and a result view below that.
_photoButton =
[self createButton:@selector(showPhotosButtonTapped)
title:NSLocalizedString(@"Demo.Title.Photos", @"Button title for 'Photos'")];
// Create a text view.
_textView = [[UITextView alloc] init];
_textView.editable = NO;
_textView.translatesAutoresizingMaskIntoConstraints = NO;
[self addResultTextView];
// Configure the photo view where we are going to display the loaded photos.
_photoView = [[PagingPhotoView alloc] initWithFrame:self.view.bounds];
_photoView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.view addSubview:_photoView];
// Reset the various views to their initial states.
[self resetViews];
}
- (UIButton *)createShowAutocompleteButton:(SEL)selector {
return [self createButton:selector
title:NSLocalizedString(@"Demo.Content.Autocomplete.ShowWidgetButton",
@"Button title for 'show autocomplete widget'")];
}
- (NSString *)openStatusTextFromPlace:(GMSPlace *)place {
GMSPlaceOpenStatus openStatus = [place isOpen];
switch (openStatus) {
case GMSPlaceOpenStatusOpen:
return @"Open";
case GMSPlaceOpenStatusClosed:
return @"Closed";
case GMSPlaceOpenStatusUnknown:
return @"Unknown";
}
}
- (void)autocompleteDidSelectPlace:(GMSPlace *)place {
NSMutableAttributedString *text =
[[NSMutableAttributedString alloc] initWithString:[place description]];
[text appendAttributedString:[[NSAttributedString alloc] initWithString:@"\nPlace status: "]];
NSString *openStatusText = [self openStatusTextFromPlace:place];
[text appendAttributedString:[[NSAttributedString alloc] initWithString:openStatusText]];
NSAttributedString *attributions = place.attributions;
if (attributions) {
NSAttributedString *doubleReturn = [[NSAttributedString alloc] initWithString:@"\n\n"];
[text appendAttributedString:doubleReturn];
[text appendAttributedString:attributions];
}
#if defined(__IPHONE_13_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0)
if (@available(iOS 13.0, *)) {
[text addAttribute:NSForegroundColorAttributeName
value:[UIColor labelColor]
range:NSMakeRange(0, text.length)];
}
#endif
_textView.attributedText = text;
[_textView setIsAccessibilityElement:YES];
[_textView setHidden:NO];
// Show the photo button be start disabled until the photos have loaded.
[_photoButton setIsAccessibilityElement:YES];
[_photoButton setHidden:NO];
[_photoButton setEnabled:NO];
if (place.photos.count > 0) {
[self preloadPhotoList:place.photos];
}
}
- (void)autocompleteDidFail:(NSError *)error {
NSString *formatString =
NSLocalizedString(@"Demo.Content.Autocomplete.FailedErrorMessage",
@"Format string for 'autocomplete failed with error' message");
_textView.text = [NSString stringWithFormat:formatString, error];
}
- (void)autocompleteDidCancel {
_textView.text = NSLocalizedString(@"Demo.Content.Autocomplete.WasCanceledMessage",
@"String for 'autocomplete canceled message'");
}
- (void)showCustomMessageInResultPane:(NSString *)message {
_textView.text = message;
}
- (void)resetViews {
_photoView.photoList = @[];
[_textView setText:@""];
[_textView setIsAccessibilityElement:NO];
[_textView setHidden:NO];
[_photoButton setIsAccessibilityElement:NO];
[_photoButton setHidden:YES];
[_photoView setHidden:YES];
}
#pragma mark - Private
- (void)addResultTextView {
NSAssert(_textView.superview == nil, @"%s should not be called twice", sel_getName(_cmd));
[self.view addSubview:_textView];
// Check to see if we can use readableContentGuide from iOS 9+
if ([self.view respondsToSelector:@selector(readableContentGuide)]) {
// Position it horizontally so it fills the readableContentGuide. Use the new anchor-based
// system because we know this code will only run on iOS 9+.
[self.view.readableContentGuide.leadingAnchor constraintEqualToAnchor:_textView.leadingAnchor]
.active = YES;
[self.view.readableContentGuide.trailingAnchor constraintEqualToAnchor:_textView.trailingAnchor]
.active = YES;
// Set the textContainerInset to 0 because the readableContentGuide is already handling the
// inset.
_textView.textContainerInset = UIEdgeInsetsZero;
} else {
// Position it horizontally so it fills the parent.
[self.view
addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-(0)-[_textView]-(0)-|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(_textView)]];
}
// If we have a view place it below that.
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:[_photoButton]-[_textView]-(0)-|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(
_photoButton, _textView)]];
}
- (UIButton *)createButton:(SEL)selector title:(NSString *)title {
// Create a button to show the autocomplete widget.
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
[button setTitle:title forState:UIControlStateNormal];
// Set the text color to adapt to light and dark mode on iOS 13+ devices
// Otherwise, set the text color to black
#if defined(__IPHONE_13_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0)
if (@available(iOS 13.0, *)) {
[button setTitleColor:[UIColor labelColor] forState:UIControlStateNormal];
} else {
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
}
#else
self.view.backgroundColor = [UIColor whiteColor];
#endif // defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
[button addTarget:self action:selector forControlEvents:UIControlEventTouchUpInside];
button.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:button];
// Position the button from the top of the view.
[button.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor].active = YES;
[button.topAnchor constraintEqualToAnchor:self.view.topAnchor constant:kButtonTopMargin].active =
YES;
[button.heightAnchor constraintEqualToConstant:kButtonHeight].active = YES;
[button.widthAnchor constraintEqualToConstant:kButtonWidth].active = YES;
return button;
}
- (void)showPhotosButtonTapped {
[_textView setIsAccessibilityElement:NO];
[_textView setHidden:YES];
[_photoButton setIsAccessibilityElement:NO];
[_photoButton setHidden:YES];
[_photoView setHidden:NO];
}
// Preload the photos to be displayed.
- (void)preloadPhotoList:(NSArray<GMSPlacePhotoMetadata *> *)photos {
__block NSMutableArray *attributedPhotos = [NSMutableArray array];
__block NSInteger photoRequestsInFlight = photos.count;
for (GMSPlacePhotoMetadata *photo in photos) {
[[GMSPlacesClient sharedClient] loadPlacePhoto:photo
callback:^(UIImage *photoImage, NSError *error) {
photoRequestsInFlight--;
if (photoImage == nil) {
NSLog(@"Photo request failed with error: %@", error);
} else {
AttributedPhoto *attributedPhoto =
[[AttributedPhoto alloc] init];
attributedPhoto.image = photoImage;
attributedPhoto.attributions = photo.attributions;
[attributedPhotos addObject:attributedPhoto];
}
if (photoRequestsInFlight == 0) {
_photoView.photoList = attributedPhotos;
[_photoButton setEnabled:YES];
}
}];
}
}
@end