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
This commit is contained in:
John Knox
2018-12-10 02:19:42 -08:00
committed by Facebook Github Bot
parent f7ddf3b496
commit 140f846797
2 changed files with 46 additions and 28 deletions

View File

@@ -13,19 +13,19 @@ import type BaseDevice from '../devices/BaseDevice';
import type Logger from '../fb-stubs/Logger.js'; import type Logger from '../fb-stubs/Logger.js';
const adb = require('adbkit-fb'); const adb = require('adbkit-fb');
function createDevice(client, device): Promise<AndroidDevice> { function createDevice(adbClient, device): Promise<AndroidDevice> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const type = const type =
device.type !== 'device' || device.id.startsWith('emulator') device.type !== 'device' || device.id.startsWith('emulator')
? 'emulator' ? 'emulator'
: 'physical'; : 'physical';
client.getProperties(device.id).then(async props => { adbClient.getProperties(device.id).then(async props => {
let name = props['ro.product.model']; let name = props['ro.product.model'];
if (type === 'emulator') { if (type === 'emulator') {
name = (await getRunningEmulatorName(device.id)) || name; 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(); androidDevice.reverse();
resolve(androidDevice); resolve(androidDevice);
}); });
@@ -115,10 +115,7 @@ export default (store: Store, logger: Logger) => {
) )
.map((device: BaseDevice) => device.serial); .map((device: BaseDevice) => device.serial);
store.dispatch({ unregisterDevices(deviceIDsToRemove);
type: 'UNREGISTER_DEVICES',
payload: new Set(deviceIDsToRemove),
});
console.error('adb server was shutdown'); console.error('adb server was shutdown');
setTimeout(watchAndroidDevices, 500); setTimeout(watchAndroidDevices, 500);
} else { } else {
@@ -128,34 +125,20 @@ export default (store: Store, logger: Logger) => {
tracker.on('add', async device => { tracker.on('add', async device => {
if (device.type !== 'offline') { if (device.type !== 'offline') {
const androidDevice = await createDevice(client, device); registerDevice(client, device);
store.dispatch({
type: 'REGISTER_DEVICE',
payload: androidDevice,
});
} }
}); });
tracker.on('change', async device => { tracker.on('change', async device => {
if (device.type === 'offline') { if (device.type === 'offline') {
store.dispatch({ unregisterDevices([device.id]);
type: 'UNREGISTER_DEVICES',
payload: new Set([device.id]),
});
} else { } else {
const androidDevice = await createDevice(client, device); registerDevice(client, device);
store.dispatch({
type: 'REGISTER_DEVICE',
payload: androidDevice,
});
} }
}); });
tracker.on('remove', device => { tracker.on('remove', device => {
store.dispatch({ unregisterDevices([device.id]);
type: 'UNREGISTER_DEVICES',
payload: new Set([device.id]),
});
}); });
}) })
.catch(err => { .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<string>) {
deviceIds.forEach(id =>
logger.track('usage', 'unregister-device', {
os: 'Android',
serial: id,
}),
);
store.dispatch({
type: 'UNREGISTER_DEVICES',
payload: new Set(deviceIds),
});
}
watchAndroidDevices(); watchAndroidDevices();
}; };

View File

@@ -51,7 +51,7 @@ window.addEventListener('beforeunload', () => {
portForwarders.forEach(process => process.kill()); portForwarders.forEach(process => process.kill());
}); });
function queryDevices(store: Store): Promise<void> { function queryDevices(store: Store, logger: Logger): Promise<void> {
const {connections} = store.getState(); const {connections} = store.getState();
const currentDeviceIDs: Set<string> = new Set( const currentDeviceIDs: Set<string> = new Set(
connections.devices connections.devices
@@ -65,6 +65,12 @@ function queryDevices(store: Store): Promise<void> {
if (currentDeviceIDs.has(udid)) { if (currentDeviceIDs.has(udid)) {
currentDeviceIDs.delete(udid); currentDeviceIDs.delete(udid);
} else { } else {
logger.track('usage', 'register-device', {
os: 'iOS',
type: type,
name: name,
serial: udid,
});
store.dispatch({ store.dispatch({
type: 'REGISTER_DEVICE', type: 'REGISTER_DEVICE',
payload: new IOSDevice(udid, type, name), payload: new IOSDevice(udid, type, name),
@@ -73,6 +79,9 @@ function queryDevices(store: Store): Promise<void> {
} }
if (currentDeviceIDs.size > 0) { if (currentDeviceIDs.size > 0) {
currentDeviceIDs.forEach(id =>
logger.track('usage', 'unregister-device', {os: 'iOS', serial: id}),
);
store.dispatch({ store.dispatch({
type: 'UNREGISTER_DEVICES', type: 'UNREGISTER_DEVICES',
payload: currentDeviceIDs, payload: currentDeviceIDs,
@@ -123,10 +132,10 @@ export default (store: Store, logger: Logger) => {
if (process.platform !== 'darwin') { if (process.platform !== 'darwin') {
return; return;
} }
queryDevices(store) queryDevices(store, logger)
.then(() => { .then(() => {
const simulatorUpdateInterval = setInterval(() => { const simulatorUpdateInterval = setInterval(() => {
queryDevices(store).catch(err => { queryDevices(store, logger).catch(err => {
console.error(err); console.error(err);
clearInterval(simulatorUpdateInterval); clearInterval(simulatorUpdateInterval);
}); });