1 /* 2 * Copyright (C) 2021 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 17 package com.android.server.nearby.fastpair; 18 19 import android.text.TextUtils; 20 21 import com.android.server.nearby.common.bluetooth.fastpair.Preferences; 22 23 import com.google.common.base.Splitter; 24 import com.google.common.collect.ImmutableSet; 25 26 /** 27 * This is fast pair connection preference 28 */ 29 public class FlagUtils { 30 private static final int GATT_OPERATION_TIME_OUT_SECOND = 10; 31 private static final int GATT_CONNECTION_TIME_OUT_SECOND = 15; 32 private static final int BLUETOOTH_TOGGLE_TIME_OUT_SECOND = 10; 33 private static final int BLUETOOTH_TOGGLE_SLEEP_TIME_OUT_SECOND = 2; 34 private static final int CLASSIC_DISCOVERY_TIME_OUT_SECOND = 13; 35 private static final int NUM_DISCOVER_ATTEMPTS = 3; 36 private static final int DISCOVERY_RETRY_SLEEP_SECONDS = 1; 37 private static final int SDP_TIME_OUT_SECONDS = 10; 38 private static final int NUM_SDP_ATTEMPTS = 0; 39 private static final int NUM_CREATED_BOND_ATTEMPTS = 3; 40 private static final int NUM_CONNECT_ATTEMPT = 2; 41 private static final int NUM_WRITE_ACCOUNT_KEY_ATTEMPT = 3; 42 private static final boolean TOGGLE_BLUETOOTH_ON_FAILURE = false; 43 private static final boolean BLUETOOTH_STATE_POOLING = true; 44 private static final int BLUETOOTH_STATE_POOLING_MILLIS = 1000; 45 private static final int NUM_ATTEMPTS = 2; 46 private static final short BREDR_HANDOVER_DATA_CHARACTERISTIC_ID = 11265; // 0x2c01 47 private static final short BLUETOOTH_SIG_DATA_CHARACTERISTIC_ID = 11266; // 0x2c02 48 private static final short TRANSPORT_BLOCK_DATA_CHARACTERISTIC_ID = 11267; // 0x2c03 49 private static final boolean WAIT_FOR_UUID_AFTER_BONDING = true; 50 private static final boolean RECEIVE_UUID_AND_BONDED_EVENT_BEFORE_CLOSE = true; 51 private static final int REMOVE_BOND_TIME_OUT_SECONDS = 5; 52 private static final int REMOVE_BOND_SLEEP_MILLIS = 1000; 53 private static final int CREATE_BOND_TIME_OUT_SECONDS = 15; 54 private static final int HIDE_CREATED_BOND_TIME_OUT_SECONDS = 40; 55 private static final int PROXY_TIME_OUT_SECONDS = 2; 56 private static final boolean REJECT_ACCESS = false; 57 private static final boolean ACCEPT_PASSKEY = true; 58 private static final int WRITE_ACCOUNT_KEY_SLEEP_MILLIS = 2000; 59 private static final boolean PROVIDER_INITIATE_BONDING = false; 60 private static final boolean SPECIFY_CREATE_BOND_TRANSPORT_TYPE = false; 61 private static final int CREATE_BOND_TRANSPORT_TYPE = 0; 62 private static final boolean KEEP_SAME_ACCOUNT_KEY_WRITE = true; 63 private static final boolean ENABLE_NAMING_CHARACTERISTIC = true; 64 private static final boolean CHECK_FIRMWARE_VERSION = true; 65 private static final int SDP_ATTEMPTS_AFTER_BONDED = 1; 66 private static final boolean SUPPORT_HID = false; 67 private static final boolean ENABLE_PAIRING_WHILE_DIRECTLY_CONNECTING = true; 68 private static final boolean ACCEPT_CONSENT_FOR_FP_ONE = true; 69 private static final int GATT_CONNECT_RETRY_TIMEOUT_MILLIS = 18000; 70 private static final boolean ENABLE_128BIT_CUSTOM_GATT_CHARACTERISTIC = true; 71 private static final boolean ENABLE_SEND_EXCEPTION_STEP_TO_VALIDATOR = true; 72 private static final boolean ENABLE_ADDITIONAL_DATA_TYPE_WHEN_ACTION_OVER_BLE = true; 73 private static final boolean CHECK_BOND_STATE_WHEN_SKIP_CONNECTING_PROFILE = true; 74 private static final boolean MORE_LOG_FOR_QUALITY = true; 75 private static final boolean RETRY_GATT_CONNECTION_AND_SECRET_HANDSHAKE = true; 76 private static final int GATT_CONNECT_SHORT_TIMEOUT_MS = 7000; 77 private static final int GATT_CONNECTION_LONG_TIME_OUT_MS = 15000; 78 private static final int GATT_CONNECT_SHORT_TIMEOUT_RETRY_MAX_SPENT_TIME_MS = 1000; 79 private static final int ADDRESS_ROTATE_RETRY_MAX_SPENT_TIME_MS = 15000; 80 private static final int PAIRING_RETRY_DELAY_MS = 100; 81 private static final int HANDSHAKE_SHORT_TIMEOUT_MS = 3000; 82 private static final int HANDSHAKE_LONG_TIMEOUT_MS = 1000; 83 private static final int SECRET_HANDSHAKE_SHORT_TIMEOUT_RETRY_MAX_SPENT_TIME_MS = 5000; 84 private static final int SECRET_HANDSHAKE_LONG_TIMEOUT_RETRY_MAX_SPENT_TIME_MS = 7000; 85 private static final int SECRET_HANDSHAKE_RETRY_ATTEMPTS = 3; 86 private static final int SECRET_HANDSHAKE_RETRY_GATT_CONNECTION_MAX_SPENT_TIME_MS = 15000; 87 private static final int SIGNAL_LOST_RETRY_MAX_SPENT_TIME_MS = 15000; 88 private static final boolean RETRY_SECRET_HANDSHAKE_TIMEOUT = false; 89 private static final boolean LOG_USER_MANUAL_RETRY = true; 90 private static final boolean ENABLE_PAIR_FLOW_SHOW_UI_WITHOUT_PROFILE_CONNECTION = false; 91 private static final boolean LOG_USER_MANUAL_CITY = true; 92 private static final boolean LOG_PAIR_WITH_CACHED_MODEL_ID = true; 93 private static final boolean DIRECT_CONNECT_PROFILE_IF_MODEL_ID_IN_CACHE = false; 94 getPreferencesBuilder()95 public static Preferences.Builder getPreferencesBuilder() { 96 return Preferences.builder() 97 .setGattOperationTimeoutSeconds(GATT_OPERATION_TIME_OUT_SECOND) 98 .setGattConnectionTimeoutSeconds(GATT_CONNECTION_TIME_OUT_SECOND) 99 .setBluetoothToggleTimeoutSeconds(BLUETOOTH_TOGGLE_TIME_OUT_SECOND) 100 .setBluetoothToggleSleepSeconds(BLUETOOTH_TOGGLE_SLEEP_TIME_OUT_SECOND) 101 .setClassicDiscoveryTimeoutSeconds(CLASSIC_DISCOVERY_TIME_OUT_SECOND) 102 .setNumDiscoverAttempts(NUM_DISCOVER_ATTEMPTS) 103 .setDiscoveryRetrySleepSeconds(DISCOVERY_RETRY_SLEEP_SECONDS) 104 .setSdpTimeoutSeconds(SDP_TIME_OUT_SECONDS) 105 .setNumSdpAttempts(NUM_SDP_ATTEMPTS) 106 .setNumCreateBondAttempts(NUM_CREATED_BOND_ATTEMPTS) 107 .setNumConnectAttempts(NUM_CONNECT_ATTEMPT) 108 .setNumWriteAccountKeyAttempts(NUM_WRITE_ACCOUNT_KEY_ATTEMPT) 109 .setToggleBluetoothOnFailure(TOGGLE_BLUETOOTH_ON_FAILURE) 110 .setBluetoothStateUsesPolling(BLUETOOTH_STATE_POOLING) 111 .setBluetoothStatePollingMillis(BLUETOOTH_STATE_POOLING_MILLIS) 112 .setNumAttempts(NUM_ATTEMPTS) 113 .setBrHandoverDataCharacteristicId(BREDR_HANDOVER_DATA_CHARACTERISTIC_ID) 114 .setBluetoothSigDataCharacteristicId(BLUETOOTH_SIG_DATA_CHARACTERISTIC_ID) 115 .setBrTransportBlockDataDescriptorId(TRANSPORT_BLOCK_DATA_CHARACTERISTIC_ID) 116 .setWaitForUuidsAfterBonding(WAIT_FOR_UUID_AFTER_BONDING) 117 .setReceiveUuidsAndBondedEventBeforeClose( 118 RECEIVE_UUID_AND_BONDED_EVENT_BEFORE_CLOSE) 119 .setRemoveBondTimeoutSeconds(REMOVE_BOND_TIME_OUT_SECONDS) 120 .setRemoveBondSleepMillis(REMOVE_BOND_SLEEP_MILLIS) 121 .setCreateBondTimeoutSeconds(CREATE_BOND_TIME_OUT_SECONDS) 122 .setHidCreateBondTimeoutSeconds(HIDE_CREATED_BOND_TIME_OUT_SECONDS) 123 .setProxyTimeoutSeconds(PROXY_TIME_OUT_SECONDS) 124 .setRejectPhonebookAccess(REJECT_ACCESS) 125 .setRejectMessageAccess(REJECT_ACCESS) 126 .setRejectSimAccess(REJECT_ACCESS) 127 .setAcceptPasskey(ACCEPT_PASSKEY) 128 .setWriteAccountKeySleepMillis(WRITE_ACCOUNT_KEY_SLEEP_MILLIS) 129 .setProviderInitiatesBondingIfSupported(PROVIDER_INITIATE_BONDING) 130 .setAttemptDirectConnectionWhenPreviouslyBonded(true) 131 .setAutomaticallyReconnectGattWhenNeeded(true) 132 .setSkipDisconnectingGattBeforeWritingAccountKey(true) 133 .setIgnoreUuidTimeoutAfterBonded(true) 134 .setSpecifyCreateBondTransportType(SPECIFY_CREATE_BOND_TRANSPORT_TYPE) 135 .setCreateBondTransportType(CREATE_BOND_TRANSPORT_TYPE) 136 .setIncreaseIntentFilterPriority(true) 137 .setEvaluatePerformance(false) 138 .setKeepSameAccountKeyWrite(KEEP_SAME_ACCOUNT_KEY_WRITE) 139 .setEnableNamingCharacteristic(ENABLE_NAMING_CHARACTERISTIC) 140 .setEnableFirmwareVersionCharacteristic(CHECK_FIRMWARE_VERSION) 141 .setNumSdpAttemptsAfterBonded(SDP_ATTEMPTS_AFTER_BONDED) 142 .setSupportHidDevice(SUPPORT_HID) 143 .setEnablePairingWhileDirectlyConnecting( 144 ENABLE_PAIRING_WHILE_DIRECTLY_CONNECTING) 145 .setAcceptConsentForFastPairOne(ACCEPT_CONSENT_FOR_FP_ONE) 146 .setGattConnectRetryTimeoutMillis(GATT_CONNECT_RETRY_TIMEOUT_MILLIS) 147 .setEnable128BitCustomGattCharacteristicsId( 148 ENABLE_128BIT_CUSTOM_GATT_CHARACTERISTIC) 149 .setEnableSendExceptionStepToValidator(ENABLE_SEND_EXCEPTION_STEP_TO_VALIDATOR) 150 .setEnableAdditionalDataTypeWhenActionOverBle( 151 ENABLE_ADDITIONAL_DATA_TYPE_WHEN_ACTION_OVER_BLE) 152 .setCheckBondStateWhenSkipConnectingProfiles( 153 CHECK_BOND_STATE_WHEN_SKIP_CONNECTING_PROFILE) 154 .setMoreEventLogForQuality(MORE_LOG_FOR_QUALITY) 155 .setRetryGattConnectionAndSecretHandshake( 156 RETRY_GATT_CONNECTION_AND_SECRET_HANDSHAKE) 157 .setGattConnectShortTimeoutMs(GATT_CONNECT_SHORT_TIMEOUT_MS) 158 .setGattConnectLongTimeoutMs(GATT_CONNECTION_LONG_TIME_OUT_MS) 159 .setGattConnectShortTimeoutRetryMaxSpentTimeMs( 160 GATT_CONNECT_SHORT_TIMEOUT_RETRY_MAX_SPENT_TIME_MS) 161 .setAddressRotateRetryMaxSpentTimeMs(ADDRESS_ROTATE_RETRY_MAX_SPENT_TIME_MS) 162 .setPairingRetryDelayMs(PAIRING_RETRY_DELAY_MS) 163 .setSecretHandshakeShortTimeoutMs(HANDSHAKE_SHORT_TIMEOUT_MS) 164 .setSecretHandshakeLongTimeoutMs(HANDSHAKE_LONG_TIMEOUT_MS) 165 .setSecretHandshakeShortTimeoutRetryMaxSpentTimeMs( 166 SECRET_HANDSHAKE_SHORT_TIMEOUT_RETRY_MAX_SPENT_TIME_MS) 167 .setSecretHandshakeLongTimeoutRetryMaxSpentTimeMs( 168 SECRET_HANDSHAKE_LONG_TIMEOUT_RETRY_MAX_SPENT_TIME_MS) 169 .setSecretHandshakeRetryAttempts(SECRET_HANDSHAKE_RETRY_ATTEMPTS) 170 .setSecretHandshakeRetryGattConnectionMaxSpentTimeMs( 171 SECRET_HANDSHAKE_RETRY_GATT_CONNECTION_MAX_SPENT_TIME_MS) 172 .setSignalLostRetryMaxSpentTimeMs(SIGNAL_LOST_RETRY_MAX_SPENT_TIME_MS) 173 .setGattConnectionAndSecretHandshakeNoRetryGattError( 174 getGattConnectionAndSecretHandshakeNoRetryGattError()) 175 .setRetrySecretHandshakeTimeout(RETRY_SECRET_HANDSHAKE_TIMEOUT) 176 .setLogUserManualRetry(LOG_USER_MANUAL_RETRY) 177 .setEnablePairFlowShowUiWithoutProfileConnection( 178 ENABLE_PAIR_FLOW_SHOW_UI_WITHOUT_PROFILE_CONNECTION) 179 .setLogUserManualRetry(LOG_USER_MANUAL_CITY) 180 .setLogPairWithCachedModelId(LOG_PAIR_WITH_CACHED_MODEL_ID) 181 .setDirectConnectProfileIfModelIdInCache( 182 DIRECT_CONNECT_PROFILE_IF_MODEL_ID_IN_CACHE); 183 } 184 getGattConnectionAndSecretHandshakeNoRetryGattError()185 private static ImmutableSet<Integer> getGattConnectionAndSecretHandshakeNoRetryGattError() { 186 ImmutableSet.Builder<Integer> noRetryGattErrorsBuilder = ImmutableSet.builder(); 187 // When GATT connection fail we will not retry on error code 257 188 for (String errorCode : 189 Splitter.on(",").split("257,")) { 190 if (!TextUtils.isDigitsOnly(errorCode)) { 191 continue; 192 } 193 194 try { 195 noRetryGattErrorsBuilder.add(Integer.parseInt(errorCode)); 196 } catch (NumberFormatException e) { 197 // Ignore 198 } 199 } 200 return noRetryGattErrorsBuilder.build(); 201 } 202 } 203