From 5a10a8df0efcf034077cbfcd28dd2e495b8d0441 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Fri, 8 Aug 2014 18:30:20 -0700 Subject: [PATCH] Use SwitchPreference in TrustAgentSettings. Fixes bug 16900059 Change-Id: I52dcfd2a2651f8f770477df3c72176303a9d1b39 --- res/layout/advanced_security_settings.xml | 37 --- res/xml/security_settings_misc.xml | 2 +- res/xml/trust_agent_settings.xml | 19 ++ .../settings/AdvancedSecuritySettings.java | 221 ------------------ .../android/settings/TrustAgentSettings.java | 157 +++++++++++++ 5 files changed, 177 insertions(+), 259 deletions(-) delete mode 100644 res/layout/advanced_security_settings.xml create mode 100644 res/xml/trust_agent_settings.xml delete mode 100644 src/com/android/settings/AdvancedSecuritySettings.java create mode 100644 src/com/android/settings/TrustAgentSettings.java diff --git a/res/layout/advanced_security_settings.xml b/res/layout/advanced_security_settings.xml deleted file mode 100644 index 98ff43d338b..00000000000 --- a/res/layout/advanced_security_settings.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - diff --git a/res/xml/security_settings_misc.xml b/res/xml/security_settings_misc.xml index a0e81b2c99c..1f280a9fb1b 100644 --- a/res/xml/security_settings_misc.xml +++ b/res/xml/security_settings_misc.xml @@ -107,7 +107,7 @@ android:title="@string/manage_trust_agents" android:summary="@string/manage_trust_agents_summary" android:persistent="false" - android:fragment="com.android.settings.AdvancedSecuritySettings"/> + android:fragment="com.android.settings.TrustAgentSettings"/> + + + diff --git a/src/com/android/settings/AdvancedSecuritySettings.java b/src/com/android/settings/AdvancedSecuritySettings.java deleted file mode 100644 index 3ddbf967e19..00000000000 --- a/src/com/android/settings/AdvancedSecuritySettings.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (C) 2014 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; - -import com.android.internal.widget.LockPatternUtils; - -import android.app.ListFragment; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.os.Bundle; -import android.service.trust.TrustAgentService; -import android.util.ArrayMap; -import android.util.ArraySet; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.CheckBox; -import android.widget.TextView; - -import java.util.List; - -public class AdvancedSecuritySettings extends ListFragment implements View.OnClickListener { - static final String TAG = "AdvancedSecuritySettings"; - - private static final String SERVICE_INTERFACE = TrustAgentService.SERVICE_INTERFACE; - - private final ArraySet mActiveAgents = new ArraySet(); - private final ArrayMap mAvailableAgents - = new ArrayMap(); - - private LockPatternUtils mLockPatternUtils; - - public static final class AgentInfo { - CharSequence label; - ComponentName component; // service that implements ITrustAgent - - @Override - public boolean equals(Object other) { - if (other instanceof AgentInfo) { - return component.equals(((AgentInfo)other).component); - } - return true; - } - - public int compareTo(AgentInfo other) { - return component.compareTo(other.component); - } - } - - @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - if (mLockPatternUtils == null) { - mLockPatternUtils = new LockPatternUtils( - container.getContext().getApplicationContext()); - } - setListAdapter(new AgentListAdapter()); - return inflater.inflate(R.layout.advanced_security_settings, container, false); - } - - @Override - public void onResume() { - super.onResume(); - updateList(); - } - - void updateList() { - Context context = getActivity(); - if (context == null) { - return; - } - - loadActiveAgents(); - - PackageManager pm = getActivity().getPackageManager(); - Intent trustAgentIntent = new Intent(SERVICE_INTERFACE); - List resolveInfos = pm.queryIntentServices(trustAgentIntent, - PackageManager.GET_META_DATA); - - mAvailableAgents.clear(); - mAvailableAgents.ensureCapacity(resolveInfos.size()); - - for (ResolveInfo resolveInfo : resolveInfos) { - if (resolveInfo.serviceInfo == null) continue; - if (!TrustAgentUtils.checkProvidePermission(resolveInfo, pm)) continue; - ComponentName name = TrustAgentUtils.getComponentName(resolveInfo); - if (!mAvailableAgents.containsKey(name)) { - AgentInfo agentInfo = new AgentInfo(); - agentInfo.label = resolveInfo.loadLabel(pm); - agentInfo.component = name; - mAvailableAgents.put(name, agentInfo); - } - } - ((BaseAdapter) getListAdapter()).notifyDataSetChanged(); - } - - @Override - public void onClick(View view) { - ViewHolder h = (ViewHolder) view.getTag(); - - if (view.getId() == R.id.clickable) { - boolean wasActive = mActiveAgents.contains(h.agentInfo.component); - loadActiveAgents(); - if (!wasActive) { - mActiveAgents.add(h.agentInfo.component); - } else { - mActiveAgents.remove(h.agentInfo.component); - } - saveActiveAgents(); - ((BaseAdapter) getListAdapter()).notifyDataSetChanged(); - } - } - - private void loadActiveAgents() { - mActiveAgents.clear(); - List activeTrustAgents = mLockPatternUtils.getEnabledTrustAgents(); - if (activeTrustAgents != null) { - mActiveAgents.addAll(activeTrustAgents); - } - } - - private void saveActiveAgents() { - mLockPatternUtils.setEnabledTrustAgents(mActiveAgents); - } - - static class ViewHolder { - TextView name; - CheckBox checkbox; - TextView description; - AgentInfo agentInfo; - View clickable; - } - - class AgentListAdapter extends BaseAdapter { - final LayoutInflater mInflater; - - AgentListAdapter() { - mInflater = (LayoutInflater) - getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - } - - public boolean hasStableIds() { - return false; - } - - public int getCount() { - return mAvailableAgents.size(); - } - - public Object getItem(int position) { - return mAvailableAgents.valueAt(position); - } - - public long getItemId(int position) { - return position; - } - - public boolean areAllItemsEnabled() { - return false; - } - - public boolean isEnabled(int position) { - return true; - } - - public View getView(int position, View convertView, ViewGroup parent) { - View v; - if (convertView == null) { - v = newView(parent); - } else { - v = convertView; - } - bindView(v, position); - return v; - } - - public View newView(ViewGroup parent) { - View v = mInflater.inflate(R.layout.trust_agent_item, parent, false); - ViewHolder h = new ViewHolder(); - h.name = (TextView)v.findViewById(R.id.name); - h.checkbox = (CheckBox)v.findViewById(R.id.checkbox); - h.clickable = v.findViewById(R.id.clickable); - h.clickable.setOnClickListener(AdvancedSecuritySettings.this); - h.description = (TextView)v.findViewById(R.id.description); - v.setTag(h); - h.clickable.setTag(h); - return v; - } - - public void bindView(View view, int position) { - ViewHolder vh = (ViewHolder) view.getTag(); - AgentInfo item = mAvailableAgents.valueAt(position); - vh.name.setText(item.label); - vh.checkbox.setChecked(mActiveAgents.contains(item.component)); - vh.agentInfo = item; - } - } -} diff --git a/src/com/android/settings/TrustAgentSettings.java b/src/com/android/settings/TrustAgentSettings.java new file mode 100644 index 00000000000..54fef362727 --- /dev/null +++ b/src/com/android/settings/TrustAgentSettings.java @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2014 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; + +import java.util.List; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.PreferenceGroup; +import android.preference.SwitchPreference; +import android.service.trust.TrustAgentService; +import android.util.ArrayMap; +import android.util.ArraySet; + +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; + + public static final class AgentInfo { + CharSequence label; + ComponentName component; // service that implements ITrustAgent + SwitchPreference preference; + public Drawable icon; + + @Override + public boolean equals(Object other) { + if (other instanceof AgentInfo) { + return component.equals(((AgentInfo)other).component); + } + return true; + } + + public int compareTo(AgentInfo other) { + return component.compareTo(other.component); + } + } + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + addPreferencesFromResource(R.xml.trust_agent_settings); + } + + public void onResume() { + super.onResume(); + updateAgents(); + }; + + private void updateAgents() { + final Context context = getActivity(); + if (mAvailableAgents == null) { + mAvailableAgents = findAvailableTrustAgents(); + } + if (mLockPatternUtils == null) { + mLockPatternUtils = new LockPatternUtils(getActivity()); + } + loadActiveAgents(); + PreferenceGroup category = + (PreferenceGroup) getPreferenceScreen().findPreference("trust_agents"); + category.removeAll(); + final int count = mAvailableAgents.size(); + for (int i = 0; i < count; i++) { + AgentInfo agent = mAvailableAgents.valueAt(i); + final SwitchPreference preference = new SwitchPreference(context); + agent.preference = preference; + preference.setPersistent(false); + preference.setTitle(agent.label); + preference.setIcon(agent.icon); + preference.setPersistent(false); + preference.setOnPreferenceChangeListener(this); + preference.setChecked(mActiveAgents.contains(agent.component)); + category.addPreference(agent.preference); + } + } + + private void loadActiveAgents() { + List activeTrustAgents = mLockPatternUtils.getEnabledTrustAgents(); + if (activeTrustAgents != null) { + mActiveAgents.addAll(activeTrustAgents); + } + } + + private void saveActiveAgents() { + mLockPatternUtils.setEnabledTrustAgents(mActiveAgents); + } + + ArrayMap findAvailableTrustAgents() { + PackageManager pm = getActivity().getPackageManager(); + Intent trustAgentIntent = new Intent(SERVICE_INTERFACE); + List resolveInfos = pm.queryIntentServices(trustAgentIntent, + PackageManager.GET_META_DATA); + + ArrayMap agents = new ArrayMap(); + final int count = resolveInfos.size(); + agents.ensureCapacity(count); + for (int i = 0; i < count; i++ ) { + ResolveInfo resolveInfo = resolveInfos.get(i); + if (resolveInfo.serviceInfo == null) continue; + if (!TrustAgentUtils.checkProvidePermission(resolveInfo, pm)) continue; + ComponentName name = TrustAgentUtils.getComponentName(resolveInfo); + AgentInfo agentInfo = new AgentInfo(); + agentInfo.label = resolveInfo.loadLabel(pm); + agentInfo.icon = resolveInfo.loadIcon(pm); + agentInfo.component = name; + agents.put(name, agentInfo); + } + return agents; + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (preference instanceof SwitchPreference) { + final int count = mAvailableAgents.size(); + for (int i = 0; i < count; i++) { + AgentInfo agent = mAvailableAgents.valueAt(i); + if (agent.preference == preference) { + if ((Boolean) newValue) { + if (!mActiveAgents.contains(agent.component)) { + mActiveAgents.add(agent.component); + } + } else { + mActiveAgents.remove(agent.component); + } + saveActiveAgents(); + return true; + } + } + } + return false; + } + +}