From d4adb57e07035d545c2d14772cc93cacf88eea05 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Tue, 26 Aug 2014 17:28:00 -0700 Subject: [PATCH] Update TrustAgentService API after review Add test for DPM.setTrustAgentConfiguration() Also fixes bug where DPM flags were set in onPreferenceChanged() which happened before being set on the checkbox preference. Fixes bug 17008504 Change-Id: I165cd73d11c0a68ee6667cb1fd88892a39267903 --- samples/ApiDemos/res/values/strings.xml | 4 ++ .../ApiDemos/res/xml/device_admin_general.xml | 15 ++++ .../android/apis/app/DeviceAdminSample.java | 69 ++++++++++++++++--- 3 files changed, 78 insertions(+), 10 deletions(-) diff --git a/samples/ApiDemos/res/values/strings.xml b/samples/ApiDemos/res/values/strings.xml index 58daf39fc..65bfba353 100644 --- a/samples/ApiDemos/res/values/strings.xml +++ b/samples/ApiDemos/res/values/strings.xml @@ -790,6 +790,10 @@ Require encryption Activate encryption + Trust Agent Features + Enabled Component Name + Enabled Features (comma-separated) + Current password meets policy requirements Current password does not meet policy requirements diff --git a/samples/ApiDemos/res/xml/device_admin_general.xml b/samples/ApiDemos/res/xml/device_admin_general.xml index cfd0048be..1d0084e6a 100644 --- a/samples/ApiDemos/res/xml/device_admin_general.xml +++ b/samples/ApiDemos/res/xml/device_admin_general.xml @@ -57,4 +57,19 @@ + + + + + + + + diff --git a/samples/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.java b/samples/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.java index 82df9037a..71badcdf7 100644 --- a/samples/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.java +++ b/samples/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.java @@ -26,7 +26,9 @@ import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.SharedPreferences; import android.os.Bundle; +import android.os.PersistableBundle; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; import android.preference.ListPreference; @@ -41,6 +43,8 @@ import android.text.TextUtils; import android.util.Log; import android.widget.Toast; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -71,6 +75,8 @@ public class DeviceAdminSample extends PreferenceActivity { private static final String KEY_DISABLE_NOTIFICATIONS = "key_disable_notifications"; private static final String KEY_DISABLE_UNREDACTED = "key_disable_unredacted"; private static final String KEY_DISABLE_TRUST_AGENTS = "key_disable_trust_agents"; + private static final String KEY_TRUST_AGENT_COMPONENT = "key_trust_agent_component"; + private static final String KEY_TRUST_AGENT_FEATURES = "key_trust_agent_features"; private static final String KEY_DISABLE_KEYGUARD_WIDGETS = "key_disable_keyguard_widgets"; private static final String KEY_DISABLE_KEYGUARD_SECURE_CAMERA = "key_disable_keyguard_secure_camera"; @@ -274,6 +280,8 @@ public class DeviceAdminSample extends PreferenceActivity { private CheckBoxPreference mDisableKeyguardNotificationCheckbox; private CheckBoxPreference mDisableKeyguardTrustAgentCheckbox; private CheckBoxPreference mDisableKeyguardUnredactedCheckbox; + private EditTextPreference mTrustAgentComponent; + private EditTextPreference mTrustAgentFeatures; @Override public void onCreate(Bundle savedInstanceState) { @@ -304,6 +312,14 @@ public class DeviceAdminSample extends PreferenceActivity { mDisableKeyguardTrustAgentCheckbox = (CheckBoxPreference) findPreference(KEY_DISABLE_TRUST_AGENTS); mDisableKeyguardTrustAgentCheckbox.setOnPreferenceChangeListener(this); + + mTrustAgentComponent = + (EditTextPreference) findPreference(KEY_TRUST_AGENT_COMPONENT); + mTrustAgentComponent.setOnPreferenceChangeListener(this); + + mTrustAgentFeatures = + (EditTextPreference) findPreference(KEY_TRUST_AGENT_FEATURES); + mTrustAgentFeatures.setOnPreferenceChangeListener(this); } // At onResume time, reload UI with current values as required @@ -340,8 +356,8 @@ public class DeviceAdminSample extends PreferenceActivity { if (super.onPreferenceChange(preference, newValue)) { return true; } - boolean value = (Boolean) newValue; if (preference == mEnableCheckbox) { + boolean value = (Boolean) newValue; if (value != mAdminActive) { if (value) { // Launch the activity to have the user enable our admin. @@ -359,6 +375,7 @@ public class DeviceAdminSample extends PreferenceActivity { } } } else if (preference == mDisableCameraCheckbox) { + boolean value = (Boolean) newValue; mDPM.setCameraDisabled(mDeviceAdminSample, value); // Delay update because the change is only applied after exiting this method. postReloadSummaries(); @@ -366,20 +383,39 @@ public class DeviceAdminSample extends PreferenceActivity { || preference == mDisableKeyguardSecureCameraCheckbox || preference == mDisableKeyguardNotificationCheckbox || preference == mDisableKeyguardUnredactedCheckbox - || preference == mDisableKeyguardTrustAgentCheckbox) { - // Delay update because the change is only applied after exiting this method. - getView().post(new Runnable() { - @Override - public void run() { - mDPM.setKeyguardDisabledFeatures(mDeviceAdminSample, - createKeyguardDisabledFlag()); - } - }); + || preference == mDisableKeyguardTrustAgentCheckbox + || preference == mTrustAgentComponent + || preference == mTrustAgentFeatures) { + postUpdateDpmDisableFeatures(); postReloadSummaries(); } return true; } + private void postUpdateDpmDisableFeatures() { + getView().post(new Runnable() { + @Override + public void run() { + mDPM.setKeyguardDisabledFeatures(mDeviceAdminSample, + createKeyguardDisabledFlag()); + String component = mTrustAgentComponent.getText(); + if (component != null) { + ComponentName agent = ComponentName.unflattenFromString(component); + if (agent != null) { + String featureString = mTrustAgentFeatures.getText(); + if (featureString != null) { + PersistableBundle bundle = new PersistableBundle(); + bundle.putStringArray("features", featureString.split(",")); + mDPM.setTrustAgentConfiguration(mDeviceAdminSample, agent, bundle); + } + } else { + Log.w(TAG, "Invalid component: " + component); + } + } + } + }); + } + @Override protected void reloadSummaries() { super.reloadSummaries(); @@ -416,6 +452,17 @@ public class DeviceAdminSample extends PreferenceActivity { R.string.keyguard_trust_agents_disabled : R.string.keyguard_trust_agents_enabled); mDisableKeyguardTrustAgentCheckbox.setSummary(keyguardEnableTrustAgentSummary); + + final SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); + final boolean trustDisabled = + (disabled & DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS) != 0; + String component = prefs.getString(mTrustAgentComponent.getKey(), null); + mTrustAgentComponent.setSummary(component); + mTrustAgentComponent.setEnabled(trustDisabled); + + String features = prefs.getString(mTrustAgentFeatures.getKey(), null); + mTrustAgentFeatures.setSummary(features); + mTrustAgentFeatures.setEnabled(trustDisabled); } /** Updates the device capabilities area (dis/enabling) as the admin is (de)activated */ @@ -426,6 +473,8 @@ public class DeviceAdminSample extends PreferenceActivity { mDisableKeyguardNotificationCheckbox.setEnabled(enabled); mDisableKeyguardUnredactedCheckbox.setEnabled(enabled); mDisableKeyguardTrustAgentCheckbox.setEnabled(enabled); + mTrustAgentComponent.setEnabled(enabled); + mTrustAgentFeatures.setEnabled(enabled); } }