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

Commit f127b1ec authored by Oli Lan's avatar Oli Lan
Browse files

Add deviceconfig flag to control clipboard access notifications.

This adds a device config flag that controls whether the clipboard
access toast is shown when an app accesses clipboard.

Bug: 179667029
Test: manual, setting flag via adb
Change-Id: I0677ebbb04e5d3922d1c17d4456ab6e61b7736fa
parent 949bcca3
Loading
Loading
Loading
Loading
+30 −6
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ import android.os.ServiceManager;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.DeviceConfig;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Slog;
@@ -59,6 +60,7 @@ import android.util.SparseArray;
import android.view.autofill.AutofillManagerInternal;
import android.widget.Toast;

import com.android.internal.annotations.GuardedBy;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.UiThread;
@@ -163,6 +165,10 @@ public class ClipboardService extends SystemService {
    private static final boolean IS_EMULATOR =
        SystemProperties.getBoolean("ro.kernel.qemu", false);

    // DeviceConfig properties
    private static final String PROPERTY_SHOW_ACCESS_NOTIFICATIONS = "show_access_notifications";
    private static final boolean DEFAULT_SHOW_ACCESS_NOTIFICATIONS = true;

    private final ActivityManagerInternal mAmInternal;
    private final IUriGrantsManager mUgm;
    private final UriGrantsManagerInternal mUgmInternal;
@@ -176,8 +182,14 @@ public class ClipboardService extends SystemService {
    private HostClipboardMonitor mHostClipboardMonitor = null;
    private Thread mHostMonitorThread = null;

    @GuardedBy("mLock")
    private final SparseArray<PerUserClipboard> mClipboards = new SparseArray<>();

    @GuardedBy("mLock")
    private boolean mShowAccessNotifications = DEFAULT_SHOW_ACCESS_NOTIFICATIONS;

    private final Object mLock = new Object();

    /**
     * Instantiates the clipboard.
     */
@@ -204,7 +216,7 @@ public class ClipboardService extends SystemService {
                            new ClipData("host clipboard",
                                         new String[]{"text/plain"},
                                         new ClipData.Item(contents));
                        synchronized(mClipboards) {
                        synchronized (mLock) {
                            setPrimaryClipInternal(getClipboard(0), clip,
                                    android.os.Process.SYSTEM_UID, null);
                        }
@@ -213,6 +225,10 @@ public class ClipboardService extends SystemService {
            mHostMonitorThread = new Thread(mHostClipboardMonitor);
            mHostMonitorThread.start();
        }

        updateConfig();
        DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_CLIPBOARD,
                getContext().getMainExecutor(), properties -> updateConfig());
    }

    @Override
@@ -222,11 +238,18 @@ public class ClipboardService extends SystemService {

    @Override
    public void onUserStopped(@NonNull TargetUser user) {
        synchronized (mClipboards) {
        synchronized (mLock) {
            mClipboards.remove(user.getUserIdentifier());
        }
    }

    private void updateConfig() {
        synchronized (mLock) {
            mShowAccessNotifications = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_CLIPBOARD,
                    PROPERTY_SHOW_ACCESS_NOTIFICATIONS, DEFAULT_SHOW_ACCESS_NOTIFICATIONS);
        }
    }

    private class ListenerInfo {
        final int mUid;
        final String mPackageName;
@@ -472,7 +495,7 @@ public class ClipboardService extends SystemService {
    };

    private PerUserClipboard getClipboard(@UserIdInt int userId) {
        synchronized (mClipboards) {
        synchronized (mLock) {
            PerUserClipboard puc = mClipboards.get(userId);
            if (puc == null) {
                puc = new PerUserClipboard(userId);
@@ -849,10 +872,11 @@ public class ClipboardService extends SystemService {
        if (clipboard.primaryClip == null) {
            return;
        }
        if (Settings.Global.getInt(getContext().getContentResolver(),
                "clipboard_access_toast_enabled", 1) == 0) {
        synchronized (mLock) {
            if (!mShowAccessNotifications) {
                return;
            }
        }
        // Don't notify if the app accessing the clipboard is the same as the current owner.
        if (UserHandle.isSameApp(uid, clipboard.primaryClipUid)) {
            return;