Merge "Add test for FastPair module"
diff --git a/nearby/framework/Android.bp b/nearby/framework/Android.bp
index 74980c9..fd7f2c9 100644
--- a/nearby/framework/Android.bp
+++ b/nearby/framework/Android.bp
@@ -59,7 +59,10 @@
     name: "framework-nearby-pre-jarjar",
     defaults: ["framework-nearby-defaults"],
     sdk_version: "module_current",
-    libs: ["framework-annotations-lib"],
+    libs: [
+        "framework-annotations-lib",
+        "framework-bluetooth",
+    ],
     // java_api_finder must accompany `srcs` (`srcs` defined in `framework-nearby-defaults`)
     plugins: ["java_api_finder"],
     installable: false,
@@ -77,6 +80,7 @@
         "framework-module-defaults",  // the SDK needs to be usable in all processes
         "framework-nearby-defaults",
     ],
+    libs: ["framework-bluetooth"],
 
     jarjar_rules: ":nearby-jarjar-rules",
     apex_available: [
diff --git a/nearby/halfsheet/Android.bp b/nearby/halfsheet/Android.bp
index 781f308..82d0933 100644
--- a/nearby/halfsheet/Android.bp
+++ b/nearby/halfsheet/Android.bp
@@ -26,6 +26,7 @@
     plugins: ["java_api_finder"],
     jarjar_rules: ":nearby-jarjar-rules",
     libs: [
+        "framework-bluetooth",
         "framework-nearby-pre-jarjar",
         "nearby-service-string",
       ],
diff --git a/nearby/service/Android.bp b/nearby/service/Android.bp
index b80d677..5b0028e 100644
--- a/nearby/service/Android.bp
+++ b/nearby/service/Android.bp
@@ -36,6 +36,7 @@
 java_library {
     name: "nearby-service-string",
     srcs: [":nearby-service-string-res"],
+    libs: ["framework-bluetooth"],
     sdk_version: "module_current",
 }
 
@@ -53,6 +54,7 @@
         // pre-jarjar symbols are needed so that nearby-service can reference the original class
         // names at compile time
         "framework-nearby-pre-jarjar",
+        "framework-bluetooth.stubs.module_lib", // TODO(b/215722418): Change to framework-bluetooth once fixed
         "error_prone_annotations",
     ],
     static_libs: [
diff --git a/nearby/service/java/com/android/server/nearby/fastpair/FastPairManager.java b/nearby/service/java/com/android/server/nearby/fastpair/FastPairManager.java
index 253e942..41b6da7 100644
--- a/nearby/service/java/com/android/server/nearby/fastpair/FastPairManager.java
+++ b/nearby/service/java/com/android/server/nearby/fastpair/FastPairManager.java
@@ -29,7 +29,6 @@
 import android.nearby.NearbyDevice;
 import android.nearby.NearbyManager;
 import android.nearby.ScanCallback;
-import android.nearby.ScanRequest;
 import android.util.Log;
 
 import androidx.annotation.NonNull;
@@ -51,8 +50,8 @@
 import com.android.server.nearby.fastpair.footprint.FootprintsDeviceManager;
 import com.android.server.nearby.fastpair.halfsheet.FastPairHalfSheetManager;
 import com.android.server.nearby.fastpair.pairinghandler.PairingProgressHandlerBase;
+import com.android.server.nearby.provider.FastPairDataProvider;
 import com.android.server.nearby.util.FastPairDecoder;
-import com.android.server.nearby.util.ForegroundThread;
 import com.android.server.nearby.util.Hex;
 
 import com.google.protobuf.ByteString;
@@ -101,11 +100,12 @@
                 Log.d("FastPairService", " the nearby manager is " + nearbyManager);
 
                 if (nearbyManager != null) {
-                    nearbyManager.startScan(
-                            new ScanRequest.Builder()
-                                    .setScanType(ScanRequest.SCAN_TYPE_FAST_PAIR).build(),
-                            ForegroundThread.getExecutor(),
-                            mScanCallback);
+                    // Uncomment this if you want to get mainline half sheet
+//                    nearbyManager.startScan(
+//                            new ScanRequest.Builder()
+//                                    .setScanType(ScanRequest.SCAN_TYPE_FAST_PAIR).build(),
+//                            ForegroundThread.getExecutor(),
+//                            mScanCallback);
                 } else {
                     Log.d("FastPairService", " the nearby manager is null");
                 }
@@ -114,9 +114,12 @@
                 byte[] model = intent.getByteArrayExtra(EXTRA_MODEL_ID);
                 String address = intent.getStringExtra(EXTRA_ADDRESS);
                 Log.d("FastPairService", "start pair " + address);
+                Rpcs.GetObservedDeviceResponse response =
+                        FastPairDataProvider.getInstance().loadFastPairDeviceMetadata(model);
+                ByteString publicKey = response.getDevice().getAntiSpoofingKeyPair().getPublicKey();
                 Locator.get(mLocatorContextWrapper, FastPairHalfSheetManager.class).showHalfSheet(
                         Cache.ScanFastPairStoreItem.newBuilder().setAddress(address)
-                                .setAntiSpoofingPublicKey(ByteString.EMPTY)
+                                .setAntiSpoofingPublicKey(publicKey)
                                 .build());
             } else {
                 Log.d("FastPairService", " screen off");
diff --git a/nearby/service/java/com/android/server/nearby/provider/FastPairDataProvider.java b/nearby/service/java/com/android/server/nearby/provider/FastPairDataProvider.java
index cac815b..2ecbaa3 100644
--- a/nearby/service/java/com/android/server/nearby/provider/FastPairDataProvider.java
+++ b/nearby/service/java/com/android/server/nearby/provider/FastPairDataProvider.java
@@ -56,8 +56,11 @@
     private FastPairDataProvider(Context context) {
         mProxyFastPairDataProvider = ProxyFastPairDataProvider.create(
                 context, FastPairDataProviderBase.ACTION_FAST_PAIR_DATA_PROVIDER);
-        Log.d("FastPairService", "the fast pair proxy provider is init"
-                + (mProxyFastPairDataProvider == null));
+        if (mProxyFastPairDataProvider == null) {
+            Log.d("FastPairService", "fail to initiate the fast pair proxy provider");
+        } else {
+            Log.d("FastPairService", "the fast pair proxy provider initiated");
+        }
     }
 
     /** loadFastPairDeviceMetadata. */
diff --git a/nearby/tests/cts/fastpair/src/android/nearby/cts/FastPairDataProviderBaseTest.java b/nearby/tests/cts/fastpair/src/android/nearby/cts/FastPairDataProviderBaseTest.java
index 8611611..bceca81 100644
--- a/nearby/tests/cts/fastpair/src/android/nearby/cts/FastPairDataProviderBaseTest.java
+++ b/nearby/tests/cts/fastpair/src/android/nearby/cts/FastPairDataProviderBaseTest.java
@@ -81,6 +81,7 @@
     private static final boolean ELIGIBLE_ACCOUNT_1_OPT_IN = true;
     private static final Account ELIGIBLE_ACCOUNT_2 = new Account("def@gmail.com", "type2");
     private static final boolean ELIGIBLE_ACCOUNT_2_OPT_IN = false;
+    private static final Account MANAGE_ACCOUNT = new Account("ghi@gmail.com", "type3");
     private static final ImmutableList<FastPairEligibleAccount> ELIGIBLE_ACCOUNTS =
             ImmutableList.of(
                     genHappyPathFastPairEligibleAccount(ELIGIBLE_ACCOUNT_1,
@@ -89,6 +90,8 @@
                             ELIGIBLE_ACCOUNT_2_OPT_IN));
     private static final int ERROR_CODE_BAD_REQUEST =
             FastPairDataProviderBase.ERROR_CODE_BAD_REQUEST;
+    private static final int MANAGE_ACCOUNT_REQUEST_TYPE =
+            FastPairDataProviderBase.MANAGE_REQUEST_ADD;
     private static final String ERROR_STRING = "ERROR_STRING";
     private static final String FAIL_CONNECT_GOTO_SETTINGS_DESCRIPTION =
             "FAIL_CONNECT_GOTO_SETTINGS_DESCRIPTION";
@@ -131,6 +134,9 @@
     private static final FastPairEligibleAccountsRequestParcel
             FAST_PAIR_ELIGIBLE_ACCOUNTS_REQUEST_PARCEL =
             genFastPairEligibleAccountsRequestParcel();
+    private static final FastPairManageAccountRequestParcel
+            FAST_PAIR_MANAGE_ACCOUNT_REQUEST_PARCEL =
+            genFastPairManageAccountRequestParcel();
     private static final FastPairAntispoofkeyDeviceMetadata
             HAPPY_PATH_FAST_PAIR_ANTI_SPOOF_KEY_DEVICE_METADATA =
             genHappyPathFastPairAntispoofkeyDeviceMetadata();
@@ -222,12 +228,22 @@
 
     @Test
     public void testHappyPathManageFastPairAccount() throws Exception {
+        // AOSP sends calls to OEM via Parcelable.
         mHappyPathFastPairDataProvider.asProvider().manageFastPairAccount(
-                new FastPairManageAccountRequestParcel(),
+                FAST_PAIR_MANAGE_ACCOUNT_REQUEST_PARCEL,
                 mManageAccountCallback);
+
+        // OEM receives request and verifies that it is as expected.
+        final ArgumentCaptor<FastPairDataProviderBase.FastPairManageAccountRequest>
+                mFastPairManageAccountRequestCaptor =
+                ArgumentCaptor.forClass(
+                        FastPairDataProviderBase.FastPairManageAccountRequest.class);
         verify(mMockFastPairDataProviderBase).onManageFastPairAccount(
-                any(FastPairDataProviderBase.FastPairManageAccountRequest.class),
+                mFastPairManageAccountRequestCaptor.capture(),
                 any(FastPairDataProviderBase.FastPairManageActionCallback.class));
+        ensureHappyPathAsExpected(mFastPairManageAccountRequestCaptor.getValue());
+
+        // AOSP receives SUCCESS response.
         verify(mManageAccountCallback).onSuccess();
     }
 
@@ -280,12 +296,12 @@
     @Test
     public void testErrorPathManageFastPairAccount() throws Exception {
         mErrorPathFastPairDataProvider.asProvider().manageFastPairAccount(
-                new FastPairManageAccountRequestParcel(),
+                FAST_PAIR_MANAGE_ACCOUNT_REQUEST_PARCEL,
                 mManageAccountCallback);
         verify(mMockFastPairDataProviderBase).onManageFastPairAccount(
                 any(FastPairDataProviderBase.FastPairManageAccountRequest.class),
                 any(FastPairDataProviderBase.FastPairManageActionCallback.class));
-        verify(mManageAccountCallback).onError(anyInt(), any());
+        verify(mManageAccountCallback).onError(eq(ERROR_CODE_BAD_REQUEST), eq(ERROR_STRING));
     }
 
     @Test
@@ -431,6 +447,17 @@
         return requestParcel;
     }
 
+    /* Generates FastPairManageAccountRequestParcel. */
+    private static FastPairManageAccountRequestParcel
+            genFastPairManageAccountRequestParcel() {
+        FastPairManageAccountRequestParcel requestParcel =
+                new FastPairManageAccountRequestParcel();
+        requestParcel.account = MANAGE_ACCOUNT;
+        requestParcel.requestType = MANAGE_ACCOUNT_REQUEST_TYPE;
+
+        return requestParcel;
+    }
+
     /* Generates Happy Path AntispoofkeyDeviceMetadata. */
     private static FastPairAntispoofkeyDeviceMetadata
             genHappyPathFastPairAntispoofkeyDeviceMetadata() {
@@ -507,6 +534,12 @@
         // No fields since FastPairEligibleAccountsRequest is just a place holder now.
     }
 
+    private static void ensureHappyPathAsExpected(
+            FastPairDataProviderBase.FastPairManageAccountRequest request) {
+        assertEquals(MANAGE_ACCOUNT, request.getAccount());
+        assertEquals(MANAGE_ACCOUNT_REQUEST_TYPE, request.getRequestType());
+    }
+
     /* Verifies Happy Path AntispoofkeyDeviceMetadataParcel. */
     private static void ensureHappyPathAsExpected(
             FastPairAntispoofkeyDeviceMetadataParcel metadataParcel) {