• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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