From 140f8467979f298af3422e238ddd208bf22cfed0 Mon Sep 17 00:00:00 2001 From: John Knox Date: Mon, 10 Dec 2018 02:19:42 -0800 Subject: [PATCH] Track device register and unregister Summary: Now we get one event for every time an android or iOS device is detected by flipper. This is different from a successfull connection. E.g. it may not have any flipper-enabled apps running. Reviewed By: danielbuechele Differential Revision: D13377316 fbshipit-source-id: 80e42ab0ae1c2ab50d4bec732a0fa86fcd941991 --- src/dispatcher/androidDevice.js | 59 +++++++++++++++++++-------------- src/dispatcher/iOSDevice.js | 15 +++++++-- 2 files changed, 46 insertions(+), 28 deletions(-) diff --git a/src/dispatcher/androidDevice.js b/src/dispatcher/androidDevice.js index f69d151d1..da4b8bd4b 100644 --- a/src/dispatcher/androidDevice.js +++ b/src/dispatcher/androidDevice.js @@ -13,19 +13,19 @@ import type BaseDevice from '../devices/BaseDevice'; import type Logger from '../fb-stubs/Logger.js'; const adb = require('adbkit-fb'); -function createDevice(client, device): Promise { +function createDevice(adbClient, device): Promise { return new Promise((resolve, reject) => { const type = device.type !== 'device' || device.id.startsWith('emulator') ? 'emulator' : 'physical'; - client.getProperties(device.id).then(async props => { + adbClient.getProperties(device.id).then(async props => { let name = props['ro.product.model']; if (type === 'emulator') { name = (await getRunningEmulatorName(device.id)) || name; } - const androidDevice = new AndroidDevice(device.id, type, name, client); + const androidDevice = new AndroidDevice(device.id, type, name, adbClient); androidDevice.reverse(); resolve(androidDevice); }); @@ -115,10 +115,7 @@ export default (store: Store, logger: Logger) => { ) .map((device: BaseDevice) => device.serial); - store.dispatch({ - type: 'UNREGISTER_DEVICES', - payload: new Set(deviceIDsToRemove), - }); + unregisterDevices(deviceIDsToRemove); console.error('adb server was shutdown'); setTimeout(watchAndroidDevices, 500); } else { @@ -128,34 +125,20 @@ export default (store: Store, logger: Logger) => { tracker.on('add', async device => { if (device.type !== 'offline') { - const androidDevice = await createDevice(client, device); - store.dispatch({ - type: 'REGISTER_DEVICE', - payload: androidDevice, - }); + registerDevice(client, device); } }); tracker.on('change', async device => { if (device.type === 'offline') { - store.dispatch({ - type: 'UNREGISTER_DEVICES', - payload: new Set([device.id]), - }); + unregisterDevices([device.id]); } else { - const androidDevice = await createDevice(client, device); - store.dispatch({ - type: 'REGISTER_DEVICE', - payload: androidDevice, - }); + registerDevice(client, device); } }); tracker.on('remove', device => { - store.dispatch({ - type: 'UNREGISTER_DEVICES', - payload: new Set([device.id]), - }); + unregisterDevices([device.id]); }); }) .catch(err => { @@ -171,5 +154,31 @@ export default (store: Store, logger: Logger) => { }); }; + async function registerDevice(adbClient: any, deviceData: any) { + const androidDevice = await createDevice(adbClient, deviceData); + logger.track('usage', 'register-device', { + os: 'Android', + name: androidDevice.title, + serial: androidDevice.serial, + }); + store.dispatch({ + type: 'REGISTER_DEVICE', + payload: androidDevice, + }); + } + + async function unregisterDevices(deviceIds: Array) { + deviceIds.forEach(id => + logger.track('usage', 'unregister-device', { + os: 'Android', + serial: id, + }), + ); + store.dispatch({ + type: 'UNREGISTER_DEVICES', + payload: new Set(deviceIds), + }); + } + watchAndroidDevices(); }; diff --git a/src/dispatcher/iOSDevice.js b/src/dispatcher/iOSDevice.js index bd16ef995..27c5938c1 100644 --- a/src/dispatcher/iOSDevice.js +++ b/src/dispatcher/iOSDevice.js @@ -51,7 +51,7 @@ window.addEventListener('beforeunload', () => { portForwarders.forEach(process => process.kill()); }); -function queryDevices(store: Store): Promise { +function queryDevices(store: Store, logger: Logger): Promise { const {connections} = store.getState(); const currentDeviceIDs: Set = new Set( connections.devices @@ -65,6 +65,12 @@ function queryDevices(store: Store): Promise { if (currentDeviceIDs.has(udid)) { currentDeviceIDs.delete(udid); } else { + logger.track('usage', 'register-device', { + os: 'iOS', + type: type, + name: name, + serial: udid, + }); store.dispatch({ type: 'REGISTER_DEVICE', payload: new IOSDevice(udid, type, name), @@ -73,6 +79,9 @@ function queryDevices(store: Store): Promise { } if (currentDeviceIDs.size > 0) { + currentDeviceIDs.forEach(id => + logger.track('usage', 'unregister-device', {os: 'iOS', serial: id}), + ); store.dispatch({ type: 'UNREGISTER_DEVICES', payload: currentDeviceIDs, @@ -123,10 +132,10 @@ export default (store: Store, logger: Logger) => { if (process.platform !== 'darwin') { return; } - queryDevices(store) + queryDevices(store, logger) .then(() => { const simulatorUpdateInterval = setInterval(() => { - queryDevices(store).catch(err => { + queryDevices(store, logger).catch(err => { console.error(err); clearInterval(simulatorUpdateInterval); });