Merge "Grant client app visibility with UID from activity record" into tm-dev

This commit is contained in:
Jack Wang
2022-06-06 16:10:48 +00:00
committed by Android (Google) Code Review
4 changed files with 34 additions and 36 deletions

View File

@@ -338,14 +338,16 @@ public abstract class ActivityTaskManagerInternal {
private final @NonNull IBinder mAssistToken;
private final @NonNull IBinder mShareableActivityToken;
private final @NonNull IApplicationThread mAppThread;
private final int mUid;
public ActivityTokens(@NonNull IBinder activityToken,
@NonNull IBinder assistToken, @NonNull IApplicationThread appThread,
@NonNull IBinder shareableActivityToken) {
@NonNull IBinder shareableActivityToken, int uid) {
mActivityToken = activityToken;
mAssistToken = assistToken;
mAppThread = appThread;
mShareableActivityToken = shareableActivityToken;
mUid = uid;
}
/**
@@ -375,6 +377,13 @@ public abstract class ActivityTaskManagerInternal {
public @NonNull IApplicationThread getApplicationThread() {
return mAppThread;
}
/**
* @return The UID of the activity
*/
public int getUid() {
return mUid;
}
}
public abstract void sendActivityResult(int callingUid, IBinder activityToken,

View File

@@ -5820,14 +5820,16 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
if (token == null && list.get(0).attachedToProcess()) {
ActivityRecord topRecord = list.get(0);
return new ActivityTokens(topRecord.token, topRecord.assistToken,
topRecord.app.getThread(), topRecord.shareableActivityToken);
topRecord.app.getThread(), topRecord.shareableActivityToken,
topRecord.getUid());
}
// find the expected Activity
for (int i = 0; i < list.size(); i++) {
ActivityRecord record = list.get(i);
if (record.shareableActivityToken == token && record.attachedToProcess()) {
return new ActivityTokens(record.token, record.assistToken,
record.app.getThread(), record.shareableActivityToken);
record.app.getThread(), record.shareableActivityToken,
record.getUid());
}
}
return null;

View File

@@ -35,7 +35,6 @@ import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.ShortcutServiceInternal;
@@ -105,7 +104,6 @@ import com.android.server.pm.permission.LegacyPermissionManagerInternal;
import com.android.server.soundtrigger.SoundTriggerInternal;
import com.android.server.utils.TimingsTraceAndSlog;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.ActivityTaskManagerInternal.ActivityTokens;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -128,7 +126,6 @@ public class VoiceInteractionManagerService extends SystemService {
final ActivityManagerInternal mAmInternal;
final ActivityTaskManagerInternal mAtmInternal;
final UserManagerInternal mUserManagerInternal;
final PackageManagerInternal mPackageManagerInternal;
final ArrayMap<Integer, VoiceInteractionManagerServiceStub.SoundTriggerSession>
mLoadedKeyphraseIds = new ArrayMap<>();
ShortcutServiceInternal mShortcutServiceInternal;
@@ -149,8 +146,6 @@ public class VoiceInteractionManagerService extends SystemService {
LocalServices.getService(ActivityTaskManagerInternal.class));
mUserManagerInternal = Objects.requireNonNull(
LocalServices.getService(UserManagerInternal.class));
mPackageManagerInternal = Objects.requireNonNull(
LocalServices.getService(PackageManagerInternal.class));
LegacyPermissionManagerInternal permissionManagerInternal = LocalServices.getService(
LegacyPermissionManagerInternal.class);
@@ -374,21 +369,6 @@ public class VoiceInteractionManagerService extends SystemService {
return new SoundTriggerSessionBinderProxy(session);
}
@GuardedBy("this")
private void grantImplicitAccessLocked(int grantRecipientUid, @Nullable Intent intent) {
if (mImpl == null) {
Slog.w(TAG, "Cannot grant implicit access because mImpl is null.");
return;
}
final int grantRecipientAppId = UserHandle.getAppId(grantRecipientUid);
final int grantRecipientUserId = UserHandle.getUserId(grantRecipientUid);
final int voiceInteractionUid = mImpl.mInfo.getServiceInfo().applicationInfo.uid;
mPackageManagerInternal.grantImplicitAccess(
grantRecipientUserId, intent, grantRecipientAppId, voiceInteractionUid,
/* direct= */ true);
}
private IVoiceInteractionSoundTriggerSession createSoundTriggerSessionForSelfIdentity(
IBinder client) {
Identity identity = new Identity();
@@ -419,9 +399,10 @@ public class VoiceInteractionManagerService extends SystemService {
@Override
public void onShown() {
synchronized (VoiceInteractionManagerServiceStub.this) {
VoiceInteractionManagerServiceStub.this
.grantImplicitAccessLocked(callingUid,
/* intent= */ null);
if (mImpl != null) {
mImpl.grantImplicitAccessLocked(callingUid,
/* intent= */ null);
}
}
mAtmInternal.onLocalVoiceInteractionStarted(token,
mImpl.mActiveSession.mSession,
@@ -995,7 +976,7 @@ public class VoiceInteractionManagerService extends SystemService {
mContext.getPackageManager(), PackageManager.MATCH_ALL);
if (activityInfo != null) {
final int activityUid = activityInfo.applicationInfo.uid;
grantImplicitAccessLocked(activityUid, intent);
mImpl.grantImplicitAccessLocked(activityUid, intent);
} else {
Slog.w(TAG, "Cannot find ActivityInfo in startVoiceActivity.");
}
@@ -1039,15 +1020,6 @@ public class VoiceInteractionManagerService extends SystemService {
}
final long caller = Binder.clearCallingIdentity();
try {
// Getting the UID corresponding to the taskId, and grant the visibility to it.
final ActivityTokens tokens = mAtmInternal
.getAttachedNonFinishingActivityForTask(taskId, /* token= */ null);
final ComponentName componentName = mAtmInternal.getActivityName(
tokens.getActivityToken());
grantImplicitAccessLocked(mPackageManagerInternal.getPackageUid(
componentName.getPackageName(), PackageManager.MATCH_ALL,
UserHandle.myUserId()), /* intent= */ null);
mImpl.requestDirectActionsLocked(token, taskId, assistToken,
cancellationCallback, resultCallback);
} finally {

View File

@@ -39,6 +39,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ParceledListSlice;
import android.content.pm.ServiceInfo;
import android.hardware.soundtrigger.IRecognitionStatusCallback;
@@ -80,6 +81,7 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConnection.Callback {
final static String TAG = "VoiceInteractionServiceManager";
@@ -100,6 +102,7 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
final ComponentName mComponent;
final IActivityManager mAm;
final IActivityTaskManager mAtm;
final PackageManagerInternal mPackageManagerInternal;
final VoiceInteractionServiceInfo mInfo;
final ComponentName mSessionComponentName;
final IWindowManager mIWindowManager;
@@ -195,6 +198,8 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
mComponent = service;
mAm = ActivityManager.getService();
mAtm = ActivityTaskManager.getService();
mPackageManagerInternal = Objects.requireNonNull(
LocalServices.getService(PackageManagerInternal.class));
VoiceInteractionServiceInfo info;
try {
info = new VoiceInteractionServiceInfo(context.getPackageManager(), service, mUser);
@@ -230,6 +235,15 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
Context.RECEIVER_EXPORTED);
}
public void grantImplicitAccessLocked(int grantRecipientUid, @Nullable Intent intent) {
final int grantRecipientAppId = UserHandle.getAppId(grantRecipientUid);
final int grantRecipientUserId = UserHandle.getUserId(grantRecipientUid);
final int voiceInteractionUid = mInfo.getServiceInfo().applicationInfo.uid;
mPackageManagerInternal.grantImplicitAccess(
grantRecipientUserId, intent, grantRecipientAppId, voiceInteractionUid,
/* direct= */ true);
}
public boolean showSessionLocked(Bundle args, int flags,
IVoiceInteractionSessionShowCallback showCallback, IBinder activityToken) {
if (mActiveSession == null) {
@@ -354,6 +368,7 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
VoiceInteractionManagerServiceImpl.this, token, taskId, assistToken,
cancellationCallback, callback), REQUEST_DIRECT_ACTIONS_RETRY_TIME_MS);
} else {
grantImplicitAccessLocked(tokens.getUid(), /* intent= */ null);
try {
tokens.getApplicationThread().requestDirectActions(tokens.getActivityToken(),
mActiveSession.mInteractor, cancellationCallback, callback);