Merge "Show warning toast for secure window" into tm-qpr-dev am: 073eeabf9f

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19561238

Change-Id: I575c65a3918c1a89c86af1391e51c4a559968746
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Iris Yang
2022-08-22 01:59:01 +00:00
committed by Automerger Merge Worker
6 changed files with 47 additions and 5 deletions

View File

@@ -6311,6 +6311,8 @@ ul.</string>
<string name="vdm_camera_access_denied" product="default">Can’t access the phone’s camera from your <xliff:g id="device" example="Chromebook">%1$s</xliff:g></string> <string name="vdm_camera_access_denied" product="default">Can’t access the phone’s camera from your <xliff:g id="device" example="Chromebook">%1$s</xliff:g></string>
<!-- Error message indicating the camera cannot be accessed when running on a virtual device. [CHAR LIMIT=NONE] --> <!-- Error message indicating the camera cannot be accessed when running on a virtual device. [CHAR LIMIT=NONE] -->
<string name="vdm_camera_access_denied" product="tablet">Can’t access the tablet’s camera from your <xliff:g id="device" example="Chromebook">%1$s</xliff:g></string> <string name="vdm_camera_access_denied" product="tablet">Can’t access the tablet’s camera from your <xliff:g id="device" example="Chromebook">%1$s</xliff:g></string>
<!-- Error message indicating the user cannot access secure content when running on a virtual device. [CHAR LIMIT=NONE] -->
<string name="vdm_secure_window">This can’t be accessed while streaming. Try on your phone instead.</string>
<!-- Title for preference of the system default locale. [CHAR LIMIT=50]--> <!-- Title for preference of the system default locale. [CHAR LIMIT=50]-->
<string name="system_locale_title">System default</string> <string name="system_locale_title">System default</string>

View File

@@ -4784,6 +4784,7 @@
<!-- For VirtualDeviceManager --> <!-- For VirtualDeviceManager -->
<java-symbol type="string" name="vdm_camera_access_denied" /> <java-symbol type="string" name="vdm_camera_access_denied" />
<java-symbol type="string" name="vdm_secure_window" />
<java-symbol type="color" name="camera_privacy_light_day"/> <java-symbol type="color" name="camera_privacy_light_day"/>
<java-symbol type="color" name="camera_privacy_light_night"/> <java-symbol type="color" name="camera_privacy_light_night"/>

View File

@@ -76,6 +76,14 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
private static final ComponentName BLOCKED_APP_STREAMING_COMPONENT = private static final ComponentName BLOCKED_APP_STREAMING_COMPONENT =
new ComponentName("android", BlockedAppStreamingActivity.class.getName()); new ComponentName("android", BlockedAppStreamingActivity.class.getName());
/**
* For communicating when a secure window shows on the virtual display.
*/
public interface SecureWindowCallback {
/** Called when a secure window shows on the virtual display. */
void onSecureWindowShown(int displayId, int uid);
}
/** /**
* If required, allow the secure activity to display on remote device since * If required, allow the secure activity to display on remote device since
* {@link android.os.Build.VERSION_CODES#TIRAMISU}. * {@link android.os.Build.VERSION_CODES#TIRAMISU}.
@@ -108,6 +116,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
new ArraySet<>(); new ArraySet<>();
@Nullable @Nullable
private final @AssociationRequest.DeviceProfile String mDeviceProfile; private final @AssociationRequest.DeviceProfile String mDeviceProfile;
@Nullable private final SecureWindowCallback mSecureWindowCallback;
/** /**
* Creates a window policy controller that is generic to the different use cases of virtual * Creates a window policy controller that is generic to the different use cases of virtual
@@ -131,6 +140,8 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
* @param activityListener Activity listener to listen for activity changes. * @param activityListener Activity listener to listen for activity changes.
* @param activityBlockedCallback Callback that is called when an activity is blocked from * @param activityBlockedCallback Callback that is called when an activity is blocked from
* launching. * launching.
* @param secureWindowCallback Callback that is called when a secure window shows on the
* virtual display.
* @param deviceProfile The {@link AssociationRequest.DeviceProfile} of this virtual device. * @param deviceProfile The {@link AssociationRequest.DeviceProfile} of this virtual device.
*/ */
public GenericWindowPolicyController(int windowFlags, int systemWindowFlags, public GenericWindowPolicyController(int windowFlags, int systemWindowFlags,
@@ -142,6 +153,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
@ActivityPolicy int defaultActivityPolicy, @ActivityPolicy int defaultActivityPolicy,
@NonNull ActivityListener activityListener, @NonNull ActivityListener activityListener,
@NonNull ActivityBlockedCallback activityBlockedCallback, @NonNull ActivityBlockedCallback activityBlockedCallback,
@NonNull SecureWindowCallback secureWindowCallback,
@AssociationRequest.DeviceProfile String deviceProfile) { @AssociationRequest.DeviceProfile String deviceProfile) {
super(); super();
mAllowedUsers = allowedUsers; mAllowedUsers = allowedUsers;
@@ -154,6 +166,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
setInterestedWindowFlags(windowFlags, systemWindowFlags); setInterestedWindowFlags(windowFlags, systemWindowFlags);
mActivityListener = activityListener; mActivityListener = activityListener;
mDeviceProfile = deviceProfile; mDeviceProfile = deviceProfile;
mSecureWindowCallback = secureWindowCallback;
} }
/** /**
@@ -234,6 +247,12 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
@Override @Override
public boolean keepActivityOnWindowFlagsChanged(ActivityInfo activityInfo, int windowFlags, public boolean keepActivityOnWindowFlagsChanged(ActivityInfo activityInfo, int windowFlags,
int systemWindowFlags) { int systemWindowFlags) {
// The callback is fired only when windowFlags are changed. To let VirtualDevice owner
// aware that the virtual display has a secure window on top.
if ((windowFlags & FLAG_SECURE) != 0) {
mSecureWindowCallback.onSecureWindowShown(mDisplayId, activityInfo.applicationInfo.uid);
}
if (!canContainActivity(activityInfo, windowFlags, systemWindowFlags)) { if (!canContainActivity(activityInfo, windowFlags, systemWindowFlags)) {
mActivityBlockedCallback.onActivityBlocked(mDisplayId, activityInfo); mActivityBlockedCallback.onActivityBlocked(mDisplayId, activityInfo);
return false; return false;

View File

@@ -52,6 +52,7 @@ import android.hardware.input.VirtualMouseScrollEvent;
import android.hardware.input.VirtualTouchEvent; import android.hardware.input.VirtualTouchEvent;
import android.os.Binder; import android.os.Binder;
import android.os.IBinder; import android.os.IBinder;
import android.os.Looper;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ResultReceiver; import android.os.ResultReceiver;
@@ -542,6 +543,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
mParams.getDefaultActivityPolicy(), mParams.getDefaultActivityPolicy(),
createListenerAdapter(), createListenerAdapter(),
this::onActivityBlocked, this::onActivityBlocked,
this::onSecureWindowShown,
mAssociationInfo.getDeviceProfile()); mAssociationInfo.getDeviceProfile());
gwpc.registerRunningAppsChangedListener(/* listener= */ this); gwpc.registerRunningAppsChangedListener(/* listener= */ this);
return gwpc; return gwpc;
@@ -591,6 +593,21 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
mContext.getUser()); mContext.getUser());
} }
private void onSecureWindowShown(int displayId, int uid) {
if (!mVirtualDisplayIds.contains(displayId)) {
return;
}
// If a virtual display isn't secure, the screen can't be captured. Show a warning toast
// if the secure window is shown on a non-secure virtual display.
DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
Display display = displayManager.getDisplay(displayId);
if ((display.getFlags() & FLAG_SECURE) == 0) {
showToastWhereUidIsRunning(uid, com.android.internal.R.string.vdm_secure_window,
Toast.LENGTH_LONG, mContext.getMainLooper());
}
}
private ArraySet<UserHandle> getAllowedUserHandles() { private ArraySet<UserHandle> getAllowedUserHandles() {
ArraySet<UserHandle> result = new ArraySet<>(); ArraySet<UserHandle> result = new ArraySet<>();
DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class); DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
@@ -650,14 +667,16 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
/** /**
* Shows a toast on virtual displays owned by this device which have a given uid running. * Shows a toast on virtual displays owned by this device which have a given uid running.
*/ */
void showToastWhereUidIsRunning(int uid, @StringRes int resId, @Toast.Duration int duration) { void showToastWhereUidIsRunning(int uid, @StringRes int resId, @Toast.Duration int duration,
showToastWhereUidIsRunning(uid, mContext.getString(resId), duration); Looper looper) {
showToastWhereUidIsRunning(uid, mContext.getString(resId), duration, looper);
} }
/** /**
* Shows a toast on virtual displays owned by this device which have a given uid running. * Shows a toast on virtual displays owned by this device which have a given uid running.
*/ */
void showToastWhereUidIsRunning(int uid, String text, @Toast.Duration int duration) { void showToastWhereUidIsRunning(int uid, String text, @Toast.Duration int duration,
Looper looper) {
synchronized (mVirtualDeviceLock) { synchronized (mVirtualDeviceLock) {
DisplayManager displayManager = mContext.getSystemService(DisplayManager.class); DisplayManager displayManager = mContext.getSystemService(DisplayManager.class);
final int size = mWindowPolicyControllers.size(); final int size = mWindowPolicyControllers.size();
@@ -666,7 +685,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
int displayId = mWindowPolicyControllers.keyAt(i); int displayId = mWindowPolicyControllers.keyAt(i);
Display display = displayManager.getDisplay(displayId); Display display = displayManager.getDisplay(displayId);
if (display != null && display.isValid()) { if (display != null && display.isValid()) {
Toast.makeText(mContext.createDisplayContext(display), text, Toast.makeText(mContext.createDisplayContext(display), looper, text,
duration).show(); duration).show();
} }
} }

View File

@@ -202,7 +202,7 @@ public class VirtualDeviceManagerService extends SystemService {
getContext().getString( getContext().getString(
com.android.internal.R.string.vdm_camera_access_denied, com.android.internal.R.string.vdm_camera_access_denied,
deviceName), deviceName),
Toast.LENGTH_LONG); Toast.LENGTH_LONG, Looper.myLooper());
} }
} }
} }

View File

@@ -83,6 +83,7 @@ public class VirtualAudioControllerTest {
VirtualDeviceParams.ACTIVITY_POLICY_DEFAULT_ALLOWED, VirtualDeviceParams.ACTIVITY_POLICY_DEFAULT_ALLOWED,
/* activityListener= */ null, /* activityListener= */ null,
/* activityBlockedCallback= */ null, /* activityBlockedCallback= */ null,
/* secureWindowCallback= */ null,
/* deviceProfile= */ DEVICE_PROFILE_APP_STREAMING); /* deviceProfile= */ DEVICE_PROFILE_APP_STREAMING);
} }