/// <summary> /// New devices found. /// </summary> private void CallBack(List <AndroidDevice> list) { lock (devicesLock) { // Look for removed devices var removed = devices.Where(x => list.All(y => y.Serial != x.Serial)).ToList(); foreach (var device in removed) { devices.Remove(device); DeviceRemoved.Fire(this, new EventArgs <AndroidDevice>(device)); } // Look for added or changed devices foreach (var device in list) { var serial = device.Serial; var existing = devices.FirstOrDefault(x => x.Serial == serial); if (existing == null) { // Device added devices.Add(device); DeviceAdded.Fire(this, new EventArgs <AndroidDevice>(device)); } else if (existing.DeviceState != device.DeviceState) { // State changed devices.Remove(existing); devices.Add(device); DeviceStateChanged.Fire(this, new EventArgs <AndroidDevice>(device)); } } receivedInitialUpdate = true; Monitor.PulseAll(devicesLock); } }
/// <summary> /// A device has been added. /// </summary> void OnDeviceAdded(object sender, EventArgs <AndroidDevice> e) { if (InvokeRequired) { Invoke(new EventHandler <EventArgs <AndroidDevice> >(OnDeviceAdded), sender, e); } else { var ui = TaskScheduler.FromCurrentSynchronizationContext(); var createTask = Task.Factory.StartNew(() => new AndroidDeviceItem(e.Data)); createTask.ContinueWith(x => { if (x.Status == TaskStatus.RanToCompletion) { RemoveItemsBySerial(e.Data.Serial); var item = new AndroidDeviceItem(e.Data); tvList.Items.Add(item); SetIsCompatible(item); ReloadList(); if (UserPreferences.Preferences.PreferredDeviceSerial == item.Serial) { Select(item.Device); } UpdateNoDevicesItem(); DeviceAdded.Fire(this, e); } }, ui); } }