1 /*
2  * Copyright (C) 2017 Google Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5  * use this file except in compliance with the License. You may obtain a copy of
6  * 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, WITHOUT
12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13  * License for the specific language governing permissions and limitations under
14  * the License.
15  */
16 
17 package com.google.android.mobly.snippet.bundled.utils;
18 
19 import android.bluetooth.BluetoothDevice;
20 import android.bluetooth.BluetoothGatt;
21 import android.bluetooth.BluetoothGattCharacteristic;
22 import android.bluetooth.BluetoothGattService;
23 import android.bluetooth.BluetoothProfile;
24 import android.bluetooth.le.AdvertiseCallback;
25 import android.bluetooth.le.AdvertiseSettings;
26 import android.bluetooth.le.ScanCallback;
27 import android.bluetooth.le.ScanSettings;
28 import android.net.wifi.WifiManager.LocalOnlyHotspotCallback;
29 import android.os.Build;
30 
31 /** Mobly Bundled Snippets (MBS)'s {@link RpcEnum} objects representing enums in Android APIs. */
32 public class MbsEnums {
33     static final RpcEnum BLE_ADVERTISE_MODE = buildBleAdvertiseModeEnum();
34     static final RpcEnum BLE_ADVERTISE_TX_POWER = buildBleAdvertiseTxPowerEnum();
35     public static final RpcEnum BLE_SCAN_FAILED_ERROR_CODE = buildBleScanFailedErrorCodeEnum();
36     public static final RpcEnum BLE_SCAN_RESULT_CALLBACK_TYPE =
37             buildBleScanResultCallbackTypeEnum();
38     static final RpcEnum BLUETOOTH_DEVICE_BOND_STATE = buildBluetoothDeviceBondState();
39     static final RpcEnum BLUETOOTH_DEVICE_TYPE = buildBluetoothDeviceTypeEnum();
40     static final RpcEnum BLE_SERVICE_TYPE = buildServiceTypeEnum();
41     public static final RpcEnum BLE_STATUS_TYPE = buildStatusTypeEnum();
42     public static final RpcEnum BLE_CONNECT_STATUS = buildConnectStatusEnum();
43     static final RpcEnum BLE_PROPERTY_TYPE = buildPropertyTypeEnum();
44     static final RpcEnum BLE_PERMISSION_TYPE = buildPermissionTypeEnum();
45     static final RpcEnum BLE_SCAN_MODE = buildBleScanModeEnum();
46     public static final RpcEnum LOCAL_HOTSPOT_FAIL_REASON = buildLocalHotspotFailedReason();
47     public static final RpcEnum ADVERTISE_FAILURE_ERROR_CODE =
48             new RpcEnum.Builder().add("ADVERTISE_FAILED_ALREADY_STARTED",
49                                      AdvertiseCallback.ADVERTISE_FAILED_ALREADY_STARTED)
50                     .add("ADVERTISE_FAILED_DATA_TOO_LARGE",
51                         AdvertiseCallback.ADVERTISE_FAILED_DATA_TOO_LARGE)
52                     .add(
53                         "ADVERTISE_FAILED_FEATURE_UNSUPPORTED",
54                         AdvertiseCallback.ADVERTISE_FAILED_FEATURE_UNSUPPORTED)
55                     .add("ADVERTISE_FAILED_INTERNAL_ERROR",
56                         AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR)
57                     .add(
58                         "ADVERTISE_FAILED_TOO_MANY_ADVERTISERS",
59                         AdvertiseCallback.ADVERTISE_FAILED_TOO_MANY_ADVERTISERS)
60                     .build();
61 
buildBluetoothDeviceBondState()62     private static RpcEnum buildBluetoothDeviceBondState() {
63         RpcEnum.Builder builder = new RpcEnum.Builder();
64         return builder.add("BOND_NONE", BluetoothDevice.BOND_NONE)
65                 .add("BOND_BONDING", BluetoothDevice.BOND_BONDING)
66                 .add("BOND_BONDED", BluetoothDevice.BOND_BONDED)
67                 .build();
68     }
69 
buildBluetoothDeviceTypeEnum()70     private static RpcEnum buildBluetoothDeviceTypeEnum() {
71         RpcEnum.Builder builder = new RpcEnum.Builder();
72         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
73             return builder.build();
74         }
75         return builder.add("DEVICE_TYPE_CLASSIC", BluetoothDevice.DEVICE_TYPE_CLASSIC)
76                 .add("DEVICE_TYPE_LE", BluetoothDevice.DEVICE_TYPE_LE)
77                 .add("DEVICE_TYPE_DUAL", BluetoothDevice.DEVICE_TYPE_DUAL)
78                 .add("DEVICE_TYPE_UNKNOWN", BluetoothDevice.DEVICE_TYPE_UNKNOWN)
79                 .build();
80     }
81 
buildBleAdvertiseTxPowerEnum()82     private static RpcEnum buildBleAdvertiseTxPowerEnum() {
83         RpcEnum.Builder builder = new RpcEnum.Builder();
84         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
85             return builder.build();
86         }
87         return builder.add(
88                         "ADVERTISE_TX_POWER_ULTRA_LOW",
89                         AdvertiseSettings.ADVERTISE_TX_POWER_ULTRA_LOW)
90                 .add("ADVERTISE_TX_POWER_LOW", AdvertiseSettings.ADVERTISE_TX_POWER_LOW)
91                 .add("ADVERTISE_TX_POWER_MEDIUM", AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM)
92                 .add("ADVERTISE_TX_POWER_HIGH", AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
93                 .build();
94     }
95 
buildBleAdvertiseModeEnum()96     private static RpcEnum buildBleAdvertiseModeEnum() {
97         RpcEnum.Builder builder = new RpcEnum.Builder();
98         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
99             return builder.build();
100         }
101         return builder.add("ADVERTISE_MODE_BALANCED", AdvertiseSettings.ADVERTISE_MODE_BALANCED)
102                 .add("ADVERTISE_MODE_LOW_LATENCY", AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
103                 .add("ADVERTISE_MODE_LOW_POWER", AdvertiseSettings.ADVERTISE_MODE_LOW_POWER)
104                 .build();
105     }
106 
buildBleScanFailedErrorCodeEnum()107     private static RpcEnum buildBleScanFailedErrorCodeEnum() {
108         RpcEnum.Builder builder = new RpcEnum.Builder();
109         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
110             return builder.build();
111         }
112         return builder.add("SCAN_FAILED_ALREADY_STARTED", ScanCallback.SCAN_FAILED_ALREADY_STARTED)
113                 .add(
114                         "SCAN_FAILED_APPLICATION_REGISTRATION_FAILED",
115                         ScanCallback.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED)
116                 .add(
117                         "SCAN_FAILED_FEATURE_UNSUPPORTED",
118                         ScanCallback.SCAN_FAILED_FEATURE_UNSUPPORTED)
119                 .add("SCAN_FAILED_INTERNAL_ERROR", ScanCallback.SCAN_FAILED_INTERNAL_ERROR)
120                 .build();
121     }
122 
buildBleScanResultCallbackTypeEnum()123     private static RpcEnum buildBleScanResultCallbackTypeEnum() {
124         RpcEnum.Builder builder = new RpcEnum.Builder();
125         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
126             return builder.build();
127         }
128         builder.add("CALLBACK_TYPE_ALL_MATCHES", ScanSettings.CALLBACK_TYPE_ALL_MATCHES);
129         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
130             builder.add("CALLBACK_TYPE_FIRST_MATCH", ScanSettings.CALLBACK_TYPE_FIRST_MATCH);
131             builder.add("CALLBACK_TYPE_MATCH_LOST", ScanSettings.CALLBACK_TYPE_MATCH_LOST);
132         }
133         return builder.build();
134     }
135 
buildServiceTypeEnum()136     private static RpcEnum buildServiceTypeEnum() {
137         RpcEnum.Builder builder = new RpcEnum.Builder();
138         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
139             return builder.build();
140         }
141         builder.add("SERVICE_TYPE_PRIMARY", BluetoothGattService.SERVICE_TYPE_PRIMARY);
142         builder.add("SERVICE_TYPE_SECONDARY", BluetoothGattService.SERVICE_TYPE_SECONDARY);
143         return builder.build();
144     }
145 
buildStatusTypeEnum()146     private static RpcEnum buildStatusTypeEnum() {
147         RpcEnum.Builder builder = new RpcEnum.Builder();
148         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
149             return builder.build();
150         }
151         builder.add("GATT_SUCCESS", BluetoothGatt.GATT_SUCCESS)
152                 .add("GATT_CONNECTION_CONGESTED", BluetoothGatt.GATT_CONNECTION_CONGESTED)
153                 .add("GATT_FAILURE", BluetoothGatt.GATT_FAILURE)
154                 .add("GATT_INSUFFICIENT_AUTHENTICATION",
155                     BluetoothGatt.GATT_INSUFFICIENT_AUTHENTICATION)
156                 .add("GATT_INSUFFICIENT_ENCRYPTION", BluetoothGatt.GATT_INSUFFICIENT_ENCRYPTION)
157                 .add("GATT_INVALID_ATTRIBUTE_LENGTH", BluetoothGatt.GATT_INVALID_ATTRIBUTE_LENGTH)
158                 .add("GATT_INVALID_OFFSET", BluetoothGatt.GATT_INVALID_OFFSET)
159                 .add("GATT_READ_NOT_PERMITTED", BluetoothGatt.GATT_READ_NOT_PERMITTED)
160                 .add("GATT_REQUEST_NOT_SUPPORTED", BluetoothGatt.GATT_REQUEST_NOT_SUPPORTED)
161                 .add("GATT_WRITE_NOT_PERMITTED", BluetoothGatt.GATT_WRITE_NOT_PERMITTED)
162                 .add("BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION", 0x13)
163                 .add("BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION", 0x12)
164                 .add("BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT", 0x22)
165                 .add("BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED", 0x3e)
166                 .add("UNEXPECTED_DISCONNECT_NO_ERROR_CODE", 134)
167                 .add("DID_NOT_FIND_OFFLINEP2P_SERVICE", 135)
168                 .add("MISSING_CHARACTERISTIC", 137)
169                 .add("CONNECTION_TIMEOUT", 138)
170                 .add("READ_MALFORMED_VERSION", 139)
171                 .add("READ_WRITE_VERSION_NONSPECIFIC_ERROR", 140)
172                 .add("GATT_0C_err", 0X0C)
173                 .add("GATT_16", 0x16)
174                 .add("GATT_INTERNAL_ERROR", 129)
175                 .add("BLE_HCI_CONNECTION_TIMEOUT", 0x08)
176                 .add("GATT_ERROR", 133);
177         return builder.build();
178     }
179 
buildConnectStatusEnum()180     private static RpcEnum buildConnectStatusEnum() {
181         RpcEnum.Builder builder = new RpcEnum.Builder();
182         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
183             return builder.build();
184         }
185         builder.add("STATE_CONNECTED", BluetoothProfile.STATE_CONNECTED)
186                 .add("STATE_CONNECTING", BluetoothProfile.STATE_CONNECTING)
187                 .add("STATE_DISCONNECTED", BluetoothProfile.STATE_DISCONNECTED)
188                 .add("STATE_DISCONNECTING", BluetoothProfile.STATE_DISCONNECTING);
189         return builder.build();
190     }
191 
buildPropertyTypeEnum()192     private static RpcEnum buildPropertyTypeEnum() {
193         RpcEnum.Builder builder = new RpcEnum.Builder();
194         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
195             return builder.build();
196         }
197         builder
198                 .add("PROPERTY_NONE", 0)
199                 .add("PROPERTY_BROADCAST", BluetoothGattCharacteristic.PROPERTY_BROADCAST)
200                 .add("PROPERTY_EXTENDED_PROPS", BluetoothGattCharacteristic.PROPERTY_EXTENDED_PROPS)
201                 .add("PROPERTY_INDICATE", BluetoothGattCharacteristic.PROPERTY_INDICATE)
202                 .add("PROPERTY_NOTIFY", BluetoothGattCharacteristic.PROPERTY_NOTIFY)
203                 .add("PROPERTY_READ", BluetoothGattCharacteristic.PROPERTY_READ)
204                 .add("PROPERTY_SIGNED_WRITE", BluetoothGattCharacteristic.PROPERTY_SIGNED_WRITE)
205                 .add("PROPERTY_WRITE", BluetoothGattCharacteristic.PROPERTY_WRITE)
206                 .add("PROPERTY_WRITE_NO_RESPONSE",
207                     BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE);
208         return builder.build();
209     }
210 
buildPermissionTypeEnum()211     private static RpcEnum buildPermissionTypeEnum() {
212         RpcEnum.Builder builder = new RpcEnum.Builder();
213         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
214             return builder.build();
215         }
216         builder.add("PERMISSION_NONE", 0)
217               .add("PERMISSION_READ", BluetoothGattCharacteristic.PERMISSION_READ)
218               .add("PERMISSION_READ_ENCRYPTED",
219                   BluetoothGattCharacteristic.PERMISSION_READ_ENCRYPTED)
220               .add("PERMISSION_READ_ENCRYPTED_MITM",
221                   BluetoothGattCharacteristic.PERMISSION_READ_ENCRYPTED_MITM)
222               .add("PERMISSION_WRITE", BluetoothGattCharacteristic.PERMISSION_WRITE)
223               .add("PERMISSION_WRITE_ENCRYPTED",
224                   BluetoothGattCharacteristic.PERMISSION_WRITE_ENCRYPTED)
225               .add("PERMISSION_WRITE_ENCRYPTED_MITM",
226                   BluetoothGattCharacteristic.PERMISSION_WRITE_ENCRYPTED_MITM)
227               .add("PERMISSION_WRITE_SIGNED", BluetoothGattCharacteristic.PERMISSION_WRITE_SIGNED)
228               .add("PERMISSION_WRITE_SIGNED_MITM",
229                   BluetoothGattCharacteristic.PERMISSION_WRITE_SIGNED_MITM);
230         return builder.build();
231     }
232 
buildBleScanModeEnum()233     private static RpcEnum buildBleScanModeEnum() {
234         RpcEnum.Builder builder = new RpcEnum.Builder();
235         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
236             return builder.build();
237         }
238         builder.add("SCAN_MODE_LOW_POWER", ScanSettings.SCAN_MODE_LOW_POWER)
239                 .add("SCAN_MODE_BALANCED", ScanSettings.SCAN_MODE_BALANCED)
240                 .add("SCAN_MODE_LOW_LATENCY", ScanSettings.SCAN_MODE_LOW_LATENCY);
241         return builder.build();
242     }
243 
buildLocalHotspotFailedReason()244     private static RpcEnum buildLocalHotspotFailedReason() {
245         RpcEnum.Builder builder = new RpcEnum.Builder();
246         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
247             return builder.build();
248         }
249         builder.add("ERROR_TETHERING_DISALLOWED",
250                    LocalOnlyHotspotCallback.ERROR_TETHERING_DISALLOWED)
251                 .add("ERROR_INCOMPATIBLE_MODE", LocalOnlyHotspotCallback.ERROR_INCOMPATIBLE_MODE)
252                 .add("ERROR_NO_CHANNEL", LocalOnlyHotspotCallback.ERROR_NO_CHANNEL)
253                 .add("ERROR_GENERIC", LocalOnlyHotspotCallback.ERROR_GENERIC);
254         return builder.build();
255     }
256 }
257