TrustCredentials listview should be expanded by default
UI Change for 2-profile case:
1. When both personal and work listview are expanded, half height is allocated for each list view
2. When only one listview is expanded, full height is allocated to the list view
Video can be found at go/trust-cred-split-view
- Use 2 ListView instead of 1 ExpandableListView in order to scoll the list independently
- The ui is not changed for only one or more than 3 profiles.
- Remove TrustedCertificateAdapterCommons, and wrap GroupAdapter by ChildAdapter in order to re-use more codes
- clear mAliasLoaders in onDestroy. (Seems it's a bug.)
- When work mode or fbe locked, force to collapse work list view. User message will be prompted when user press on header
- Groups in GroupAdapter is set synchronously instead of async, since we assume the number of users are fixed during initialization
- DataSet events will go through GroupAdapter to notifiy ChildAdapter
Bug:28236955
(cherry picked from commit 7dde845544
)
Change-Id: I87293afc56e9cc270c2289111bab6f1809351faf
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