From 2700cdbdac14c27a047d3d20b75a738b25d2bfe8 Mon Sep 17 00:00:00 2001 From: Bartosz Fabianowski Date: Fri, 17 Feb 2017 13:30:32 +0100 Subject: [PATCH] Add default IME to Privacy Settings page This CL adds information about default IMEs set by Device Owner and/or Profile Owners to the Enterprise Privacy Setting page. Test: make RunSettingsRoboTests Bug: 32692748 Change-Id: I9f78ab4792a5a1d444808048ff33e3e20a0483dc --- res/values/strings.xml | 2 + res/xml/enterprise_privacy_settings.xml | 4 + .../accounts/ChooseAccountActivity.java | 2 +- .../DevicePolicyManagerWrapper.java | 8 ++ .../DevicePolicyManagerWrapperImpl.java | 6 ++ .../EnterprisePrivacyFeatureProvider.java | 12 ++- .../EnterprisePrivacyFeatureProviderImpl.java | 28 +++++- .../enterprise/EnterprisePrivacySettings.java | 1 + .../enterprise/ImePreferenceController.java | 57 +++++++++++ .../settings/overlay/FeatureFactoryImpl.java | 2 +- ...erprisePrivacyFeatureProviderImplTest.java | 69 ++++++++++--- .../EnterprisePrivacySettingsTest.java | 3 +- .../ImePreferenceControllerTest.java | 97 +++++++++++++++++++ 13 files changed, 268 insertions(+), 23 deletions(-) create mode 100644 src/com/android/settings/enterprise/ImePreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/enterprise/ImePreferenceControllerTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 86733594b64..4af9cc8d515 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -8164,6 +8164,8 @@ %d default app set by your admin %d default apps set by your admin + + Default keyboard set to %s by your admin Always-on VPN turned on diff --git a/res/xml/enterprise_privacy_settings.xml b/res/xml/enterprise_privacy_settings.xml index bfb12478f7f..992c7537618 100644 --- a/res/xml/enterprise_privacy_settings.xml +++ b/res/xml/enterprise_privacy_settings.xml @@ -88,6 +88,10 @@ android:title="@string/enterprise_privacy_always_on_vpn_work" settings:allowDividerBelow="true" settings:multiLine="true"/> + mProfiles = new ArrayList(); + private @Mock Context mContext; private @Mock DevicePolicyManagerWrapper mDevicePolicyManager; - private @Mock PackageManagerWrapper mPackageManager; + private @Mock PackageManagerWrapper mPackageManagerWrapper; + private @Mock PackageManager mPackageManager; private @Mock UserManager mUserManager; private @Mock ConnectivityManagerWrapper mConnectivityManger; private Resources mResources; @@ -76,14 +84,14 @@ public final class EnterprisePrivacyFeatureProviderImplTest { public void setUp() { MockitoAnnotations.initMocks(this); - when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN)) - .thenReturn(true); + when(mContext.getApplicationContext()).thenReturn(mContext); + resetAndInitializePackageManagerWrapper(); when(mUserManager.getProfiles(MY_USER_ID)).thenReturn(mProfiles); mProfiles.add(new UserInfo(MY_USER_ID, "", "", 0 /* flags */)); mResources = ShadowApplication.getInstance().getApplicationContext().getResources(); - mProvider = new EnterprisePrivacyFeatureProviderImpl(mDevicePolicyManager, mPackageManager, - mUserManager, mConnectivityManger, mResources); + mProvider = new EnterprisePrivacyFeatureProviderImpl(mContext, mDevicePolicyManager, + mPackageManagerWrapper, mUserManager, mConnectivityManger, mResources); } @Test @@ -106,28 +114,26 @@ public final class EnterprisePrivacyFeatureProviderImplTest { @Test public void testGetDeviceOwnerDisclosure() { - final Context context = mock(Context.class); - when(mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser()).thenReturn(null); - assertThat(mProvider.getDeviceOwnerDisclosure(context)).isNull(); + assertThat(mProvider.getDeviceOwnerDisclosure()).isNull(); SpannableStringBuilder disclosure = new SpannableStringBuilder(); disclosure.append(mResources.getString(R.string.do_disclosure_generic)); disclosure.append(mResources.getString(R.string.do_disclosure_learn_more_separator)); disclosure.append(mResources.getString(R.string.do_disclosure_learn_more), - new EnterprisePrivacyFeatureProviderImpl.EnterprisePrivacySpan(context), 0); + new EnterprisePrivacyFeatureProviderImpl.EnterprisePrivacySpan(mContext), 0); when(mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser()).thenReturn(OWNER); when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(null); - assertThat(mProvider.getDeviceOwnerDisclosure(context)).isEqualTo(disclosure); + assertThat(mProvider.getDeviceOwnerDisclosure()).isEqualTo(disclosure); disclosure = new SpannableStringBuilder(); disclosure.append(mResources.getString(R.string.do_disclosure_with_name, OWNER_ORGANIZATION)); disclosure.append(mResources.getString(R.string.do_disclosure_learn_more_separator)); disclosure.append(mResources.getString(R.string.do_disclosure_learn_more), - new EnterprisePrivacyFeatureProviderImpl.EnterprisePrivacySpan(context), 0); + new EnterprisePrivacyFeatureProviderImpl.EnterprisePrivacySpan(mContext), 0); when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(OWNER_ORGANIZATION); - assertThat(mProvider.getDeviceOwnerDisclosure(context)).isEqualTo(disclosure); + assertThat(mProvider.getDeviceOwnerDisclosure()).isEqualTo(disclosure); } @Test @@ -217,4 +223,43 @@ public final class EnterprisePrivacyFeatureProviderImplTest { mProfiles.add(new UserInfo(MANAGED_PROFILE_USER_ID, "", "", UserInfo.FLAG_MANAGED_PROFILE)); assertThat(mProvider.getMaximumFailedPasswordsBeforeWipeInManagedProfile()).isEqualTo(10); } + + @Test + public void testGetImeLabelIfOwnerSet() throws Exception { + final ApplicationInfo applicationInfo = mock(ApplicationInfo.class); + when(applicationInfo.loadLabel(mPackageManager)).thenReturn(IME_PACKAGE_LABEL); + + Settings.Secure.putString(null, Settings.Secure.DEFAULT_INPUT_METHOD, IME_PACKAGE_ID); + when(mPackageManagerWrapper.getApplicationInfoAsUser(IME_PACKAGE_ID, 0, MY_USER_ID)) + .thenReturn(applicationInfo); + + // IME not set by Device Owner. + when(mDevicePolicyManager.isCurrentInputMethodSetByOwner()).thenReturn(false); + assertThat(mProvider.getImeLabelIfOwnerSet()).isNull(); + + // Device Owner set IME to empty string. + when(mDevicePolicyManager.isCurrentInputMethodSetByOwner()).thenReturn(true); + Settings.Secure.putString(null, Settings.Secure.DEFAULT_INPUT_METHOD, null); + assertThat(mProvider.getImeLabelIfOwnerSet()).isNull(); + + // Device Owner set IME to nonexistent package. + Settings.Secure.putString(null, Settings.Secure.DEFAULT_INPUT_METHOD, IME_PACKAGE_ID); + when(mPackageManagerWrapper.getApplicationInfoAsUser(IME_PACKAGE_ID, 0, MY_USER_ID)) + .thenThrow(new PackageManager.NameNotFoundException()); + assertThat(mProvider.getImeLabelIfOwnerSet()).isNull(); + + // Device Owner set IME to existent package. + resetAndInitializePackageManagerWrapper(); + when(mPackageManagerWrapper.getApplicationInfoAsUser(IME_PACKAGE_ID, 0, MY_USER_ID)) + .thenReturn(applicationInfo); + assertThat(mProvider.getImeLabelIfOwnerSet()).isEqualTo(IME_PACKAGE_LABEL); + } + + private void resetAndInitializePackageManagerWrapper() { + reset(mPackageManagerWrapper); + when(mPackageManagerWrapper.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN)) + .thenReturn(true); + when(mPackageManagerWrapper.getPackageManager()).thenReturn(mPackageManager); + + } } diff --git a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacySettingsTest.java b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacySettingsTest.java index 6c062aeaecb..f74c63a1956 100644 --- a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacySettingsTest.java +++ b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacySettingsTest.java @@ -73,7 +73,7 @@ public final class EnterprisePrivacySettingsTest { final List controllers = mSettings.getPreferenceControllers( ShadowApplication.getInstance().getApplicationContext()); assertThat(controllers).isNotNull(); - assertThat(controllers.size()).isEqualTo(14); + assertThat(controllers.size()).isEqualTo(15); assertThat(controllers.get(0)).isInstanceOf(InstalledPackagesPreferenceController.class); assertThat(controllers.get(1)).isInstanceOf(NetworkLogsPreferenceController.class); assertThat(controllers.get(2)).isInstanceOf(BugReportsPreferenceController.class); @@ -95,5 +95,6 @@ public final class EnterprisePrivacySettingsTest { assertThat(controllers.get(11)).isInstanceOf(GlobalHttpProxyPreferenceController.class); assertThat(controllers.get(12)).isInstanceOf(FailedPasswordWipePrimaryUserPreferenceController.class); assertThat(controllers.get(13)).isInstanceOf(FailedPasswordWipeManagedProfilePreferenceController.class); + assertThat(controllers.get(14)).isInstanceOf(ImePreferenceController.class); } } diff --git a/tests/robotests/src/com/android/settings/enterprise/ImePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/ImePreferenceControllerTest.java new file mode 100644 index 00000000000..232a8726624 --- /dev/null +++ b/tests/robotests/src/com/android/settings/enterprise/ImePreferenceControllerTest.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2017 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.enterprise; + +import android.content.Context; +import android.content.res.Resources; +import com.android.settings.R; +import android.support.v7.preference.Preference; + +import com.android.settings.SettingsRobolectricTestRunner; +import com.android.settings.TestConfig; +import com.android.settings.testutils.FakeFeatureFactory; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.when; + +/** + * Tests for {@link ImePreferenceController}. + */ +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public final class ImePreferenceControllerTest { + + private final String DEFAULT_IME_LABEL = "Test IME"; + private final String DEFAULT_IME_TEXT = "IME set to Test IME"; + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private Context mContext; + private FakeFeatureFactory mFeatureFactory; + + private ImePreferenceController mController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + FakeFeatureFactory.setupForTest(mContext); + mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); + mController = new ImePreferenceController(mContext); + when(mContext.getResources().getString(R.string.enterprise_privacy_input_method, + DEFAULT_IME_LABEL)).thenReturn(DEFAULT_IME_TEXT); + } + + @Test + public void testUpdateState() { + final Preference preference = new Preference(mContext, null, 0, 0); + preference.setVisible(true); + + when(mFeatureFactory.enterprisePrivacyFeatureProvider.getImeLabelIfOwnerSet()) + .thenReturn(null); + mController.updateState(preference); + assertThat(preference.isVisible()).isFalse(); + + when(mFeatureFactory.enterprisePrivacyFeatureProvider.getImeLabelIfOwnerSet()) + .thenReturn(DEFAULT_IME_LABEL); + mController.updateState(preference); + assertThat(preference.isVisible()).isTrue(); + assertThat(preference.getTitle()).isEqualTo(DEFAULT_IME_TEXT); + } + + @Test + public void testIsAvailable() { + assertThat(mController.isAvailable()).isTrue(); + } + + @Test + public void testHandlePreferenceTreeClick() { + assertThat(mController.handlePreferenceTreeClick(new Preference(mContext, null, 0, 0))) + .isFalse(); + } + + @Test + public void testGetPreferenceKey() { + assertThat(mController.getPreferenceKey()).isEqualTo("input_method"); + } +}