Merge "Disable trust agent settings when disabled by policy"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 92dfd51..7c13e8f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6274,6 +6274,9 @@
     <!-- Description for advanced menu option to reset app preferences [CHAR LIMIT=NONE] -->
     <string name="reset_app_preferences_description">Reset preferences across all apps to defaults</string>
 
+    <!-- Summary for a trust agent that was disabled by the device policy [LIMIT=NONE] -->
+    <string name="trust_agent_disabled_device_admin">Disabled by administrator</string>
+
     <!-- Description of settings item that leads to list of all apps [CHAR LIMIT=NONE] -->
     <string name="all_apps_summary"><xliff:g id="count" example="10">%d</xliff:g> apps installed, including system and downloaded apps</string>
 
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index fd99536..30b7590 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -362,7 +362,7 @@
     private void addTrustAgentSettings(PreferenceGroup securityCategory) {
         final boolean hasSecurity = mLockPatternUtils.isSecure();
         ArrayList<TrustAgentComponentInfo> 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 @@
             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 @@
     }
 
     private static ArrayList<TrustAgentComponentInfo> getActiveTrustAgents(
-            PackageManager pm, LockPatternUtils utils) {
+            PackageManager pm, LockPatternUtils utils, DevicePolicyManager dpm) {
         ArrayList<TrustAgentComponentInfo> result = new ArrayList<TrustAgentComponentInfo>();
         List<ResolveInfo> resolveInfos = pm.queryIntentServices(TRUST_AGENT_INTENT,
                 PackageManager.GET_META_DATA);
         List<ComponentName> 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 @@
                         !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 @@
             final LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
             if (lockPatternUtils.isSecure()) {
                 ArrayList<TrustAgentComponentInfo> 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 1427d5f..4c6b4ee 100644
--- a/src/com/android/settings/TrustAgentSettings.java
+++ b/src/com/android/settings/TrustAgentSettings.java
@@ -18,6 +18,7 @@
 
 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 @@
 public class TrustAgentSettings extends SettingsPreferenceFragment implements
         Preference.OnPreferenceChangeListener {
     private static final String SERVICE_INTERFACE = TrustAgentService.SERVICE_INTERFACE;
+
     private ArrayMap<ComponentName, AgentInfo> mAvailableAgents;
     private final ArraySet<ComponentName> mActiveAgents = new ArraySet<ComponentName>();
     private LockPatternUtils mLockPatternUtils;
+    private DevicePolicyManager mDpm;
 
     public static final class AgentInfo {
         CharSequence label;
@@ -69,6 +72,7 @@
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
+        mDpm = getActivity().getSystemService(DevicePolicyManager.class);
         addPreferencesFromResource(R.xml.trust_agent_settings);
     }
 
@@ -89,6 +93,10 @@
         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 @@
             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 31a073c..109663a 100644
--- a/src/com/android/settings/TrustAgentUtils.java
+++ b/src/com/android/settings/TrustAgentUtils.java
@@ -57,6 +57,7 @@
         ComponentName componentName;
         String title;
         String summary;
+        boolean disabledByAdministrator;
     }
 
     public static ComponentName getComponentName(ResolveInfo resolveInfo) {