diff options
author | youngki@chromium.org <youngki@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-10 04:07:32 +0000 |
---|---|---|
committer | youngki@chromium.org <youngki@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-10 04:07:32 +0000 |
commit | 36f0ce434726b7cd44b76643dcf6593c5f7a599b (patch) | |
tree | cf81ae60647623cc8b0e956edbaee3f41304ae7a /device | |
parent | f92494768949ab3c0af132405953b0fc3b1585f5 (diff) | |
download | chromium_src-36f0ce434726b7cd44b76643dcf6593c5f7a599b.zip chromium_src-36f0ce434726b7cd44b76643dcf6593c5f7a599b.tar.gz chromium_src-36f0ce434726b7cd44b76643dcf6593c5f7a599b.tar.bz2 |
Simplified BluetoothAdapterMac.
Mainly removed the complicate but unnecessary logic of updating |devices_| with paired devices. Since Bluetooth APIs do not need to listen to any of Device* observer calls for paired devices, I simplified the logic by just repopulating |devices_| when there is a change to those devices.
This is the first CL to implement Bluetooth 4.0 APIs and since there might be more changes, I'd rather implement the corresponding test in the later CLs once the shape of this file looks stable.
BUG=229636
Review URL: https://chromiumcodereview.appspot.com/13862020
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@193313 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'device')
-rw-r--r-- | device/bluetooth/bluetooth_adapter_mac.h | 17 | ||||
-rw-r--r-- | device/bluetooth/bluetooth_adapter_mac.mm | 62 | ||||
-rw-r--r-- | device/bluetooth/bluetooth_adapter_mac_unittest.mm | 183 |
3 files changed, 24 insertions, 238 deletions
diff --git a/device/bluetooth/bluetooth_adapter_mac.h b/device/bluetooth/bluetooth_adapter_mac.h index dc4b06b..0886076 100644 --- a/device/bluetooth/bluetooth_adapter_mac.h +++ b/device/bluetooth/bluetooth_adapter_mac.h @@ -21,11 +21,13 @@ @class IOBluetoothDevice; @class IOBluetoothDeviceInquiry; @class NSArray; +@class NSDate; #else class BluetoothAdapterMacDelegate; class IOBluetoothDevice; class IOBluetoothDeviceInquiry; class NSArray; +class NSDate; #endif namespace base { @@ -90,15 +92,8 @@ class BluetoothAdapterMac : public BluetoothAdapter { void InitForTest(scoped_refptr<base::SequencedTaskRunner> ui_task_runner); void PollAdapter(); - // Adds |devices| into |devices_| and notifies observers of the changes. - // |devices| is an array of pointers to discovered or paired - // |IOBluetoothDevice| objects. - void AddDevices(NSArray* devices); - - // Removes devices that used to be paired but are unpaired by the system from - // |devices_|. - // |devices| is an array of pointers to paired |IOBluetoothDevice| objects. - void RemoveUnpairedDevices(NSArray* paired_devices); + // Updates |devices_| to be consistent with |devices|. + void UpdateDevices(NSArray* devices); void MaybeStartDeviceInquiry(); void MaybeStopDeviceInquiry(); @@ -125,6 +120,10 @@ class BluetoothAdapterMac : public BluetoothAdapter { // the discovery between consecutive inquiries. base::hash_set<std::string> discovered_devices_; + // Timestamp for the recently accessed device. + // Used to determine if |devices_| needs an update. + NSDate* recently_accessed_device_timestamp_; + scoped_refptr<base::SequencedTaskRunner> ui_task_runner_; // List of observers interested in event notifications from us. diff --git a/device/bluetooth/bluetooth_adapter_mac.mm b/device/bluetooth/bluetooth_adapter_mac.mm index 9ca4b3a..00d6737 100644 --- a/device/bluetooth/bluetooth_adapter_mac.mm +++ b/device/bluetooth/bluetooth_adapter_mac.mm @@ -99,12 +99,14 @@ BluetoothAdapterMac::BluetoothAdapterMac() device_inquiry_( [[IOBluetoothDeviceInquiry inquiryWithDelegate:adapter_delegate_] retain]), + recently_accessed_device_timestamp_(nil), weak_ptr_factory_(this) { } BluetoothAdapterMac::~BluetoothAdapterMac() { [device_inquiry_ release]; [adapter_delegate_ release]; + [recently_accessed_device_timestamp_ release]; } void BluetoothAdapterMac::AddObserver(BluetoothAdapter::Observer* observer) { @@ -215,9 +217,17 @@ void BluetoothAdapterMac::PollAdapter() { AdapterPoweredChanged(this, powered_)); } - NSArray* paired_devices = [IOBluetoothDevice pairedDevices]; - AddDevices(paired_devices); - RemoveUnpairedDevices(paired_devices); + IOBluetoothDevice* recent_device = + [[IOBluetoothDevice recentDevices:1] lastObject]; + NSDate* access_timestamp = [recent_device recentAccessDate]; + if (recently_accessed_device_timestamp_ == nil || + access_timestamp == nil || + [recently_accessed_device_timestamp_ compare:access_timestamp] == + NSOrderedAscending) { + UpdateDevices([IOBluetoothDevice pairedDevices]); + [recently_accessed_device_timestamp_ release]; + recently_accessed_device_timestamp_ = [access_timestamp copy]; + } ui_task_runner_->PostDelayedTask( FROM_HERE, @@ -226,52 +236,12 @@ void BluetoothAdapterMac::PollAdapter() { base::TimeDelta::FromMilliseconds(kPollIntervalMs)); } -void BluetoothAdapterMac::AddDevices(NSArray* devices) { +void BluetoothAdapterMac::UpdateDevices(NSArray* devices) { + STLDeleteValues(&devices_); for (IOBluetoothDevice* device in devices) { std::string device_address = base::SysNSStringToUTF8([device addressString]); - DevicesMap::iterator found_device_iter = devices_.find(device_address); - - if (found_device_iter == devices_.end()) { - devices_[device_address] = new BluetoothDeviceMac(device); - FOR_EACH_OBSERVER(BluetoothAdapter::Observer, observers_, - DeviceAdded(this, devices_[device_address])); - continue; - } - BluetoothDeviceMac* device_mac = - static_cast<BluetoothDeviceMac*>(found_device_iter->second); - if (device_mac->device_fingerprint() != - BluetoothDeviceMac::ComputeDeviceFingerprint(device)) { - devices_[device_address] = new BluetoothDeviceMac(device); - FOR_EACH_OBSERVER(BluetoothAdapter::Observer, observers_, - DeviceChanged(this, devices_[device_address])); - delete device_mac; - } - } -} - -void BluetoothAdapterMac::RemoveUnpairedDevices(NSArray* paired_devices) { - base::hash_set<std::string> paired_device_address_list; - for (IOBluetoothDevice* device in paired_devices) { - paired_device_address_list.insert( - base::SysNSStringToUTF8([device addressString])); - } - - DevicesMap::iterator iter = devices_.begin(); - while (iter != devices_.end()) { - DevicesMap::iterator device_iter = iter; - ++iter; - - if (paired_device_address_list.find(device_iter->first) != - paired_device_address_list.end()) - continue; - - if (device_iter->second->IsPaired()) { - FOR_EACH_OBSERVER(BluetoothAdapter::Observer, observers_, - DeviceRemoved(this, device_iter->second)); - delete device_iter->second; - devices_.erase(device_iter); - } + devices_[device_address] = new BluetoothDeviceMac(device); } } diff --git a/device/bluetooth/bluetooth_adapter_mac_unittest.mm b/device/bluetooth/bluetooth_adapter_mac_unittest.mm index 2ea7f5a..6ef4c9b 100644 --- a/device/bluetooth/bluetooth_adapter_mac_unittest.mm +++ b/device/bluetooth/bluetooth_adapter_mac_unittest.mm @@ -2,121 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import <IOBluetooth/IOBluetoothUtilities.h> -#import <IOBluetooth/objc/IOBluetoothDevice.h> - #include "base/memory/ref_counted.h" #include "base/test/test_simple_task_runner.h" #include "device/bluetooth/bluetooth_adapter.h" #include "device/bluetooth/bluetooth_adapter_mac.h" #include "testing/gtest/include/gtest/gtest.h" -@interface TestIOBluetoothDevice : IOBluetoothDevice { - @private - NSString* device_name_; - NSString* device_address_; - BOOL paired_; -} - -+ (TestIOBluetoothDevice*)deviceWithName:(NSString*)device_name - address:(NSString*)device_address - paired:(BOOL)paired; -- (id)initWithName:(NSString*)device_name - address:(NSString*)device_address - paired:(BOOL)paired; - -@property (nonatomic, copy, getter=name) NSString* deviceName; -@property (nonatomic, copy, getter=addressString) NSString* deviceAddress; -@property (nonatomic, assign, getter=isPaired) BOOL paired; - -@end - -@implementation TestIOBluetoothDevice - -@synthesize deviceName = device_name_; -@synthesize deviceAddress = device_address_; -@synthesize paired = paired_; - -+ (TestIOBluetoothDevice*)deviceWithName:(NSString*)device_name - address:(NSString*)device_address - paired:(BOOL)paired { - return [[[TestIOBluetoothDevice alloc] initWithName:device_name - address:device_address - paired:paired] autorelease]; -} - -- (id)initWithName:(NSString*)device_name - address:(NSString*)device_address - paired:(BOOL)paired { - if (self = [super init]) { - [self setDeviceName:device_name]; - [self setDeviceAddress:device_address]; - [self setPaired:paired]; - } - - return self; -} - -- (void)dealloc { - [self setDeviceName:nil]; - [self setDeviceAddress:nil]; - [super dealloc]; -} - -@end - -namespace { - -class AdapterObserver : public device::BluetoothAdapter::Observer { - public: - AdapterObserver() { - Clear(); - } - - void Clear() { - num_device_added_ = 0; - num_device_changed_ = 0; - num_device_removed_ = 0; - } - - virtual void DeviceAdded( - device::BluetoothAdapter* adapter, - device::BluetoothDevice* device) OVERRIDE { - num_device_added_++; - } - - virtual void DeviceChanged( - device::BluetoothAdapter* adapter, - device::BluetoothDevice* device) OVERRIDE { - num_device_changed_++; - } - - virtual void DeviceRemoved( - device::BluetoothAdapter* adapter, - device::BluetoothDevice* device) OVERRIDE { - num_device_removed_++; - } - - int num_device_added() const { - return num_device_added_; - } - - int num_device_changed() const { - return num_device_changed_; - } - - int num_device_removed() const { - return num_device_removed_; - } - - private: - int num_device_added_; - int num_device_changed_; - int num_device_removed_; -}; - -} // namespace - namespace device { class BluetoothAdapterMacTest : public testing::Test { @@ -126,90 +17,16 @@ class BluetoothAdapterMacTest : public testing::Test { adapter_(new BluetoothAdapterMac()), adapter_mac_(static_cast<BluetoothAdapterMac*>(adapter_.get())) { adapter_mac_->InitForTest(ui_task_runner_); - adapter_mac_->RemoveUnpairedDevices([NSArray array]); - adapter_observer_.Clear(); - } - - virtual void SetUp() OVERRIDE { - adapter_mac_->AddObserver(&adapter_observer_); - } - - virtual void TearDown() OVERRIDE { - adapter_mac_->RemoveObserver(&adapter_observer_); - } - - void AddDevices(NSArray* devices) { - adapter_mac_->AddDevices(devices); - } - - void RemoveUnpairedDevices(NSArray* devices) { - adapter_mac_->RemoveUnpairedDevices(devices); } protected: scoped_refptr<base::TestSimpleTaskRunner> ui_task_runner_; scoped_refptr<BluetoothAdapter> adapter_; BluetoothAdapterMac* adapter_mac_; - AdapterObserver adapter_observer_; }; TEST_F(BluetoothAdapterMacTest, Poll) { EXPECT_FALSE(ui_task_runner_->GetPendingTasks().empty()); } -TEST_F(BluetoothAdapterMacTest, AddDevices) { - TestIOBluetoothDevice* android_device = - [TestIOBluetoothDevice deviceWithName:@"android" - address:@"11:22:33:44:55:66" - paired:false]; - TestIOBluetoothDevice* laptop_device = - [TestIOBluetoothDevice deviceWithName:@"laptop" - address:@"77:88:99:aa:bb:cc" - paired:false]; - TestIOBluetoothDevice* iphone_device = - [TestIOBluetoothDevice deviceWithName:@"iphone" - address:@"dd:ee:ff:11:22:33" - paired:false]; - NSMutableArray* devices = [NSMutableArray arrayWithCapacity:3]; - [devices addObject:android_device]; - [devices addObject:laptop_device]; - [devices addObject:iphone_device]; - AddDevices(devices); - EXPECT_EQ(3, adapter_observer_.num_device_added()); - adapter_observer_.Clear(); - - AddDevices(devices); - EXPECT_EQ(0, adapter_observer_.num_device_added()); - EXPECT_EQ(0, adapter_observer_.num_device_changed()); - - [iphone_device setDeviceName:@"apple phone"]; - AddDevices(devices); - EXPECT_EQ(0, adapter_observer_.num_device_added()); - EXPECT_EQ(1, adapter_observer_.num_device_changed()); - adapter_observer_.Clear(); -} - -TEST_F(BluetoothAdapterMacTest, RemoveUnpairedDevices) { - TestIOBluetoothDevice* android_device = - [TestIOBluetoothDevice deviceWithName:@"android" - address:@"11:22:33:44:55:66" - paired:true]; - TestIOBluetoothDevice* laptop_device = - [TestIOBluetoothDevice deviceWithName:@"laptop" - address:@"77:88:99:aa:bb:cc" - paired:false]; - NSMutableArray* devices = [NSMutableArray arrayWithCapacity:2]; - [devices addObject:android_device]; - [devices addObject:laptop_device]; - AddDevices(devices); - adapter_observer_.Clear(); - - RemoveUnpairedDevices([NSArray arrayWithObject:android_device]); - EXPECT_EQ(0, adapter_observer_.num_device_removed()); - - RemoveUnpairedDevices([NSArray array]); - EXPECT_EQ(1, adapter_observer_.num_device_removed()); - -} - } // namespace device |