Andrew Overton 083cf8c12f
[TextControls] Restructure Cocoapods and Blaze targets (#9430)
## UPDATED PR DESCRIPTION:

**NOTE: [cl/290296411](http://cl/290296411) must be patched into whatever release includes this PR.**

There were requests to break it up further. With the latest changes, it will look like this in the future:

//components/TextControls:Shared # shared public types
//components/TextControls:BaseTextFields
//components/TextControls:FilledTextFields
//components/TextControls:FilledTextFieldsTheming
//components/TextControls:OutlinedTextFields
//components/TextControls:OutlinedTextFieldsTheming
//components/TextControls:BaseTextAreas
//components/TextControls:FilledTextAreas
//components/TextControls:FilledTextAreasTheming
//components/TextControls:OutlinedTextAreas
//components/TextControls:OutlinedTextAreasTheming
//components/TextControls:FilledInputChipView
//components/TextControls:FilledInputChipViewTheming
//components/TextControls:OutlinedInputChipView
//components/TextControls:OutlinedInputChipViewTheming
//components/private/TextControlsPrivate: Shared # shared private types
//components/private/TextControlsPrivate:OutlinedStyle
//components/private/TextControlsPrivate:FilledStyle

This would make it easier to sunset/retire a specific style of a specific text control type, for example.

## ORIGINAL PR DESCRIPTION:

This PR is an attempt to satisfy the recent requests to break up the Cocoapods subspecs and Bazel targets for TextControls.

~**NOTE: [cl/289710430](http://cl/289710430) must be patched into whatever release includes this PR.**~

**ANOTHER NOTE: This PR will break any third party people who depend on TextControls via Cocoapods and have not pinned to a specific version of our library.**

This PR takes the following Cocoapods subspecs:
TextControls
TextControls+Theming

And breaks them up into these ones:
TextControls
TextControls+TextFields
TextControls+TextFieldsTheming
private/TextControlsPrivate

Similarly, it takes the following bazel targets:
//components/TextControls
//components/TextControls:Theming

And breaks them up into these ones:
//components/TextControls
//components/TextControls:TextFields
//components/TextControls:TextFieldsTheming
//components/private/TextControlsPrivate

Where before a third party client would have had the following in their Podfile:
`pod 'MaterialComponents/TextControls'`
They would now have:
`pod 'MaterialComponents/TextControls+TextFields'`

When I started this work I originally planned to have there be top level components for each of the TextControls that all depended on a shared private component. However, I quickly remembered that all the text controls shared some public types too. At some point I decided it make make sense to make use of extensions.

In order to satisfy pod lib lint I had to add some dummy source files and dummy test files. The dummy test files could potentially have some stuff in there if we want to validate the enums they refer to somehow...

Closes #9405.
2020-01-17 15:21:08 -05:00

220 lines
8.8 KiB
Objective-C

// Copyright 2019-present the Material Components for iOS authors. 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 <UIKit/UIKit.h>
#import "MaterialButtons.h"
#import "MaterialContainerScheme.h"
#import "MaterialTextControls+FilledTextFieldsTheming.h"
#import "MaterialTextControls+OutlinedTextFieldsTheming.h"
#import "MaterialTextControlsPrivate+Shared.h"
#import "MDCTextControlConfiguratorExample.h"
#import "MDCTraitEnvironmentChangeDelegate.h"
@interface MDCTextControlConfiguratorExample ()
/**
All the content size categories that this view controller supports.
*/
@property(nonatomic, strong) NSArray *contentSizeCategories;
@end
@implementation MDCTextControlConfiguratorExample
#pragma mark View Controller Lifecycle
- (void)viewDidLoad {
[super viewDidLoad];
[self setUpChildViewController];
[self setUpContentSizeCategories];
[self setUpContainerScheme];
self.view.backgroundColor = self.containerScheme.colorScheme.backgroundColor;
}
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
CGFloat viewWidth = CGRectGetWidth(self.view.frame);
CGFloat viewHeight = CGRectGetHeight(self.view.frame);
self.contentViewController.view.frame =
CGRectMake(0, self.preferredContentMinY, viewWidth, viewHeight - self.preferredContentMinY);
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
[self.contentViewController.view setNeedsLayout];
}
#pragma mark Setup
- (void)setUpChildViewController {
[self initializeContentViewController];
if (self.contentViewController) {
[self addChildViewController:self.contentViewController];
self.contentViewController.traitEnvironmentChangeDelegate = self;
[self.view addSubview:self.contentViewController.view];
}
}
- (void)initializeContentViewController {
}
- (void)setUpContainerScheme {
if (!self.containerScheme) {
MDCContainerScheme *containerScheme = [[MDCContainerScheme alloc] init];
containerScheme.colorScheme =
[[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201907];
self.containerScheme = containerScheme;
}
}
- (void)setUpContentSizeCategories {
self.contentSizeCategories = @[
UIContentSizeCategoryExtraSmall, UIContentSizeCategorySmall, UIContentSizeCategoryMedium,
UIContentSizeCategoryLarge, UIContentSizeCategoryExtraLarge,
UIContentSizeCategoryExtraExtraLarge, UIContentSizeCategoryExtraExtraExtraLarge,
UIContentSizeCategoryAccessibilityMedium, UIContentSizeCategoryAccessibilityLarge,
UIContentSizeCategoryAccessibilityExtraLarge, UIContentSizeCategoryAccessibilityExtraExtraLarge,
UIContentSizeCategoryAccessibilityExtraExtraExtraLarge
];
}
- (void)increaseContentSizeForChildViewController:(UIViewController *)childViewController
decreaseButton:(MDCButton *)decreaseButton
increaseButton:(MDCButton *)increaseButton {
UIContentSizeCategory contentSizeCategory =
[self contentSizeCategoryForViewController:childViewController];
if (contentSizeCategory) {
NSInteger idx = [self.contentSizeCategories indexOfObject:contentSizeCategory];
if (idx < (NSInteger)self.contentSizeCategories.count - 1) {
idx += 1;
UIContentSizeCategory newContentSizeCategory = self.contentSizeCategories[idx];
[self setContentSizeCategory:newContentSizeCategory
onChildViewController:childViewController];
increaseButton.enabled = idx != (NSInteger)self.contentSizeCategories.count - 1;
decreaseButton.enabled = idx > 0;
}
}
}
- (void)decreaseContentSizeForChildViewController:(UIViewController *)childViewController
decreaseButton:(MDCButton *)decreaseButton
increaseButton:(MDCButton *)increaseButton {
UIContentSizeCategory contentSizeCategory =
[self contentSizeCategoryForViewController:childViewController];
if (contentSizeCategory) {
NSInteger idx = [self.contentSizeCategories indexOfObject:contentSizeCategory];
if (idx > (NSInteger)0) {
idx -= 1;
UIContentSizeCategory newContentSizeCategory = self.contentSizeCategories[idx];
[self setContentSizeCategory:newContentSizeCategory
onChildViewController:childViewController];
increaseButton.enabled = idx != (NSInteger)self.contentSizeCategories.count - 1;
decreaseButton.enabled = idx > 0;
}
}
}
#pragma mark Accessors
- (void)setContentSizeCategory:(UIContentSizeCategory)contentSizeCategory
onChildViewController:(UIViewController *)viewController {
if (@available(iOS 10.0, *)) {
UITraitCollection *contentSizeCategoryTraitCollection =
[UITraitCollection traitCollectionWithPreferredContentSizeCategory:contentSizeCategory];
UITraitCollection *currentTraitCollection = viewController.traitCollection;
NSArray *traitCollections = @[ currentTraitCollection, contentSizeCategoryTraitCollection ];
UITraitCollection *traitCollection =
[UITraitCollection traitCollectionWithTraitsFromCollections:traitCollections];
[self setOverrideTraitCollection:traitCollection forChildViewController:viewController];
[self.view setNeedsLayout];
}
}
- (UIContentSizeCategory)contentSizeCategoryForViewController:(UIViewController *)viewController {
if (@available(iOS 10.0, *)) {
return viewController.traitCollection.preferredContentSizeCategory;
}
return nil;
}
- (void)setContainerScheme:(id<MDCContainerScheming>)containerScheme {
self.contentViewController.containerScheme = containerScheme;
}
- (id<MDCContainerScheming>)containerScheme {
return self.contentViewController.containerScheme;
}
- (CGFloat)preferredContentMinY {
if (@available(iOS 11.0, *)) {
return (CGFloat)(self.view.safeAreaInsets.top);
} else {
return (CGFloat)self.topLayoutGuide.length;
}
}
- (void)setTraitCollection:(UITraitCollection *)traitCollection
onChildViewController:(UIViewController *)childViewController {
NSArray *traitCollections = @[ childViewController.traitCollection, traitCollection ];
UITraitCollection *newTraitCollection =
[UITraitCollection traitCollectionWithTraitsFromCollections:traitCollections];
[self setOverrideTraitCollection:newTraitCollection forChildViewController:childViewController];
}
#pragma mark - MDCTraitEnvironmentChangeDelegate
- (void)
childViewControllerDidRequestPreferredContentSizeCategoryDecrement:
(UIViewController *)childViewController
decreaseButton:(MDCButton *)decreaseButton
increaseButton:(MDCButton *)increaseButton {
[self decreaseContentSizeForChildViewController:childViewController
decreaseButton:decreaseButton
increaseButton:increaseButton];
}
- (void)
childViewControllerDidRequestPreferredContentSizeCategoryIncrement:
(UIViewController *)childViewController
decreaseButton:(MDCButton *)decreaseButton
increaseButton:(MDCButton *)increaseButton {
[self increaseContentSizeForChildViewController:childViewController
decreaseButton:decreaseButton
increaseButton:increaseButton];
}
- (void)childViewControllerDidRequestUserInterfaceStyle:(UIViewController *)childViewController
userInterfaceStyle:(UIUserInterfaceStyle)userInterfaceStyle
API_AVAILABLE(ios(12.0)) {
UITraitCollection *userInterfaceStyleTraitCollection =
[UITraitCollection traitCollectionWithUserInterfaceStyle:userInterfaceStyle];
[self setTraitCollection:userInterfaceStyleTraitCollection
onChildViewController:childViewController];
}
- (void)childViewControllerDidRequestLayoutDirection:(UIViewController *)childViewController
layoutDirection:
(UITraitEnvironmentLayoutDirection)layoutDirection
API_AVAILABLE(ios(10.0)) {
UITraitCollection *layoutDirectionTraitCollection =
[UITraitCollection traitCollectionWithLayoutDirection:layoutDirection];
[self setTraitCollection:layoutDirectionTraitCollection
onChildViewController:childViewController];
}
@end