package com.layernet.adbwifi; import com.developerphil.adbidea.adb.AdbUtil; import com.android.ddmlib.AndroidDebugBridge; import com.android.ddmlib.IDevice; import com.developerphil.adbidea.adb.command.*; import com.developerphil.adbidea.ui.DeviceChooserDialog; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.sdk.AndroidSdkUtils; import org.jetbrains.android.util.AndroidUtils; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import static com.developerphil.adbidea.ui.NotificationHelper.error; public class AdbWifiConnect { private static final ExecutorService EXECUTOR = Executors.newCachedThreadPool(new ThreadFactoryBuilder().setNameFormat("AdbWifi-%d").build()); public static void adbWifi(Project project) { executeOnDevice(project, new WifiCommand()); } private static void executeOnDevice(final Project project, final Command runnable) { final DeviceResult result = getDevice(project); if (result != null) { for (final IDevice device : result.devices) { EXECUTOR.submit(new Runnable() { @Override public void run() { runnable.run(project, device, result.facet, result.packageName); } }); } } } private static DeviceResult getDevice(Project project) { List<AndroidFacet> facets = getApplicationFacets(project); if (!facets.isEmpty()) { AndroidFacet facet = facets.get(0); String packageName = AdbUtil.computePackageName(facet); AndroidDebugBridge bridge = AndroidSdkUtils.getDebugBridge(project); if (bridge == null) { error("No platform configured"); return null; } int count = 0; while (!bridge.isConnected() || !bridge.hasInitialDeviceList()) { try { Thread.sleep(100); count++; } catch (InterruptedException e) { // pass } // let's not wait > 10 sec. if (count > 100) { error("Timeout getting device list!"); return null; } } IDevice[] devices = bridge.getDevices(); if (devices.length == 1) { return new DeviceResult(devices, facet, packageName); } else if (devices.length > 1) { return askUserForDevice(facet, packageName); } else { return null; } } error("No devices found"); return null; } private static List<AndroidFacet> getApplicationFacets(Project project) { List<AndroidFacet> facetList = AndroidUtils.getApplicationFacets(project); Module[] modules = ModuleManager.getInstance(project).getModules(); for (Module module : modules) { AndroidFacet androidFacet = AndroidFacet.getInstance(module); if (androidFacet != null) { facetList.add(androidFacet); } } return facetList; } private static DeviceResult askUserForDevice(AndroidFacet facet, String packageName) { final DeviceChooserDialog chooser = new DeviceChooserDialog(facet); chooser.show(); if (chooser.getExitCode() != DialogWrapper.OK_EXIT_CODE) { return null; } IDevice[] selectedDevices = chooser.getSelectedDevices(); if (selectedDevices.length == 0) { return null; } return new DeviceResult(selectedDevices, facet, packageName); } private static final class DeviceResult { private final IDevice[] devices; private final AndroidFacet facet; private final String packageName; private DeviceResult(IDevice[] devices, AndroidFacet facet, String packageName) { this.devices = devices; this.facet = facet; this.packageName = packageName; } } }