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

Commit 152e9397 authored by Antony Sargent's avatar Antony Sargent
Browse files

VirtualDevice clipboard support

This CL refactors ClipboardService to provide siloed clipboard storage
for VirtualDevices, adding an additional dimension for selecting clip
storage alongside the existing userId dimension.

This behavior is turned off by default behind a DeviceConfig flag.

Bug: 262038440
Test: atest ClipboardManagerTest ClipboardManagerListenerTest StreamedAppClipboardTest
Change-Id: I88de5a9930448f741169cd48d3804a9d936dfa76
parent e2035b01
Loading
Loading
Loading
Loading
+36 −9
Original line number Diff line number Diff line
@@ -70,6 +70,23 @@ public class ClipboardManager extends android.text.ClipboardManager {
     */
    public static final boolean DEVICE_CONFIG_DEFAULT_SHOW_ACCESS_NOTIFICATIONS = true;

    /**
     * DeviceConfig property, within the clipboard namespace, that determines whether VirtualDevices
     * are allowed to have siloed Clipboards for the apps running on them. If false, then clipboard
     * access is blocked entirely for apps running on VirtualDevices.
     *
     * @hide
     */
    public static final String DEVICE_CONFIG_ALLOW_VIRTUALDEVICE_SILOS =
            "allow_virtualdevice_silos";

    /**
     * Default value for the DEVICE_CONFIG_ALLOW_VIRTUALDEVICE_SILOS property.
     *
     * @hide
     */
    public static final boolean DEVICE_CONFIG_DEFAULT_ALLOW_VIRTUALDEVICE_SILOS = false;

    private final Context mContext;
    private final Handler mHandler;
    private final IClipboard mService;
@@ -133,7 +150,8 @@ public class ClipboardManager extends android.text.ClipboardManager {
                    clip,
                    mContext.getOpPackageName(),
                    mContext.getAttributionTag(),
                    mContext.getUserId());
                    mContext.getUserId(),
                    mContext.getDeviceId());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -162,6 +180,7 @@ public class ClipboardManager extends android.text.ClipboardManager {
                    mContext.getOpPackageName(),
                    mContext.getAttributionTag(),
                    mContext.getUserId(),
                    mContext.getDeviceId(),
                    sourcePackage);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
@@ -178,7 +197,8 @@ public class ClipboardManager extends android.text.ClipboardManager {
            mService.clearPrimaryClip(
                    mContext.getOpPackageName(),
                    mContext.getAttributionTag(),
                    mContext.getUserId());
                    mContext.getUserId(),
                    mContext.getDeviceId());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -197,7 +217,8 @@ public class ClipboardManager extends android.text.ClipboardManager {
            return mService.getPrimaryClip(
                    mContext.getOpPackageName(),
                    mContext.getAttributionTag(),
                    mContext.getUserId());
                    mContext.getUserId(),
                    mContext.getDeviceId());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -217,7 +238,8 @@ public class ClipboardManager extends android.text.ClipboardManager {
            return mService.getPrimaryClipDescription(
                    mContext.getOpPackageName(),
                    mContext.getAttributionTag(),
                    mContext.getUserId());
                    mContext.getUserId(),
                    mContext.getDeviceId());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -234,7 +256,8 @@ public class ClipboardManager extends android.text.ClipboardManager {
            return mService.hasPrimaryClip(
                    mContext.getOpPackageName(),
                    mContext.getAttributionTag(),
                    mContext.getUserId());
                    mContext.getUserId(),
                    mContext.getDeviceId());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -248,7 +271,8 @@ public class ClipboardManager extends android.text.ClipboardManager {
                            mPrimaryClipChangedServiceListener,
                            mContext.getOpPackageName(),
                            mContext.getAttributionTag(),
                            mContext.getUserId());
                            mContext.getUserId(),
                            mContext.getDeviceId());
                } catch (RemoteException e) {
                    throw e.rethrowFromSystemServer();
                }
@@ -266,7 +290,8 @@ public class ClipboardManager extends android.text.ClipboardManager {
                            mPrimaryClipChangedServiceListener,
                            mContext.getOpPackageName(),
                            mContext.getAttributionTag(),
                            mContext.getUserId());
                            mContext.getUserId(),
                            mContext.getDeviceId());
                } catch (RemoteException e) {
                    throw e.rethrowFromSystemServer();
                }
@@ -306,7 +331,8 @@ public class ClipboardManager extends android.text.ClipboardManager {
            return mService.hasClipboardText(
                    mContext.getOpPackageName(),
                    mContext.getAttributionTag(),
                    mContext.getUserId());
                    mContext.getUserId(),
                    mContext.getDeviceId());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -326,7 +352,8 @@ public class ClipboardManager extends android.text.ClipboardManager {
            return mService.getPrimaryClipSource(
                    mContext.getOpPackageName(),
                    mContext.getAttributionTag(),
                    mContext.getUserId());
                    mContext.getUserId(),
                    mContext.getDeviceId());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
+15 −11
Original line number Diff line number Diff line
@@ -26,22 +26,26 @@ import android.content.IOnPrimaryClipChangedListener;
 * {@hide}
 */
interface IClipboard {
    void setPrimaryClip(in ClipData clip, String callingPackage, String attributionTag, int userId);
    void setPrimaryClipAsPackage(in ClipData clip, String callingPackage, String attributionTag, int userId,
            String sourcePackage);
    void clearPrimaryClip(String callingPackage, String attributionTag, int userId);
    ClipData getPrimaryClip(String pkg, String attributionTag, int userId);
    ClipDescription getPrimaryClipDescription(String callingPackage, String attributionTag, int userId);
    boolean hasPrimaryClip(String callingPackage, String attributionTag, int userId);
    void setPrimaryClip(in ClipData clip, String callingPackage, String attributionTag, int userId,
            int deviceId);
    void setPrimaryClipAsPackage(in ClipData clip, String callingPackage, String attributionTag,
            int userId, int deviceId, String sourcePackage);
    void clearPrimaryClip(String callingPackage, String attributionTag, int userId, int deviceId);
    ClipData getPrimaryClip(String pkg, String attributionTag, int userId, int deviceId);
    ClipDescription getPrimaryClipDescription(String callingPackage, String attributionTag,
            int userId, int deviceId);
    boolean hasPrimaryClip(String callingPackage, String attributionTag, int userId, int deviceId);
    void addPrimaryClipChangedListener(in IOnPrimaryClipChangedListener listener,
            String callingPackage, String attributionTag, int userId);
            String callingPackage, String attributionTag, int userId, int deviceId);
    void removePrimaryClipChangedListener(in IOnPrimaryClipChangedListener listener,
            String callingPackage, String attributionTag, int userId);
            String callingPackage, String attributionTag, int userId, int deviceId);

    /**
     * Returns true if the clipboard contains text; false otherwise.
     */
    boolean hasClipboardText(String callingPackage, String attributionTag, int userId);
    boolean hasClipboardText(String callingPackage, String attributionTag, int userId,
            int deviceId);

    String getPrimaryClipSource(String callingPackage, String attributionTag, int userId);
    String getPrimaryClipSource(String callingPackage, String attributionTag, int userId,
            int deviceId);
}
+1 −2
Original line number Diff line number Diff line
@@ -88,7 +88,6 @@ import java.io.PrintWriter;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.Consumer;


@@ -114,7 +113,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub
    private final CameraAccessController mCameraAccessController;
    private VirtualAudioController mVirtualAudioController;
    @VisibleForTesting
    final Set<Integer> mVirtualDisplayIds = new ArraySet<>();
    final ArraySet<Integer> mVirtualDisplayIds = new ArraySet<>();
    private final OnDeviceCloseListener mOnDeviceCloseListener;
    private final IBinder mAppToken;
    private final VirtualDeviceParams mParams;
+15 −2
Original line number Diff line number Diff line
@@ -67,7 +67,6 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
@@ -471,7 +470,7 @@ public class VirtualDeviceManagerService extends SystemService {
        }

        @Override
        public @NonNull Set<Integer> getDeviceIdsForUid(int uid) {
        public @NonNull ArraySet<Integer> getDeviceIdsForUid(int uid) {
            ArraySet<Integer> result = new ArraySet<>();
            synchronized (mVirtualDeviceManagerLock) {
                int size = mVirtualDevices.size();
@@ -586,6 +585,20 @@ public class VirtualDeviceManagerService extends SystemService {
            return false;
        }

        @Override
        public @NonNull ArraySet<Integer> getDisplayIdsForDevice(int deviceId) {
            synchronized (mVirtualDeviceManagerLock) {
                int size = mVirtualDevices.size();
                for (int i = 0; i < size; i++) {
                    VirtualDeviceImpl device = mVirtualDevices.valueAt(i);
                    if (device.getDeviceId() == deviceId) {
                        return new ArraySet<>(device.mVirtualDisplayIds);
                    }
                }
            }
            return new ArraySet<>();
        }

        @Override
        public void registerVirtualDisplayListener(
                @NonNull VirtualDisplayListener listener) {
+310 −89

File changed.

Preview size limit exceeded, changes collapsed.

Loading