1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.hosttest;
17 
18 import com.android.ddmlib.AndroidDebugBridge;
19 import com.android.ddmlib.IDevice;
20 import com.android.ddmlib.AndroidDebugBridge.IDeviceChangeListener;
21 
22 
23 /**
24  * A helper class that can connect to a ddmlib {@link IDevice}
25  */
26 public class DeviceConnector {
27 
28     /**
29      * The maximum time to wait for a device to be connected.
30      */
31     private static final int MAX_WAIT_DEVICE_TIME = 5000;
32 
33     /**
34      * Initializes DDMS library, and connects to specified Android device
35      *
36      * @param deviceSerial the device serial to connect to. If <code>null</code> connect to first
37      * discovered device.
38      *
39      * @return the {@link IDevice} found
40      * @throws IllegalArgumentException if no device cannot be found.
41      */
connectToDevice(String deviceSerial)42     public IDevice connectToDevice(String deviceSerial) {
43         // initialize DDMS with no clientSupport aka debugger support
44         AndroidDebugBridge.init(false /* clientSupport */);
45         AndroidDebugBridge adbBridge = AndroidDebugBridge.createBridge();
46         for (IDevice device : adbBridge.getDevices()) {
47             if (deviceSerial == null) {
48                 return device;
49             } else if (deviceSerial.equals(device.getSerialNumber())) {
50                 return device;
51             }
52         }
53         // TODO: get some sort of logger interface as param instead
54         System.out.println("Waiting for device...");
55         NewDeviceListener listener = new NewDeviceListener(deviceSerial);
56         AndroidDebugBridge.addDeviceChangeListener(listener);
57         IDevice device = listener.waitForDevice(MAX_WAIT_DEVICE_TIME);
58         AndroidDebugBridge.removeDeviceChangeListener(listener);
59         if (device == null) {
60             throw new IllegalArgumentException("Could not connect to device");
61         } else {
62             System.out.println(String.format("Connected to %s", device.getSerialNumber()));
63         }
64         return device;
65     }
66 
67     /**
68      * Listener for new Android devices
69      */
70     private static class NewDeviceListener implements IDeviceChangeListener {
71         private IDevice mDevice;
72         private String mSerial;
73 
NewDeviceListener(String serial)74         public NewDeviceListener(String serial) {
75             mSerial = serial;
76         }
77 
deviceChanged(IDevice device, int changeMask)78         public void deviceChanged(IDevice device, int changeMask) {
79         }
80 
deviceConnected(IDevice device)81         public void deviceConnected(IDevice device) {
82             if (mSerial == null) {
83                 setDevice(device);
84             } else if (mSerial.equals(device.getSerialNumber())) {
85                 setDevice(device);
86             }
87         }
88 
setDevice(IDevice device)89         private synchronized void setDevice(IDevice device) {
90             mDevice = device;
91             notify();
92         }
93 
deviceDisconnected(IDevice device)94         public void deviceDisconnected(IDevice device) {
95         }
96 
waitForDevice(long waitTime)97         public IDevice waitForDevice(long waitTime) {
98             synchronized(this) {
99                 if (mDevice == null) {
100                     try {
101                         wait(waitTime);
102                     } catch (InterruptedException e) {
103                         System.out.println("Waiting for device interrupted");
104                     }
105                 }
106             }
107             return mDevice;
108         }
109     }
110 }
111