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

Commit 8db0036c authored by Felipe Leme's avatar Felipe Leme
Browse files

Improved how content capture is disabled by settings.

- Use 1/0 instead of true/false for the settings value.
- Improved logging / internal logic by splitting disabled by settings and device config.
- Other minor fixes.

Test: atest CtsContentCaptureServiceTestCases

Bug: 119264902

Change-Id: I51b99588f823c4e1eaf496841efd45757e4258be
parent 153f1061
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -5759,6 +5759,10 @@ public final class Settings {
        /**
         * Defines whether Content Capture is enabled for the user.
         *
         * <p>Type: {@code int} ({@code 0} for disabled, {@code 1} for enabled).
         * <p>Default: enabled
         *
         * @hide
         */
        @TestApi
+25 −40
Original line number Diff line number Diff line
@@ -89,11 +89,11 @@ public final class ContentCaptureManagerService extends
    private ActivityManagerInternal mAm;

    /**
     * Users disabled by {@link android.provider.Settings.Secure#CONTENT_CAPTURE_ENABLED}.
     * Users disabled by {@link android.provider.Settings.Secure#CONTENT_CAPTURE_ENABLED}
     */
    @GuardedBy("mLock")
    @Nullable
    private SparseBooleanArray mDisabledUsers;
    private SparseBooleanArray mDisabledBySettings;

    /**
     * Global kill-switch based on value defined by
@@ -130,18 +130,18 @@ public final class ContentCaptureManagerService extends
            mRequestsHistory = null;
        }

        // Sets which services are disabled
        // Sets which services are disabled by settings
        final UserManager um = getContext().getSystemService(UserManager.class);
        final List<UserInfo> users = um.getUsers();
        for (int i = 0; i < users.size(); i++) {
            final int userId = users.get(i).id;
            final boolean disabled = mDisabledByDeviceConfig || isDisabledBySettings(userId);
            final boolean disabled = !isEnabledBySettings(userId);
            if (disabled) {
                Slog.i(mTag, "user " + userId + " disabled by settings or device config");
                if (mDisabledUsers == null) {
                    mDisabledUsers = new SparseBooleanArray(1);
                Slog.i(mTag, "user " + userId + " disabled by settings");
                if (mDisabledBySettings == null) {
                    mDisabledBySettings = new SparseBooleanArray(1);
                }
                mDisabledUsers.put(userId, true);
                mDisabledBySettings.put(userId, true);
            }
        }
    }
@@ -187,7 +187,8 @@ public final class ContentCaptureManagerService extends
    protected void onSettingsChanged(@UserIdInt int userId, @NonNull String property) {
        switch (property) {
            case Settings.Secure.CONTENT_CAPTURE_ENABLED:
                setContentCaptureFeatureEnabledFromSettings(userId);
                setContentCaptureFeatureEnabledBySettingsForUser(userId,
                        isEnabledBySettings(userId));
                return;
            default:
                Slog.w(mTag, "Unexpected property (" + property + "); updating cache instead");
@@ -201,31 +202,13 @@ public final class ContentCaptureManagerService extends
    }

    private boolean isDisabledBySettingsLocked(@UserIdInt int userId) {
        return mDisabledUsers != null && mDisabledUsers.get(userId);
        return mDisabledBySettings != null && mDisabledBySettings.get(userId);
    }

    private void setContentCaptureFeatureEnabledFromSettings(@UserIdInt int userId) {
        setContentCaptureFeatureEnabledForUser(userId, !isDisabledBySettings(userId));
    }

    private boolean isDisabledBySettings(@UserIdInt int userId) {
        final String property = Settings.Secure.CONTENT_CAPTURE_ENABLED;
        final String value = Settings.Secure.getStringForUser(getContext().getContentResolver(),
                property, userId);
        if (value == null) {
            if (verbose) {
                Slog.v(mTag, "isDisabledBySettings(): assuming false as '" + property
                        + "' is not set");
            }
            return false;
        }

        try {
            return !Boolean.valueOf(value);
        } catch (Exception e) {
            Slog.w(mTag, "Invalid value for property " + property + ": " + value);
        }
        return false;
    private boolean isEnabledBySettings(@UserIdInt int userId) {
        final boolean enabled = Settings.Secure.getIntForUser(getContext().getContentResolver(),
                Settings.Secure.CONTENT_CAPTURE_ENABLED, 1, userId) == 1 ? true : false;
        return enabled;
    }

    private void onDeviceConfigChange(@NonNull String key, @Nullable String value) {
@@ -331,12 +314,13 @@ public final class ContentCaptureManagerService extends
        }
    }

    private void setContentCaptureFeatureEnabledForUser(@UserIdInt int userId, boolean enabled) {
    private void setContentCaptureFeatureEnabledBySettingsForUser(@UserIdInt int userId,
            boolean enabled) {
        synchronized (mLock) {
            if (mDisabledUsers == null) {
                mDisabledUsers = new SparseBooleanArray();
            if (mDisabledBySettings == null) {
                mDisabledBySettings = new SparseBooleanArray();
            }
            final boolean alreadyEnabled = !mDisabledUsers.get(userId);
            final boolean alreadyEnabled = !mDisabledBySettings.get(userId);
            if (!(enabled ^ alreadyEnabled)) {
                if (debug) {
                    Slog.d(mTag, "setContentCaptureFeatureEnabledForUser(): already " + enabled);
@@ -346,13 +330,14 @@ public final class ContentCaptureManagerService extends
            if (enabled) {
                Slog.i(mTag, "setContentCaptureFeatureEnabled(): enabling service for user "
                        + userId);
                mDisabledUsers.delete(userId);
                mDisabledBySettings.delete(userId);
            } else {
                Slog.i(mTag, "setContentCaptureFeatureEnabled(): disabling service for user "
                        + userId);
                mDisabledUsers.put(userId, true);
                mDisabledBySettings.put(userId, true);
            }
            updateCachedServiceLocked(userId, !enabled);
            final boolean disabled = !enabled || mDisabledByDeviceConfig;
            updateCachedServiceLocked(userId, disabled);
        }
    }

@@ -472,7 +457,7 @@ public final class ContentCaptureManagerService extends

        final String prefix2 = prefix + "  ";

        pw.print(prefix); pw.print("Disabled users: "); pw.println(mDisabledUsers);
        pw.print(prefix); pw.print("Users disabled by Settings: "); pw.println(mDisabledBySettings);
        pw.print(prefix); pw.println("DeviceConfig Settings: ");
        pw.print(prefix2); pw.print("disabled: "); pw.println(mDisabledByDeviceConfig);
        pw.print(prefix2); pw.print("loggingLevel: "); pw.println(mDevCfgLoggingLevel);
+1 −1
Original line number Diff line number Diff line
@@ -498,7 +498,7 @@ final class ContentCapturePerUserService
            final long token = Binder.clearCallingIdentity();
            try {
                Settings.Secure.putStringForUser(getContext().getContentResolver(),
                        Settings.Secure.CONTENT_CAPTURE_ENABLED, "false", mUserId);
                        Settings.Secure.CONTENT_CAPTURE_ENABLED, "0", mUserId);
            } finally {
                Binder.restoreCallingIdentity(token);
            }