Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cd8f2047 authored by Vladimir Komsiyski's avatar Vladimir Komsiyski Committed by Android (Google) Code Review
Browse files

Merge changes from topic "virtual-device-context"

* changes:
  Add deviceId to Context and allow for creating Contexts with different deviceId.
  Open the visibility of VirtualDeviceManager and VirtualDeviceManager#getVirtualDevices.
  Add an API to get the details of all virtual devices.
parents 7bc0dbdd 7c1be329
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -9070,6 +9070,24 @@ package android.companion {
}
package android.companion.virtual {
  public final class VirtualDevice implements android.os.Parcelable {
    method public int describeContents();
    method public int getDeviceId();
    method @Nullable public String getName();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.companion.virtual.VirtualDevice> CREATOR;
  }
  public final class VirtualDeviceManager {
    method @NonNull public java.util.List<android.companion.virtual.VirtualDevice> getVirtualDevices();
    field public static final int DEFAULT_DEVICE_ID = 0; // 0x0
    field public static final int INVALID_DEVICE_ID = -1; // 0xffffffff
  }
}
package android.content {
  public abstract class AbstractThreadedSyncAdapter {
@@ -9667,6 +9685,7 @@ package android.content {
    method public abstract android.content.Context createConfigurationContext(@NonNull android.content.res.Configuration);
    method @NonNull public android.content.Context createContext(@NonNull android.content.ContextParams);
    method public abstract android.content.Context createContextForSplit(String) throws android.content.pm.PackageManager.NameNotFoundException;
    method @NonNull public android.content.Context createDeviceContext(int);
    method public abstract android.content.Context createDeviceProtectedStorageContext();
    method @DisplayContext public abstract android.content.Context createDisplayContext(@NonNull android.view.Display);
    method public abstract android.content.Context createPackageContext(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
@@ -9697,6 +9716,7 @@ package android.content {
    method public abstract android.content.ContentResolver getContentResolver();
    method public abstract java.io.File getDataDir();
    method public abstract java.io.File getDatabasePath(String);
    method public int getDeviceId();
    method public abstract java.io.File getDir(String, int);
    method @Nullable public android.view.Display getDisplay();
    method @Nullable public final android.graphics.drawable.Drawable getDrawable(@DrawableRes int);
@@ -9892,6 +9912,7 @@ package android.content {
    field public static final String USER_SERVICE = "user";
    field public static final String VIBRATOR_MANAGER_SERVICE = "vibrator_manager";
    field @Deprecated public static final String VIBRATOR_SERVICE = "vibrator";
    field public static final String VIRTUAL_DEVICE_SERVICE = "virtualdevice";
    field public static final String VPN_MANAGEMENT_SERVICE = "vpn_management";
    field @UiContext public static final String WALLPAPER_SERVICE = "wallpaper";
    field public static final String WIFI_AWARE_SERVICE = "wifiaware";
+2 −2
Original line number Diff line number Diff line
@@ -2798,8 +2798,6 @@ package android.companion.virtual {
  public final class VirtualDeviceManager {
    method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.companion.virtual.VirtualDeviceManager.VirtualDevice createVirtualDevice(int, @NonNull android.companion.virtual.VirtualDeviceParams);
    field public static final int DEFAULT_DEVICE_ID = 0; // 0x0
    field public static final int INVALID_DEVICE_ID = -1; // 0xffffffff
    field public static final int LAUNCH_FAILURE_NO_ACTIVITY = 2; // 0x2
    field public static final int LAUNCH_FAILURE_PENDING_INTENT_CANCELED = 1; // 0x1
    field public static final int LAUNCH_SUCCESS = 0; // 0x0
@@ -2834,6 +2832,7 @@ package android.companion.virtual {
    method public int getDefaultActivityPolicy();
    method public int getDefaultNavigationPolicy();
    method public int getLockState();
    method @Nullable public String getName();
    method @NonNull public java.util.Set<android.os.UserHandle> getUsersWithMatchingAccounts();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field public static final int ACTIVITY_POLICY_DEFAULT_ALLOWED = 0; // 0x0
@@ -2853,6 +2852,7 @@ package android.companion.virtual {
    method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setBlockedActivities(@NonNull java.util.Set<android.content.ComponentName>);
    method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setBlockedCrossTaskNavigations(@NonNull java.util.Set<android.content.ComponentName>);
    method @NonNull @RequiresPermission(value=android.Manifest.permission.ADD_ALWAYS_UNLOCKED_DISPLAY, conditional=true) public android.companion.virtual.VirtualDeviceParams.Builder setLockState(int);
    method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setName(@NonNull String);
    method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setUsersWithMatchingAccounts(@NonNull java.util.Set<android.os.UserHandle>);
  }
+32 −0
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UiContext;
import android.companion.virtual.VirtualDevice;
import android.companion.virtual.VirtualDeviceManager;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.AttributionSource;
import android.content.AutofillOptions;
@@ -241,6 +243,7 @@ class ContextImpl extends Context {
    @UnsupportedAppUsage
    private @NonNull Resources mResources;
    private @Nullable Display mDisplay; // may be null if invalid display or not initialized yet.
    private int mDeviceId = VirtualDeviceManager.DEFAULT_DEVICE_ID;

    /**
     * If set to {@code true} the resources for this context will be configured for mDisplay which
@@ -2700,6 +2703,30 @@ class ContextImpl extends Context {
        return context;
    }

    @Override
    public @NonNull Context createDeviceContext(int deviceId) {
        boolean validDeviceId = deviceId == VirtualDeviceManager.DEFAULT_DEVICE_ID;
        if (deviceId > VirtualDeviceManager.DEFAULT_DEVICE_ID) {
            VirtualDeviceManager vdm = getSystemService(VirtualDeviceManager.class);
            if (vdm != null) {
                List<VirtualDevice> virtualDevices = vdm.getVirtualDevices();
                validDeviceId = virtualDevices.stream().anyMatch(d -> d.getDeviceId() == deviceId);
            }
        }
        if (!validDeviceId) {
            throw new IllegalArgumentException(
                    "Not a valid ID of the default device or any virtual device: " + deviceId);
        }

        ContextImpl context = new ContextImpl(this, mMainThread, mPackageInfo, mParams,
                mAttributionSource.getAttributionTag(),
                mAttributionSource.getNext(),
                mSplitName, mToken, mUser, mFlags, mClassLoader, null);

        context.mDeviceId = deviceId;
        return context;
    }

    @NonNull
    @Override
    public WindowContext createWindowContext(@WindowType int type,
@@ -2946,6 +2973,11 @@ class ContextImpl extends Context {
        }
    }

    @Override
    public int getDeviceId() {
        return mDeviceId;
    }

    @Override
    public DisplayAdjustments getDisplayAdjustments(int displayId) {
        return mResources.getDisplayAdjustments();
+6 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.companion.virtual;

import android.companion.virtual.IVirtualDevice;
import android.companion.virtual.IVirtualDeviceActivityListener;
import android.companion.virtual.VirtualDevice;
import android.companion.virtual.VirtualDeviceParams;
import android.hardware.display.IVirtualDisplayCallback;
import android.hardware.display.VirtualDisplayConfig;
@@ -45,6 +46,11 @@ interface IVirtualDeviceManager {
            in IBinder token, String packageName, int associationId,
            in VirtualDeviceParams params, in IVirtualDeviceActivityListener activityListener);

    /**
     * Returns the details of all available virtual devices.
     */
    List<VirtualDevice> getVirtualDevices();

    /**
     * Creates a virtual display owned by a particular virtual device.
     *
+19 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.companion.virtual;

parcelable VirtualDevice;
Loading