• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 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.tradefed.device;
17 
18 import com.android.ddmlib.IDevice;
19 import com.android.tradefed.command.remote.DeviceDescriptor;
20 import com.android.tradefed.device.connection.DefaultConnection;
21 
22 import java.util.Map;
23 import java.util.regex.Matcher;
24 import java.util.regex.Pattern;
25 
26 /**
27  * Implementation of a {@link ITestDevice} for a full stack android device connected via
28  * adb connect.
29  * Assume the device serial will be in the format <hostname>:<portnumber> in adb.
30  */
31 public class RemoteAndroidDevice extends TestDevice {
32     public static final long WAIT_FOR_ADB_CONNECT = 2 * 60 * 1000;
33 
34     protected static final long RETRY_INTERVAL_MS = 5000;
35     protected static final int MAX_RETRIES = 5;
36     protected static final long DEFAULT_SHORT_CMD_TIMEOUT = 20 * 1000;
37 
38     private static final Pattern IP_PATTERN =
39             Pattern.compile(ManagedTestDeviceFactory.IPADDRESS_PATTERN);
40 
41     /**
42      * Creates a {@link RemoteAndroidDevice}.
43      *
44      * @param device the associated {@link IDevice}
45      * @param stateMonitor the {@link IDeviceStateMonitor} mechanism to use
46      * @param allocationMonitor the {@link IDeviceMonitor} to inform of allocation state changes.
47      */
RemoteAndroidDevice(IDevice device, IDeviceStateMonitor stateMonitor, IDeviceMonitor allocationMonitor)48     public RemoteAndroidDevice(IDevice device, IDeviceStateMonitor stateMonitor,
49             IDeviceMonitor allocationMonitor) {
50         super(device, stateMonitor, allocationMonitor);
51     }
52 
53     /**
54      * Check if the format of the serial is as expected <hostname>:port
55      *
56      * @return true if the format is valid, false otherwise.
57      */
checkSerialFormatValid(String serialString)58     public static boolean checkSerialFormatValid(String serialString) {
59         String[] serial = serialString.split(":");
60         if (serial.length == 2) {
61             // Check first part is an IP
62             Matcher match = IP_PATTERN.matcher(serial[0]);
63             if (!match.find()) {
64                 return false;
65             }
66             // Check second part if a port
67             try {
68                 Integer.parseInt(serial[1]);
69                 return true;
70             } catch (NumberFormatException nfe) {
71                 return false;
72             }
73         }
74         return false;
75     }
76 
77     /**
78      * {@inheritDoc}
79      */
80     @Override
isEncryptionSupported()81     public boolean isEncryptionSupported() {
82         // Prevent device from being encrypted since we won't have a way to decrypt on Remote
83         // devices since fastboot cannot be use remotely
84         return false;
85     }
86 
87     /**
88      * {@inheritDoc}
89      */
90     @Override
getMacAddress()91     public String getMacAddress() {
92         return null;
93     }
94 
95 
96     @Override
getDeviceDescriptor(boolean shortDescriptor)97     public DeviceDescriptor getDeviceDescriptor(boolean shortDescriptor) {
98         DeviceDescriptor descriptor = super.getDeviceDescriptor(shortDescriptor);
99         if (getConnection() instanceof DefaultConnection) {
100             String initialSerial = ((DefaultConnection) getConnection()).getInitialSerial();
101             String initialIp = ((DefaultConnection) getConnection()).getInitialIp();
102             Integer initialOffset =
103                     ((DefaultConnection) getConnection()).getInitialDeviceNumOffset();
104             if (initialIp != null || initialOffset != null) {
105                 // Specify ip/offset.
106                 descriptor = new DeviceDescriptor(descriptor, initialIp, initialOffset);
107             }
108         }
109         return descriptor;
110     }
111 
112     @Override
connectToWifiNetwork(Map<String, String> wifiSsidToPsk, boolean scanSsid)113     public boolean connectToWifiNetwork(Map<String, String> wifiSsidToPsk, boolean scanSsid)
114             throws DeviceNotAvailableException {
115         // turn on cmd wifi logic for virtual devices.
116         if (getOptions().isCmdWifiVirtual()) {
117             getOptions().setUseCmdWifi(true);
118         }
119         return super.connectToWifiNetwork(wifiSsidToPsk, scanSsid);
120     }
121 }
122