3 * Copyright (c) 2021 Project CHIP Authors
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 #import "DeviceSelector.h"
20 #import "CHIPUIViewUtils.h"
21 #import "DefaultsUtils.h"
23 @interface DeviceSelector ()
26 @implementation DeviceSelector {
27 NSMutableArray * _deviceList;
28 UIPickerView * _devicePicker;
29 NSUInteger _selectedDeviceIndex;
34 if (self = [super init]) {
35 [self refreshDeviceList];
37 [self setEnabled:YES];
42 - (void)refreshDeviceList
44 uint64_t nextDeviceID = CHIPGetNextAvailableDeviceID();
45 _deviceList = [NSMutableArray new];
46 for (uint64_t i = 0; i < nextDeviceID; i++) {
47 if (CHIPGetPairedDeviceWithID(i) != nil) {
48 [_deviceList addObject:[@(i) stringValue]];
51 _selectedDeviceIndex = 0;
53 // This will refresh the view with the updated device list
54 [self setEnabled:self.isEnabled];
57 - (void)forSelectedDevices:(DeviceAction)action
59 if ([self isEnabled]) {
60 if ([_deviceList count] > 0) {
62 NSScanner * scanner = [NSScanner scannerWithString:[_deviceList objectAtIndex:_selectedDeviceIndex]];
63 [scanner scanUnsignedLongLong:&nodeId];
67 for (id device in _deviceList) {
69 NSScanner * scanner = [NSScanner scannerWithString:device];
70 [scanner scanUnsignedLongLong:&nodeId];
78 _devicePicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 100, 0, 0)];
79 self.inputView = _devicePicker;
80 [_devicePicker setDataSource:self];
81 [_devicePicker setDelegate:self];
84 UIToolbar * deviceSelectButtonView = [[UIToolbar alloc] init];
85 [deviceSelectButtonView sizeToFit];
86 UIBarButtonItem * deviceSelectButton = [[UIBarButtonItem alloc] initWithTitle:@"Select"
87 style:UIBarButtonItemStylePlain
89 action:@selector(deviceSelectClicked:)];
90 UIBarButtonItem * flexible = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
93 [deviceSelectButtonView setItems:[NSArray arrayWithObjects:flexible, deviceSelectButton, nil]];
94 self.inputAccessoryView = deviceSelectButtonView;
97 - (void)setEnabled:(BOOL)enabled
99 [super setEnabled:enabled];
101 self.text = [_deviceList description];
102 } else if ([_deviceList count] > 0) {
103 self.text = [NSString stringWithFormat:@"%@", [_deviceList objectAtIndex:_selectedDeviceIndex]];
107 // MARK: UIPickerView
109 - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
111 if ([_deviceList count] > 0) {
112 NSLog(@"%@", [_deviceList objectAtIndex:row]);
113 self.text = [NSString stringWithFormat:@"%@", [_deviceList objectAtIndex:row]];
117 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
119 return [_deviceList count];
122 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
127 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
129 if ([_deviceList count] > 0) {
130 return [_deviceList objectAtIndex:row];
132 return [NSString new];
136 - (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
141 - (IBAction)deviceSelectClicked:(id)sender
143 if ([_deviceList count] > 0) {
144 _selectedDeviceIndex = [_deviceList indexOfObject:self.text];
146 [self resignFirstResponder];
149 // MARK: CHIPDeviceControllerDelegate
150 - (void)deviceControllerOnConnected
152 NSLog(@"Status: Device connected");
155 - (void)deviceControllerOnError:(nonnull NSError *)error