Merge "Add activity label to encryption interstitial" into nyc-dev
diff --git a/res/layout/preference_importance_slider.xml b/res/layout/preference_importance_slider.xml
index dc7c9db..ddbcd30 100644
--- a/res/layout/preference_importance_slider.xml
+++ b/res/layout/preference_importance_slider.xml
@@ -58,8 +58,8 @@
                 android:focusable="true"
                 android:background="#00ffffff"
                 android:progressBackgroundTint="@color/importance_secondary_slider_color"
-                android:thumbTint="@color/importance_disabled_slider_color"
-                android:progressTint="@color/importance_disabled_slider_color"
+                android:thumbTint="@color/importance_slider_color"
+                android:progressTint="@color/importance_slider_color"
                 style="@android:style/Widget.Material.SeekBar.Discrete"
                 android:tickMarkTint="@android:color/black" />
 
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index b9748ed..72c76e6 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -3000,7 +3000,7 @@
     <string name="wifi" msgid="1081550856200013637">"Wi-Fi"</string>
     <string name="ethernet" msgid="6600095783781389720">"Ethernet"</string>
     <string name="cell_data_template" msgid="3308709914705592281">"Datos móviles: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
-    <string name="wifi_data_template" msgid="501654649753761778">"Datos de Wi-Fi: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
+    <string name="wifi_data_template" msgid="501654649753761778">"<xliff:g id="ID_1">%1$s</xliff:g> de datos con Wi-Fi"</string>
     <string name="ethernet_data_template" msgid="5775729859383597507">"Datos de Ethernet: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="cell_warning_only" msgid="763147658209027140">"Advertencia de datos: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
     <string name="cell_warning_and_limit" msgid="2273413629267437470">"Advertencia de datos: <xliff:g id="ID_1">%1$s</xliff:g>/Límite de datos: <xliff:g id="ID_2">%2$s</xliff:g>"</string>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index 30766fc..ba35cfb 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -2347,7 +2347,7 @@
     <string name="global_change_warning" product="tablet" msgid="8045013389464294039">"ဤအစီအမံသည် ဤတက်ဘလက်မှ သူံးစွဲသူအားလုံးကို အကျိုးသက်ရောက်လိမ့်မည်။"</string>
     <string name="global_change_warning" product="default" msgid="2461264421590324675">"ဤဆက်တင်းသည် ဤဖုန်းမှ သူံးစွဲသူအားလုံးကို အကျိုးသက်ရောက်လိမ့်မည်။"</string>
     <string name="global_locale_change_title" msgid="5956281361384221451">"ဘာသာစကားပြောင်းရန်"</string>
-    <string name="nfc_payment_settings_title" msgid="1807298287380821613">"တို့ထ‌ိပေးစနစ်"</string>
+    <string name="nfc_payment_settings_title" msgid="1807298287380821613">"တို့ထိပေးစနစ်"</string>
     <string name="nfc_payment_how_it_works" msgid="3028822263837896720">"အဲဒါ အလုပ် လုပ်ပုံ"</string>
     <string name="nfc_payment_no_apps" msgid="5477904979148086424">"စတိုးဆိုင်များတွင် သင်၏ ဖုန်းဖြင့် ငွေပေးချေပါ"</string>
     <string name="nfc_payment_default" msgid="8648420259219150395">"အလိုအလျောက် ငွေချေမှု"</string>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
index 5b593d1..c8864e0 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta-rIN/strings.xml
@@ -2318,7 +2318,7 @@
     <string name="user_confirm_remove_title" msgid="1163721647646152032">"இவரை அகற்றவா?"</string>
     <string name="user_profile_confirm_remove_title" msgid="5573161550669867342">"இதை அகற்றவா?"</string>
     <string name="work_profile_confirm_remove_title" msgid="2017323555783522213">"பணி சுயவிவரத்தை அகற்றவா?"</string>
-    <string name="user_confirm_remove_self_message" product="tablet" msgid="2391372805233812410">"இந்த டேப்லெட்டில் உங்களுக்கான சேமிப்பிடம் மற்றும் தரவை நீங்கள் இழக்க நேரிடும். இதை நீங்கள் மாற்ற முடியாது."</string>
+    <string name="user_confirm_remove_self_message" product="tablet" msgid="2391372805233812410">"இந்த டேப்லெட்டில் உங்களுக்கான சேமிப்பிடம் மற்றும் தரவை இழக்க நேரிடும். இதை மாற்ற முடியாது."</string>
     <string name="user_confirm_remove_self_message" product="default" msgid="7943645442479360048">"இந்த மொபைலில் உங்களுக்கான சேமிப்பிடம், தரவை இழக்க நேரிடும். இதை மாற்ற முடியாது."</string>
     <string name="user_confirm_remove_message" msgid="1020629390993095037">"எல்லா பயன்பாடுகளும் தரவும் நீக்கப்படும்."</string>
     <string name="work_profile_confirm_remove_message" msgid="323856589749078140">"தொடர்ந்தால், இந்தச் சுயவிவரத்தில் உள்ள எல்லா பயன்பாடுகளும் தகவலும் நீக்கப்படும்."</string>
diff --git a/src/com/android/settings/ConfirmDeviceCredentialBaseActivity.java b/src/com/android/settings/ConfirmDeviceCredentialBaseActivity.java
index c56a956..d488d7a 100644
--- a/src/com/android/settings/ConfirmDeviceCredentialBaseActivity.java
+++ b/src/com/android/settings/ConfirmDeviceCredentialBaseActivity.java
@@ -18,19 +18,20 @@
 
 import android.app.Fragment;
 import android.app.KeyguardManager;
-import android.content.Intent;
 import android.os.Bundle;
-import android.os.Handler;
 import android.os.UserManager;
 import android.view.MenuItem;
 import android.view.WindowManager;
 
 public abstract class ConfirmDeviceCredentialBaseActivity extends SettingsActivity {
 
+    private static final String STATE_IS_KEYGUARD_LOCKED = "STATE_IS_KEYGUARD_LOCKED";
+
     private boolean mRestoring;
     private boolean mDark;
     private boolean mEnterAnimationPending;
     private boolean mFirstTimeVisible = true;
+    private boolean mIsKeyguardLocked = false;
 
     @Override
     protected void onCreate(Bundle savedState) {
@@ -44,8 +45,15 @@
             mDark = true;
         }
         super.onCreate(savedState);
-        boolean deviceLocked = getSystemService(KeyguardManager.class).isKeyguardLocked();
-        if (deviceLocked && getIntent().getBooleanExtra(
+        mIsKeyguardLocked = savedState == null
+                ? getSystemService(KeyguardManager.class).isKeyguardLocked()
+                : savedState.getBoolean(STATE_IS_KEYGUARD_LOCKED, false);
+        // If the activity is launched, not due to config change, when keyguard is locked and the
+        // flag is set, assume it's launched on top of keyguard on purpose.
+        // TODO: Don't abuse SHOW_WHEN_LOCKED and don't check isKeyguardLocked.
+        // Set extra SHOW_WHEN_LOCKED and WindowManager FLAG_SHOW_WHEN_LOCKED only if it's
+        // truly on top of keyguard on purpose
+        if (mIsKeyguardLocked && getIntent().getBooleanExtra(
                 ConfirmDeviceCredentialBaseFragment.SHOW_WHEN_LOCKED, false)) {
             getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
         }
@@ -60,6 +68,12 @@
     }
 
     @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putBoolean(STATE_IS_KEYGUARD_LOCKED, mIsKeyguardLocked);
+    }
+
+    @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         if (item.getItemId() == android.R.id.home) {
             finish();
diff --git a/src/com/android/settings/CredentialStorage.java b/src/com/android/settings/CredentialStorage.java
index 6cdf0b9..eed380b 100644
--- a/src/com/android/settings/CredentialStorage.java
+++ b/src/com/android/settings/CredentialStorage.java
@@ -103,16 +103,11 @@
     static final int MIN_PASSWORD_QUALITY = DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
 
     private static final int CONFIRM_KEY_GUARD_REQUEST = 1;
+    private static final int CONFIRM_CLEAR_SYSTEM_CREDENTIAL_REQUEST = 2;
 
     private final KeyStore mKeyStore = KeyStore.getInstance();
 
     /**
-     * The UIDs that are used for system credential storage in keystore.
-     */
-    private static final int[] SYSTEM_CREDENTIAL_UIDS = {Process.WIFI_UID, Process.VPN_UID,
-        Process.ROOT_UID, Process.SYSTEM_UID};
-
-    /**
      * When non-null, the bundle containing credentials to install.
      */
     private Bundle mInstallBundle;
@@ -197,7 +192,7 @@
             return;
         }
         // force key guard confirmation
-        if (confirmKeyGuard()) {
+        if (confirmKeyGuard(CONFIRM_KEY_GUARD_REQUEST)) {
             // will return password value via onActivityResult
             return;
         }
@@ -328,8 +323,10 @@
         @Override public void onDismiss(DialogInterface dialog) {
             if (mResetConfirmed) {
                 mResetConfirmed = false;
-                new ResetKeyStoreAndKeyChain().execute();
-                return;
+                if (confirmKeyGuard(CONFIRM_CLEAR_SYSTEM_CREDENTIAL_REQUEST)) {
+                    // will return password value via onActivityResult
+                    return;
+                }
             }
             finish();
         }
@@ -343,12 +340,7 @@
         @Override protected Boolean doInBackground(Void... unused) {
 
             // Clear all the users credentials could have been installed in for this user.
-            final UserManager um = (UserManager) getSystemService(USER_SERVICE);
-            for (int userId : um.getProfileIdsWithDisabled(UserHandle.myUserId())) {
-                for (int uid : SYSTEM_CREDENTIAL_UIDS) {
-                    mKeyStore.clearUid(UserHandle.getUid(userId, uid));
-                }
-            }
+            new LockPatternUtils(CredentialStorage.this).resetKeyStore(UserHandle.myUserId());
 
             try {
                 KeyChainConnection keyChainConnection = KeyChain.bind(CredentialStorage.this);
@@ -454,10 +446,10 @@
     /**
      * Confirm existing key guard, returning password via onActivityResult.
      */
-    private boolean confirmKeyGuard() {
+    private boolean confirmKeyGuard(int requestCode) {
         Resources res = getResources();
         boolean launched = new ChooseLockSettingsHelper(this)
-                .launchConfirmationActivity(CONFIRM_KEY_GUARD_REQUEST,
+                .launchConfirmationActivity(requestCode,
                         res.getText(R.string.credentials_title), true);
         return launched;
     }
@@ -481,6 +473,13 @@
             }
             // failed confirmation, bail
             finish();
+        } else if (requestCode == CONFIRM_CLEAR_SYSTEM_CREDENTIAL_REQUEST) {
+            if (resultCode == Activity.RESULT_OK) {
+                new ResetKeyStoreAndKeyChain().execute();
+                return;
+            }
+            // failed confirmation, bail
+            finish();
         }
     }
 
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/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java
index 18b941c..e08173f 100644
--- a/src/com/android/settings/dashboard/DashboardSummary.java
+++ b/src/com/android/settings/dashboard/DashboardSummary.java
@@ -87,7 +87,7 @@
         mSummaryLoader = new SummaryLoader(getActivity(), categories);
         setHasOptionsMenu(true);
         Context context = getContext();
-        mConditionManager = ConditionManager.get(context);
+        mConditionManager = ConditionManager.get(context, false);
         mSuggestionParser = new SuggestionParser(context,
                 context.getSharedPreferences(SUGGESTIONS, 0), R.xml.suggestion_ordering);
         mSuggestionsChecks = new SuggestionsChecks(getContext());
diff --git a/src/com/android/settings/dashboard/conditional/ConditionManager.java b/src/com/android/settings/dashboard/conditional/ConditionManager.java
index 128ac27..ad0e839 100644
--- a/src/com/android/settings/dashboard/conditional/ConditionManager.java
+++ b/src/com/android/settings/dashboard/conditional/ConditionManager.java
@@ -54,10 +54,15 @@
 
     private final ArrayList<ConditionListener> mListeners = new ArrayList<>();
 
-    private ConditionManager(Context context) {
+    private ConditionManager(Context context, boolean loadConditionsNow) {
         mContext = context;
-        mConditions = new ArrayList<Condition>();
-        new ConditionLoader().execute();
+        mConditions = new ArrayList<>();
+        if (loadConditionsNow) {
+            ConditionLoader loader = new ConditionLoader();
+            loader.onPostExecute(loader.doInBackground());
+        } else {
+            new ConditionLoader().execute();
+        }
     }
 
     public void refreshAll() {
@@ -67,11 +72,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 +91,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 +134,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 +176,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 +222,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();
@@ -234,8 +246,12 @@
     }
 
     public static ConditionManager get(Context context) {
+        return get(context, true);
+    }
+
+    public static ConditionManager get(Context context, boolean loadConditionsNow) {
         if (sInstance == null) {
-            sInstance = new ConditionManager(context.getApplicationContext());
+            sInstance = new ConditionManager(context.getApplicationContext(), loadConditionsNow);
         }
         return sInstance;
     }
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/notification/ImportanceSeekBarPreference.java b/src/com/android/settings/notification/ImportanceSeekBarPreference.java
index 4da5dbf..b21f9ce 100644
--- a/src/com/android/settings/notification/ImportanceSeekBarPreference.java
+++ b/src/com/android/settings/notification/ImportanceSeekBarPreference.java
@@ -21,6 +21,7 @@
 
 import android.content.Context;
 import android.content.res.ColorStateList;
+import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
 import android.os.Handler;
 import android.service.notification.NotificationListenerService;
@@ -45,6 +46,8 @@
     private SeekBar mSeekBar;
     private ColorStateList mActiveSliderTint;
     private ColorStateList mInactiveSliderTint;
+    private float mActiveSliderAlpha = 1.0f;
+    private float mInactiveSliderAlpha;
     private boolean mAutoOn;
     private Handler mHandler;
 
@@ -57,6 +60,11 @@
         mInactiveSliderTint = ColorStateList.valueOf(
                 context.getColor(R.color.importance_disabled_slider_color));
         mHandler = new Handler();
+        final TypedArray ta =
+                context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.Theme, 0, 0);
+        mInactiveSliderAlpha =
+                ta.getFloat(com.android.internal.R.styleable.Theme_disabledAlpha, 0.5f);
+        ta.recycle();
     }
 
     public ImportanceSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) {
@@ -124,13 +132,12 @@
     private void applyAutoUi(ImageView autoButton) {
         mSeekBar.setEnabled(!mAutoOn);
 
-        final ColorStateList sliderTint = mAutoOn ? mInactiveSliderTint : mActiveSliderTint;
+        final float alpha = mAutoOn ? mInactiveSliderAlpha : mActiveSliderAlpha;
         final ColorStateList starTint = mAutoOn ?  mActiveSliderTint : mInactiveSliderTint;
         Drawable icon = autoButton.getDrawable().mutate();
         icon.setTintList(starTint);
         autoButton.setImageDrawable(icon);
-        mSeekBar.setProgressTintList(sliderTint);
-        mSeekBar.setThumbTintList(sliderTint);
+        mSeekBar.setAlpha(alpha);
 
         if (mAutoOn) {
             setProgress(NotificationListenerService.Ranking.IMPORTANCE_DEFAULT);
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());
             }