Merge "Support changes to SuggestionParser"
diff --git a/res/layout/app_header.xml b/res/layout/app_header.xml
index 6c13ae8..2d8a099 100644
--- a/res/layout/app_header.xml
+++ b/res/layout/app_header.xml
@@ -50,7 +50,8 @@
         android:minWidth="0dp"
         android:contentDescription="@string/notification_app_settings_button"
         android:scaleType="center"
-        android:src="@drawable/ic_info"
+        android:src="@drawable/ic_settings_24dp"
+        android:visibility="gone"
         style="?android:attr/borderlessButtonStyle" />
 
 </RelativeLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9336fee..8a1a76a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5295,6 +5295,10 @@
     <string name="user_enable_calling_and_sms_confirm_title">Turn on phone calls &amp; SMS?</string>
     <!-- Message for confirmation of turning on calls and SMS [CHAR LIMIT=none] -->
     <string name="user_enable_calling_and_sms_confirm_message">Call and SMS history will be shared with this user.</string>
+    <!-- Title for the emergency info preference [CHAR LIMIT=40] -->
+    <string name="emergency_info_title">Emergency information</string>
+    <!-- Description of the emergency info preference [CHAR LIMIT=80] -->
+    <string name="emergency_info_subtitle">Accessible through lock screen in the emergency dialer</string>
 
     <!-- Application Restrictions screen title [CHAR LIMIT=45] -->
     <string name="application_restrictions">Allow apps and content</string>
diff --git a/res/xml/user_settings.xml b/res/xml/user_settings.xml
index 4fefc10..ac2685f 100644
--- a/res/xml/user_settings.xml
+++ b/res/xml/user_settings.xml
@@ -35,5 +35,9 @@
                 android:key="add_users_when_locked"
                 android:title="@string/user_add_on_lockscreen_menu"
                 android:summary="@string/user_add_on_lockscreen_menu_summary" />
+        <Preference
+                android:key="emergency_info"
+                android:title="@string/emergency_info_title"
+                android:summary="@string/emergency_info_subtitle"/>
     </PreferenceCategory>
 </PreferenceScreen>
diff --git a/src/com/android/settings/AppHeader.java b/src/com/android/settings/AppHeader.java
index 36026bb..0351ed5 100644
--- a/src/com/android/settings/AppHeader.java
+++ b/src/com/android/settings/AppHeader.java
@@ -58,7 +58,7 @@
     }
 
     public static View setupHeaderView(final Activity activity, Drawable icon, CharSequence label,
-            final String pkgName, final int uid, boolean includeAppInfo, int tintColorRes,
+            final String pkgName, final int uid, final boolean includeAppInfo, int tintColorRes,
             View bar) {
         final ImageView appIcon = (ImageView) bar.findViewById(R.id.app_icon);
         appIcon.setImageDrawable(icon);
@@ -69,19 +69,20 @@
         final TextView appName = (TextView) bar.findViewById(R.id.app_name);
         appName.setText(label);
 
-        final View appSettings = bar.findViewById(R.id.app_settings);
-        if (includeAppInfo && pkgName != null && !pkgName.equals(Utils.OS_PKG)) {
-            appSettings.setClickable(true);
-            appSettings.setOnClickListener(new OnClickListener() {
+        if (pkgName != null && !pkgName.equals(Utils.OS_PKG)) {
+            bar.setClickable(true);
+            bar.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {
-                    AppInfoBase.startAppInfoFragment(InstalledAppDetails.class,
-                            R.string.application_info_label, pkgName, uid, activity,
-                            INSTALLED_APP_DETAILS);
+                    if (includeAppInfo) {
+                        AppInfoBase.startAppInfoFragment(InstalledAppDetails.class,
+                                R.string.application_info_label, pkgName, uid, activity,
+                                INSTALLED_APP_DETAILS);
+                    } else {
+                        activity.finish();
+                    }
                 }
             });
-        } else {
-            appSettings.setVisibility(View.GONE);
         }
         return bar;
     }
diff --git a/src/com/android/settings/ChooseLockSettingsHelper.java b/src/com/android/settings/ChooseLockSettingsHelper.java
index 70ecdfd..1035ef1 100644
--- a/src/com/android/settings/ChooseLockSettingsHelper.java
+++ b/src/com/android/settings/ChooseLockSettingsHelper.java
@@ -150,6 +150,23 @@
                 false, false, true, challenge, Utils.getCredentialOwnerUserId(mActivity));
     }
 
+    /**
+     * If a pattern, password or PIN exists, prompt the user before allowing them to change it.
+     * @param message optional message to display about the action about to be done
+     * @param details optional detail message to display
+     * @param challenge a challenge to be verified against the device credential.
+     *                  This method can only be called internally.
+     * @param userId The userId for whom the lock should be confirmed.
+     * @return true if one exists and we launched an activity to confirm it
+     * @see #onActivityResult(int, int, android.content.Intent)
+     */
+    public boolean launchConfirmationActivity(int request, @Nullable CharSequence title,
+            @Nullable CharSequence header, @Nullable CharSequence description,
+            long challenge, int userId) {
+        return launchConfirmationActivity(request, title, header, description,
+                false, false, true, challenge, Utils.enforceSameOwner(mActivity, userId));
+    }
+
     private boolean launchConfirmationActivity(int request, @Nullable CharSequence title,
             @Nullable CharSequence header, @Nullable CharSequence description,
             boolean returnCredentials, boolean external, boolean hasChallenge,
diff --git a/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
index 86c9fca..40e3103 100644
--- a/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
+++ b/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
@@ -22,6 +22,7 @@
 import android.app.ActivityOptions;
 import android.app.IActivityManager;
 import android.app.admin.DevicePolicyManager;
+import android.app.trust.TrustManager;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentSender;
@@ -63,12 +64,16 @@
     private boolean mAllowFpAuthentication;
     protected Button mCancelButton;
     protected ImageView mFingerprintIcon;
+    protected int mEffectiveUserId;
 
     @Override
     public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mAllowFpAuthentication = getActivity().getIntent().getBooleanExtra(
                 ALLOW_FP_AUTHENTICATION, false);
+        // Only take this argument into account if it belongs to the current profile.
+        Intent intent = getActivity().getIntent();
+        mEffectiveUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras());
     }
 
     @Override
@@ -78,7 +83,7 @@
         mFingerprintIcon = (ImageView) view.findViewById(R.id.fingerprintIcon);
         mFingerprintHelper = new FingerprintUiHelper(
                 mFingerprintIcon,
-                (TextView) view.findViewById(R.id.errorText), this);
+                (TextView) view.findViewById(R.id.errorText), this, mEffectiveUserId);
         boolean showCancelButton = getActivity().getIntent().getBooleanExtra(
                 SHOW_CANCEL_BUTTON, false);
         mCancelButton.setVisibility(showCancelButton ? View.VISIBLE : View.GONE);
@@ -132,7 +137,12 @@
     public void onAuthenticated() {
         // Check whether we are still active.
         if (getActivity() != null && getActivity().isResumed()) {
+            TrustManager trustManager =
+                (TrustManager) getActivity().getSystemService(Context.TRUST_SERVICE);
+            trustManager.setDeviceLockedForUser(mEffectiveUserId, false);
             authenticationSucceeded();
+            authenticationSucceeded();
+            checkForPendingIntent();
         }
     }
 
diff --git a/src/com/android/settings/ConfirmLockPassword.java b/src/com/android/settings/ConfirmLockPassword.java
index f6347c1..e1362ea 100644
--- a/src/com/android/settings/ConfirmLockPassword.java
+++ b/src/com/android/settings/ConfirmLockPassword.java
@@ -99,7 +99,6 @@
         private AppearAnimationUtils mAppearAnimationUtils;
         private DisappearAnimationUtils mDisappearAnimationUtils;
         private boolean mBlockImm;
-        private int mEffectiveUserId;
 
         // required constructor for fragments
         public ConfirmLockPasswordFragment() {
@@ -110,9 +109,6 @@
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             mLockPatternUtils = new LockPatternUtils(getActivity());
-            Intent intent = getActivity().getIntent();
-            // Only take this argument into account if it belongs to the current profile.
-            mEffectiveUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras());
         }
 
         @Override
@@ -183,14 +179,13 @@
         private int getDefaultDetails() {
             boolean isProfile = Utils.isManagedProfile(
                     UserManager.get(getActivity()), mEffectiveUserId);
-            if (mIsAlpha && !isProfile) {
-                return R.string.lockpassword_confirm_your_password_generic;
-            } else if (mIsAlpha && isProfile) {
-                return R.string.lockpassword_confirm_your_password_generic_profile;
-            } else if (!isProfile) {
-                return R.string.lockpassword_confirm_your_pin_generic;
+            if (mIsAlpha) {
+                return isProfile ? R.string.lockpassword_confirm_your_password_generic_profile
+                        : R.string.lockpassword_confirm_your_password_generic;
+            } else {
+                return isProfile ? R.string.lockpassword_confirm_your_pin_generic_profile
+                        : R.string.lockpassword_confirm_your_pin_generic;
             }
-            return R.string.lockpassword_confirm_your_pin_generic_profile;
         }
 
         private int getErrorMessage() {
diff --git a/src/com/android/settings/ConfirmLockPattern.java b/src/com/android/settings/ConfirmLockPattern.java
index 5c72bd1..922d1c7 100644
--- a/src/com/android/settings/ConfirmLockPattern.java
+++ b/src/com/android/settings/ConfirmLockPattern.java
@@ -104,8 +104,6 @@
         private AppearAnimationUtils mAppearAnimationUtils;
         private DisappearAnimationUtils mDisappearAnimationUtils;
 
-        private int mEffectiveUserId;
-
         // required constructor for fragments
         public ConfirmLockPatternFragment() {
 
@@ -115,9 +113,6 @@
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             mLockPatternUtils = new LockPatternUtils(getActivity());
-            Intent intent = getActivity().getIntent();
-            // Only take this argument into account if it belongs to the current profile.
-            mEffectiveUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras());
         }
 
         @Override
diff --git a/src/com/android/settings/ProfileChallengePreferenceFragment.java b/src/com/android/settings/ProfileChallengePreferenceFragment.java
index 4b57552..5d39641 100644
--- a/src/com/android/settings/ProfileChallengePreferenceFragment.java
+++ b/src/com/android/settings/ProfileChallengePreferenceFragment.java
@@ -25,6 +25,8 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.UserInfo;
+import android.hardware.fingerprint.Fingerprint;
+import android.hardware.fingerprint.FingerprintManager;
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.os.UserManager;
@@ -34,12 +36,15 @@
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.Preference.OnPreferenceChangeListener;
 import android.support.v7.preference.Preference.OnPreferenceClickListener;
+import android.util.Log;
 import android.support.v7.preference.PreferenceCategory;
 import android.support.v7.preference.PreferenceGroup;
 import android.support.v7.preference.PreferenceScreen;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.fingerprint.FingerprintEnrollIntroduction;
+import com.android.settings.fingerprint.FingerprintSettings;
 
 import java.util.Collections;
 import java.util.HashSet;
@@ -218,6 +223,7 @@
         PreferenceGroup securityCategory = (PreferenceGroup)
                 root.findPreference(KEY_SECURITY_CATEGORY);
         if (securityCategory != null) {
+            maybeAddFingerprintPreference(securityCategory);
             if (mLockPatternUtils.isSeparateProfileChallengeEnabled(mProfileUserId)) {
                 maybeAddUnificationPreference(securityCategory);
             } else {
@@ -241,6 +247,14 @@
         }
     }
 
+    private void maybeAddFingerprintPreference(PreferenceGroup securityCategory) {
+        Preference fingerprintPreference =
+                FingerprintSettings.getFingerprintPreferenceForUser(getActivity(), mProfileUserId);
+        if (fingerprintPreference != null) {
+            securityCategory.addPreference(fingerprintPreference);
+        }
+    }
+
     private void removeNonWhitelistedItems(PreferenceGroup prefScreen) {
         int numPreferences = prefScreen.getPreferenceCount();
         int i = 0;
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index d39203d..a324d9c 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -90,7 +90,6 @@
     private static final String KEY_OWNER_INFO_SETTINGS = "owner_info_settings";
     private static final String KEY_ADVANCED_SECURITY = "advanced_security";
     private static final String KEY_MANAGE_TRUST_AGENTS = "manage_trust_agents";
-    private static final String KEY_FINGERPRINT_SETTINGS = "fingerprint_settings";
 
     private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
     private static final int CHANGE_TRUST_AGENT_SETTINGS = 126;
@@ -375,32 +374,12 @@
     }
 
     private void maybeAddFingerprintPreference(PreferenceGroup securityCategory) {
-        FingerprintManager fpm = (FingerprintManager) getActivity().getSystemService(
-                Context.FINGERPRINT_SERVICE);
-        if (!fpm.isHardwareDetected()) {
-            Log.v(TAG, "No fingerprint hardware detected!!");
-            return;
+        Preference fingerprintPreference =
+                FingerprintSettings.getFingerprintPreferenceForUser(
+                        securityCategory.getContext(), UserHandle.myUserId());
+        if (fingerprintPreference != null) {
+            securityCategory.addPreference(fingerprintPreference);
         }
-        Preference fingerprintPreference = new Preference(securityCategory.getContext());
-        fingerprintPreference.setKey(KEY_FINGERPRINT_SETTINGS);
-        fingerprintPreference.setTitle(R.string.security_settings_fingerprint_preference_title);
-        Intent intent = new Intent();
-        final List<Fingerprint> items = fpm.getEnrolledFingerprints();
-        final int fingerprintCount = items != null ? items.size() : 0;
-        final String clazz;
-        if (fingerprintCount > 0) {
-            fingerprintPreference.setSummary(getResources().getQuantityString(
-                    R.plurals.security_settings_fingerprint_preference_summary,
-                    fingerprintCount, fingerprintCount));
-            clazz = FingerprintSettings.class.getName();
-        } else {
-            fingerprintPreference.setSummary(
-                    R.string.security_settings_fingerprint_preference_summary_none);
-            clazz = FingerprintEnrollIntroduction.class.getName();
-        }
-        intent.setClassName("com.android.settings", clazz);
-        fingerprintPreference.setIntent(intent);
-        securityCategory.addPreference(fingerprintPreference);
     }
 
     private void addTrustAgentSettings(PreferenceGroup securityCategory) {
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollBase.java b/src/com/android/settings/fingerprint/FingerprintEnrollBase.java
index 2843040..20bbadc 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollBase.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollBase.java
@@ -20,6 +20,7 @@
 import android.content.Intent;
 import android.graphics.Color;
 import android.os.Bundle;
+import android.os.UserHandle;
 import android.text.TextUtils;
 import android.view.View;
 import android.view.WindowManager;
@@ -42,6 +43,7 @@
     static final int RESULT_TIMEOUT = FingerprintSettings.RESULT_TIMEOUT;
 
     protected byte[] mToken;
+    protected int mUserId;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -53,6 +55,7 @@
             mToken = savedInstanceState.getByteArray(
                     ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
         }
+        mUserId = getIntent().getIntExtra(Intent.EXTRA_USER_ID, UserHandle.myUserId());
     }
 
     @Override
@@ -127,6 +130,9 @@
         Intent intent = new Intent();
         intent.setClassName("com.android.settings", FingerprintEnrollEnrolling.class.getName());
         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken);
+        if (mUserId != UserHandle.USER_NULL) {
+            intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
+        }
         return intent;
     }
 }
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java
index 322a92c..36dfbfe 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java
@@ -32,6 +32,7 @@
 import android.graphics.drawable.Drawable;
 import android.hardware.fingerprint.FingerprintManager;
 import android.os.Bundle;
+import android.os.UserHandle;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.animation.AnimationUtils;
@@ -221,6 +222,9 @@
         Intent intent = getFinishIntent();
         intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token);
+        if (mUserId != UserHandle.USER_NULL) {
+            intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
+        }
         startActivity(intent);
         finish();
     }
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java
index c17dc70..b858950 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java
@@ -19,6 +19,7 @@
 import android.content.Intent;
 import android.hardware.fingerprint.FingerprintManager;
 import android.os.Bundle;
+import android.os.UserHandle;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.ChooseLockSettingsHelper;
@@ -173,10 +174,17 @@
     private void launchConfirmLock() {
         long challenge = getSystemService(FingerprintManager.class).preEnroll();
         ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this);
-        if (!helper.launchConfirmationActivity(CONFIRM_REQUEST,
+        boolean launchedConfirmationActivity = false;
+        if (mUserId == UserHandle.USER_NULL) {
+            launchedConfirmationActivity = helper.launchConfirmationActivity(CONFIRM_REQUEST,
                 getString(R.string.security_settings_fingerprint_preference_title),
-                null, null, challenge)) {
-
+                null, null, challenge);
+        } else {
+            launchedConfirmationActivity = helper.launchConfirmationActivity(CONFIRM_REQUEST,
+                    getString(R.string.security_settings_fingerprint_preference_title),
+                    null, null, challenge, mUserId);
+        }
+        if (!launchedConfirmationActivity) {
             // This shouldn't happen, as we should only end up at this step if a lock thingy is
             // already set.
             finish();
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollFinish.java b/src/com/android/settings/fingerprint/FingerprintEnrollFinish.java
index 80124e0..8ec4ec0 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollFinish.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollFinish.java
@@ -20,6 +20,7 @@
 import android.content.Intent;
 import android.hardware.fingerprint.FingerprintManager;
 import android.os.Bundle;
+import android.os.UserHandle;
 import android.view.View;
 import android.widget.Button;
 
@@ -39,7 +40,7 @@
         Button addButton = (Button) findViewById(R.id.add_another_button);
 
         FingerprintManager fpm = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE);
-        int enrolled = fpm.getEnrolledFingerprints().size();
+        int enrolled = fpm.getEnrolledFingerprints(mUserId).size();
         int max = getResources().getInteger(
                 com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
         if (enrolled >= max) {
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java
index 61cecf4..c1347f5 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java
@@ -46,14 +46,12 @@
         setHeaderText(R.string.security_settings_fingerprint_enroll_introduction_title);
         findViewById(R.id.cancel_button).setOnClickListener(this);
         findViewById(R.id.learn_more_button).setOnClickListener(this);
-        final int passwordQuality = new ChooseLockSettingsHelper(this).utils()
-                .getActivePasswordQuality(UserHandle.myUserId());
         updatePasswordQuality();
     }
 
     private void updatePasswordQuality() {
         final int passwordQuality = new ChooseLockSettingsHelper(this).utils()
-                .getActivePasswordQuality(UserHandle.myUserId());
+                .getActivePasswordQuality(mUserId);
         mHasPassword = passwordQuality != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
     }
 
@@ -77,6 +75,9 @@
         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true);
         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge);
         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, true);
+        if (mUserId != UserHandle.USER_NULL) {
+            intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
+        }
         startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST);
     }
 
@@ -93,7 +94,11 @@
     }
 
     protected Intent getFindSensorIntent() {
-        return new Intent(this, FingerprintEnrollFindSensor.class);
+        Intent intent = new Intent(this, FingerprintEnrollFindSensor.class);
+        if (mUserId != UserHandle.USER_NULL) {
+            intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
+        }
+        return intent;
     }
 
     @Override
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollOnboard.java b/src/com/android/settings/fingerprint/FingerprintEnrollOnboard.java
index 0990459..1b80589 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollOnboard.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollOnboard.java
@@ -20,6 +20,7 @@
 import android.content.Intent;
 import android.hardware.fingerprint.FingerprintManager;
 import android.os.Bundle;
+import android.os.UserHandle;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.ChooseLockGeneric;
@@ -66,6 +67,9 @@
         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true);
         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge);
         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, true);
+        if (mUserId != UserHandle.USER_NULL) {
+            intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
+        }
         startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST);
     }
 
@@ -76,6 +80,9 @@
     private void launchFindSensor(byte[] token) {
         Intent intent = getFindSensorIntent();
         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token);
+        if (mUserId != UserHandle.USER_NULL) {
+            intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
+        }
         startActivity(intent);
         finish();
     }
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java b/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java
index 72c06db..d0fcda0 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java
@@ -18,10 +18,12 @@
 
 import android.annotation.Nullable;
 import android.app.Activity;
+import android.content.Intent;
 import android.hardware.fingerprint.FingerprintManager;
 import android.os.Bundle;
 import android.os.CancellationSignal;
 import android.os.Handler;
+import android.os.UserHandle;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.ChooseLockSettingsHelper;
@@ -40,6 +42,8 @@
     private Handler mHandler = new Handler();
     private byte[] mToken;
     private boolean mDone;
+    private int mUserId;
+    private FingerprintManager mFingerprintManager;
 
     @Override
     public void onCreate(@Nullable Bundle savedInstanceState) {
@@ -50,8 +54,10 @@
     @Override
     public void onAttach(Activity activity) {
         super.onAttach(activity);
+        mFingerprintManager = activity.getSystemService(FingerprintManager.class);
         mToken = activity.getIntent().getByteArrayExtra(
                 ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
+        mUserId = activity.getIntent().getIntExtra(Intent.EXTRA_USER_ID, UserHandle.USER_NULL);
     }
 
     @Override
@@ -74,8 +80,11 @@
         mHandler.removeCallbacks(mTimeoutRunnable);
         mEnrollmentSteps = -1;
         mEnrollmentCancel = new CancellationSignal();
-        getActivity().getSystemService(FingerprintManager.class).enroll(mToken, mEnrollmentCancel,
-                0 /* flags */, mEnrollmentCallback);
+        if (mUserId != UserHandle.USER_NULL) {
+            mFingerprintManager.setActiveUser(mUserId);
+        }
+        mFingerprintManager.enroll(mToken, mEnrollmentCancel,
+                0 /* flags */, mEnrollmentCallback, mUserId);
         mEnrolling = true;
     }
 
diff --git a/src/com/android/settings/fingerprint/FingerprintSettings.java b/src/com/android/settings/fingerprint/FingerprintSettings.java
index 9e90c00..56e9b12 100644
--- a/src/com/android/settings/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/fingerprint/FingerprintSettings.java
@@ -72,6 +72,8 @@
  */
 public class FingerprintSettings extends SubSettings {
 
+    private static final String TAG = "FingerprintSettings";
+
     /**
      * Used by the choose fingerprint wizard to indicate the wizard is
      * finished, and each activity in the wizard should finish.
@@ -98,6 +100,8 @@
 
     private static final long LOCKOUT_DURATION = 30000; // time we have to wait for fp to reset, ms
 
+    public static final String KEY_FINGERPRINT_SETTINGS = "fingerprint_settings";
+
     @Override
     public Intent getIntent() {
         Intent modIntent = new Intent(super.getIntent());
@@ -765,4 +769,34 @@
             return builder;
         }
     }
+
+    public static Preference getFingerprintPreferenceForUser(Context context, int userId) {
+        FingerprintManager fpm = (FingerprintManager) context.getSystemService(
+                Context.FINGERPRINT_SERVICE);
+        if (!fpm.isHardwareDetected()) {
+            Log.v(TAG, "No fingerprint hardware detected!!");
+            return null;
+        }
+        Preference fingerprintPreference = new Preference(context);
+        fingerprintPreference.setKey(KEY_FINGERPRINT_SETTINGS);
+        fingerprintPreference.setTitle(R.string.security_settings_fingerprint_preference_title);
+        Intent intent = new Intent();
+        final List<Fingerprint> items = fpm.getEnrolledFingerprints(userId);
+        final int fingerprintCount = items != null ? items.size() : 0;
+        final String clazz;
+        if (fingerprintCount > 0) {
+            fingerprintPreference.setSummary(context.getResources().getQuantityString(
+                    R.plurals.security_settings_fingerprint_preference_summary,
+                    fingerprintCount, fingerprintCount));
+            clazz = FingerprintSettings.class.getName();
+        } else {
+            fingerprintPreference.setSummary(
+                    R.string.security_settings_fingerprint_preference_summary_none);
+            clazz = FingerprintEnrollIntroduction.class.getName();
+        }
+        intent.setClassName("com.android.settings", clazz);
+        intent.putExtra(Intent.EXTRA_USER_ID, userId);
+        fingerprintPreference.setIntent(intent);
+        return fingerprintPreference;
+    }
 }
diff --git a/src/com/android/settings/fingerprint/FingerprintUiHelper.java b/src/com/android/settings/fingerprint/FingerprintUiHelper.java
index 245cbb4..cf37050 100644
--- a/src/com/android/settings/fingerprint/FingerprintUiHelper.java
+++ b/src/com/android/settings/fingerprint/FingerprintUiHelper.java
@@ -34,21 +34,26 @@
     private ImageView mIcon;
     private TextView mErrorTextView;
     private CancellationSignal mCancellationSignal;
+    private int mUserId;
 
     private Callback mCallback;
     private FingerprintManager mFingerprintManager;
 
-    public FingerprintUiHelper(ImageView icon, TextView errorTextView, Callback callback) {
+    public FingerprintUiHelper(ImageView icon, TextView errorTextView, Callback callback,
+            int userId) {
         mFingerprintManager = icon.getContext().getSystemService(FingerprintManager.class);
         mIcon = icon;
         mErrorTextView = errorTextView;
         mCallback = callback;
+        mUserId = userId;
     }
 
     public void startListening() {
-        if (mFingerprintManager.getEnrolledFingerprints().size() > 0) {
+        if (mFingerprintManager.getEnrolledFingerprints(mUserId).size() > 0) {
             mCancellationSignal = new CancellationSignal();
-            mFingerprintManager.authenticate(null, mCancellationSignal, 0 /* flags */, this, null);
+            mFingerprintManager.setActiveUser(mUserId);
+            mFingerprintManager.authenticate(
+                    null, mCancellationSignal, 0 /* flags */, this, null, mUserId);
             setFingerprintIconVisibility(true);
             mIcon.setImageResource(R.drawable.ic_fingerprint);
         }
diff --git a/src/com/android/settings/notification/ZenModeAutomationSettings.java b/src/com/android/settings/notification/ZenModeAutomationSettings.java
index 33cff53..1bdb46a 100644
--- a/src/com/android/settings/notification/ZenModeAutomationSettings.java
+++ b/src/com/android/settings/notification/ZenModeAutomationSettings.java
@@ -81,6 +81,9 @@
     @Override
     public void onResume() {
         super.onResume();
+        if (isUiRestricted()) {
+            return;
+        }
         updateControls();
     }
 
diff --git a/src/com/android/settings/notification/ZenModeEventRuleSettings.java b/src/com/android/settings/notification/ZenModeEventRuleSettings.java
index c5691d4..69c870a 100644
--- a/src/com/android/settings/notification/ZenModeEventRuleSettings.java
+++ b/src/com/android/settings/notification/ZenModeEventRuleSettings.java
@@ -72,6 +72,9 @@
     @Override
     public void onResume() {
         super.onResume();
+        if (isUiRestricted()) {
+            return;
+        }
         if (!mCreate) {
             reloadCalendar();
         }
diff --git a/src/com/android/settings/notification/ZenModeRuleSettingsBase.java b/src/com/android/settings/notification/ZenModeRuleSettingsBase.java
index b0f12f8..19514ab 100644
--- a/src/com/android/settings/notification/ZenModeRuleSettingsBase.java
+++ b/src/com/android/settings/notification/ZenModeRuleSettingsBase.java
@@ -133,6 +133,9 @@
     @Override
     public void onResume() {
         super.onResume();
+        if (isUiRestricted()) {
+            return;
+        }
         updateControls();
     }
 
diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java
index 3743396..99fd198 100644
--- a/src/com/android/settings/notification/ZenModeSettings.java
+++ b/src/com/android/settings/notification/ZenModeSettings.java
@@ -47,6 +47,9 @@
     @Override
     public void onResume() {
         super.onResume();
+        if (isUiRestricted()) {
+            return;
+        }
         updateControls();
     }
 
diff --git a/src/com/android/settings/notification/ZenModeSettingsBase.java b/src/com/android/settings/notification/ZenModeSettingsBase.java
index 4c8663f..f1b5edf 100644
--- a/src/com/android/settings/notification/ZenModeSettingsBase.java
+++ b/src/com/android/settings/notification/ZenModeSettingsBase.java
@@ -28,7 +28,9 @@
 import android.provider.Settings.Global;
 import android.service.notification.ZenModeConfig;
 import android.util.Log;
+import android.view.View;
 
+import com.android.settings.R;
 import com.android.settings.RestrictedSettingsFragment;
 
 import java.util.List;
@@ -67,11 +69,17 @@
         maybeRefreshRules(true, true /*fireChanged*/);
         mSettingsObserver.register();
         if (isUiRestricted()) {
-            finish();
+            getPreferenceScreen().removeAll();
+            return;
         }
     }
 
     @Override
+    protected View initAdminSupportDetailsView() {
+        return getActivity().findViewById(R.id.admin_support_details);
+    }
+
+    @Override
     public void onPause() {
         super.onPause();
         mSettingsObserver.unregister();
diff --git a/src/com/android/settings/print/PrintJobSettingsFragment.java b/src/com/android/settings/print/PrintJobSettingsFragment.java
index 80bf166..11b4ba2 100644
--- a/src/com/android/settings/print/PrintJobSettingsFragment.java
+++ b/src/com/android/settings/print/PrintJobSettingsFragment.java
@@ -153,9 +153,10 @@
 
     private void processArguments() {
         String printJobId = getArguments().getString(EXTRA_PRINT_JOB_ID);
-        mPrintJobId = PrintJobId.unflattenFromString(printJobId);
-        if (mPrintJobId == null) {
+        if (printJobId == null) {
             finish();
+        } else {
+            mPrintJobId = PrintJobId.unflattenFromString(printJobId);
         }
     }
 
diff --git a/src/com/android/settings/print/PrintServiceSettingsFragment.java b/src/com/android/settings/print/PrintServiceSettingsFragment.java
index 5d20f65..2ac84f4 100644
--- a/src/com/android/settings/print/PrintServiceSettingsFragment.java
+++ b/src/com/android/settings/print/PrintServiceSettingsFragment.java
@@ -481,7 +481,8 @@
                         final int printerCount = mPrinters.size();
                         for (int i = 0; i < printerCount; i++) {
                             PrinterInfo printer = mPrinters.get(i);
-                            if (printer.getName().toLowerCase().contains(constraintLowerCase)) {
+                            String name = printer.getName();
+                            if (name != null && name.toLowerCase().contains(constraintLowerCase)) {
                                 filteredPrinters.add(printer);
                             }
                         }
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 06ec966..8229464 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -101,6 +101,7 @@
     private static final String KEY_USER_LIST = "user_list";
     private static final String KEY_USER_ME = "user_me";
     private static final String KEY_ADD_USER = "user_add";
+    private static final String KEY_EMERGENCY_INFO = "emergency_info";
 
     private static final int MENU_REMOVE_USER = Menu.FIRST;
 
@@ -134,6 +135,7 @@
     private DimmableIconPreference mAddUser;
     private PreferenceGroup mLockScreenSettings;
     private RestrictedSwitchPreference mAddUserWhenLocked;
+    private Preference mEmergencyInfoPreference;
     private int mRemovingUserId = -1;
     private int mAddedUserId = 0;
     private boolean mAddingUser;
@@ -229,6 +231,8 @@
         }
         mLockScreenSettings = (PreferenceGroup) findPreference("lock_screen_settings");
         mAddUserWhenLocked = (RestrictedSwitchPreference) findPreference("add_users_when_locked");
+        mEmergencyInfoPreference = findPreference(KEY_EMERGENCY_INFO);
+        mEmergencyInfoPreference.setOnPreferenceClickListener(this);
         loadProfile();
         setHasOptionsMenu(true);
         IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED);
@@ -917,6 +921,9 @@
             } else {
                 onAddUserClicked(USER_TYPE_USER);
             }
+        } else if (pref == mEmergencyInfoPreference) {
+            Intent intent = new Intent("com.android.emergency.EDIT_EMERGENGY_INFO");
+            startActivity(intent);
         }
         return false;
     }