diff --git a/res/values/strings.xml b/res/values/strings.xml index 92dfd512981..7c13e8f0c08 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6274,6 +6274,9 @@ Reset preferences across all apps to defaults + + Disabled by administrator + %d apps installed, including system and downloaded apps diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java index fd99536b6a6..30b75902a5a 100644 --- a/src/com/android/settings/SecuritySettings.java +++ b/src/com/android/settings/SecuritySettings.java @@ -362,7 +362,7 @@ public class SecuritySettings extends SettingsPreferenceFragment private void addTrustAgentSettings(PreferenceGroup securityCategory) { final boolean hasSecurity = mLockPatternUtils.isSecure(); ArrayList agents = - getActiveTrustAgents(getPackageManager(), mLockPatternUtils); + getActiveTrustAgents(getPackageManager(), mLockPatternUtils, mDPM); for (int i = 0; i < agents.size(); i++) { final TrustAgentComponentInfo agent = agents.get(i); Preference trustAgentPreference = @@ -377,7 +377,11 @@ public class SecuritySettings extends SettingsPreferenceFragment trustAgentPreference.setIntent(intent); // Add preference to the settings menu. securityCategory.addPreference(trustAgentPreference); - if (!hasSecurity) { + + if (agent.disabledByAdministrator) { + trustAgentPreference.setEnabled(false); + trustAgentPreference.setSummary(R.string.trust_agent_disabled_device_admin); + } else if (!hasSecurity) { trustAgentPreference.setEnabled(false); trustAgentPreference.setSummary(R.string.disabled_because_no_backup_security); } @@ -422,11 +426,15 @@ public class SecuritySettings extends SettingsPreferenceFragment } private static ArrayList getActiveTrustAgents( - PackageManager pm, LockPatternUtils utils) { + PackageManager pm, LockPatternUtils utils, DevicePolicyManager dpm) { ArrayList result = new ArrayList(); List resolveInfos = pm.queryIntentServices(TRUST_AGENT_INTENT, PackageManager.GET_META_DATA); List enabledTrustAgents = utils.getEnabledTrustAgents(); + + boolean disableTrustAgents = (dpm.getKeyguardDisabledFeatures(null) + & DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS) != 0; + if (enabledTrustAgents != null && !enabledTrustAgents.isEmpty()) { for (int i = 0; i < resolveInfos.size(); i++) { ResolveInfo resolveInfo = resolveInfos.get(i); @@ -438,6 +446,10 @@ public class SecuritySettings extends SettingsPreferenceFragment !enabledTrustAgents.contains( TrustAgentUtils.getComponentName(resolveInfo)) || TextUtils.isEmpty(trustAgentComponentInfo.title)) continue; + if (disableTrustAgents && dpm.getTrustAgentConfiguration( + null, TrustAgentUtils.getComponentName(resolveInfo)) == null) { + trustAgentComponentInfo.disabledByAdministrator = true; + } result.add(trustAgentComponentInfo); if (ONLY_ONE_TRUST_AGENT) break; } @@ -772,7 +784,8 @@ public class SecuritySettings extends SettingsPreferenceFragment final LockPatternUtils lockPatternUtils = new LockPatternUtils(context); if (lockPatternUtils.isSecure()) { ArrayList agents = - getActiveTrustAgents(context.getPackageManager(), lockPatternUtils); + getActiveTrustAgents(context.getPackageManager(), lockPatternUtils, + context.getSystemService(DevicePolicyManager.class)); 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/TrustAgentSettings.java b/src/com/android/settings/TrustAgentSettings.java index 1427d5f004e..4c6b4ee7986 100644 --- a/src/com/android/settings/TrustAgentSettings.java +++ b/src/com/android/settings/TrustAgentSettings.java @@ -18,6 +18,7 @@ package com.android.settings; import java.util.List; +import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -38,9 +39,11 @@ import com.android.internal.widget.LockPatternUtils; public class TrustAgentSettings extends SettingsPreferenceFragment implements Preference.OnPreferenceChangeListener { private static final String SERVICE_INTERFACE = TrustAgentService.SERVICE_INTERFACE; + private ArrayMap mAvailableAgents; private final ArraySet mActiveAgents = new ArraySet(); private LockPatternUtils mLockPatternUtils; + private DevicePolicyManager mDpm; public static final class AgentInfo { CharSequence label; @@ -69,6 +72,7 @@ public class TrustAgentSettings extends SettingsPreferenceFragment implements @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); + mDpm = getActivity().getSystemService(DevicePolicyManager.class); addPreferencesFromResource(R.xml.trust_agent_settings); } @@ -89,6 +93,10 @@ public class TrustAgentSettings extends SettingsPreferenceFragment implements PreferenceGroup category = (PreferenceGroup) getPreferenceScreen().findPreference("trust_agents"); category.removeAll(); + + boolean disabledByDevicePolicy = (mDpm.getKeyguardDisabledFeatures(null) + & DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS) != 0; + final int count = mAvailableAgents.size(); for (int i = 0; i < count; i++) { AgentInfo agent = mAvailableAgents.valueAt(i); @@ -100,6 +108,13 @@ public class TrustAgentSettings extends SettingsPreferenceFragment implements preference.setPersistent(false); preference.setOnPreferenceChangeListener(this); preference.setChecked(mActiveAgents.contains(agent.component)); + + if (disabledByDevicePolicy + && mDpm.getTrustAgentConfiguration(null, agent.component) == null) { + preference.setEnabled(false); + preference.setSummary(R.string.trust_agent_disabled_device_admin); + } + category.addPreference(agent.preference); } } diff --git a/src/com/android/settings/TrustAgentUtils.java b/src/com/android/settings/TrustAgentUtils.java index 31a073c15ae..109663a2ce5 100644 --- a/src/com/android/settings/TrustAgentUtils.java +++ b/src/com/android/settings/TrustAgentUtils.java @@ -57,6 +57,7 @@ public class TrustAgentUtils { ComponentName componentName; String title; String summary; + boolean disabledByAdministrator; } public static ComponentName getComponentName(ResolveInfo resolveInfo) {