Population Density Provider: add cache hint

Adds a parameter to indicate the desired answer size when querying the coarsened cells. This allows the framework to indicate its cache size, and the provider to answer with the right amount of cells.

Tests:
- atest CtsLocationNoneTestCases:PopulationDensityProviderBaseTest
- atest FrameworksMockingServicesTests:LocationProviderManagerTest
- atest FrameworksMockingServicesTests:LocationFudgerTest
- atest FrameworksMockingServicesTests:LocationFudgerCacheTest
Test: manual atest on Pixel 7 pro (see above)
Bug: 381286551
Flag: android.location.flags.density_based_coarse_locations

Change-Id: Ib0d26e8ce0e1164ff30b45e2d3deddb67f68a83b
diff --git a/location/api/system-current.txt b/location/api/system-current.txt
index 8cd08d3..9478e35 100644
--- a/location/api/system-current.txt
+++ b/location/api/system-current.txt
@@ -645,7 +645,7 @@
   @FlaggedApi("android.location.flags.population_density_provider") public abstract class PopulationDensityProviderBase {
     ctor public PopulationDensityProviderBase(@NonNull android.content.Context, @NonNull String);
     method @Nullable public final android.os.IBinder getBinder();
-    method public abstract void onGetCoarsenedS2Cell(double, double, @NonNull android.os.OutcomeReceiver<long[],java.lang.Throwable>);
+    method public abstract void onGetCoarsenedS2Cells(double, double, @IntRange(from=0) int, @NonNull android.os.OutcomeReceiver<long[],java.lang.Throwable>);
     method public abstract void onGetDefaultCoarseningLevel(@NonNull android.os.OutcomeReceiver<java.lang.Integer,java.lang.Throwable>);
     field public static final String ACTION_POPULATION_DENSITY_PROVIDER = "com.android.location.service.PopulationDensityProvider";
   }
diff --git a/location/java/android/location/provider/IPopulationDensityProvider.aidl b/location/java/android/location/provider/IPopulationDensityProvider.aidl
index 9b5cb5a..41fe500 100644
--- a/location/java/android/location/provider/IPopulationDensityProvider.aidl
+++ b/location/java/android/location/provider/IPopulationDensityProvider.aidl
@@ -35,11 +35,11 @@
     void getDefaultCoarseningLevel(in IS2LevelCallback callback);
 
     /**
-     * Returns a list of IDs of the S2 cells to be used to coarsen a location. The answer should
+     * Requests a list of IDs of the S2 cells to be used to coarsen a location. The answer should
      * contain at least one S2 cell, which should contain the requested location. Its level
-     * represents the population density. Optionally, additional nearby cells can be also returned,
-     * to assist in coarsening nearby locations.
+     * represents the population density. Optionally, if numAdditionalCells is greater than 0,
+     * additional nearby cells can be also returned, to assist in coarsening nearby locations.
      */
-    void getCoarsenedS2Cell(double latitudeDegrees, double longitudeDegrees, in IS2CellIdsCallback
-        callback);
+    void getCoarsenedS2Cells(double latitudeDegrees, double longitudeDegrees,
+        int numAdditionalCells, in IS2CellIdsCallback callback);
 }
diff --git a/location/java/android/location/provider/PopulationDensityProviderBase.java b/location/java/android/location/provider/PopulationDensityProviderBase.java
index 3907516..0177cf8 100644
--- a/location/java/android/location/provider/PopulationDensityProviderBase.java
+++ b/location/java/android/location/provider/PopulationDensityProviderBase.java
@@ -17,6 +17,7 @@
 package android.location.provider;
 
 import android.annotation.FlaggedApi;
+import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SuppressLint;
@@ -89,17 +90,18 @@
      * Called upon receiving a new request for population density at a specific latitude/longitude,
      * expressed in degrees.
      * The answer is at least one S2CellId corresponding to the coarsening level at the specified
-     * location. This must be the first element of the result array. Optionally, additional nearby
-     * S2CellIds can be returned. One use for the optional nearby cells is when the client has a
-     * local cache that needs to be filled with the local area around a certain latitude/longitude.
-     * The callback {@link OutcomeReceiver#onResult} should be called with the result; or, in case
-     * an error occurs, {@link OutcomeReceiver#onError} should be called.
-     * The callback is single-use, calling more than any one of these two methods throws an
-     * AssertionException.
+     * location. This must be the first element of the result array. Optionally, if
+     * numAdditionalCells is greater than zero, additional nearby S2CellIds can be returned. One use
+     * for the optional nearby cells is when the client has a local cache that needs to be filled
+     * with the local area around a certain latitude/longitude. The callback
+     * {@link OutcomeReceiver#onResult} should be called with the result; or, in case an error
+     * occurs, {@link OutcomeReceiver#onError} should be called. The callback is single-use, calling
+     * more than any one of these two methods throws an AssertionException.
      *
      * @param callback A single-use callback that either returns S2CellIds, or an error.
      */
-    public abstract void onGetCoarsenedS2Cell(double latitudeDegrees, double longitudeDegrees,
+    public abstract void onGetCoarsenedS2Cells(double latitudeDegrees, double longitudeDegrees,
+            @IntRange(from = 0) int numAdditionalCells,
             @NonNull OutcomeReceiver<long[], Throwable> callback);
 
     private final class Service extends IPopulationDensityProvider.Stub {
@@ -119,10 +121,10 @@
         }
 
         @Override
-        public void getCoarsenedS2Cell(double latitudeDegrees, double longitudeDegrees,
-                @NonNull IS2CellIdsCallback callback) {
+        public void getCoarsenedS2Cells(double latitudeDegrees, double longitudeDegrees,
+                int numAdditionalCells, @NonNull IS2CellIdsCallback callback) {
             try {
-                onGetCoarsenedS2Cell(latitudeDegrees, longitudeDegrees,
+                onGetCoarsenedS2Cells(latitudeDegrees, longitudeDegrees, numAdditionalCells,
                         new SingleUseS2CellIdsCallback(callback));
             } catch (RuntimeException e) {
                 // exceptions on one-way binder threads are dropped - move to a different thread