From 0d3444a300d48c02fac3775758f946f326bdca2d Mon Sep 17 00:00:00 2001 From: Felipe Leme Date: Wed, 6 Mar 2019 15:50:03 -0800 Subject: [PATCH] Added new toggle for Content Capture on Settings -> Privacy Test: manual verification Test: atest EnableContentCapturePreferenceControllerTest Bug: 119264902 Change-Id: I2e29d7892892e6a0f90a97e35c48df231d67b0b6 --- res/values/strings.xml | 8 ++ res/xml/privacy_dashboard_settings.xml | 7 ++ ...bleContentCapturePreferenceController.java | 58 ++++++++++ ...ontentCapturePreferenceControllerTest.java | 103 ++++++++++++++++++ 4 files changed, 176 insertions(+) create mode 100644 src/com/android/settings/privacy/EnableContentCapturePreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/privacy/EnableContentCapturePreferenceControllerTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 1bbeb63644f..d34c01f8930 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10716,4 +10716,12 @@ Your subscription with this provider may be cancelled. Recurring subscriptions will not be cancelled. For more information, check with your provider. + + + content capture + + Content Capture + + 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. + diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml index 48034a846eb..d2d9e35a1dd 100644 --- a/res/xml/privacy_dashboard_settings.xml +++ b/res/xml/privacy_dashboard_settings.xml @@ -62,6 +62,13 @@ android:summary="@string/summary_placeholder" settings:searchable="false"/> + + + diff --git a/src/com/android/settings/privacy/EnableContentCapturePreferenceController.java b/src/com/android/settings/privacy/EnableContentCapturePreferenceController.java new file mode 100644 index 00000000000..b3ea9a7e395 --- /dev/null +++ b/src/com/android/settings/privacy/EnableContentCapturePreferenceController.java @@ -0,0 +1,58 @@ +/* + * 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; + } +} diff --git a/tests/robotests/src/com/android/settings/privacy/EnableContentCapturePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/privacy/EnableContentCapturePreferenceControllerTest.java new file mode 100644 index 00000000000..a3798582033 --- /dev/null +++ b/tests/robotests/src/com/android/settings/privacy/EnableContentCapturePreferenceControllerTest.java @@ -0,0 +1,103 @@ +/* + * 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); + } +}