diff --git a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java index 547aa16ee6e4c..4dd1b79b536c8 100644 --- a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java +++ b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java @@ -587,8 +587,28 @@ public final class AppSearchSession implements Closeable { Objects.requireNonNull(executor); Objects.requireNonNull(callback); Preconditions.checkState(!mIsClosed, "AppSearchSession has already been closed"); - // TODO(b/182909475): Implement getStorageInfo - throw new UnsupportedOperationException(); + try { + mService.getStorageInfo( + mPackageName, + mDatabaseName, + mUserId, + new IAppSearchResultCallback.Stub() { + public void onResult(AppSearchResult result) { + executor.execute(() -> { + if (result.isSuccess()) { + Bundle responseBundle = (Bundle) result.getResultValue(); + StorageInfo response = + new StorageInfo(responseBundle); + callback.accept(AppSearchResult.newSuccessfulResult(response)); + } else { + callback.accept(result); + } + }); + } + }); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } /** diff --git a/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl b/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl index 48c397f324ec4..a8ac27c11089c 100644 --- a/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl +++ b/apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl @@ -306,6 +306,22 @@ interface IAppSearchManager { in int userId, in IAppSearchResultCallback callback); + /** + * Gets the storage info. + * + * @param packageName The name of the package to get the storage info for. + * @param databaseName The databaseName to get the storage info for. + * @param userId Id of the calling user + * @param callback {@link IAppSearchResultCallback#onResult} will be called with an + * {@link AppSearchResult}<{@link Bundle}>, where the value is a + * {@link StorageInfo}. + */ + void getStorageInfo( + in String packageName, + in String databaseName, + in int userId, + in IAppSearchResultCallback callback); + /** * Persists all update/delete requests to the disk. * diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java index 91ed6cd4a638a..991dda7cacd2d 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java @@ -33,6 +33,7 @@ import android.app.appsearch.PackageIdentifier; import android.app.appsearch.SearchResultPage; import android.app.appsearch.SearchSpec; import android.app.appsearch.SetSchemaResponse; +import android.app.appsearch.StorageInfo; import android.content.Context; import android.content.pm.PackageManagerInternal; import android.os.Binder; @@ -609,6 +610,34 @@ public class AppSearchManagerService extends SystemService { } } + @Override + public void getStorageInfo( + @NonNull String packageName, + @NonNull String databaseName, + @UserIdInt int userId, + @NonNull IAppSearchResultCallback callback) { + Preconditions.checkNotNull(packageName); + Preconditions.checkNotNull(databaseName); + Preconditions.checkNotNull(callback); + int callingUid = Binder.getCallingUid(); + int callingUserId = handleIncomingUser(userId, callingUid); + final long callingIdentity = Binder.clearCallingIdentity(); + try { + verifyUserUnlocked(callingUserId); + verifyCallingPackage(callingUid, packageName); + AppSearchImpl impl = + mImplInstanceManager.getAppSearchImpl(callingUserId); + StorageInfo storageInfo = impl.getStorageInfoForDatabase(packageName, databaseName); + Bundle storageInfoBundle = storageInfo.getBundle(); + invokeCallbackOnResult( + callback, AppSearchResult.newSuccessfulResult(storageInfoBundle)); + } catch (Throwable t) { + invokeCallbackOnError(callback, t); + } finally { + Binder.restoreCallingIdentity(callingIdentity); + } + } + @Override public void persistToDisk(@UserIdInt int userId) { int callingUid = Binder.getCallingUidOrThrow(); diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java index ef3e320cb84b9..88b06511cc74b 100644 --- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java @@ -849,6 +849,12 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { callback.onResult(AppSearchResult.newSuccessfulResult(null)); } + @Override + public void getStorageInfo(String packageName, String databaseName, int userId, + IAppSearchResultCallback callback) throws RemoteException { + ignore(callback); + } + @Override public void persistToDisk(int userId) throws RemoteException {