Make ImplInstanceManager a singleton

This moves the whole class into a singleton style for consistency.

Bug: 178730366
Test: presubmit
Change-Id: Idbba534fa81e80fcd865ebc056dd8d24a301e691
This commit is contained in:
Cassie Wang
2021-01-21 11:13:49 -08:00
parent e07bbc9889
commit a836fdcd45
2 changed files with 77 additions and 44 deletions

View File

@@ -64,7 +64,7 @@ public class AppSearchManagerService extends SystemService {
public void onStart() {
publishBinderService(Context.APP_SEARCH_SERVICE, new Stub());
mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
mImplInstanceManager = new ImplInstanceManager(getContext());
mImplInstanceManager = ImplInstanceManager.getInstance(getContext());
}
private class Stub extends IAppSearchManager.Stub {
@@ -102,7 +102,8 @@ public class AppSearchManagerService extends SystemService {
}
schemasPackageAccessible.put(entry.getKey(), packageIdentifiers);
}
AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
AppSearchImpl impl =
mImplInstanceManager.getAppSearchImpl(getContext(), callingUserId);
impl.setSchema(
packageName,
databaseName,
@@ -133,7 +134,8 @@ public class AppSearchManagerService extends SystemService {
final long callingIdentity = Binder.clearCallingIdentity();
try {
verifyCallingPackage(callingUid, packageName);
AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
AppSearchImpl impl =
mImplInstanceManager.getAppSearchImpl(getContext(), callingUserId);
List<AppSearchSchema> schemas = impl.getSchema(packageName, databaseName);
List<Bundle> schemaBundles = new ArrayList<>(schemas.size());
for (int i = 0; i < schemas.size(); i++) {
@@ -166,7 +168,8 @@ public class AppSearchManagerService extends SystemService {
verifyCallingPackage(callingUid, packageName);
AppSearchBatchResult.Builder<String, Void> resultBuilder =
new AppSearchBatchResult.Builder<>();
AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
AppSearchImpl impl =
mImplInstanceManager.getAppSearchImpl(getContext(), callingUserId);
for (int i = 0; i < documentBundles.size(); i++) {
GenericDocument document = new GenericDocument(documentBundles.get(i));
try {
@@ -207,12 +210,18 @@ public class AppSearchManagerService extends SystemService {
verifyCallingPackage(callingUid, packageName);
AppSearchBatchResult.Builder<String, Bundle> resultBuilder =
new AppSearchBatchResult.Builder<>();
AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
AppSearchImpl impl =
mImplInstanceManager.getAppSearchImpl(getContext(), callingUserId);
for (int i = 0; i < uris.size(); i++) {
String uri = uris.get(i);
try {
GenericDocument document = impl.getDocument(packageName, databaseName,
namespace, uri, typePropertyPaths);
GenericDocument document =
impl.getDocument(
packageName,
databaseName,
namespace,
uri,
typePropertyPaths);
resultBuilder.setSuccess(uri, document.getBundle());
} catch (Throwable t) {
resultBuilder.setResult(uri, throwableToFailedResult(t));
@@ -245,7 +254,8 @@ public class AppSearchManagerService extends SystemService {
final long callingIdentity = Binder.clearCallingIdentity();
try {
verifyCallingPackage(callingUid, packageName);
AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
AppSearchImpl impl =
mImplInstanceManager.getAppSearchImpl(getContext(), callingUserId);
SearchResultPage searchResultPage =
impl.query(
packageName,
@@ -278,12 +288,14 @@ public class AppSearchManagerService extends SystemService {
final long callingIdentity = Binder.clearCallingIdentity();
try {
verifyCallingPackage(callingUid, packageName);
AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
SearchResultPage searchResultPage = impl.globalQuery(
queryExpression,
new SearchSpec(searchSpecBundle),
packageName,
callingUid);
AppSearchImpl impl =
mImplInstanceManager.getAppSearchImpl(getContext(), callingUserId);
SearchResultPage searchResultPage =
impl.globalQuery(
queryExpression,
new SearchSpec(searchSpecBundle),
packageName,
callingUid);
invokeCallbackOnResult(
callback,
AppSearchResult.newSuccessfulResult(searchResultPage.getBundle()));
@@ -306,7 +318,8 @@ public class AppSearchManagerService extends SystemService {
// TODO(b/162450968) check nextPageToken is being advanced by the same uid as originally
// opened it
try {
AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
AppSearchImpl impl =
mImplInstanceManager.getAppSearchImpl(getContext(), callingUserId);
SearchResultPage searchResultPage = impl.getNextPage(nextPageToken);
invokeCallbackOnResult(
callback,
@@ -324,7 +337,8 @@ public class AppSearchManagerService extends SystemService {
int callingUserId = handleIncomingUser(userId, callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
AppSearchImpl impl =
mImplInstanceManager.getAppSearchImpl(getContext(), callingUserId);
impl.invalidateNextPageToken(nextPageToken);
} catch (Throwable t) {
Log.e(TAG, "Unable to invalidate the query page token", t);
@@ -350,15 +364,11 @@ public class AppSearchManagerService extends SystemService {
int callingUserId = handleIncomingUser(userId, callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
impl.reportUsage(
packageName,
databaseName,
namespace,
uri,
usageTimeMillis);
invokeCallbackOnResult(callback,
AppSearchResult.newSuccessfulResult(/*result=*/ null));
AppSearchImpl impl =
mImplInstanceManager.getAppSearchImpl(getContext(), callingUserId);
impl.reportUsage(packageName, databaseName, namespace, uri, usageTimeMillis);
invokeCallbackOnResult(
callback, AppSearchResult.newSuccessfulResult(/*result=*/ null));
} catch (Throwable t) {
invokeCallbackOnError(callback, t);
} finally {
@@ -385,7 +395,8 @@ public class AppSearchManagerService extends SystemService {
verifyCallingPackage(callingUid, packageName);
AppSearchBatchResult.Builder<String, Void> resultBuilder =
new AppSearchBatchResult.Builder<>();
AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
AppSearchImpl impl =
mImplInstanceManager.getAppSearchImpl(getContext(), callingUserId);
for (int i = 0; i < uris.size(); i++) {
String uri = uris.get(i);
try {
@@ -421,7 +432,8 @@ public class AppSearchManagerService extends SystemService {
final long callingIdentity = Binder.clearCallingIdentity();
try {
verifyCallingPackage(callingUid, packageName);
AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
AppSearchImpl impl =
mImplInstanceManager.getAppSearchImpl(getContext(), callingUserId);
impl.removeByQuery(
packageName,
databaseName,
@@ -441,7 +453,8 @@ public class AppSearchManagerService extends SystemService {
int callingUserId = handleIncomingUser(userId, callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId);
AppSearchImpl impl =
mImplInstanceManager.getAppSearchImpl(getContext(), callingUserId);
impl.persistToDisk();
} catch (Throwable t) {
Log.e(TAG, "Unable to persist the data to disk", t);
@@ -457,7 +470,7 @@ public class AppSearchManagerService extends SystemService {
int callingUserId = handleIncomingUser(userId, callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
mImplInstanceManager.getInstance(callingUserId);
mImplInstanceManager.getAppSearchImpl(getContext(), callingUserId);
invokeCallbackOnResult(callback, AppSearchResult.newSuccessfulResult(null));
} catch (Throwable t) {
invokeCallbackOnError(callback, t);

View File

@@ -41,14 +41,33 @@ import java.io.File;
public final class ImplInstanceManager {
private static final String APP_SEARCH_DIR = "appSearch";
private static final SparseArray<AppSearchImpl> sInstances = new SparseArray<>();
private static ImplInstanceManager sImplInstanceManager;
private final Context mContext;
private final SparseArray<AppSearchImpl> mInstances = new SparseArray<>();
private final String mGlobalQuerierPackage;
public ImplInstanceManager(@NonNull Context context) {
mContext = context;
mGlobalQuerierPackage = getGlobalAppSearchDataQuerierPackageName(mContext);
private ImplInstanceManager(@NonNull String globalQuerierPackage) {
mGlobalQuerierPackage = globalQuerierPackage;
}
/**
* Gets an instance of ImplInstanceManager to be used.
*
* <p>If no instance has been initialized yet, a new one will be created. Otherwise, the
* existing instance will be returned.
*/
@NonNull
public static ImplInstanceManager getInstance(@NonNull Context context) {
if (sImplInstanceManager == null) {
synchronized (ImplInstanceManager.class) {
if (sImplInstanceManager == null) {
sImplInstanceManager =
new ImplInstanceManager(
getGlobalAppSearchDataQuerierPackageName(context));
}
}
}
return sImplInstanceManager;
}
/**
@@ -57,30 +76,30 @@ public final class ImplInstanceManager {
* <p>If no AppSearchImpl instance exists for this user, Icing will be initialized and one will
* be created.
*
* @param context The context
* @param userId The multi-user userId of the device user calling AppSearch
* @return An initialized {@link AppSearchImpl} for this user
*/
@NonNull
public AppSearchImpl getInstance(@UserIdInt int userId)
public AppSearchImpl getAppSearchImpl(@NonNull Context context, @UserIdInt int userId)
throws AppSearchException {
AppSearchImpl instance = sInstances.get(userId);
AppSearchImpl instance = mInstances.get(userId);
if (instance == null) {
synchronized (ImplInstanceManager.class) {
instance = sInstances.get(userId);
instance = mInstances.get(userId);
if (instance == null) {
instance = createImpl(userId);
sInstances.put(userId, instance);
instance = createImpl(context, userId);
mInstances.put(userId, instance);
}
}
}
return instance;
}
private AppSearchImpl createImpl(@UserIdInt int userId)
private AppSearchImpl createImpl(@NonNull Context context, @UserIdInt int userId)
throws AppSearchException {
File appSearchDir = getAppSearchDir(mContext, userId);
return AppSearchImpl.create(
appSearchDir, mContext, userId, mGlobalQuerierPackage);
File appSearchDir = getAppSearchDir(context, userId);
return AppSearchImpl.create(appSearchDir, context, userId, mGlobalQuerierPackage);
}
private static File getAppSearchDir(@NonNull Context context, @UserIdInt int userId) {
@@ -96,7 +115,8 @@ public final class ImplInstanceManager {
*
* @param context Context of the system service.
*/
private static String getGlobalAppSearchDataQuerierPackageName(Context context) {
@NonNull
private static String getGlobalAppSearchDataQuerierPackageName(@NonNull Context context) {
String globalAppSearchDataQuerierPackage =
context.getString(R.string.config_globalAppSearchDataQuerierPackage);
try {