Merge "Resolve API council feedback" into tm-dev
diff --git a/nearby/tests/multidevices/host/test_data/fastpair/pixelbuds-a_account_devicemeta_json.txt b/nearby/tests/multidevices/host/test_data/fastpair/pixelbuds-a_account_devicemeta_json.txt
new file mode 100644
index 0000000..6be58df
--- /dev/null
+++ b/nearby/tests/multidevices/host/test_data/fastpair/pixelbuds-a_account_devicemeta_json.txt
@@ -0,0 +1,66 @@
+[
+ {
+ "account_key": "BPy5AaSyMfrFvMNgr6f7GA==",
+ "sha256_account_key_public_address": "jNGRz+Ni6ZuLd8hVF3lmGoJnF5byXBUyVi9CmnrF1so=",
+ "fast_pair_device_metadata": {
+ "image_url": "https:\/\/lh3.googleusercontent.com\/2PffmZiopo2AjT8sshX0Se3jV-91cp4yOCIay2bBvZqKoKGVy5B4uyzdHsde6UrUSGaoCqV-h4edd5ZljA4oSGc",
+ "intent_uri": "intent:#Intent;action=com.google.android.gms.nearby.discovery%3AACTION_MAGIC_PAIR;package=com.google.android.gms;component=com.google.android.gms\/.nearby.discovery.service.DiscoveryService;S.com.google.android.gms.nearby.discovery%3AEXTRA_COMPANION_APP=com.google.android.apps.wearables.maestro.companion;end",
+ "ble_tx_power": 0,
+ "trigger_distance": 0,
+ "device_type": 0,
+ "left_bud_url": "",
+ "right_bud_url": "",
+ "case_url": "",
+ "initial_notification_description": "Tap to pair. Earbuds will be tied to %s",
+ "initial_notification_description_no_account": "Tap to pair with this device",
+ "initial_pairing_description": "Pixel Buds A-Series will appear on devices linked with ericth.nearby.dogfood@gmail.com",
+ "connect_success_companion_app_installed": "Your device is ready to be set up",
+ "connect_success_companion_app_not_installed": "Download the device app on Google Play to see all available features",
+ "subsequent_pairing_description": "Connect %s to this phone",
+ "retroactive_pairing_description": "Save device to %s for faster pairing to your other devices",
+ "wait_launch_companion_app_description": "This will take a few moments",
+ "fail_connect_go_to_settings_description": "Try manually pairing to the device by going to Settings",
+ "confirm_pin_title": "",
+ "confirm_pin_description": "",
+ "sync_contacts_title": "",
+ "sync_contacts_description": "",
+ "sync_sms_title": "",
+ "sync_sms_description": "",
+ "assistant_setup_half_sheet": "Get hands-free help on the go from Google Assistant",
+ "assistant_setup_notification": "Tap to set up your Google Assistant",
+ "fast_pair_tv_connect_device_no_account_description": "Select connect to pair your %s with this device"
+ },
+ "fast_pair_discovery_item": {
+ "id": "",
+ "type": 6,
+ "mac_address": "",
+ "action_url": "intent:#Intent;action=com.google.android.gms.nearby.discovery%3AACTION_MAGIC_PAIR;package=com.google.android.gms;component=com.google.android.gms\/.nearby.discovery.service.DiscoveryService;S.com.google.android.gms.nearby.discovery%3AEXTRA_COMPANION_APP=com.google.android.apps.wearables.maestro.companion;end",
+ "device_name": "",
+ "title": "Pixel Buds A-Series",
+ "description": "Tap to pair with this device",
+ "display_url": "",
+ "last_observation_timestamp_millis": 0,
+ "first_observation_timestamp_millis": 0,
+ "state": 1,
+ "action_url_type": 2,
+ "rssi": 0,
+ "pending_app_install_timestamp_millis": 0,
+ "tx_power": 0,
+ "app_name": "",
+ "group_id": "",
+ "attachment_type": 0,
+ "package_name": "",
+ "feature_graphic_url": "",
+ "trigger_id": "",
+ "icon_png": "",
+ "icon_fife_url": "https:\/\/lh3.googleusercontent.com\/2PffmZiopo2AjT8sshX0Se3jV-91cp4yOCIay2bBvZqKoKGVy5B4uyzdHsde6UrUSGaoCqV-h4edd5ZljA4oSGc",
+ "debug_message": "",
+ "debug_category": 0,
+ "lost_millis": 0,
+ "last_user_experience": 0,
+ "ble_record_bytes": "",
+ "entity_id": "",
+ "authentication_public_key_secp256r1": "z+grhW8lWVA34JUQhXOxMrk1WqVy+VpEDd2K+01ZJvS6KdV0OUg7FRMzq+ITuOqKO\/2TIRKEAEfMKdyk2Ob1Vw=="
+ }
+ }
+]
\ No newline at end of file
diff --git a/nearby/tests/multidevices/host/test_data/fastpair/pixelbuds-a_antispoofkey_devicemeta_json.txt b/nearby/tests/multidevices/host/test_data/fastpair/pixelbuds-a_antispoofkey_devicemeta_json.txt
new file mode 100644
index 0000000..c03d000
--- /dev/null
+++ b/nearby/tests/multidevices/host/test_data/fastpair/pixelbuds-a_antispoofkey_devicemeta_json.txt
@@ -0,0 +1,38 @@
+{
+ "anti_spoofing_public_key_str": "z+grhW8lWVA34JUQhXOxMrk1WqVy+VpEDd2K+01ZJvS6KdV0OUg7FRMzq+ITuOqKO\/2TIRKEAEfMKdyk2Ob1Vw==",
+ "fast_pair_device_metadata": {
+ "image_url": "https:\/\/lh3.googleusercontent.com\/2PffmZiopo2AjT8sshX0Se3jV-91cp4yOCIay2bBvZqKoKGVy5B4uyzdHsde6UrUSGaoCqV-h4edd5ZljA4oSGc",
+ "intent_uri": "intent:#Intent;action=com.google.android.gms.nearby.discovery%3AACTION_MAGIC_PAIR;package=com.google.android.gms;component=com.google.android.gms\/.nearby.discovery.service.DiscoveryService;S.com.google.android.gms.nearby.discovery%3AEXTRA_COMPANION_APP=com.google.android.apps.wearables.maestro.companion;end",
+ "ble_tx_power": -11,
+ "trigger_distance": 0.6000000238418579,
+ "device_type": 7,
+ "name": "Pixel Buds A-Series",
+ "left_bud_url": "https:\/\/lh3.googleusercontent.com\/O8SVJ5E7CXUkpkym7ibZbp6wypuO7HaTFcslT_FjmEzJX4KHoIY_kzLTdK2kwJXiDBgg8cC__sG-JJ5aVnQtFjQ",
+ "right_bud_url": "https:\/\/lh3.googleusercontent.com\/X_FsRmEKH_fgKzvopyrlyWJAdczRel42Tih7p9-e-U48gBTaggGVQx70K27TzlqIaqYVuaNpTnGoUsKIgiy4WA",
+ "case_url": "https:\/\/lh3.googleusercontent.com\/mNZ7CGplQSpZhoY79jXDQU4B65eY2f0SndnYZLk1PSm8zKTYeRU7REmrLL_pptD6HpVI2F_oQ6xhhtZKOvB8EQ",
+ "locale": "en-US",
+ "initial_notification_description": "Tap to pair. Earbuds will be tied to %s",
+ "initial_notification_description_no_account": "Tap to pair with this device",
+ "open_companion_app_description": "Tap to finish setup",
+ "update_companion_app_description": "Tap to update device settings and finish setup",
+ "download_companion_app_description": "Tap to download device app on Google Play and see all features",
+ "unable_to_connect_title": "Unable to connect",
+ "unable_to_connect_description": "Try manually pairing to the device",
+ "initial_pairing_description": "%s will appear on devices linked with %s",
+ "connect_success_companion_app_installed": "Your device is ready to be set up",
+ "connect_success_companion_app_not_installed": "Download the device app on Google Play to see all available features",
+ "subsequent_pairing_description": "Connect %s to this phone",
+ "retroactive_pairing_description": "Save device to %s for faster pairing to your other devices",
+ "wait_launch_companion_app_description": "This will take a few moments",
+ "fail_connect_go_to_settings_description": "Try manually pairing to the device by going to Settings",
+ "confirm_pin_title": "",
+ "confirm_pin_description": "",
+ "sync_contacts_title": "",
+ "sync_contacts_description": "",
+ "sync_sms_title": "",
+ "sync_sms_description": "",
+ "assistant_setup_half_sheet": "Get hands-free help on the go from Google Assistant",
+ "assistant_setup_notification": "Tap to set up your Google Assistant",
+ "fast_pair_tv_connect_device_no_account_description": "Select connect to pair your %s with this device"
+ }
+}
\ No newline at end of file
diff --git a/nearby/tests/multidevices/host/test_data/fastpair/simulator_account_devicemeta_json.txt b/nearby/tests/multidevices/host/test_data/fastpair/simulator_account_devicemeta_json.txt
new file mode 100644
index 0000000..392c443
--- /dev/null
+++ b/nearby/tests/multidevices/host/test_data/fastpair/simulator_account_devicemeta_json.txt
@@ -0,0 +1,66 @@
+[
+ {
+ "account_key": "BPy5AaSyMfrFvMNgr6f7GA==",
+ "sha256_account_key_public_address": "jNGRz+Ni6ZuLd8hVF3lmGoJnF5byXBUyVi9CmnrF1so=",
+ "fast_pair_device_metadata": {
+ "assistant_setup_half_sheet": "Get hands-free help on the go from Google Assistant",
+ "assistant_setup_notification": "Tap to set up your Google Assistant",
+ "ble_tx_power": 0,
+ "case_url": "",
+ "confirm_pin_description": "",
+ "confirm_pin_title": "",
+ "connect_success_companion_app_installed": "Your device is ready to be set up",
+ "connect_success_companion_app_not_installed": "Download the device app on Google Play to see all available features",
+ "device_type": 0,
+ "fail_connect_go_to_settings_description": "Try manually pairing to the device by going to Settings",
+ "fast_pair_tv_connect_device_no_account_description": "Select connect to pair your %s with this device",
+ "image_url": "https://lh3.googleusercontent.com/2PffmZiopo2AjT8sshX0Se3jV-91cp4yOCIay2bBvZqKoKGVy5B4uyzdHsde6UrUSGaoCqV-h4edd5ZljA4oSGc",
+ "initial_notification_description": "Tap to pair. Earbuds will be tied to %s",
+ "initial_notification_description_no_account": "Tap to pair with this device",
+ "initial_pairing_description": "Pixel Buds A-Series will appear on devices linked with ericth.nearby.dogfood@gmail.com",
+ "intent_uri": "intent:#Intent;action=com.google.android.gms.nearby.discovery%3AACTION_MAGIC_PAIR;package=com.google.android.gms;component=com.google.android.gms/.nearby.discovery.service.DiscoveryService;S.com.google.android.gms.nearby.discovery%3AEXTRA_COMPANION_APP=com.google.android.apps.wearables.maestro.companion;end",
+ "left_bud_url": "",
+ "retroactive_pairing_description": "Save device to %s for faster pairing to your other devices",
+ "right_bud_url": "",
+ "subsequent_pairing_description": "Connect %s to this phone",
+ "sync_contacts_description": "",
+ "sync_contacts_title": "",
+ "sync_sms_description": "",
+ "sync_sms_title": "",
+ "trigger_distance": 0,
+ "wait_launch_companion_app_description": "This will take a few moments"
+ },
+ "fast_pair_discovery_item": {
+ "action_url": "intent:#Intent;action=com.google.android.gms.nearby.discovery%3AACTION_MAGIC_PAIR;package=com.google.android.gms;component=com.google.android.gms/.nearby.discovery.service.DiscoveryService;S.com.google.android.gms.nearby.discovery%3AEXTRA_COMPANION_APP=com.google.android.apps.wearables.maestro.companion;end",
+ "action_url_type": 2,
+ "app_name": "",
+ "attachment_type": 0,
+ "authentication_public_key_secp256r1": "z+grhW8lWVA34JUQhXOxMrk1WqVy+VpEDd2K+01ZJvS6KdV0OUg7FRMzq+ITuOqKO/2TIRKEAEfMKdyk2Ob1Vw==",
+ "ble_record_bytes": "",
+ "debug_category": 0,
+ "debug_message": "",
+ "description": "Tap to pair with this device",
+ "device_name": "",
+ "display_url": "",
+ "entity_id": "",
+ "feature_graphic_url": "",
+ "first_observation_timestamp_millis": 0,
+ "group_id": "",
+ "icon_fife_url": "https://lh3.googleusercontent.com/2PffmZiopo2AjT8sshX0Se3jV-91cp4yOCIay2bBvZqKoKGVy5B4uyzdHsde6UrUSGaoCqV-h4edd5ZljA4oSGc",
+ "icon_png": "",
+ "id": "",
+ "last_observation_timestamp_millis": 0,
+ "last_user_experience": 0,
+ "lost_millis": 0,
+ "mac_address": "",
+ "package_name": "",
+ "pending_app_install_timestamp_millis": 0,
+ "rssi": 0,
+ "state": 1,
+ "title": "Pixel Buds A-Series",
+ "trigger_id": "",
+ "tx_power": 0,
+ "type": 6
+ }
+ }
+]
\ No newline at end of file
diff --git a/nearby/tests/multidevices/host/tool/fast_pair_data_provider_shell.sh b/nearby/tests/multidevices/host/tool/fast_pair_data_provider_shell.sh
new file mode 100755
index 0000000..a74c1a9
--- /dev/null
+++ b/nearby/tests/multidevices/host/tool/fast_pair_data_provider_shell.sh
@@ -0,0 +1,107 @@
+#!/bin/bash
+
+#
+# Copyright (C) 2022 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# A script to interactively manage FastPairTestDataCache of FastPairTestDataProviderService.
+#
+# FastPairTestDataProviderService (../../clients/test_service/fastpair_seeker_data_provider/) is a
+# run-Time configurable FastPairDataProviderService. It has a FastPairTestDataManager to receive
+# Intent broadcast to add/clear the FastPairTestDataCache. This cache provides the data to return to
+# the Nearby Mainline module for onXXX calls (ex: onLoadFastPairAntispoofKeyDeviceMetadata).
+#
+# To use this tool, make sure you:
+# 1. Flash the ROM your built to the device
+# 2. Build and install NearbyFastPairSeekerDataProvider to the device
+# m NearbyFastPairSeekerDataProvider
+# adb install -r -g ${ANDROID_PRODUCT_OUT}/system/app/NearbyFastPairSeekerDataProvider/NearbyFastPairSeekerDataProvider.apk
+# 3. Check FastPairService can connect to the FastPairTestDataProviderService.
+# adb logcat ServiceMonitor:* *:S
+# (ex: ServiceMonitor: [FAST_PAIR_DATA_PROVIDER] connected to {
+# android.nearby.fastpair.seeker.dataprovider/android.nearby.fastpair.seeker.dataprovider.FastPairTestDataProviderService})
+#
+# Sample Usages:
+# 1. Send FastPairAntispoofKeyDeviceMetadata for PixelBuds-A to FastPairTestDataCache
+# ./fast_pair_data_provider_shell.sh -m=718c17 -a=../test_data/fastpair/pixelbuds-a_antispoofkey_devicemeta_json.txt
+# 2. Send FastPairAccountDevicesMetadata for PixelBuds-A to FastPairTestDataCache
+# ./fast_pair_data_provider_shell.sh -d=../test_data/fastpair/pixelbuds-a_account_devicemeta_json.txt
+# 3. Send FastPairAntispoofKeyDeviceMetadata for Provider Simulator to FastPairTestDataCache
+# ./fast_pair_data_provider_shell.sh -m=00000c -a=../test_data/fastpair/simulator_antispoofkey_devicemeta_json.txt
+# 4. Send FastPairAccountDevicesMetadata for Provider Simulator to FastPairTestDataCache
+# ./fast_pair_data_provider_shell.sh -d=../test_data/fastpair/simulator_account_devicemeta_json.txt
+# 5. Clear FastPairTestDataCache
+# ./fast_pair_data_provider_shell.sh -c
+#
+# Check logcat:
+# adb logcat FastPairTestDataManager:* FastPairTestDataProviderService:* *:S
+
+for i in "$@"; do
+ case $i in
+ -a=*|--ask=*)
+ ASK_FILE="${i#*=}"
+ shift # past argument=value
+ ;;
+ -m=*|--model=*)
+ MODEL_ID="${i#*=}"
+ shift # past argument=value
+ ;;
+ -d=*|--adm=*)
+ ADM_FILE="${i#*=}"
+ shift # past argument=value
+ ;;
+ -c)
+ CLEAR="true"
+ shift # past argument
+ ;;
+ -*|--*)
+ echo "Unknown option $i"
+ exit 1
+ ;;
+ *)
+ ;;
+ esac
+done
+
+readonly ACTION_BASE="android.nearby.fastpair.seeker.action"
+readonly ACTION_SEND_ANTISPOOF_KEY_DEVICE_METADATA="$ACTION_BASE.ACTION_SEND_ANTISPOOF_KEY_DEVICE_METADATA"
+readonly ACTION_SEND_ACCOUNT_KEY_DEVICE_METADATA="$ACTION_BASE.ACCOUNT_KEY_DEVICE_METADATA"
+readonly ACTION_RESET_TEST_DATA_CACHE="$ACTION_BASE.RESET"
+readonly DATA_JSON_STRING_KEY="json"
+readonly DATA_MODEL_ID_STRING_KEY="modelId"
+
+if [[ -n "${ASK_FILE}" ]] && [[ -n "${MODEL_ID}" ]]; then
+ echo "Sending AntispoofKeyDeviceMetadata for model ${MODEL_ID} to the FastPairTestDataCache..."
+ ASK_JSON_TEXT=$(tr -d '\n' < "$ASK_FILE")
+ CMD="am broadcast -a $ACTION_SEND_ANTISPOOF_KEY_DEVICE_METADATA "
+ CMD+="-e $DATA_MODEL_ID_STRING_KEY '$MODEL_ID' "
+ CMD+="-e $DATA_JSON_STRING_KEY '\"'$ASK_JSON_TEXT'\"'"
+ CMD="adb shell \"$CMD\""
+ echo "$CMD" && eval "$CMD"
+fi
+
+if [ -n "${ADM_FILE}" ]; then
+ echo "Sending AccountKeyDeviceMetadata to the FastPairTestDataCache..."
+ ADM_JSON_TEXT=$(tr -d '\n' < "$ADM_FILE")
+ CMD="am broadcast -a $ACTION_SEND_ACCOUNT_KEY_DEVICE_METADATA "
+ CMD+="-e $DATA_JSON_STRING_KEY '\"'$ADM_JSON_TEXT'\"'"
+ CMD="adb shell \"$CMD\""
+ echo "$CMD" && eval "$CMD"
+fi
+
+if [ -n "${CLEAR}" ]; then
+ echo "Cleaning FastPairTestDataCache..."
+ CMD="adb shell am broadcast -a $ACTION_RESET_TEST_DATA_CACHE"
+ echo "$CMD" && eval "$CMD"
+fi
diff --git a/service/src/com/android/server/connectivity/TcpKeepaliveController.java b/service/src/com/android/server/connectivity/TcpKeepaliveController.java
index acfbb3c..a9cb2fa 100644
--- a/service/src/com/android/server/connectivity/TcpKeepaliveController.java
+++ b/service/src/com/android/server/connectivity/TcpKeepaliveController.java
@@ -124,7 +124,12 @@
final TcpKeepalivePacketDataParcelable tcpDetails = switchToRepairMode(fd);
// TODO: consider building a TcpKeepalivePacketData directly from switchToRepairMode
return fromStableParcelable(tcpDetails);
- } catch (InvalidPacketException | InvalidSocketException e) {
+ // Use separate catch blocks: a combined catch would get wrongly optimized by R8
+ // (b/226127213).
+ } catch (InvalidSocketException e) {
+ switchOutOfRepairMode(fd);
+ throw e;
+ } catch (InvalidPacketException e) {
switchOutOfRepairMode(fd);
throw e;
}