Merge "Add checks where fetching vdm could cause NPE" into udc-dev am: 4682a93c22

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

Change-Id: I8268723e51ce21635c57f7a883886a250a4f93cc
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Marco Loaiza
2023-03-01 15:04:12 +00:00
committed by Automerger Merge Worker
5 changed files with 19 additions and 3 deletions

View File

@@ -2814,7 +2814,7 @@ class ContextImpl extends Context {
public @NonNull Context createDeviceContext(int deviceId) {
if (deviceId != Context.DEVICE_ID_DEFAULT) {
VirtualDeviceManager vdm = getSystemService(VirtualDeviceManager.class);
if (!vdm.isValidVirtualDeviceId(deviceId)) {
if (vdm == null || !vdm.isValidVirtualDeviceId(deviceId)) {
throw new IllegalArgumentException(
"Not a valid ID of the default device or any virtual device: " + deviceId);
}

View File

@@ -877,6 +877,10 @@ public final class SystemServiceRegistry {
@Override
public VirtualDeviceManager createService(ContextImpl ctx)
throws ServiceNotFoundException {
if (!ctx.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_COMPANION_DEVICE_SETUP)) {
return null;
}
IVirtualDeviceManager service = IVirtualDeviceManager.Stub.asInterface(
ServiceManager.getServiceOrThrow(Context.VIRTUAL_DEVICE_SERVICE));
return new VirtualDeviceManager(service, ctx.getOuterContext());
@@ -1648,6 +1652,7 @@ public final class SystemServiceRegistry {
case Context.ETHERNET_SERVICE:
case Context.CONTEXTHUB_SERVICE:
case Context.VIRTUALIZATION_SERVICE:
case Context.VIRTUAL_DEVICE_SERVICE:
return null;
}
Slog.wtf(TAG, "Manager wrapper not available: " + name);

View File

@@ -5703,6 +5703,9 @@ public abstract class Context {
* Use with {@link #getSystemService(String)} to retrieve a
* {@link android.companion.virtual.VirtualDeviceManager} for managing virtual devices.
*
* On devices without {@link PackageManager#FEATURE_COMPANION_DEVICE_SETUP}
* system feature the {@link #getSystemService(String)} will return {@code null}.
*
* @see #getSystemService(String)
* @see android.companion.virtual.VirtualDeviceManager
*/

View File

@@ -45,6 +45,7 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
import static android.content.pm.ConfigurationInfo.GL_ES_VERSION_UNDEFINED;
import static android.content.pm.PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS;
import static android.content.pm.PackageManager.FEATURE_CANT_SAVE_STATE;
import static android.content.pm.PackageManager.FEATURE_COMPANION_DEVICE_SETUP;
import static android.content.pm.PackageManager.FEATURE_EXPANDED_PICTURE_IN_PICTURE;
import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
import static android.content.pm.PackageManager.FEATURE_LEANBACK;
@@ -401,6 +402,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
volatile WindowProcessController mHeavyWeightProcess;
boolean mHasHeavyWeightFeature;
boolean mHasLeanbackFeature;
boolean mHasCompanionDeviceSetupFeature;
/** The process of the top most activity. */
volatile WindowProcessController mTopApp;
/**
@@ -859,6 +861,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
final PackageManager pm = mContext.getPackageManager();
mHasHeavyWeightFeature = pm.hasSystemFeature(FEATURE_CANT_SAVE_STATE);
mHasLeanbackFeature = pm.hasSystemFeature(FEATURE_LEANBACK);
mHasCompanionDeviceSetupFeature = pm.hasSystemFeature(FEATURE_COMPANION_DEVICE_SETUP);
mVrController.onSystemReady();
mRecentTasks.onSystemReadyLocked();
mTaskSupervisor.onSystemReady();

View File

@@ -1239,8 +1239,13 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
return Context.DEVICE_ID_DEFAULT;
}
if (mVirtualDeviceManager == null) {
mVirtualDeviceManager =
mService.mContext.getSystemService(VirtualDeviceManager.class);
if (mService.mHasCompanionDeviceSetupFeature) {
mVirtualDeviceManager =
mService.mContext.getSystemService(VirtualDeviceManager.class);
}
if (mVirtualDeviceManager == null) {
return Context.DEVICE_ID_DEFAULT;
}
}
return mVirtualDeviceManager.getDeviceIdForDisplayId(displayId);
}