Home | History | Annotate | Download | only in hosttest
      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      */
     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 
     74         public NewDeviceListener(String serial) {
     75             mSerial = serial;
     76         }
     77 
     78         public void deviceChanged(IDevice device, int changeMask) {
     79         }
     80 
     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 
     89         private synchronized void setDevice(IDevice device) {
     90             mDevice = device;
     91             notify();
     92         }
     93 
     94         public void deviceDisconnected(IDevice device) {
     95         }
     96 
     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