diff --git a/res/xml/security_settings_misc.xml b/res/xml/security_settings_misc.xml index 6a71033ea8c..bc737b01408 100644 --- a/res/xml/security_settings_misc.xml +++ b/res/xml/security_settings_misc.xml @@ -69,7 +69,7 @@ + android:fragment="com.android.settings.security.trustagent.TrustAgentSettings"/> result = new ArrayList(); + ArrayList result = new ArrayList<>(); List resolveInfos = pm.queryIntentServices(TRUST_AGENT_INTENT, PackageManager.GET_META_DATA); List enabledTrustAgents = utils.getEnabledTrustAgents(MY_USER_ID); @@ -557,13 +552,13 @@ public class SecuritySettings extends SettingsPreferenceFragment continue; } TrustAgentComponentInfo trustAgentComponentInfo = - TrustAgentUtils.getSettingsComponent(pm, resolveInfo); + trustAgentManager.getSettingsComponent(pm, resolveInfo); if (trustAgentComponentInfo.componentName == null || !enabledTrustAgents.contains( - TrustAgentUtils.getComponentName(resolveInfo)) || + trustAgentManager.getComponentName(resolveInfo)) || TextUtils.isEmpty(trustAgentComponentInfo.title)) continue; if (admin != null && dpm.getTrustAgentConfiguration( - null, TrustAgentUtils.getComponentName(resolveInfo)) == null) { + null, trustAgentManager.getComponentName(resolveInfo)) == null) { trustAgentComponentInfo.admin = admin; } result.add(trustAgentComponentInfo); diff --git a/src/com/android/settings/security/SecurityFeatureProvider.java b/src/com/android/settings/security/SecurityFeatureProvider.java index 23b4cf0c065..509446d13f9 100644 --- a/src/com/android/settings/security/SecurityFeatureProvider.java +++ b/src/com/android/settings/security/SecurityFeatureProvider.java @@ -19,7 +19,7 @@ package com.android.settings.security; import android.content.Context; import android.support.v7.preference.PreferenceScreen; -import com.android.settings.trustagent.TrustAgentManager; +import com.android.settings.security.trustagent.TrustAgentManager; import com.android.settingslib.drawer.DashboardCategory; diff --git a/src/com/android/settings/security/SecurityFeatureProviderImpl.java b/src/com/android/settings/security/SecurityFeatureProviderImpl.java index b8cf689797f..29aaefe225d 100644 --- a/src/com/android/settings/security/SecurityFeatureProviderImpl.java +++ b/src/com/android/settings/security/SecurityFeatureProviderImpl.java @@ -30,8 +30,7 @@ import android.util.ArrayMap; import android.util.Pair; import com.android.settings.R; -import com.android.settings.trustagent.TrustAgentManager; -import com.android.settings.trustagent.TrustAgentManagerImpl; +import com.android.settings.security.trustagent.TrustAgentManager; import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.TileUtils; @@ -192,7 +191,7 @@ public class SecurityFeatureProviderImpl implements SecurityFeatureProvider { @Override public TrustAgentManager getTrustAgentManager() { if (mTrustAgentManager == null) { - mTrustAgentManager = new TrustAgentManagerImpl(); + mTrustAgentManager = new TrustAgentManager(); } return mTrustAgentManager; } diff --git a/src/com/android/settings/TrustAgentUtils.java b/src/com/android/settings/security/trustagent/TrustAgentManager.java similarity index 62% rename from src/com/android/settings/TrustAgentUtils.java rename to src/com/android/settings/security/trustagent/TrustAgentManager.java index b3d560f612e..0655618289c 100644 --- a/src/com/android/settings/TrustAgentUtils.java +++ b/src/com/android/settings/security/trustagent/TrustAgentManager.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 The Android Open Source Project + * Copyright (C) 2016 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. @@ -11,10 +11,12 @@ * 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 + * limitations under the License. */ -package com.android.settings; +package com.android.settings.security.trustagent; + +import static android.service.trust.TrustAgentService.TRUST_AGENT_META_DATA; import android.content.ComponentName; import android.content.pm.PackageManager; @@ -22,40 +24,67 @@ import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; -import android.service.trust.TrustAgentService; +import android.support.annotation.VisibleForTesting; import android.util.AttributeSet; +import android.util.Log; import android.util.Slog; import android.util.Xml; +import com.android.settingslib.RestrictedLockUtils; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; -import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; -// TODO(b/34461256): Refactor TrustAgentUtils into TrustAgentManager. -public class TrustAgentUtils { - static final String TAG = "TrustAgentUtils"; - - private static final String TRUST_AGENT_META_DATA = TrustAgentService.TRUST_AGENT_META_DATA; +/** A manager for trust agent state. */ +public class TrustAgentManager { public static class TrustAgentComponentInfo { - ComponentName componentName; - String title; - String summary; - EnforcedAdmin admin = null; + public ComponentName componentName; + public String title; + public String summary; + public RestrictedLockUtils.EnforcedAdmin admin = null; } - public static ComponentName getComponentName(ResolveInfo resolveInfo) { + private static final String TAG = "TrustAgentManager"; + + @VisibleForTesting + static final String PERMISSION_PROVIDE_AGENT = + android.Manifest.permission.PROVIDE_TRUST_AGENT; + + /** + * Determines if the service associated with a resolved trust agent intent is allowed to provide + * trust on this device. + * + * @param resolveInfo The entry corresponding to the matched trust agent intent. + * @param pm The package manager to be used to check for permissions. + * @return {@code true} if the associated service is allowed to provide a trust agent, and + * {@code false} if otherwise. + */ + public boolean shouldProvideTrust(ResolveInfo resolveInfo, PackageManager pm) { + final String packageName = resolveInfo.serviceInfo.packageName; + if (pm.checkPermission(PERMISSION_PROVIDE_AGENT, packageName) + != PackageManager.PERMISSION_GRANTED) { + Log.w(TAG, "Skipping agent because package " + packageName + + " does not have permission " + PERMISSION_PROVIDE_AGENT + "."); + return false; + } + return true; + } + + public ComponentName getComponentName(ResolveInfo resolveInfo) { if (resolveInfo == null || resolveInfo.serviceInfo == null) return null; return new ComponentName(resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name); } - public static TrustAgentComponentInfo getSettingsComponent( + public TrustAgentComponentInfo getSettingsComponent( PackageManager pm, ResolveInfo resolveInfo) { if (resolveInfo == null || resolveInfo.serviceInfo == null - || resolveInfo.serviceInfo.metaData == null) return null; + || resolveInfo.serviceInfo.metaData == null) { + return null; + } String cn = null; TrustAgentComponentInfo trustAgentComponentInfo = new TrustAgentComponentInfo(); XmlResourceParser parser = null; @@ -101,7 +130,8 @@ public class TrustAgentUtils { if (cn != null && cn.indexOf('/') < 0) { cn = resolveInfo.serviceInfo.packageName + "/" + cn; } - trustAgentComponentInfo.componentName = (cn == null) ? null : ComponentName.unflattenFromString(cn); + trustAgentComponentInfo.componentName = + (cn == null) ? null : ComponentName.unflattenFromString(cn); return trustAgentComponentInfo; } } diff --git a/src/com/android/settings/TrustAgentSettings.java b/src/com/android/settings/security/trustagent/TrustAgentSettings.java similarity index 96% rename from src/com/android/settings/TrustAgentSettings.java rename to src/com/android/settings/security/trustagent/TrustAgentSettings.java index 0e5cd2c1971..d3ec2d91dd2 100644 --- a/src/com/android/settings/TrustAgentSettings.java +++ b/src/com/android/settings/security/trustagent/TrustAgentSettings.java @@ -14,7 +14,9 @@ * limitations under the License. */ -package com.android.settings; +package com.android.settings.security.trustagent; + +import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; @@ -34,15 +36,14 @@ import android.util.ArraySet; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.widget.LockPatternUtils; +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; import com.android.settings.overlay.FeatureFactory; -import com.android.settings.trustagent.TrustAgentManager; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedSwitchPreference; import java.util.List; -import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; - public class TrustAgentSettings extends SettingsPreferenceFragment implements Preference.OnPreferenceChangeListener { private static final String SERVICE_INTERFACE = TrustAgentService.SERVICE_INTERFACE; @@ -152,7 +153,7 @@ public class TrustAgentSettings extends SettingsPreferenceFragment implements UserHandle.myUserId()); } - ArrayMap findAvailableTrustAgents() { + private ArrayMap findAvailableTrustAgents() { PackageManager pm = getActivity().getPackageManager(); Intent trustAgentIntent = new Intent(SERVICE_INTERFACE); List resolveInfos = pm.queryIntentServices(trustAgentIntent, @@ -169,7 +170,7 @@ public class TrustAgentSettings extends SettingsPreferenceFragment implements if (!mTrustAgentManager.shouldProvideTrust(resolveInfo, pm)) { continue; } - ComponentName name = TrustAgentUtils.getComponentName(resolveInfo); + ComponentName name = mTrustAgentManager.getComponentName(resolveInfo); AgentInfo agentInfo = new AgentInfo(); agentInfo.label = resolveInfo.loadLabel(pm); agentInfo.icon = resolveInfo.loadIcon(pm); diff --git a/src/com/android/settings/trustagent/TrustAgentManager.java b/src/com/android/settings/trustagent/TrustAgentManager.java deleted file mode 100644 index 3335e17f193..00000000000 --- a/src/com/android/settings/trustagent/TrustAgentManager.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2016 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.trustagent; - -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; - - -/** A manager for trust agent state. */ -public interface TrustAgentManager { - - String PERMISSION_PROVIDE_AGENT = android.Manifest.permission.PROVIDE_TRUST_AGENT; - - /** - * Determines if the service associated with a resolved trust agent intent is allowed to provide - * trust on this device. - * - * @param resolveInfo The entry corresponding to the matched trust agent intent. - * @param pm The package manager to be used to check for permissions. - * @return {@code true} if the associated service is allowed to provide a trust agent, and - * {@code false} if otherwise. - */ - boolean shouldProvideTrust(ResolveInfo resolveInfo, PackageManager pm); -} diff --git a/src/com/android/settings/trustagent/TrustAgentManagerImpl.java b/src/com/android/settings/trustagent/TrustAgentManagerImpl.java deleted file mode 100644 index cabda79657e..00000000000 --- a/src/com/android/settings/trustagent/TrustAgentManagerImpl.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2016 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.trustagent; - -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.util.Log; - -/** Implementation for {@code SecurityFeatureProvider}. */ -public class TrustAgentManagerImpl implements TrustAgentManager { - - private static final String TAG = "TrustAgentFeature"; - - @Override - public boolean shouldProvideTrust(ResolveInfo resolveInfo, PackageManager pm) { - final String packageName = resolveInfo.serviceInfo.packageName; - if (pm.checkPermission(PERMISSION_PROVIDE_AGENT, packageName) - != PackageManager.PERMISSION_GRANTED) { - Log.w(TAG, "Skipping agent because package " + packageName - + " does not have permission " + PERMISSION_PROVIDE_AGENT + "."); - return false; - } - return true; - } -} diff --git a/tests/robotests/assets/grandfather_not_implementing_indexable b/tests/robotests/assets/grandfather_not_implementing_indexable index 91a66497ae3..608e44c459c 100644 --- a/tests/robotests/assets/grandfather_not_implementing_indexable +++ b/tests/robotests/assets/grandfather_not_implementing_indexable @@ -77,7 +77,7 @@ com.android.settings.WifiCallingSettings com.android.settings.WifiCallingSettingsForSub com.android.settings.password.SetupChooseLockGeneric$SetupChooseLockGenericFragment com.android.settings.SetupRedactionInterstitial$SetupRedactionInterstitialFragment -com.android.settings.TrustAgentSettings +com.android.settings.security.trustagent.TrustAgentSettings com.android.settings.password.ChooseLockGeneric$ChooseLockGenericFragment com.android.settings.IccLockSettings com.android.settings.TetherSettings diff --git a/tests/robotests/src/com/android/settings/trustagent/TrustAgentFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentFeatureProviderTest.java similarity index 76% rename from tests/robotests/src/com/android/settings/trustagent/TrustAgentFeatureProviderImplTest.java rename to tests/robotests/src/com/android/settings/security/trustagent/TrustAgentFeatureProviderTest.java index b1812539794..7840d1f078c 100644 --- a/tests/robotests/src/com/android/settings/trustagent/TrustAgentFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentFeatureProviderTest.java @@ -14,14 +14,17 @@ * limitations under the License. */ -package com.android.settings.trustagent; +package com.android.settings.security.trustagent; +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.when; + +import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; -import android.content.pm.PackageManager; -import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; import org.junit.Test; @@ -30,51 +33,48 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - @RunWith(SettingsRobolectricTestRunner.class) -@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) -public class TrustAgentFeatureProviderImplTest { +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION_O) +public class TrustAgentFeatureProviderTest { private static final String CANNED_PACKAGE_NAME = "com.test.package"; @Mock private PackageManager mPackageManager; - private TrustAgentManagerImpl mImpl; + private TrustAgentManager mTrustAgentManager; @Before public void setUp() throws PackageManager.NameNotFoundException { MockitoAnnotations.initMocks(this); - mImpl = new TrustAgentManagerImpl(); + mTrustAgentManager = new TrustAgentManager(); } @Test public void shouldProvideTrust_doesProvideTrustWithPermission() { when(mPackageManager.checkPermission(TrustAgentManager.PERMISSION_PROVIDE_AGENT, - CANNED_PACKAGE_NAME)).thenReturn(PackageManager.PERMISSION_GRANTED); + CANNED_PACKAGE_NAME)).thenReturn(PackageManager.PERMISSION_GRANTED); ServiceInfo serviceInfo = new ServiceInfo(); serviceInfo.packageName = CANNED_PACKAGE_NAME; ResolveInfo resolveInfo = new ResolveInfo(); resolveInfo.serviceInfo = serviceInfo; - assertTrue(mImpl.shouldProvideTrust(resolveInfo, mPackageManager)); + assertThat(mTrustAgentManager.shouldProvideTrust(resolveInfo, mPackageManager)) + .isTrue(); } @Test public void shouldProvideTrust_doesNotProvideTrustWithoutPermission() { when(mPackageManager.checkPermission(TrustAgentManager.PERMISSION_PROVIDE_AGENT, - CANNED_PACKAGE_NAME)).thenReturn(PackageManager.PERMISSION_DENIED); + CANNED_PACKAGE_NAME)).thenReturn(PackageManager.PERMISSION_DENIED); ServiceInfo serviceInfo = new ServiceInfo(); serviceInfo.packageName = CANNED_PACKAGE_NAME; ResolveInfo resolveInfo = new ResolveInfo(); resolveInfo.serviceInfo = serviceInfo; - assertFalse(mImpl.shouldProvideTrust(resolveInfo, mPackageManager)); + assertThat(mTrustAgentManager.shouldProvideTrust(resolveInfo, mPackageManager)) + .isFalse(); } }