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

Side by Side Diff: remoting/client/ios/app/remoting_settings_view_controller.mm

Issue 2871993003: Moving the iOS directory to be remoting top level. (Closed)
Patch Set: //remoting/ios was the old landing target for the internal iOS application. Fix. 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #if !defined(__has_feature) || !__has_feature(objc_arc)
6 #error "This file requires ARC support."
7 #endif
8
9 #import "remoting/client/ios/app/remoting_settings_view_controller.h"
10
11 #import "ios/third_party/material_components_ios/src/components/AppBar/src/Mater ialAppBar.h"
12 #import "ios/third_party/material_components_ios/src/components/Buttons/src/Mate rialButtons.h"
13 #import "remoting/client/ios/facade/remoting_authentication.h"
14 #import "remoting/client/ios/facade/remoting_service.h"
15
16 #include "base/strings/stringprintf.h"
17 #include "google_apis/google_api_keys.h"
18 #include "net/base/escape.h"
19
20 // TODO(nicholss): This should be generated from a remoting/base class:
21
22 static NSString* const kReusableIdentifierItem =
23 @"remotingSettingsViewControllerItem";
24 static UIColor* kBackgroundColor =
25 [UIColor colorWithRed:0.f green:0.67f blue:0.55f alpha:1.f];
26
27 namespace {
28 const char kChromotingAuthScopeValues[] =
29 "https://www.googleapis.com/auth/chromoting "
30 "https://www.googleapis.com/auth/googletalk "
31 "https://www.googleapis.com/auth/userinfo.email";
32
33 std::string GetAuthorizationCodeUri() {
34 // Replace space characters with a '+' sign when formatting.
35 bool use_plus = true;
36 return base::StringPrintf(
37 "https://accounts.google.com/o/oauth2/auth"
38 "?scope=%s"
39 "&redirect_uri=https://chromoting-oauth.talkgadget.google.com/"
40 "talkgadget/oauth/chrome-remote-desktop/dev"
41 "&response_type=code"
42 "&client_id=%s"
43 "&access_type=offline"
44 "&approval_prompt=force",
45 net::EscapeUrlEncodedData(kChromotingAuthScopeValues, use_plus).c_str(),
46 net::EscapeUrlEncodedData(
47 google_apis::GetOAuth2ClientID(google_apis::CLIENT_REMOTING),
48 use_plus)
49 .c_str());
50 }
51
52 } // namespace
53
54 @interface RemotingSettingsViewController () {
55 MDCAppBar* _appBar;
56 NSMutableArray* _content;
57 }
58 @end
59
60 // This is the chromium version of the settings view controller. This will
61 // launch a web view to login and collect an oauth token to be able to login to
62 // the app without the standard google login flow.
63 //
64 // This class is majority boiler plate code to get a collection view.
65 // It will be replaced with a sidebar-like view in the future, but in
66 // chromium this is how we get an oauth token to login to the app.
67 //
68 // Note: this class is not localized, it will not be shipped to production.
69 //
70 // TODO(nicholss): This class needs to be split into a shareable view
71 // for chromium and prod to share.
72 //
73 @implementation RemotingSettingsViewController
74
75 - (id)init {
76 self = [super init];
77 if (self) {
78 self.title = @"Settings";
79
80 _appBar = [[MDCAppBar alloc] init];
81 [self addChildViewController:_appBar.headerViewController];
82
83 _appBar.headerViewController.headerView.backgroundColor = kBackgroundColor;
84 _appBar.navigationBar.tintColor = [UIColor whiteColor];
85 _appBar.navigationBar.titleTextAttributes =
86 @{NSForegroundColorAttributeName : [UIColor whiteColor]};
87 }
88 return self;
89 }
90
91 #pragma mark - UIViewController
92
93 - (void)viewDidLoad {
94 [super viewDidLoad];
95
96 _appBar.headerViewController.headerView.trackingScrollView =
97 self.collectionView;
98 [_appBar addSubviewsToParent];
99
100 UIBarButtonItem* backButton =
101 [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Back"]
102 style:UIBarButtonItemStyleDone
103 target:self
104 action:@selector(didTapBack:)];
105 self.navigationItem.leftBarButtonItem = backButton;
106 self.navigationItem.rightBarButtonItem = nil;
107
108 [self.collectionView registerClass:[MDCCollectionViewTextCell class]
109 forCellWithReuseIdentifier:kReusableIdentifierItem];
110
111 [self.collectionView registerClass:[MDCCollectionViewTextCell class]
112 forSupplementaryViewOfKind:UICollectionElementKindSectionHeader
113 withReuseIdentifier:UICollectionElementKindSectionHeader];
114
115 self.styler.cellStyle = MDCCollectionViewCellStyleCard;
116
117 _content = [NSMutableArray array];
118 [_content addObject:@[ @"Login", @"Logout" ]];
119 }
120
121 #pragma mark - UICollectionViewDataSource
122
123 - (NSInteger)numberOfSectionsInCollectionView:
124 (UICollectionView*)collectionView {
125 return (NSInteger)[_content count];
126 }
127
128 - (NSInteger)collectionView:(UICollectionView*)collectionView
129 numberOfItemsInSection:(NSInteger)section {
130 return (NSInteger)[_content[(NSUInteger)section] count];
131 }
132
133 - (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView
134 cellForItemAtIndexPath:(NSIndexPath*)indexPath {
135 MDCCollectionViewTextCell* cell = [collectionView
136 dequeueReusableCellWithReuseIdentifier:kReusableIdentifierItem
137 forIndexPath:indexPath];
138 cell.textLabel.text =
139 _content[(NSUInteger)indexPath.section][(NSUInteger)indexPath.item];
140
141 if (indexPath.section == 0 && indexPath.item == 0) {
142 MDCRaisedButton* accessCodeButton = [[MDCRaisedButton alloc] init];
143 [accessCodeButton setTitle:@"Get Access Code"
144 forState:UIControlStateNormal];
145 [accessCodeButton sizeToFit];
146 [accessCodeButton addTarget:self
147 action:@selector(didTapGetAccessCode:)
148 forControlEvents:UIControlEventTouchUpInside];
149 accessCodeButton.translatesAutoresizingMaskIntoConstraints = NO;
150 cell.accessoryView = accessCodeButton;
151 } else if (indexPath.section == 0 && indexPath.item == 1) {
152 MDCRaisedButton* logoutButton = [[MDCRaisedButton alloc] init];
153 [logoutButton setTitle:@"Logout" forState:UIControlStateNormal];
154 [logoutButton sizeToFit];
155 [logoutButton addTarget:self
156 action:@selector(didTapLogout:)
157 forControlEvents:UIControlEventTouchUpInside];
158 logoutButton.translatesAutoresizingMaskIntoConstraints = NO;
159 cell.accessoryView = logoutButton;
160 }
161
162 return cell;
163 }
164
165 - (UICollectionReusableView*)collectionView:(UICollectionView*)collectionView
166 viewForSupplementaryElementOfKind:(NSString*)kind
167 atIndexPath:(NSIndexPath*)indexPath {
168 MDCCollectionViewTextCell* supplementaryView =
169 [collectionView dequeueReusableSupplementaryViewOfKind:kind
170 withReuseIdentifier:kind
171 forIndexPath:indexPath];
172 if ([kind isEqualToString:UICollectionElementKindSectionHeader]) {
173 if (indexPath.section == 0) {
174 supplementaryView.textLabel.text = @"Account";
175 }
176 supplementaryView.textLabel.textColor = kBackgroundColor;
177 }
178 return supplementaryView;
179 }
180
181 #pragma mark - <UICollectionViewDelegateFlowLayout>
182
183 - (CGSize)collectionView:(UICollectionView*)collectionView
184 layout:
185 (UICollectionViewLayout*)collectionViewLayout
186 referenceSizeForHeaderInSection:(NSInteger)section {
187 return CGSizeMake(collectionView.bounds.size.width,
188 MDCCellDefaultOneLineHeight);
189 }
190
191 #pragma mark - Private
192
193 - (void)didTapBack:(id)button {
194 [self dismissViewControllerAnimated:YES completion:nil];
195 }
196
197 - (void)didTapGetAccessCode:(id)sender {
198 NSString* authUri =
199 [NSString stringWithCString:GetAuthorizationCodeUri().c_str()
200 encoding:[NSString defaultCStringEncoding]];
201 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:authUri]];
202 }
203
204 - (void)didTapLogout:(id)sender {
205 [[RemotingService SharedInstance].authentication logout];
206 }
207
208 @end
OLDNEW
« no previous file with comments | « remoting/client/ios/app/remoting_settings_view_controller.h ('k') | remoting/client/ios/app/remoting_view_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698