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

Commit a0a1db9d authored by Yuichiro Hanada's avatar Yuichiro Hanada Committed by Android (Google) Code Review
Browse files

Merge "clipboard: Introduce ArcClipboardMonitor" into main

parents b50089ae efacf369
Loading
Loading
Loading
Loading
+64 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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 com.android.server.clipboard;

import android.annotation.Nullable;
import android.content.ClipData;

import com.android.server.LocalServices;

import java.util.function.BiConsumer;
import java.util.function.Consumer;

public class ArcClipboardMonitor implements Consumer<ClipData> {
    private static final String TAG = "ArcClipboardMonitor";

    public interface ArcClipboardBridge {
        /**
         * Called when a clipboard content is updated.
         */
        void onPrimaryClipChanged(ClipData data);

        /**
         * Passes the callback to set a new clipboard content with a uid.
         */
        void setHandler(BiConsumer<ClipData, Integer> setAndroidClipboard);
    }

    private ArcClipboardBridge mBridge;
    private BiConsumer<ClipData, Integer> mAndroidClipboardSetter;

    ArcClipboardMonitor(final BiConsumer<ClipData, Integer> setAndroidClipboard) {
        mAndroidClipboardSetter = setAndroidClipboard;
        LocalServices.addService(ArcClipboardMonitor.class, this);
    }

    @Override
    public void accept(final @Nullable ClipData clip) {
        if (mBridge != null) {
            mBridge.onPrimaryClipChanged(clip);
        }
    }

    /**
     * Sets the other end of the clipboard bridge.
     */
    public void setClipboardBridge(ArcClipboardBridge bridge) {
        mBridge = bridge;
        mBridge.setHandler(mAndroidClipboardSetter);
    }
}
+8 −4
Original line number Diff line number Diff line
@@ -151,7 +151,7 @@ public class ClipboardService extends SystemService {
    private final ContentCaptureManagerInternal mContentCaptureInternal;
    private final AutofillManagerInternal mAutofillInternal;
    private final IBinder mPermissionOwner;
    private final Consumer<ClipData> mEmulatorClipboardMonitor;
    private final Consumer<ClipData> mClipboardMonitor;
    private final Handler mWorkerHandler;

    @GuardedBy("mLock")
@@ -192,7 +192,7 @@ public class ClipboardService extends SystemService {
        final IBinder permOwner = mUgmInternal.newUriPermissionOwner("clipboard");
        mPermissionOwner = permOwner;
        if (Build.IS_EMULATOR) {
            mEmulatorClipboardMonitor = new EmulatorClipboardMonitor((clip) -> {
            mClipboardMonitor = new EmulatorClipboardMonitor((clip) -> {
                synchronized (mLock) {
                    Clipboard clipboard = getClipboardLocked(0, DEVICE_ID_DEFAULT);
                    if (clipboard != null) {
@@ -201,8 +201,12 @@ public class ClipboardService extends SystemService {
                    }
                }
            });
        } else if (Build.IS_ARC) {
            mClipboardMonitor = new ArcClipboardMonitor((clip, uid) -> {
                setPrimaryClipInternal(clip, uid);
            });
        } else {
            mEmulatorClipboardMonitor = (clip) -> {};
            mClipboardMonitor = (clip) -> {};
        }

        updateConfig();
@@ -937,7 +941,7 @@ public class ClipboardService extends SystemService {
    private void setPrimaryClipInternalLocked(
            @Nullable ClipData clip, int uid, int deviceId, @Nullable String sourcePackage) {
        if (deviceId == DEVICE_ID_DEFAULT) {
            mEmulatorClipboardMonitor.accept(clip);
            mClipboardMonitor.accept(clip);
        }

        final int userId = UserHandle.getUserId(uid);