diff --git a/src/com/android/settings/security/SecuritySettings.java b/src/com/android/settings/security/SecuritySettings.java index 97cfbb9b95f..16ab1fc7d06 100644 --- a/src/com/android/settings/security/SecuritySettings.java +++ b/src/com/android/settings/security/SecuritySettings.java @@ -23,12 +23,9 @@ import android.app.AlertDialog; import android.app.Dialog; import android.app.FragmentManager; import android.app.admin.DevicePolicyManager; -import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.hardware.fingerprint.FingerprintManager; import android.os.Bundle; @@ -38,7 +35,6 @@ import android.os.UserManager; import android.os.storage.StorageManager; import android.provider.SearchIndexableResource; import android.provider.Settings; -import android.service.trust.TrustAgentService; import android.support.annotation.VisibleForTesting; import android.support.v14.preference.SwitchPreference; import android.support.v7.preference.Preference; @@ -91,8 +87,6 @@ public class SecuritySettings extends SettingsPreferenceFragment private static final String TAG = "SecuritySettings"; private static final String TRUST_AGENT_CLICK_INTENT = "trust_agent_click_intent"; - private static final Intent TRUST_AGENT_INTENT = - new Intent(TrustAgentService.SERVICE_INTERFACE); // Lock Settings private static final String KEY_UNLOCK_SET_OR_CHANGE = "unlock_set_or_change"; @@ -135,9 +129,6 @@ public class SecuritySettings extends SettingsPreferenceFragment KEY_SHOW_PASSWORD, KEY_UNIFICATION, KEY_VISIBLE_PATTERN_PROFILE }; - // Only allow one trust agent on the platform. - private static final boolean ONLY_ONE_TRUST_AGENT = true; - private static final int MY_USER_ID = UserHandle.myUserId(); private DashboardFeatureProvider mDashboardFeatureProvider; @@ -466,11 +457,10 @@ public class SecuritySettings extends SettingsPreferenceFragment // Return the number of trust agents being added private int addTrustAgentSettings(PreferenceGroup securityCategory) { final boolean hasSecurity = mLockPatternUtils.isSecure(MY_USER_ID); - ArrayList agents = getActiveTrustAgents( - getActivity(), mTrustAgentManager, mLockPatternUtils, mDPM); - for (int i = 0; i < agents.size(); i++) { - final TrustAgentComponentInfo agent = agents.get(i); - RestrictedPreference trustAgentPreference = + final List agents = mTrustAgentManager.getActiveTrustAgents( + getActivity(), mLockPatternUtils); + for (TrustAgentComponentInfo agent : agents) { + final RestrictedPreference trustAgentPreference = new RestrictedPreference(securityCategory.getContext()); trustAgentPreference.setKey(KEY_TRUST_AGENT); trustAgentPreference.setTitle(agent.title); @@ -529,44 +519,6 @@ public class SecuritySettings extends SettingsPreferenceFragment return false; } - static ArrayList getActiveTrustAgents(Context context, - TrustAgentManager trustAgentManager, LockPatternUtils utils, - DevicePolicyManager dpm) { - PackageManager pm = context.getPackageManager(); - ArrayList result = new ArrayList<>(); - List resolveInfos = pm.queryIntentServices(TRUST_AGENT_INTENT, - PackageManager.GET_META_DATA); - List enabledTrustAgents = utils.getEnabledTrustAgents(MY_USER_ID); - - EnforcedAdmin admin = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(context, - DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS, UserHandle.myUserId()); - - if (enabledTrustAgents != null && !enabledTrustAgents.isEmpty()) { - for (int i = 0; i < resolveInfos.size(); i++) { - ResolveInfo resolveInfo = resolveInfos.get(i); - if (resolveInfo.serviceInfo == null) continue; - if (!trustAgentManager.shouldProvideTrust(resolveInfo, pm)) { - continue; - } - TrustAgentComponentInfo trustAgentComponentInfo = - trustAgentManager.getSettingsComponent(pm, resolveInfo); - if (trustAgentComponentInfo.componentName == null || - !enabledTrustAgents.contains( - trustAgentManager.getComponentName(resolveInfo)) || - TextUtils.isEmpty(trustAgentComponentInfo.title)) continue; - if (admin != null && dpm.getTrustAgentConfiguration( - null, trustAgentManager.getComponentName(resolveInfo)) == null) { - trustAgentComponentInfo.admin = admin; - } - result.add(trustAgentComponentInfo); - if (ONLY_ONE_TRUST_AGENT) break; - } - } - return result; - } - - - @Override public void onGearClick(GearPreference p) { if (KEY_UNLOCK_SET_OR_CHANGE.equals(p.getKey())) { @@ -915,8 +867,7 @@ public class SecuritySettings extends SettingsPreferenceFragment FeatureFactory.getFactory(context).getSecurityFeatureProvider() .getTrustAgentManager(); final List agents = - getActiveTrustAgents(context, trustAgentManager, lockPatternUtils, - context.getSystemService(DevicePolicyManager.class)); + trustAgentManager.getActiveTrustAgents(context, lockPatternUtils); for (int i = 0; i < agents.size(); i++) { final TrustAgentComponentInfo agent = agents.get(i); data = new SearchIndexableRaw(context); diff --git a/src/com/android/settings/security/SecuritySubSettings.java b/src/com/android/settings/security/SecuritySubSettings.java index d9f2f2c2e4e..5c5052bf3d4 100644 --- a/src/com/android/settings/security/SecuritySubSettings.java +++ b/src/com/android/settings/security/SecuritySubSettings.java @@ -19,7 +19,6 @@ package com.android.settings.security; import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; import android.app.admin.DevicePolicyManager; -import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.UserHandle; @@ -40,8 +39,6 @@ import com.android.settings.password.ManagedLockPasswordProvider; import com.android.settings.security.trustagent.TrustAgentManager; import com.android.settingslib.RestrictedLockUtils; -import java.util.ArrayList; - public class SecuritySubSettings extends SettingsPreferenceFragment implements Preference.OnPreferenceChangeListener, OwnerInfoPreferenceController.OwnerInfoCallback { @@ -74,9 +71,9 @@ public class SecuritySubSettings extends SettingsPreferenceFragment @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); - SecurityFeatureProvider securityFeatureProvider = - FeatureFactory.getFactory(getActivity()).getSecurityFeatureProvider(); - mTrustAgentManager = securityFeatureProvider.getTrustAgentManager(); + mTrustAgentManager = + FeatureFactory.getFactory( + getActivity()).getSecurityFeatureProvider().getTrustAgentManager(); mLockPatternUtils = new LockPatternUtils(getContext()); mDPM = getContext().getSystemService(DevicePolicyManager.class); mOwnerInfoPreferenceController = @@ -131,8 +128,8 @@ public class SecuritySubSettings extends SettingsPreferenceFragment // lock instantly on power key press mPowerButtonInstantlyLocks = (SwitchPreference) findPreference( KEY_POWER_INSTANTLY_LOCKS); - CharSequence trustAgentLabel = getActiveTrustAgentLabel(getContext(), - mTrustAgentManager, mLockPatternUtils, mDPM); + final CharSequence trustAgentLabel = mTrustAgentManager.getActiveTrustAgentLabel( + getContext(), mLockPatternUtils); if (mPowerButtonInstantlyLocks != null && !TextUtils.isEmpty(trustAgentLabel)) { mPowerButtonInstantlyLocks.setSummary(getString( R.string.lockpattern_settings_power_button_instantly_locks_summary, @@ -188,8 +185,8 @@ public class SecuritySubSettings extends SettingsPreferenceFragment } } - CharSequence trustAgentLabel = getActiveTrustAgentLabel(getContext(), - mTrustAgentManager, mLockPatternUtils, mDPM); + final CharSequence trustAgentLabel = mTrustAgentManager + .getActiveTrustAgentLabel(getContext(), mLockPatternUtils); if (!TextUtils.isEmpty(trustAgentLabel)) { if (Long.valueOf(values[best].toString()) == 0) { summary = getString(R.string.lock_immediately_summary_with_exception, @@ -252,12 +249,4 @@ public class SecuritySubSettings extends SettingsPreferenceFragment } return true; } - - private static CharSequence getActiveTrustAgentLabel(Context context, - TrustAgentManager trustAgentManager, LockPatternUtils utils, - DevicePolicyManager dpm) { - ArrayList agents = - SecuritySettings.getActiveTrustAgents(context, trustAgentManager, utils, dpm); - return agents.isEmpty() ? null : agents.get(0).title; - } } diff --git a/src/com/android/settings/security/trustagent/TrustAgentManager.java b/src/com/android/settings/security/trustagent/TrustAgentManager.java index 0655618289c..371090502ae 100644 --- a/src/com/android/settings/security/trustagent/TrustAgentManager.java +++ b/src/com/android/settings/security/trustagent/TrustAgentManager.java @@ -18,29 +18,41 @@ package com.android.settings.security.trustagent; import static android.service.trust.TrustAgentService.TRUST_AGENT_META_DATA; +import android.app.admin.DevicePolicyManager; import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; +import android.os.UserHandle; +import android.service.trust.TrustAgentService; import android.support.annotation.VisibleForTesting; +import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; import android.util.Slog; import android.util.Xml; +import com.android.internal.widget.LockPatternUtils; import com.android.settingslib.RestrictedLockUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; /** A manager for trust agent state. */ public class TrustAgentManager { + // Only allow one trust agent on the platform. + private static final boolean ONLY_ONE_TRUST_AGENT = true; + public static class TrustAgentComponentInfo { public ComponentName componentName; public String title; @@ -49,6 +61,8 @@ public class TrustAgentManager { } private static final String TAG = "TrustAgentManager"; + private static final Intent TRUST_AGENT_INTENT = + new Intent(TrustAgentService.SERVICE_INTERFACE); @VisibleForTesting static final String PERMISSION_PROVIDE_AGENT = @@ -74,13 +88,66 @@ public class TrustAgentManager { return true; } + /** + * Return the display label for active trust agent. + */ + public CharSequence getActiveTrustAgentLabel(Context context, LockPatternUtils utils) { + final List agents = getActiveTrustAgents(context, utils); + return agents.isEmpty() ? null : agents.get(0).title; + } + + /** + * Returns a list of trust agents. + * + * If {@link #ONLY_ONE_TRUST_AGENT} is set, the list will contain up to 1 agent instead of all + * available agents on device. + */ + public List getActiveTrustAgents(Context context, + LockPatternUtils utils) { + final int myUserId = UserHandle.myUserId(); + final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class); + final PackageManager pm = context.getPackageManager(); + final List result = new ArrayList<>(); + + final List resolveInfos = pm.queryIntentServices(TRUST_AGENT_INTENT, + PackageManager.GET_META_DATA); + final List enabledTrustAgents = utils.getEnabledTrustAgents(myUserId); + final RestrictedLockUtils.EnforcedAdmin admin = RestrictedLockUtils + .checkIfKeyguardFeaturesDisabled( + context, DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS, myUserId); + + if (enabledTrustAgents != null && !enabledTrustAgents.isEmpty()) { + for (ResolveInfo resolveInfo : resolveInfos) { + if (resolveInfo.serviceInfo == null || !shouldProvideTrust(resolveInfo, pm)) { + continue; + } + final TrustAgentComponentInfo trustAgentComponentInfo = + getSettingsComponent(pm, resolveInfo); + if (trustAgentComponentInfo.componentName == null || + !enabledTrustAgents.contains(getComponentName(resolveInfo)) || + TextUtils.isEmpty(trustAgentComponentInfo.title)) { + continue; + } + if (admin != null && dpm.getTrustAgentConfiguration( + null, getComponentName(resolveInfo)) == null) { + trustAgentComponentInfo.admin = admin; + } + result.add(trustAgentComponentInfo); + if (ONLY_ONE_TRUST_AGENT) { + break; + } + } + } + return result; + } + public ComponentName getComponentName(ResolveInfo resolveInfo) { if (resolveInfo == null || resolveInfo.serviceInfo == null) return null; return new ComponentName(resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name); } - public TrustAgentComponentInfo getSettingsComponent( - PackageManager pm, ResolveInfo resolveInfo) { + private TrustAgentComponentInfo getSettingsComponent(PackageManager pm, + ResolveInfo resolveInfo) { if (resolveInfo == null || resolveInfo.serviceInfo == null || resolveInfo.serviceInfo.metaData == null) { return null; diff --git a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentFeatureProviderTest.java b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentManagerTest.java similarity index 98% rename from tests/robotests/src/com/android/settings/security/trustagent/TrustAgentFeatureProviderTest.java rename to tests/robotests/src/com/android/settings/security/trustagent/TrustAgentManagerTest.java index 7840d1f078c..ed616be22a0 100644 --- a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentFeatureProviderTest.java +++ b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentManagerTest.java @@ -35,7 +35,7 @@ import org.robolectric.annotation.Config; @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION_O) -public class TrustAgentFeatureProviderTest { +public class TrustAgentManagerTest { private static final String CANNED_PACKAGE_NAME = "com.test.package";