From dabef23801ddc6ceb1b595a15c01f826c17323a7 Mon Sep 17 00:00:00 2001 From: Joanne Date: Mon, 3 Oct 2022 22:44:47 +0800 Subject: [PATCH] Callback immediately even no TranslationService is set on device Bug: 249447538 Test: manual. Set fake service to let remote service is null. The result can return immediately. Test: atest CtsTranslationTestCases Change-Id: I4365aa33192c4a20002479b11bad19a3885a460a --- .../TranslationManagerServiceImpl.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java b/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java index 1e74451a8d4df..2d382a27d7474 100644 --- a/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java +++ b/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java @@ -17,6 +17,7 @@ package com.android.server.translation; import static android.view.translation.TranslationManager.EXTRA_CAPABILITIES; +import static android.view.translation.TranslationManager.STATUS_SYNC_CALL_FAIL; import static android.view.translation.UiTranslationManager.EXTRA_PACKAGE_NAME; import static android.view.translation.UiTranslationManager.EXTRA_SOURCE_LOCALE; import static android.view.translation.UiTranslationManager.EXTRA_STATE; @@ -32,7 +33,9 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.content.ComponentName; import android.content.Context; +import android.content.Intent; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.os.Bundle; import android.os.IBinder; @@ -40,6 +43,7 @@ import android.os.IRemoteCallback; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.ResultReceiver; +import android.service.translation.TranslationService; import android.service.translation.TranslationServiceInfo; import android.util.ArrayMap; import android.util.ArraySet; @@ -156,12 +160,27 @@ final class TranslationManagerServiceImpl extends return null; } final ComponentName serviceComponent = ComponentName.unflattenFromString(serviceName); + if (!isServiceAvailableForUser(serviceComponent)) { + if (mMaster.verbose) { + Slog.v(TAG, "ensureRemoteServiceLocked(): " + serviceComponent + + " is not available,"); + } + return null; + } mRemoteTranslationService = new RemoteTranslationService(getContext(), serviceComponent, mUserId, /* isInstantAllowed= */ false, mRemoteServiceCallback); } return mRemoteTranslationService; } + private boolean isServiceAvailableForUser(ComponentName serviceComponent) { + Intent intent = new Intent(TranslationService.SERVICE_INTERFACE) + .setComponent(serviceComponent); + final ResolveInfo resolveInfo = getContext().getPackageManager().resolveServiceAsUser( + intent, PackageManager.GET_SERVICES | PackageManager.GET_META_DATA, mUserId); + return resolveInfo != null && resolveInfo.serviceInfo != null; + } + @GuardedBy("mLock") void onTranslationCapabilitiesRequestLocked(@TranslationSpec.DataFormat int sourceFormat, @TranslationSpec.DataFormat int destFormat, @@ -170,6 +189,9 @@ final class TranslationManagerServiceImpl extends if (remoteService != null) { remoteService.onTranslationCapabilitiesRequest(sourceFormat, destFormat, resultReceiver); + } else { + Slog.v(TAG, "onTranslationCapabilitiesRequestLocked(): no remote service."); + resultReceiver.send(STATUS_SYNC_CALL_FAIL, null); } } @@ -184,10 +206,13 @@ final class TranslationManagerServiceImpl extends @GuardedBy("mLock") void onSessionCreatedLocked(@NonNull TranslationContext translationContext, int sessionId, - IResultReceiver resultReceiver) { + IResultReceiver resultReceiver) throws RemoteException { final RemoteTranslationService remoteService = ensureRemoteServiceLocked(); if (remoteService != null) { remoteService.onSessionCreated(translationContext, sessionId, resultReceiver); + } else { + Slog.v(TAG, "onSessionCreatedLocked(): no remote service."); + resultReceiver.send(STATUS_SYNC_CALL_FAIL, null); } }