Merge "TrustCredentials listview should be expanded by default" into nyc-dev
am: 963c3a4e9f
* commit '963c3a4e9f06808c098fe3de4aaec5033431f21d':
TrustCredentials listview should be expanded by default
Change-Id: I4edd0c7687a8951456152f334a3a169c817f8ec1
This commit is contained in:
@@ -19,6 +19,8 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:background="?android:attr/selectableItemBackground"
|
android:background="?android:attr/selectableItemBackground"
|
||||||
|
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
|
||||||
|
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
||||||
android:paddingTop="15dip"
|
android:paddingTop="15dip"
|
||||||
android:paddingBottom="15dip">
|
android:paddingBottom="15dip">
|
||||||
|
|
||||||
|
57
res/layout/trusted_credential_list_container.xml
Normal file
57
res/layout/trusted_credential_list_container.xml
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2016 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.
|
||||||
|
-->
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:visibility="gone">
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/header_view"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:clickable="true"
|
||||||
|
android:background="?android:attr/selectableItemBackground"
|
||||||
|
android:visibility="gone">
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/header_divider"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="2dp"
|
||||||
|
android:background="?android:attr/listDivider"
|
||||||
|
android:visibility="gone"/>
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
|
||||||
|
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/group_indicator"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"/>
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/header_content_container"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"/>
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
<ListView
|
||||||
|
android:id="@+id/cert_list"
|
||||||
|
style="@style/TrustedCredentialsList">
|
||||||
|
</ListView>
|
||||||
|
</LinearLayout>
|
@@ -49,25 +49,26 @@
|
|||||||
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
||||||
android:visibility="gone" />
|
android:visibility="gone" />
|
||||||
|
|
||||||
<ListView
|
<LinearLayout
|
||||||
android:id="@+id/system_list"
|
android:id="@+id/system_content"
|
||||||
android:layout_width="fill_parent"
|
android:orientation="vertical"
|
||||||
android:layout_height="fill_parent"
|
android:layout_width="match_parent"
|
||||||
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
|
android:layout_height="match_parent"
|
||||||
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
|
||||||
android:scrollbarStyle="outsideOverlay"
|
|
||||||
android:visibility="gone">
|
android:visibility="gone">
|
||||||
</ListView>
|
|
||||||
|
<include
|
||||||
|
android:id="@+id/system_personal_container"
|
||||||
|
layout="@layout/trusted_credential_list_container"/>
|
||||||
|
<include
|
||||||
|
android:id="@+id/system_work_container"
|
||||||
|
layout="@layout/trusted_credential_list_container"/>
|
||||||
|
|
||||||
<ExpandableListView
|
<ExpandableListView
|
||||||
android:id="@+id/system_expandable_list"
|
android:id="@+id/system_expandable_list"
|
||||||
android:layout_width="fill_parent"
|
style="@style/TrustedCredentialsList"
|
||||||
android:layout_height="fill_parent"
|
|
||||||
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
|
|
||||||
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
|
||||||
android:scrollbarStyle="outsideOverlay"
|
|
||||||
android:visibility="gone">
|
android:visibility="gone">
|
||||||
</ExpandableListView>
|
</ExpandableListView>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
||||||
@@ -85,25 +86,27 @@
|
|||||||
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
||||||
android:visibility="gone" />
|
android:visibility="gone" />
|
||||||
|
|
||||||
<ListView
|
<LinearLayout
|
||||||
android:id="@+id/user_list"
|
android:id="@+id/user_content"
|
||||||
android:layout_width="fill_parent"
|
android:orientation="vertical"
|
||||||
android:layout_height="fill_parent"
|
android:layout_width="match_parent"
|
||||||
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
|
android:layout_height="match_parent"
|
||||||
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
|
||||||
android:scrollbarStyle="outsideOverlay"
|
|
||||||
android:visibility="gone">
|
android:visibility="gone">
|
||||||
</ListView>
|
|
||||||
|
<include
|
||||||
|
android:id="@+id/user_personal_container"
|
||||||
|
layout="@layout/trusted_credential_list_container"/>
|
||||||
|
|
||||||
|
<include
|
||||||
|
android:id="@+id/user_work_container"
|
||||||
|
layout="@layout/trusted_credential_list_container"/>
|
||||||
|
|
||||||
<ExpandableListView
|
<ExpandableListView
|
||||||
android:id="@+id/user_expandable_list"
|
android:id="@+id/user_expandable_list"
|
||||||
android:layout_width="fill_parent"
|
style="@style/TrustedCredentialsList"
|
||||||
android:layout_height="fill_parent"
|
|
||||||
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
|
|
||||||
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
|
||||||
android:scrollbarStyle="outsideOverlay"
|
|
||||||
android:visibility="gone">
|
android:visibility="gone">
|
||||||
</ExpandableListView>
|
</ExpandableListView>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
||||||
|
@@ -146,6 +146,12 @@
|
|||||||
<style name="SettingsPreferenceHeaderList" parent="@*android:style/PreferenceHeaderList">
|
<style name="SettingsPreferenceHeaderList" parent="@*android:style/PreferenceHeaderList">
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="TrustedCredentialsList">
|
||||||
|
<item name="android:layout_width">fill_parent</item>
|
||||||
|
<item name="android:layout_height">fill_parent</item>
|
||||||
|
<item name="android:scrollbarStyle">outsideOverlay</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
<style name="PreferenceFragmentStyle" parent="@*android:style/PreferenceFragment.Material">
|
<style name="PreferenceFragmentStyle" parent="@*android:style/PreferenceFragment.Material">
|
||||||
<item name="android:layout">@layout/preference_list_fragment</item>
|
<item name="android:layout">@layout/preference_list_fragment</item>
|
||||||
</style>
|
</style>
|
||||||
|
@@ -25,6 +25,9 @@ import android.content.DialogInterface;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.content.pm.UserInfo;
|
import android.content.pm.UserInfo;
|
||||||
|
import android.content.res.TypedArray;
|
||||||
|
import android.database.DataSetObserver;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.net.http.SslCertificate;
|
import android.net.http.SslCertificate;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -36,6 +39,7 @@ import android.security.KeyChain;
|
|||||||
import android.security.KeyChain.KeyChainConnection;
|
import android.security.KeyChain.KeyChainConnection;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
|
import android.util.ArraySet;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@@ -43,6 +47,9 @@ import android.widget.AdapterView;
|
|||||||
import android.widget.BaseAdapter;
|
import android.widget.BaseAdapter;
|
||||||
import android.widget.BaseExpandableListAdapter;
|
import android.widget.BaseExpandableListAdapter;
|
||||||
import android.widget.ExpandableListView;
|
import android.widget.ExpandableListView;
|
||||||
|
import android.widget.FrameLayout;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
import android.widget.Switch;
|
import android.widget.Switch;
|
||||||
@@ -58,8 +65,8 @@ import java.security.cert.CertificateEncodingException;
|
|||||||
import java.security.cert.X509Certificate;
|
import java.security.cert.X509Certificate;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class TrustedCredentialsSettings extends OptionsMenuFragment
|
public class TrustedCredentialsSettings extends OptionsMenuFragment
|
||||||
implements TrustedCredentialsDialogBuilder.DelegateInterface {
|
implements TrustedCredentialsDialogBuilder.DelegateInterface {
|
||||||
@@ -85,33 +92,41 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
|
|||||||
R.string.trusted_credentials_system_tab,
|
R.string.trusted_credentials_system_tab,
|
||||||
R.id.system_tab,
|
R.id.system_tab,
|
||||||
R.id.system_progress,
|
R.id.system_progress,
|
||||||
R.id.system_list,
|
R.id.system_personal_container,
|
||||||
|
R.id.system_work_container,
|
||||||
R.id.system_expandable_list,
|
R.id.system_expandable_list,
|
||||||
|
R.id.system_content,
|
||||||
true),
|
true),
|
||||||
USER("user",
|
USER("user",
|
||||||
R.string.trusted_credentials_user_tab,
|
R.string.trusted_credentials_user_tab,
|
||||||
R.id.user_tab,
|
R.id.user_tab,
|
||||||
R.id.user_progress,
|
R.id.user_progress,
|
||||||
R.id.user_list,
|
R.id.user_personal_container,
|
||||||
|
R.id.user_work_container,
|
||||||
R.id.user_expandable_list,
|
R.id.user_expandable_list,
|
||||||
|
R.id.user_content,
|
||||||
false);
|
false);
|
||||||
|
|
||||||
private final String mTag;
|
private final String mTag;
|
||||||
private final int mLabel;
|
private final int mLabel;
|
||||||
private final int mView;
|
private final int mView;
|
||||||
private final int mProgress;
|
private final int mProgress;
|
||||||
private final int mList;
|
private final int mPersonalList;
|
||||||
|
private final int mWorkList;
|
||||||
private final int mExpandableList;
|
private final int mExpandableList;
|
||||||
|
private final int mContentView;
|
||||||
private final boolean mSwitch;
|
private final boolean mSwitch;
|
||||||
|
|
||||||
private Tab(String tag, int label, int view, int progress, int list, int expandableList,
|
private Tab(String tag, int label, int view, int progress, int personalList, int workList,
|
||||||
boolean withSwitch) {
|
int expandableList, int contentView, boolean withSwitch) {
|
||||||
mTag = tag;
|
mTag = tag;
|
||||||
mLabel = label;
|
mLabel = label;
|
||||||
mView = view;
|
mView = view;
|
||||||
mProgress = progress;
|
mProgress = progress;
|
||||||
mList = list;
|
mPersonalList = personalList;
|
||||||
|
mWorkList = workList;
|
||||||
mExpandableList = expandableList;
|
mExpandableList = expandableList;
|
||||||
|
mContentView = contentView;
|
||||||
mSwitch = withSwitch;
|
mSwitch = withSwitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,25 +149,12 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
|
|||||||
}
|
}
|
||||||
throw new AssertionError();
|
throw new AssertionError();
|
||||||
}
|
}
|
||||||
private void postOperationUpdate(boolean ok, CertHolder certHolder) {
|
|
||||||
if (ok) {
|
|
||||||
if (certHolder.mTab.mSwitch) {
|
|
||||||
certHolder.mDeleted = !certHolder.mDeleted;
|
|
||||||
} else {
|
|
||||||
certHolder.mAdapter.remove(certHolder);
|
|
||||||
}
|
|
||||||
certHolder.mAdapter.notifyDataSetChanged();
|
|
||||||
} else {
|
|
||||||
// bail, reload to reset to known state
|
|
||||||
certHolder.mAdapter.load();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private TabHost mTabHost;
|
private TabHost mTabHost;
|
||||||
|
private ArrayList<GroupAdapter> mGroupAdapters = new ArrayList<>(2);
|
||||||
private AliasOperation mAliasOperation;
|
private AliasOperation mAliasOperation;
|
||||||
private HashMap<Tab, AdapterData.AliasLoader>
|
private Set<AdapterData.AliasLoader> mAliasLoaders = new ArraySet<AdapterData.AliasLoader>(2);
|
||||||
mAliasLoaders = new HashMap<Tab, AdapterData.AliasLoader>(2);
|
|
||||||
private final SparseArray<KeyChainConnection>
|
private final SparseArray<KeyChainConnection>
|
||||||
mKeyChainConnectionByProfileId = new SparseArray<KeyChainConnection>();
|
mKeyChainConnectionByProfileId = new SparseArray<KeyChainConnection>();
|
||||||
|
|
||||||
@@ -164,18 +166,8 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
|
|||||||
if (Intent.ACTION_MANAGED_PROFILE_AVAILABLE.equals(action) ||
|
if (Intent.ACTION_MANAGED_PROFILE_AVAILABLE.equals(action) ||
|
||||||
Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action) ||
|
Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action) ||
|
||||||
Intent.ACTION_MANAGED_PROFILE_UNLOCKED.equals(action)) {
|
Intent.ACTION_MANAGED_PROFILE_UNLOCKED.equals(action)) {
|
||||||
// Reload all alias
|
for (GroupAdapter adapter : mGroupAdapters) {
|
||||||
final ExpandableListView systemView = (ExpandableListView) mTabHost
|
adapter.load();
|
||||||
.findViewById(Tab.SYSTEM.mExpandableList);
|
|
||||||
if (systemView != null) {
|
|
||||||
((TrustedCertificateExpandableAdapter) systemView.getExpandableListAdapter())
|
|
||||||
.load();
|
|
||||||
}
|
|
||||||
final ExpandableListView userView = (ExpandableListView) mTabHost
|
|
||||||
.findViewById(Tab.USER.mExpandableList);
|
|
||||||
if (userView != null) {
|
|
||||||
((TrustedCertificateExpandableAdapter) userView.getExpandableListAdapter())
|
|
||||||
.load();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -214,9 +206,11 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
|
|||||||
@Override
|
@Override
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
getActivity().unregisterReceiver(mWorkProfileChangedReceiver);
|
getActivity().unregisterReceiver(mWorkProfileChangedReceiver);
|
||||||
for (AdapterData.AliasLoader aliasLoader : mAliasLoaders.values()) {
|
for (AdapterData.AliasLoader aliasLoader : mAliasLoaders) {
|
||||||
aliasLoader.cancel(true);
|
aliasLoader.cancel(true);
|
||||||
}
|
}
|
||||||
|
mAliasLoaders.clear();
|
||||||
|
mGroupAdapters.clear();
|
||||||
if (mAliasOperation != null) {
|
if (mAliasOperation != null) {
|
||||||
mAliasOperation.cancel(true);
|
mAliasOperation.cancel(true);
|
||||||
mAliasOperation = null;
|
mAliasOperation = null;
|
||||||
@@ -239,52 +233,31 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
|
|||||||
.setContent(tab.mView);
|
.setContent(tab.mView);
|
||||||
mTabHost.addTab(systemSpec);
|
mTabHost.addTab(systemSpec);
|
||||||
|
|
||||||
if (mUserManager.getUserProfiles().size() > 1) {
|
final int profilesSize = mUserManager.getUserProfiles().size();
|
||||||
ExpandableListView lv = (ExpandableListView) mTabHost.findViewById(tab.mExpandableList);
|
final GroupAdapter groupAdapter = new GroupAdapter(tab);
|
||||||
final TrustedCertificateExpandableAdapter adapter =
|
mGroupAdapters.add(groupAdapter);
|
||||||
new TrustedCertificateExpandableAdapter(tab);
|
|
||||||
lv.setAdapter(adapter);
|
|
||||||
lv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition,
|
|
||||||
long id) {
|
|
||||||
final UserHandle groupUser = adapter.getGroup(groupPosition);
|
|
||||||
final int groupUserId = groupUser.getIdentifier();
|
|
||||||
if (mUserManager.isQuietModeEnabled(groupUser)) {
|
|
||||||
final Intent intent = UnlaunchableAppActivity.createInQuietModeDialogIntent(
|
|
||||||
groupUserId);
|
|
||||||
getActivity().startActivity(intent);
|
|
||||||
return true;
|
|
||||||
} else if (!mUserManager.isUserUnlocked(groupUser)) {
|
|
||||||
final LockPatternUtils lockPatternUtils = new LockPatternUtils(
|
|
||||||
getActivity());
|
|
||||||
if (lockPatternUtils.isSeparateProfileChallengeEnabled(groupUserId)) {
|
|
||||||
startWorkChallenge(groupUserId);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
if (profilesSize == 1) {
|
||||||
lv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
|
final ChildAdapter adapter = groupAdapter.getChildAdapter(0);
|
||||||
@Override
|
adapter.setContainerViewId(tab.mPersonalList);
|
||||||
public boolean onChildClick(ExpandableListView parent, View v,
|
adapter.prepare();
|
||||||
int groupPosition, int childPosition, long id) {
|
} else if (profilesSize == 2) {
|
||||||
showCertDialog(adapter.getChild(groupPosition, childPosition));
|
final int workIndex = groupAdapter.getUserInfoByGroup(1).isManagedProfile() ? 1 : 0;
|
||||||
return true;
|
final int personalIndex = workIndex == 1 ? 0 : 1;
|
||||||
}
|
|
||||||
});
|
final ChildAdapter personalAdapter = groupAdapter.getChildAdapter(personalIndex);
|
||||||
} else {
|
personalAdapter.setContainerViewId(tab.mPersonalList);
|
||||||
ListView lv = (ListView) mTabHost.findViewById(tab.mList);
|
personalAdapter.showHeader(true);
|
||||||
final TrustedCertificateAdapter adapter = new TrustedCertificateAdapter(tab);
|
personalAdapter.prepare();
|
||||||
lv.setAdapter(adapter);
|
|
||||||
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
final ChildAdapter workAdapter = groupAdapter.getChildAdapter(workIndex);
|
||||||
@Override public void onItemClick(AdapterView<?> parent, View view,
|
workAdapter.setContainerViewId(tab.mWorkList);
|
||||||
int pos, long id) {
|
workAdapter.showHeader(true);
|
||||||
showCertDialog(adapter.getItem(pos));
|
workAdapter.showDivider(true);
|
||||||
}
|
workAdapter.prepare();
|
||||||
});
|
} else if (profilesSize >= 3) {
|
||||||
|
groupAdapter.setExpandableListView(
|
||||||
|
(ExpandableListView) mTabHost.findViewById(tab.mExpandableList));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -299,47 +272,19 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
|
|||||||
getActivity().startActivity(newIntent);
|
getActivity().startActivity(newIntent);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Common interface for adapters of both expandable and non-expandable certificate lists.
|
|
||||||
*/
|
|
||||||
private interface TrustedCertificateAdapterCommons {
|
|
||||||
/**
|
|
||||||
* Remove a certificate from the list.
|
|
||||||
* @param certHolder the certificate to be removed.
|
|
||||||
*/
|
|
||||||
void remove(CertHolder certHolder);
|
|
||||||
/**
|
|
||||||
* Notify the adapter that the underlying data set has changed.
|
|
||||||
*/
|
|
||||||
void notifyDataSetChanged();
|
|
||||||
/**
|
|
||||||
* Load the certificates.
|
|
||||||
*/
|
|
||||||
void load();
|
|
||||||
/**
|
|
||||||
* Gets the identifier of the list view the adapter is connected to.
|
|
||||||
* @param tab the tab on which the list view resides.
|
|
||||||
* @return identifier of the list view.
|
|
||||||
*/
|
|
||||||
int getListViewId(Tab tab);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adapter for expandable list view of certificates. Groups in the view correspond to profiles
|
* Adapter for expandable list view of certificates. Groups in the view correspond to profiles
|
||||||
* whereas children correspond to certificates.
|
* whereas children correspond to certificates.
|
||||||
*/
|
*/
|
||||||
private class TrustedCertificateExpandableAdapter extends BaseExpandableListAdapter implements
|
private class GroupAdapter extends BaseExpandableListAdapter implements
|
||||||
TrustedCertificateAdapterCommons {
|
ExpandableListView.OnGroupClickListener, ExpandableListView.OnChildClickListener {
|
||||||
private AdapterData mData;
|
private final AdapterData mData;
|
||||||
|
|
||||||
private TrustedCertificateExpandableAdapter(Tab tab) {
|
private GroupAdapter(Tab tab) {
|
||||||
mData = new AdapterData(tab, this);
|
mData = new AdapterData(tab, this);
|
||||||
load();
|
load();
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public void remove(CertHolder certHolder) {
|
|
||||||
mData.remove(certHolder);
|
|
||||||
}
|
|
||||||
@Override
|
@Override
|
||||||
public int getGroupCount() {
|
public int getGroupCount() {
|
||||||
return mData.mCertHoldersByUserId.size();
|
return mData.mCertHoldersByUserId.size();
|
||||||
@@ -358,12 +303,18 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
|
|||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public CertHolder getChild(int groupPosition, int childPosition) {
|
public CertHolder getChild(int groupPosition, int childPosition) {
|
||||||
return mData.mCertHoldersByUserId.valueAt(groupPosition).get(childPosition);
|
return mData.mCertHoldersByUserId.get(getUserIdByGroup(groupPosition)).get(childPosition);
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public long getGroupId(int groupPosition) {
|
public long getGroupId(int groupPosition) {
|
||||||
|
return getUserIdByGroup(groupPosition);
|
||||||
|
}
|
||||||
|
private int getUserIdByGroup(int groupPosition) {
|
||||||
return mData.mCertHoldersByUserId.keyAt(groupPosition);
|
return mData.mCertHoldersByUserId.keyAt(groupPosition);
|
||||||
}
|
}
|
||||||
|
public UserInfo getUserInfoByGroup(int groupPosition) {
|
||||||
|
return mUserManager.getUserInfo(getUserIdByGroup(groupPosition));
|
||||||
|
}
|
||||||
@Override
|
@Override
|
||||||
public long getChildId(int groupPosition, int childPosition) {
|
public long getChildId(int groupPosition, int childPosition) {
|
||||||
return childPosition;
|
return childPosition;
|
||||||
@@ -382,9 +333,7 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
final TextView title = (TextView) convertView.findViewById(android.R.id.title);
|
final TextView title = (TextView) convertView.findViewById(android.R.id.title);
|
||||||
final UserHandle profile = getGroup(groupPosition);
|
if (getUserInfoByGroup(groupPosition).isManagedProfile()) {
|
||||||
final UserInfo userInfo = mUserManager.getUserInfo(profile.getIdentifier());
|
|
||||||
if (userInfo.isManagedProfile()) {
|
|
||||||
title.setText(R.string.category_work);
|
title.setText(R.string.category_work);
|
||||||
} else {
|
} else {
|
||||||
title.setText(R.string.category_personal);
|
title.setText(R.string.category_personal);
|
||||||
@@ -403,50 +352,227 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
|
|||||||
public boolean isChildSelectable(int groupPosition, int childPosition) {
|
public boolean isChildSelectable(int groupPosition, int childPosition) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
public boolean onChildClick(ExpandableListView expandableListView, View view,
|
||||||
|
int groupPosition, int childPosition, long id) {
|
||||||
|
showCertDialog(getChild(groupPosition, childPosition));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onGroupClick(ExpandableListView expandableListView, View view,
|
||||||
|
int groupPosition, long id) {
|
||||||
|
return !checkGroupExpandableAndStartWarningActivity(groupPosition);
|
||||||
|
}
|
||||||
|
|
||||||
public void load() {
|
public void load() {
|
||||||
mData.new AliasLoader().execute();
|
mData.new AliasLoader().execute();
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public int getListViewId(Tab tab) {
|
|
||||||
return tab.mExpandableList;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class TrustedCertificateAdapter extends BaseAdapter implements
|
|
||||||
TrustedCertificateAdapterCommons {
|
|
||||||
private final AdapterData mData;
|
|
||||||
private TrustedCertificateAdapter(Tab tab) {
|
|
||||||
mData = new AdapterData(tab, this);
|
|
||||||
load();
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void remove(CertHolder certHolder) {
|
public void remove(CertHolder certHolder) {
|
||||||
mData.remove(certHolder);
|
mData.remove(certHolder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setExpandableListView(ExpandableListView lv) {
|
||||||
|
lv.setAdapter(this);
|
||||||
|
lv.setOnGroupClickListener(this);
|
||||||
|
lv.setOnChildClickListener(this);
|
||||||
|
lv.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChildAdapter getChildAdapter(int groupPosition) {
|
||||||
|
return new ChildAdapter(this, groupPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkGroupExpandableAndStartWarningActivity(int groupPosition) {
|
||||||
|
final UserHandle groupUser = getGroup(groupPosition);
|
||||||
|
final int groupUserId = groupUser.getIdentifier();
|
||||||
|
if (mUserManager.isQuietModeEnabled(groupUser)) {
|
||||||
|
final Intent intent = UnlaunchableAppActivity.createInQuietModeDialogIntent(
|
||||||
|
groupUserId);
|
||||||
|
getActivity().startActivity(intent);
|
||||||
|
return false;
|
||||||
|
} else if (!mUserManager.isUserUnlocked(groupUser)) {
|
||||||
|
final LockPatternUtils lockPatternUtils = new LockPatternUtils(
|
||||||
|
getActivity());
|
||||||
|
if (lockPatternUtils.isSeparateProfileChallengeEnabled(groupUserId)) {
|
||||||
|
startWorkChallenge(groupUserId);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private View getViewForCertificate(CertHolder certHolder, Tab mTab, View convertView,
|
||||||
|
ViewGroup parent) {
|
||||||
|
ViewHolder holder;
|
||||||
|
if (convertView == null) {
|
||||||
|
LayoutInflater inflater = LayoutInflater.from(getActivity());
|
||||||
|
convertView = inflater.inflate(R.layout.trusted_credential, parent, false);
|
||||||
|
holder = new ViewHolder();
|
||||||
|
holder.mSubjectPrimaryView = (TextView)
|
||||||
|
convertView.findViewById(R.id.trusted_credential_subject_primary);
|
||||||
|
holder.mSubjectSecondaryView = (TextView)
|
||||||
|
convertView.findViewById(R.id.trusted_credential_subject_secondary);
|
||||||
|
holder.mSwitch = (Switch) convertView.findViewById(
|
||||||
|
R.id.trusted_credential_status);
|
||||||
|
convertView.setTag(holder);
|
||||||
|
} else {
|
||||||
|
holder = (ViewHolder) convertView.getTag();
|
||||||
|
}
|
||||||
|
holder.mSubjectPrimaryView.setText(certHolder.mSubjectPrimary);
|
||||||
|
holder.mSubjectSecondaryView.setText(certHolder.mSubjectSecondary);
|
||||||
|
if (mTab.mSwitch) {
|
||||||
|
holder.mSwitch.setChecked(!certHolder.mDeleted);
|
||||||
|
holder.mSwitch.setEnabled(!mUserManager.hasUserRestriction(
|
||||||
|
UserManager.DISALLOW_CONFIG_CREDENTIALS,
|
||||||
|
new UserHandle(certHolder.mProfileId)));
|
||||||
|
holder.mSwitch.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
return convertView;
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ViewHolder {
|
||||||
|
private TextView mSubjectPrimaryView;
|
||||||
|
private TextView mSubjectSecondaryView;
|
||||||
|
private Switch mSwitch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ChildAdapter extends BaseAdapter implements View.OnClickListener,
|
||||||
|
AdapterView.OnItemClickListener {
|
||||||
|
private final int[] GROUP_EXPANDED_STATE_SET = {com.android.internal.R.attr.state_expanded};
|
||||||
|
private final int[] EMPTY_STATE_SET = {};
|
||||||
|
private final LinearLayout.LayoutParams HIDE_LAYOUT_PARAMS = new LinearLayout.LayoutParams(
|
||||||
|
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
|
||||||
|
private final LinearLayout.LayoutParams SHOW_LAYOUT_PARAMS = new LinearLayout.LayoutParams(
|
||||||
|
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, 1f);
|
||||||
|
private final GroupAdapter mParent;
|
||||||
|
private final int mGroupPosition;
|
||||||
|
/*
|
||||||
|
* This class doesn't hold the actual data. Events should notify parent.
|
||||||
|
* When notifying DataSet events in this class, events should be forwarded to mParent.
|
||||||
|
* i.e. this.notifyDataSetChanged -> mParent.notifyDataSetChanged -> mObserver.onChanged
|
||||||
|
* -> outsideObservers.onChanged() (e.g. ListView)
|
||||||
|
*/
|
||||||
|
private final DataSetObserver mObserver = new DataSetObserver() {
|
||||||
@Override
|
@Override
|
||||||
public int getListViewId(Tab tab) {
|
public void onChanged() {
|
||||||
return tab.mList;
|
super.onChanged();
|
||||||
|
ChildAdapter.super.notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public void load() {
|
public void onInvalidated() {
|
||||||
mData.new AliasLoader().execute();
|
super.onInvalidated();
|
||||||
|
ChildAdapter.super.notifyDataSetInvalidated();
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private boolean mIsListExpanded = true;
|
||||||
|
private LinearLayout mContainerView;
|
||||||
|
private ViewGroup mHeaderView;
|
||||||
|
private ListView mListView;
|
||||||
|
private ImageView mIndicatorView;
|
||||||
|
|
||||||
|
private ChildAdapter(GroupAdapter parent, int groupPosition) {
|
||||||
|
mParent = parent;
|
||||||
|
mGroupPosition = groupPosition;
|
||||||
|
mParent.registerDataSetObserver(mObserver);
|
||||||
|
}
|
||||||
|
|
||||||
@Override public int getCount() {
|
@Override public int getCount() {
|
||||||
List<CertHolder> certHolders = mData.mCertHoldersByUserId.valueAt(0);
|
return mParent.getChildrenCount(mGroupPosition);
|
||||||
if (certHolders != null) {
|
|
||||||
return certHolders.size();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
@Override public CertHolder getItem(int position) {
|
@Override public CertHolder getItem(int position) {
|
||||||
return mData.mCertHoldersByUserId.valueAt(0).get(position);
|
return mParent.getChild(mGroupPosition, position);
|
||||||
}
|
}
|
||||||
@Override public long getItemId(int position) {
|
@Override public long getItemId(int position) {
|
||||||
return position;
|
return mParent.getChildId(mGroupPosition, position);
|
||||||
}
|
}
|
||||||
@Override public View getView(int position, View view, ViewGroup parent) {
|
@Override public View getView(int position, View convertView, ViewGroup parent) {
|
||||||
return getViewForCertificate(getItem(position), mData.mTab, view, parent);
|
return mParent.getChildView(mGroupPosition, position, false, convertView, parent);
|
||||||
|
}
|
||||||
|
// DataSet events
|
||||||
|
@Override
|
||||||
|
public void notifyDataSetChanged() {
|
||||||
|
// Don't call super as the parent will propagate this event back later in mObserver
|
||||||
|
mParent.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void notifyDataSetInvalidated() {
|
||||||
|
// Don't call super as the parent will propagate this event back later in mObserver
|
||||||
|
mParent.notifyDataSetInvalidated();
|
||||||
|
}
|
||||||
|
|
||||||
|
// View related codes
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
mIsListExpanded = checkGroupExpandableAndStartWarningActivity() && !mIsListExpanded;
|
||||||
|
refreshViews();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onItemClick(AdapterView<?> adapterView, View view, int pos, long id) {
|
||||||
|
showCertDialog(getItem(pos));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setContainerViewId(int viewId) {
|
||||||
|
mContainerView = (LinearLayout) mTabHost.findViewById(viewId);
|
||||||
|
mContainerView.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
mListView = (ListView) mContainerView.findViewById(R.id.cert_list);
|
||||||
|
mListView.setAdapter(this);
|
||||||
|
mListView.setOnItemClickListener(this);
|
||||||
|
|
||||||
|
mHeaderView = (ViewGroup) mContainerView.findViewById(R.id.header_view);
|
||||||
|
mHeaderView.setOnClickListener(this);
|
||||||
|
|
||||||
|
mIndicatorView = (ImageView) mHeaderView.findViewById(R.id.group_indicator);
|
||||||
|
mIndicatorView.setImageDrawable(getGroupIndicator());
|
||||||
|
|
||||||
|
FrameLayout headerContentContainer = (FrameLayout)
|
||||||
|
mHeaderView.findViewById(R.id.header_content_container);
|
||||||
|
headerContentContainer.addView(
|
||||||
|
mParent.getGroupView(mGroupPosition, true /* parent ignores it */, null,
|
||||||
|
headerContentContainer));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showHeader(boolean showHeader) {
|
||||||
|
mHeaderView.setVisibility(showHeader ? View.VISIBLE : View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showDivider(boolean showDivider) {
|
||||||
|
View dividerView = mHeaderView.findViewById(R.id.header_divider);
|
||||||
|
dividerView.setVisibility(showDivider ? View.VISIBLE : View.GONE );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void prepare() {
|
||||||
|
mIsListExpanded = checkGroupExpandableAndStartWarningActivity();
|
||||||
|
refreshViews();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkGroupExpandableAndStartWarningActivity() {
|
||||||
|
return mParent.checkGroupExpandableAndStartWarningActivity(mGroupPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshViews() {
|
||||||
|
mIndicatorView.setImageState(mIsListExpanded ? GROUP_EXPANDED_STATE_SET
|
||||||
|
: EMPTY_STATE_SET, false);
|
||||||
|
mListView.setVisibility(mIsListExpanded ? View.VISIBLE : View.GONE);
|
||||||
|
mContainerView.setLayoutParams(mIsListExpanded ? SHOW_LAYOUT_PARAMS
|
||||||
|
: HIDE_LAYOUT_PARAMS);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get group indicator from styles of ExpandableListView
|
||||||
|
private Drawable getGroupIndicator() {
|
||||||
|
final TypedArray a = getActivity().obtainStyledAttributes(null,
|
||||||
|
com.android.internal.R.styleable.ExpandableListView,
|
||||||
|
com.android.internal.R.attr.expandableListViewStyle, 0);
|
||||||
|
Drawable groupIndicator = a.getDrawable(
|
||||||
|
com.android.internal.R.styleable.ExpandableListView_groupIndicator);
|
||||||
|
a.recycle();
|
||||||
|
return groupIndicator;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -454,21 +580,25 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
|
|||||||
private final SparseArray<List<CertHolder>> mCertHoldersByUserId =
|
private final SparseArray<List<CertHolder>> mCertHoldersByUserId =
|
||||||
new SparseArray<List<CertHolder>>();
|
new SparseArray<List<CertHolder>>();
|
||||||
private final Tab mTab;
|
private final Tab mTab;
|
||||||
private final TrustedCertificateAdapterCommons mAdapter;
|
private final GroupAdapter mAdapter;
|
||||||
|
|
||||||
private AdapterData(Tab tab, TrustedCertificateAdapterCommons adapter) {
|
private AdapterData(Tab tab, GroupAdapter adapter) {
|
||||||
mAdapter = adapter;
|
mAdapter = adapter;
|
||||||
mTab = tab;
|
mTab = tab;
|
||||||
}
|
}
|
||||||
|
|
||||||
private class AliasLoader extends AsyncTask<Void, Integer, SparseArray<List<CertHolder>>> {
|
private class AliasLoader extends AsyncTask<Void, Integer, SparseArray<List<CertHolder>>> {
|
||||||
private ProgressBar mProgressBar;
|
private ProgressBar mProgressBar;
|
||||||
private View mList;
|
private View mContentView;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
|
|
||||||
public AliasLoader() {
|
public AliasLoader() {
|
||||||
mContext = getActivity();
|
mContext = getActivity();
|
||||||
mAliasLoaders.put(mTab, this);
|
mAliasLoaders.add(this);
|
||||||
|
List<UserHandle> profiles = mUserManager.getUserProfiles();
|
||||||
|
for (UserHandle profile : profiles) {
|
||||||
|
mCertHoldersByUserId.put(profile.getIdentifier(), new ArrayList<CertHolder>());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean shouldSkipProfile(UserHandle userHandle) {
|
private boolean shouldSkipProfile(UserHandle userHandle) {
|
||||||
@@ -479,9 +609,9 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
|
|||||||
@Override protected void onPreExecute() {
|
@Override protected void onPreExecute() {
|
||||||
View content = mTabHost.getTabContentView();
|
View content = mTabHost.getTabContentView();
|
||||||
mProgressBar = (ProgressBar) content.findViewById(mTab.mProgress);
|
mProgressBar = (ProgressBar) content.findViewById(mTab.mProgress);
|
||||||
mList = content.findViewById(mAdapter.getListViewId(mTab));
|
mContentView = content.findViewById(mTab.mContentView);
|
||||||
mProgressBar.setVisibility(View.VISIBLE);
|
mProgressBar.setVisibility(View.VISIBLE);
|
||||||
mList.setVisibility(View.GONE);
|
mContentView.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
@Override protected SparseArray<List<CertHolder>> doInBackground(Void... params) {
|
@Override protected SparseArray<List<CertHolder>> doInBackground(Void... params) {
|
||||||
SparseArray<List<CertHolder>> certHoldersByProfile =
|
SparseArray<List<CertHolder>> certHoldersByProfile =
|
||||||
@@ -565,9 +695,9 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
|
|||||||
}
|
}
|
||||||
mAdapter.notifyDataSetChanged();
|
mAdapter.notifyDataSetChanged();
|
||||||
mProgressBar.setVisibility(View.GONE);
|
mProgressBar.setVisibility(View.GONE);
|
||||||
mList.setVisibility(View.VISIBLE);
|
mContentView.setVisibility(View.VISIBLE);
|
||||||
mProgressBar.setProgress(0);
|
mProgressBar.setProgress(0);
|
||||||
mAliasLoaders.remove(mTab);
|
mAliasLoaders.remove(this);
|
||||||
showTrustAllCaDialogIfNeeded();
|
showTrustAllCaDialogIfNeeded();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -615,7 +745,7 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
|
|||||||
/* package */ static class CertHolder implements Comparable<CertHolder> {
|
/* package */ static class CertHolder implements Comparable<CertHolder> {
|
||||||
public int mProfileId;
|
public int mProfileId;
|
||||||
private final IKeyChainService mService;
|
private final IKeyChainService mService;
|
||||||
private final TrustedCertificateAdapterCommons mAdapter;
|
private final GroupAdapter mAdapter;
|
||||||
private final Tab mTab;
|
private final Tab mTab;
|
||||||
private final String mAlias;
|
private final String mAlias;
|
||||||
private final X509Certificate mX509Cert;
|
private final X509Certificate mX509Cert;
|
||||||
@@ -626,7 +756,7 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
|
|||||||
private boolean mDeleted;
|
private boolean mDeleted;
|
||||||
|
|
||||||
private CertHolder(IKeyChainService service,
|
private CertHolder(IKeyChainService service,
|
||||||
TrustedCertificateAdapterCommons adapter,
|
GroupAdapter adapter,
|
||||||
Tab tab,
|
Tab tab,
|
||||||
String alias,
|
String alias,
|
||||||
X509Certificate x509Cert,
|
X509Certificate x509Cert,
|
||||||
@@ -706,40 +836,6 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private View getViewForCertificate(CertHolder certHolder, Tab mTab, View convertView,
|
|
||||||
ViewGroup parent) {
|
|
||||||
ViewHolder holder;
|
|
||||||
if (convertView == null) {
|
|
||||||
LayoutInflater inflater = LayoutInflater.from(getActivity());
|
|
||||||
convertView = inflater.inflate(R.layout.trusted_credential, parent, false);
|
|
||||||
holder = new ViewHolder();
|
|
||||||
holder.mSubjectPrimaryView = (TextView)
|
|
||||||
convertView.findViewById(R.id.trusted_credential_subject_primary);
|
|
||||||
holder.mSubjectSecondaryView = (TextView)
|
|
||||||
convertView.findViewById(R.id.trusted_credential_subject_secondary);
|
|
||||||
holder.mSwitch = (Switch) convertView.findViewById(
|
|
||||||
R.id.trusted_credential_status);
|
|
||||||
convertView.setTag(holder);
|
|
||||||
} else {
|
|
||||||
holder = (ViewHolder) convertView.getTag();
|
|
||||||
}
|
|
||||||
holder.mSubjectPrimaryView.setText(certHolder.mSubjectPrimary);
|
|
||||||
holder.mSubjectSecondaryView.setText(certHolder.mSubjectSecondary);
|
|
||||||
if (mTab.mSwitch) {
|
|
||||||
holder.mSwitch.setChecked(!certHolder.mDeleted);
|
|
||||||
holder.mSwitch.setEnabled(!mUserManager.hasUserRestriction(
|
|
||||||
UserManager.DISALLOW_CONFIG_CREDENTIALS,
|
|
||||||
new UserHandle(certHolder.mProfileId)));
|
|
||||||
holder.mSwitch.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
return convertView;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class ViewHolder {
|
|
||||||
private TextView mSubjectPrimaryView;
|
|
||||||
private TextView mSubjectSecondaryView;
|
|
||||||
private Switch mSwitch;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isTrustAllCaCertModeInProgress() {
|
private boolean isTrustAllCaCertModeInProgress() {
|
||||||
return mTrustAllCaUserId != UserHandle.USER_NULL;
|
return mTrustAllCaUserId != UserHandle.USER_NULL;
|
||||||
@@ -824,7 +920,17 @@ public class TrustedCredentialsSettings extends OptionsMenuFragment
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPostExecute(Boolean ok) {
|
protected void onPostExecute(Boolean ok) {
|
||||||
mCertHolder.mTab.postOperationUpdate(ok, mCertHolder);
|
if (ok) {
|
||||||
|
if (mCertHolder.mTab.mSwitch) {
|
||||||
|
mCertHolder.mDeleted = !mCertHolder.mDeleted;
|
||||||
|
} else {
|
||||||
|
mCertHolder.mAdapter.remove(mCertHolder);
|
||||||
|
}
|
||||||
|
mCertHolder.mAdapter.notifyDataSetChanged();
|
||||||
|
} else {
|
||||||
|
// bail, reload to reset to known state
|
||||||
|
mCertHolder.mAdapter.load();
|
||||||
|
}
|
||||||
mAliasOperation = null;
|
mAliasOperation = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user