Callback translation usages for registered translation app.
Apps developers may track the translation usage on their apps, the
system provides UiTranslationStateCallback if the apps registered.
Bug: 184901144
Test: atest UiTranslationManagerTest
Change-Id: I3265d4b587c81b74c6beae881cd3ff3034de9852
diff --git a/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java b/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java
index 16a2d8d..6606fb0 100644
--- a/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java
+++ b/services/translation/java/com/android/server/translation/TranslationManagerServiceImpl.java
@@ -182,15 +182,28 @@
+ "translation state for token=" + token + " taskId=" + taskId);
return;
}
+ int translationActivityUid = -1;
try {
+ IBinder activityToken = taskTopActivityTokens.getActivityToken();
taskTopActivityTokens.getApplicationThread().updateUiTranslationState(
- taskTopActivityTokens.getActivityToken(), state, sourceSpec, targetSpec,
+ activityToken, state, sourceSpec, targetSpec,
viewIds, uiTranslationSpec);
mLastActivityTokens = new WeakReference<>(taskTopActivityTokens);
+ ComponentName componentName =
+ mActivityTaskManagerInternal.getActivityName(activityToken);
+ try {
+ if (componentName != null) {
+ translationActivityUid =
+ getContext().getPackageManager().getApplicationInfoAsUser(
+ componentName.getPackageName(), 0, getUserId()).uid;
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ Slog.d(TAG, "Cannot find package for" + componentName);
+ }
} catch (RemoteException e) {
Slog.w(TAG, "Update UiTranslationState fail: " + e);
}
- invokeCallbacks(state, sourceSpec, targetSpec);
+ invokeCallbacks(state, sourceSpec, targetSpec, translationActivityUid);
}
@GuardedBy("mLock")
@@ -216,7 +229,8 @@
}
private void invokeCallbacks(
- int state, TranslationSpec sourceSpec, TranslationSpec targetSpec) {
+ int state, TranslationSpec sourceSpec, TranslationSpec targetSpec,
+ int translationActivityUid) {
Bundle res = new Bundle();
res.putInt(EXTRA_STATE, state);
// TODO(177500482): Store the locale pair so it can be sent for RESUME events.
@@ -229,6 +243,14 @@
LocalServices.getService(InputMethodManagerInternal.class)
.getEnabledInputMethodListAsUser(mUserId);
mCallbacks.broadcast((callback, uid) -> {
+ // callback to the application that is translated if registered.
+ if ((int) uid == translationActivityUid) {
+ try {
+ callback.sendResult(res);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Failed to invoke UiTranslationStateCallback: " + e);
+ }
+ }
// Code here is non-optimal since it's temporary..
boolean isIme = false;
for (InputMethodInfo inputMethod : enabledInputMethods) {