Merge "Fix Work Challenge / personal confirm credential is shown on top of keyguard after rotation" into nyc-dev
diff --git a/src/com/android/settings/TrustedCredentialsDialogBuilder.java b/src/com/android/settings/TrustedCredentialsDialogBuilder.java
index 2508d8c..da557fe 100644
--- a/src/com/android/settings/TrustedCredentialsDialogBuilder.java
+++ b/src/com/android/settings/TrustedCredentialsDialogBuilder.java
@@ -38,12 +38,14 @@
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
+import java.util.function.IntConsumer;
class TrustedCredentialsDialogBuilder extends AlertDialog.Builder {
public interface DelegateInterface {
List<X509Certificate> getX509CertsFromCertHolder(CertHolder certHolder);
void removeOrInstallCert(CertHolder certHolder);
- boolean startConfirmCredentialIfNotConfirmed(int userId);
+ boolean startConfirmCredentialIfNotConfirmed(int userId,
+ IntConsumer onCredentialConfirmedListener);
}
private final DialogEventHandler mDialogEventHandler;
@@ -145,7 +147,8 @@
private void onClickTrust() {
CertHolder certHolder = getCurrentCertInfo();
- if (!mDelegate.startConfirmCredentialIfNotConfirmed(certHolder.getUserId())) {
+ if (!mDelegate.startConfirmCredentialIfNotConfirmed(certHolder.getUserId(),
+ this::onCredentialConfirmed)) {
mDpm.approveCaCert(certHolder.getAlias(), certHolder.getUserId(), true);
nextOrDismiss();
}
@@ -168,6 +171,14 @@
.show();
}
+ private void onCredentialConfirmed(int userId) {
+ if (mDialog.isShowing() && mNeedsApproval && getCurrentCertInfo() != null
+ && getCurrentCertInfo().getUserId() == userId) {
+ // Treat it as user just clicks "trust" for this cert
+ onClickTrust();
+ }
+ }
+
private CertHolder getCurrentCertInfo() {
return mCurrentCertIndex < mCertHolders.length ? mCertHolders[mCurrentCertIndex] : null;
}
diff --git a/src/com/android/settings/TrustedCredentialsSettings.java b/src/com/android/settings/TrustedCredentialsSettings.java
index 4100e75..92b7f6b 100644
--- a/src/com/android/settings/TrustedCredentialsSettings.java
+++ b/src/com/android/settings/TrustedCredentialsSettings.java
@@ -68,6 +68,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Set;
+import java.util.function.IntConsumer;
public class TrustedCredentialsSettings extends OptionsMenuFragment
implements TrustedCredentialsDialogBuilder.DelegateInterface {
@@ -159,6 +160,7 @@
private AliasOperation mAliasOperation;
private ArraySet<Integer> mConfirmedCredentialUsers;
private int mConfirmingCredentialUser;
+ private IntConsumer mConfirmingCredentialListener;
private Set<AdapterData.AliasLoader> mAliasLoaders = new ArraySet<AdapterData.AliasLoader>(2);
private final SparseArray<KeyChainConnection>
mKeyChainConnectionByProfileId = new SparseArray<KeyChainConnection>();
@@ -199,6 +201,8 @@
}
}
+ mConfirmingCredentialListener = null;
+
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
@@ -246,10 +250,18 @@
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CONFIRM_CREDENTIALS) {
- if (resultCode == Activity.RESULT_OK) {
- mConfirmedCredentialUsers.add(mConfirmingCredentialUser);
- }
+ int userId = mConfirmingCredentialUser;
+ IntConsumer listener = mConfirmingCredentialListener;
+ // reset them before calling the listener because the listener may call back to start
+ // activity again. (though it should never happen.)
mConfirmingCredentialUser = UserHandle.USER_NULL;
+ mConfirmingCredentialListener = null;
+ if (resultCode == Activity.RESULT_OK) {
+ mConfirmedCredentialUsers.add(userId);
+ if (listener != null) {
+ listener.accept(userId);
+ }
+ }
}
}
@@ -942,12 +954,18 @@
}
@Override
- public boolean startConfirmCredentialIfNotConfirmed(int userId) {
+ public boolean startConfirmCredentialIfNotConfirmed(int userId,
+ IntConsumer onCredentialConfirmedListener) {
if (mConfirmedCredentialUsers.contains(userId)) {
// Credential has been confirmed. Don't start activity.
return false;
}
- return startConfirmCredential(userId);
+
+ boolean result = startConfirmCredential(userId);
+ if (result) {
+ mConfirmingCredentialListener = onCredentialConfirmedListener;
+ }
+ return result;
}
private class AliasOperation extends AsyncTask<Void, Void, Boolean> {
diff --git a/src/com/android/settings/UserCredentialsSettings.java b/src/com/android/settings/UserCredentialsSettings.java
index a09800b..c264ff7 100644
--- a/src/com/android/settings/UserCredentialsSettings.java
+++ b/src/com/android/settings/UserCredentialsSettings.java
@@ -45,6 +45,7 @@
import android.widget.TextView;
import com.android.internal.logging.MetricsProto.MetricsEvent;
+import com.android.internal.widget.LockPatternUtils;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
@@ -203,6 +204,11 @@
KeyStore keyStore = KeyStore.getInstance();
for (final Credential.Type type : Credential.Type.values()) {
for (final String alias : keyStore.list(type.prefix)) {
+ // Do not show work profile keys in user credentials
+ if (alias.startsWith(LockPatternUtils.PROFILE_KEY_NAME_ENCRYPT) ||
+ alias.startsWith(LockPatternUtils.PROFILE_KEY_NAME_DECRYPT)) {
+ continue;
+ }
Credential c = credentials.get(alias);
if (c == null) {
credentials.put(alias, (c = new Credential(alias)));
diff --git a/src/com/android/settings/applications/DefaultEmergencyPreference.java b/src/com/android/settings/applications/DefaultEmergencyPreference.java
index 1d23263..f0a97b1 100644
--- a/src/com/android/settings/applications/DefaultEmergencyPreference.java
+++ b/src/com/android/settings/applications/DefaultEmergencyPreference.java
@@ -44,6 +44,7 @@
public class DefaultEmergencyPreference extends AppListPreference
implements SelfAvailablePreference {
+ private static final boolean DEFAULT_EMERGENCY_APP_IS_CONFIGURABLE = false;
private final ContentResolver mContentResolver;
public static final Intent QUERY_INTENT = new Intent(
@@ -143,7 +144,8 @@
}
public boolean isAvailable(Context context) {
- return isCapable(context)
+ return DEFAULT_EMERGENCY_APP_IS_CONFIGURABLE
+ && isCapable(context)
&& context.getPackageManager().resolveActivity(QUERY_INTENT, 0) != null;
}
diff --git a/src/com/android/settings/dashboard/conditional/ConditionManager.java b/src/com/android/settings/dashboard/conditional/ConditionManager.java
index 128ac27..f38bb2a 100644
--- a/src/com/android/settings/dashboard/conditional/ConditionManager.java
+++ b/src/com/android/settings/dashboard/conditional/ConditionManager.java
@@ -56,7 +56,7 @@
private ConditionManager(Context context) {
mContext = context;
- mConditions = new ArrayList<Condition>();
+ mConditions = new ArrayList<>();
new ConditionLoader().execute();
}
@@ -67,11 +67,11 @@
}
}
- private void readFromXml() {
- if (DEBUG) Log.d(TAG, "Reading from " + mXmlFile.toString());
+ private void readFromXml(File xmlFile, ArrayList<Condition> conditions) {
+ if (DEBUG) Log.d(TAG, "Reading from " + xmlFile.toString());
try {
XmlPullParser parser = Xml.newPullParser();
- FileReader in = new FileReader(mXmlFile);
+ FileReader in = new FileReader(xmlFile);
parser.setInput(in);
int state = parser.getEventType();
@@ -86,7 +86,7 @@
PersistableBundle bundle = PersistableBundle.restoreFromXml(parser);
if (DEBUG) Log.d(TAG, "Reading " + clz + " -- " + bundle);
condition.restoreState(bundle);
- mConditions.add(condition);
+ conditions.add(condition);
while (parser.getDepth() > depth) {
parser.next();
}
@@ -129,21 +129,21 @@
}
}
- private void addMissingConditions() {
- addIfMissing(AirplaneModeCondition.class);
- addIfMissing(HotspotCondition.class);
- addIfMissing(DndCondition.class);
- addIfMissing(BatterySaverCondition.class);
- addIfMissing(CellularDataCondition.class);
- addIfMissing(BackgroundDataCondition.class);
- addIfMissing(WorkModeCondition.class);
- Collections.sort(mConditions, CONDITION_COMPARATOR);
+ private void addMissingConditions(ArrayList<Condition> conditions) {
+ addIfMissing(AirplaneModeCondition.class, conditions);
+ addIfMissing(HotspotCondition.class, conditions);
+ addIfMissing(DndCondition.class, conditions);
+ addIfMissing(BatterySaverCondition.class, conditions);
+ addIfMissing(CellularDataCondition.class, conditions);
+ addIfMissing(BackgroundDataCondition.class, conditions);
+ addIfMissing(WorkModeCondition.class, conditions);
+ Collections.sort(conditions, CONDITION_COMPARATOR);
}
- private void addIfMissing(Class<? extends Condition> clz) {
- if (getCondition(clz) == null) {
+ private void addIfMissing(Class<? extends Condition> clz, ArrayList<Condition> conditions) {
+ if (getCondition(clz, conditions) == null) {
if (DEBUG) Log.d(TAG, "Adding missing " + clz.getName());
- mConditions.add(createCondition(clz));
+ conditions.add(createCondition(clz));
}
}
@@ -171,10 +171,14 @@
}
public <T extends Condition> T getCondition(Class<T> clz) {
- final int N = mConditions.size();
+ return getCondition(clz, mConditions);
+ }
+
+ private <T extends Condition> T getCondition(Class<T> clz, List<Condition> conditions) {
+ final int N = conditions.size();
for (int i = 0; i < N; i++) {
- if (clz.equals(mConditions.get(i).getClass())) {
- return (T) mConditions.get(i);
+ if (clz.equals(conditions.get(i).getClass())) {
+ return (T) conditions.get(i);
}
}
return null;
@@ -213,19 +217,22 @@
mListeners.remove(listener);
}
- private class ConditionLoader extends AsyncTask<Void, Void, Void> {
+ private class ConditionLoader extends AsyncTask<Void, Void, ArrayList<Condition>> {
@Override
- protected Void doInBackground(Void... params) {
+ protected ArrayList<Condition> doInBackground(Void... params) {
+ ArrayList<Condition> conditions = new ArrayList<>();
mXmlFile = new File(mContext.getFilesDir(), FILE_NAME);
if (mXmlFile.exists()) {
- readFromXml();
+ readFromXml(mXmlFile, conditions);
}
- addMissingConditions();
- return null;
+ addMissingConditions(conditions);
+ return conditions;
}
@Override
- protected void onPostExecute(Void aVoid) {
+ protected void onPostExecute(ArrayList<Condition> conditions) {
+ mConditions.clear();
+ mConditions.addAll(conditions);
final int N = mListeners.size();
for (int i = 0; i < N; i++) {
mListeners.get(i).onConditionsChanged();
diff --git a/src/com/android/settings/deviceinfo/SimStatus.java b/src/com/android/settings/deviceinfo/SimStatus.java
index 0acad37..610744b 100644
--- a/src/com/android/settings/deviceinfo/SimStatus.java
+++ b/src/com/android/settings/deviceinfo/SimStatus.java
@@ -362,7 +362,7 @@
mShowLatestAreaInfo = true;
}
}
- PersistableBundle carrierConfig = mCarrierConfigManager.getConfig(
+ PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(
mSir.getSubscriptionId());
mShowICCID = carrierConfig.getBoolean(
CarrierConfigManager.KEY_SHOW_ICCID_IN_SIM_STATUS_BOOL);
diff --git a/src/com/android/settings/search/DynamicIndexableContentMonitor.java b/src/com/android/settings/search/DynamicIndexableContentMonitor.java
index 6753a76..a24ec50 100644
--- a/src/com/android/settings/search/DynamicIndexableContentMonitor.java
+++ b/src/com/android/settings/search/DynamicIndexableContentMonitor.java
@@ -34,10 +34,12 @@
import android.os.Looper;
import android.os.Message;
import android.os.UserHandle;
+import android.os.UserManager;
import android.print.PrintManager;
import android.print.PrintServicesLoader;
import android.printservice.PrintServiceInfo;
import android.provider.UserDictionary;
+import android.util.Log;
import android.view.accessibility.AccessibilityManager;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
@@ -53,6 +55,7 @@
public final class DynamicIndexableContentMonitor extends PackageMonitor implements
InputManager.InputDeviceListener,
LoaderManager.LoaderCallbacks<List<PrintServiceInfo>> {
+ private static final String TAG = "DynamicIndexableContentMonitor";
private static final long DELAY_PROCESS_PACKAGE_CHANGE = 2000;
@@ -84,6 +87,7 @@
private Context mContext;
private boolean mHasFeatureIme;
+ private boolean mRegistered;
private static Intent getAccessibilityServiceIntent(String packageName) {
final Intent intent = new Intent(AccessibilityService.SERVICE_INTERFACE);
@@ -100,6 +104,14 @@
public void register(Activity activity, int loaderId) {
mContext = activity;
+ if (!mContext.getSystemService(UserManager.class).isUserUnlocked()) {
+ Log.w(TAG, "Skipping content monitoring because user is locked");
+ mRegistered = false;
+ return;
+ } else {
+ mRegistered = true;
+ }
+
boolean hasFeaturePrinting = mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_PRINTING);
mHasFeatureIme = mContext.getPackageManager().hasSystemFeature(
@@ -151,7 +163,10 @@
register(activity, Looper.getMainLooper(), UserHandle.CURRENT, false);
}
+ @Override
public void unregister() {
+ if (!mRegistered) return;
+
super.unregister();
InputManager inputManager = (InputManager) mContext.getSystemService(
@@ -183,13 +198,17 @@
@Override
public void onPackageModified(String packageName) {
super.onPackageModified(packageName);
- final int state = mContext.getPackageManager().getApplicationEnabledSetting(
- packageName);
- if (state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
- || state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
- postMessage(MSG_PACKAGE_AVAILABLE, packageName);
- } else {
- postMessage(MSG_PACKAGE_UNAVAILABLE, packageName);
+ try {
+ final int state = mContext.getPackageManager().getApplicationEnabledSetting(
+ packageName);
+ if (state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
+ || state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
+ postMessage(MSG_PACKAGE_AVAILABLE, packageName);
+ } else {
+ postMessage(MSG_PACKAGE_UNAVAILABLE, packageName);
+ }
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Package does not exist: " + packageName, e);
}
}
diff --git a/src/com/android/settings/vpn2/ConfigDialogFragment.java b/src/com/android/settings/vpn2/ConfigDialogFragment.java
index 0dbaa9a..788b9a9 100644
--- a/src/com/android/settings/vpn2/ConfigDialogFragment.java
+++ b/src/com/android/settings/vpn2/ConfigDialogFragment.java
@@ -176,6 +176,7 @@
try {
LegacyVpnInfo connected = mService.getLegacyVpnInfo(UserHandle.myUserId());
if (connected != null && profile.key.equals(connected.key)) {
+ VpnUtils.clearLockdownVpn(getContext());
mService.prepareVpn(VpnConfig.LEGACY_VPN, VpnConfig.LEGACY_VPN,
UserHandle.myUserId());
}