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

Commit 470caabd authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Added new toggle for Content Capture on Settings -> Privacy"

parents 39832ae3 0d3444a3
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -10713,4 +10713,12 @@
    <!-- Message for forget passpoint dialog [CHAR LIMIT=none] -->
    <string name="forget_passpoint_dialog_message">Your subscription with this provider may be cancelled. Recurring subscriptions will not be cancelled. For more information, check with your provider.</string>
    <!-- Keywords for Content Capture feature [CHAR_LIMIT=32] -->
    <string name="keywords_content_capture">content capture</string>
    <!-- Title of the 'Content Capture' feature toggle in the Settings -> Privacy screen [CHAR LIMIT=none]-->
    <string name="content_capture">Content Capture</string>
    <!-- Description of the 'Content Capture' feature toggle in the Settings -> Privacy screen [CHAR LIMIT=NONE]-->
    <string name="content_capture_summary">Allow Android to save information seen on your screen or heard in video or audio content. Android makes helpful suggestions based on your device activity.</string>
</resources>
+7 −0
Original line number Diff line number Diff line
@@ -62,6 +62,13 @@
        android:summary="@string/summary_placeholder"
        settings:searchable="false"/>

    <!-- Content Capture -->
    <SwitchPreference
        android:key="content_capture"
        android:title="@string/content_capture"
        android:summary="@string/content_capture_summary"
        settings:controller="com.android.settings.privacy.EnableContentCapturePreferenceController"/>

    <!-- Privacy Service -->
    <PreferenceCategory
        android:key="privacy_services"/>
+58 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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.settings.privacy;

import android.content.Context;
import android.os.IBinder;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.provider.Settings;
import android.view.contentcapture.ContentCaptureManager;

import com.android.settings.core.TogglePreferenceController;

public class EnableContentCapturePreferenceController extends TogglePreferenceController {

    private static final String KEY_SHOW_PASSWORD = "content_capture";
    private static final int MY_USER_ID = UserHandle.myUserId();

    public EnableContentCapturePreferenceController(Context context) {
        super(context, KEY_SHOW_PASSWORD);
    }

    @Override
    public boolean isChecked() {
        boolean enabled = Settings.Secure.getIntForUser(mContext.getContentResolver(),
                Settings.Secure.CONTENT_CAPTURE_ENABLED, 1, MY_USER_ID) == 1;
        return enabled;
    }

    @Override
    public boolean setChecked(boolean isChecked) {
        Settings.Secure.putIntForUser(mContext.getContentResolver(),
                Settings.Secure.CONTENT_CAPTURE_ENABLED, isChecked ? 1 : 0, MY_USER_ID);
        return true;
    }

    @Override
    public int getAvailabilityStatus() {
        // We cannot look for ContentCaptureManager, because it's not available if the service
        // didn't whitelist Settings
        IBinder service = ServiceManager.checkService(Context.CONTENT_CAPTURE_MANAGER_SERVICE);
        return service != null ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
    }
}
+103 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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.settings.privacy;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.ContentResolver;
import android.content.Context;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;

import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;

@RunWith(RobolectricTestRunner.class)
public class EnableContentCapturePreferenceControllerTest {

    @Mock
    private PreferenceScreen mScreen;

    private Context mContext;
    private EnableContentCapturePreferenceController mController;
    private Preference mPreference;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mContext = RuntimeEnvironment.application;
        mController = new EnableContentCapturePreferenceController(mContext);
        mPreference = new Preference(mContext);
        mPreference.setKey(mController.getPreferenceKey());
    }

    @Test
    public void isChecked_settingIsOff_false() throws Exception {
        setProperty(0);

        assertThat(mController.isChecked()).isFalse();
    }

    @Test
    public void isChecked_settingIsOn_true() throws Exception {
        setProperty(1);

        assertThat(mController.isChecked()).isTrue();
    }

    @Test
    public void changePref_turnOn_shouldChangeSettingTo1() throws Exception {
        setProperty(0);

        mController.onPreferenceChange(mPreference, true);

        assertThat(mController.isChecked()).isTrue();
        assertProperty(1);
    }

    @Test
    public void changePref_turnOff_shouldChangeSettingTo0() throws Exception {
        setProperty(1);

        mController.onPreferenceChange(mPreference, false);

        assertThat(mController.isChecked()).isFalse();
        assertProperty(0);
    }

    private void setProperty(int newValue) throws SettingNotFoundException {
        final ContentResolver contentResolver = mContext.getContentResolver();
        Settings.Secure.putInt(contentResolver, Settings.Secure.CONTENT_CAPTURE_ENABLED, newValue);
    }

    private void assertProperty(int expectedValue) throws SettingNotFoundException {
        final ContentResolver contentResolver = mContext.getContentResolver();
        assertThat(Settings.Secure.getInt(contentResolver, Settings.Secure.CONTENT_CAPTURE_ENABLED))
                .isEqualTo(expectedValue);
    }
}