qt_dev: Fix ContentSuggestions service connection

Issue:
When the RemoteContentSuggestionsService dies (due to package manager
update or clear data), the ContentSuggestionsPerUserService (system)
does not restart and uses an old zombie instance.

Fix:
 Reset the instance upon onServiceDied in the system service.

Test: Verified that stopping/clear-data/package-update of Device
Personalization Services (which implements ContentSuggestionsService)
multiple-times and then Overview long-press actually works.

Also verified that if the Remote Service crashes, we don't keep
 reconnecting infinitely.

Fixes: 120865921
Fixes: 130420008

Change-Id: I80197ec1cb446ddb5f1865a4b75beb18b48d2e9e
This commit is contained in:
Perumaal S
2019-06-14 15:34:07 -07:00
committed by Perumaal Shanmugam
parent 2aa255a746
commit bcedb60f4c

View File

@@ -95,7 +95,7 @@ public final class ContentSuggestionsPerUserService extends
@GuardedBy("mLock")
void provideContextImageLocked(int taskId, @NonNull Bundle imageContextRequestExtras) {
RemoteContentSuggestionsService service = getRemoteServiceLocked();
RemoteContentSuggestionsService service = ensureRemoteServiceLocked();
if (service != null) {
ActivityManager.TaskSnapshot snapshot =
mActivityTaskManagerInternal.getTaskSnapshot(taskId, false);
@@ -118,7 +118,7 @@ public final class ContentSuggestionsPerUserService extends
void suggestContentSelectionsLocked(
@NonNull SelectionsRequest selectionsRequest,
@NonNull ISelectionsCallback selectionsCallback) {
RemoteContentSuggestionsService service = getRemoteServiceLocked();
RemoteContentSuggestionsService service = ensureRemoteServiceLocked();
if (service != null) {
service.suggestContentSelections(selectionsRequest, selectionsCallback);
}
@@ -128,7 +128,7 @@ public final class ContentSuggestionsPerUserService extends
void classifyContentSelectionsLocked(
@NonNull ClassificationsRequest classificationsRequest,
@NonNull IClassificationsCallback callback) {
RemoteContentSuggestionsService service = getRemoteServiceLocked();
RemoteContentSuggestionsService service = ensureRemoteServiceLocked();
if (service != null) {
service.classifyContentSelections(classificationsRequest, callback);
}
@@ -136,7 +136,7 @@ public final class ContentSuggestionsPerUserService extends
@GuardedBy("mLock")
void notifyInteractionLocked(@NonNull String requestId, @NonNull Bundle bundle) {
RemoteContentSuggestionsService service = getRemoteServiceLocked();
RemoteContentSuggestionsService service = ensureRemoteServiceLocked();
if (service != null) {
service.notifyInteraction(requestId, bundle);
}
@@ -153,12 +153,12 @@ public final class ContentSuggestionsPerUserService extends
@GuardedBy("mLock")
@Nullable
private RemoteContentSuggestionsService getRemoteServiceLocked() {
private RemoteContentSuggestionsService ensureRemoteServiceLocked() {
if (mRemoteService == null) {
final String serviceName = getComponentNameLocked();
if (serviceName == null) {
if (mMaster.verbose) {
Slog.v(TAG, "getRemoteServiceLocked(): not set");
Slog.v(TAG, "ensureRemoteServiceLocked(): not set");
}
return null;
}
@@ -170,8 +170,8 @@ public final class ContentSuggestionsPerUserService extends
@Override
public void onServiceDied(
@NonNull RemoteContentSuggestionsService service) {
// TODO(b/120865921): properly implement
Slog.w(TAG, "remote content suggestions service died");
updateRemoteServiceLocked();
}
}, mMaster.isBindInstantServiceAllowed(), mMaster.verbose);
}