Add Work Challenge Notifications Setting

Bug: 26844582
Change-Id: Ib1eb28cfebcc0c8d23ec8669f2777ccb822d7bf3
diff --git a/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
index 090d4be..96ede4d 100644
--- a/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
+++ b/src/com/android/settings/ConfirmDeviceCredentialBaseFragment.java
@@ -36,7 +36,6 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.RemoteException;
-import android.os.UserHandle;
 import android.os.UserManager;
 import android.view.View;
 import android.view.ViewGroup;
@@ -224,7 +223,7 @@
     }
 
     protected boolean isProfileChallenge() {
-        return UserHandle.myUserId() != mEffectiveUserId;
+        return Utils.isManagedProfile(UserManager.get(getContext()));
     }
 
     protected void reportSuccessfullAttempt() {
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 8966974..5537926 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -228,7 +228,7 @@
         final int resid = getResIdForLockUnlockScreen(getActivity(), mLockPatternUtils, MY_USER_ID);
         addPreferencesFromResource(resid);
 
-        mProfileChallengeUserId = getManagedProfileId(mUm);
+        mProfileChallengeUserId = Utils.getManagedProfileId(mUm, MY_USER_ID);
         if (mProfileChallengeUserId != UserHandle.USER_NULL
                 && mLockPatternUtils.isSeparateProfileChallengeAllowed(mProfileChallengeUserId)) {
             addPreferencesFromResource(R.xml.security_settings_profile);
@@ -726,21 +726,6 @@
         return R.string.help_url_security;
     }
 
-    private static int getManagedProfileId(UserManager um) {
-        List<UserInfo> profiles = um.getProfiles(MY_USER_ID);
-        int numProfiles = profiles.size();
-        if (numProfiles == 1) {
-            return UserHandle.USER_NULL;
-        }
-        for (int i = 0; i < numProfiles; ++i) {
-            UserInfo profile = profiles.get(i);
-            if (profile.id != MY_USER_ID) {
-                return profile.id;
-            }
-        }
-        return UserHandle.USER_NULL;
-    }
-
     /**
      * For Search. Please keep it in sync when updating "createPreferenceHierarchy()"
      */
@@ -764,7 +749,7 @@
             result.add(sir);
 
             final UserManager um = UserManager.get(context);
-            final int profileUserId = getManagedProfileId(um);
+            final int profileUserId = Utils.getManagedProfileId(um, MY_USER_ID);
             if (profileUserId != UserHandle.USER_NULL
                     && lockPatternUtils.isSeparateProfileChallengeAllowed(profileUserId)) {
                 sir = new SearchIndexableResource(context);
@@ -847,7 +832,7 @@
             }
 
             final LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
-            final int profileUserId = getManagedProfileId(um);
+            final int profileUserId = Utils.getManagedProfileId(um, MY_USER_ID);
             if (profileUserId != UserHandle.USER_NULL
                     && lockPatternUtils.isSeparateProfileChallengeAllowed(profileUserId)) {
                 if (lockPatternUtils.getKeyguardStoredPasswordQuality(profileUserId)
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index c6af8fb..e719291 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -596,6 +596,23 @@
     }
 
     /**
+     * Retrieves the id for the given user's managed profile.
+     *
+     * @return the managed profile id or UserHandle.USER_NULL if there is none.
+     */
+    public static int getManagedProfileId(UserManager um, int parentUserId) {
+        List<UserInfo> profiles = um.getProfiles(parentUserId);
+        int numProfiles = profiles.size();
+        for (int i = 0; i < numProfiles; ++i) {
+            UserInfo profile = profiles.get(i);
+            if (profile.id != parentUserId) {
+                return profile.id;
+            }
+        }
+        return UserHandle.USER_NULL;
+    }
+
+    /**
      * Returns true if the userId passed in is a managed profile.
      *
      * @throws IllegalArgumentException if userManager is null.
diff --git a/src/com/android/settings/notification/ConfigureNotificationSettings.java b/src/com/android/settings/notification/ConfigureNotificationSettings.java
index 842b06f..7a47891 100644
--- a/src/com/android/settings/notification/ConfigureNotificationSettings.java
+++ b/src/com/android/settings/notification/ConfigureNotificationSettings.java
@@ -23,6 +23,7 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.UserHandle;
+import android.os.UserManager;
 import android.provider.Settings;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.Preference.OnPreferenceChangeListener;
@@ -34,6 +35,7 @@
 import com.android.settings.R;
 import com.android.settings.RestrictedListPreference.RestrictedItem;
 import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.Utils;
 import com.android.settingslib.RestrictedLockUtils;
 
 import java.util.ArrayList;
@@ -48,6 +50,8 @@
 
     private static final String KEY_NOTIFICATION_PULSE = "notification_pulse";
     private static final String KEY_LOCK_SCREEN_NOTIFICATIONS = "lock_screen_notifications";
+    private static final String KEY_LOCK_SCREEN_PROFILE_NOTIFICATIONS =
+            "lock_screen_notifications_profile";
 
     private final SettingsObserver mSettingsObserver = new SettingsObserver();
 
@@ -55,8 +59,12 @@
 
     private TwoStatePreference mNotificationPulse;
     private NotificationLockscreenPreference mLockscreen;
+    private NotificationLockscreenPreference mLockscreenProfile;
     private boolean mSecure;
+    private boolean mSecureProfile;
     private int mLockscreenSelectedValue;
+    private int mLockscreenSelectedValueProfile;
+    private int mProfileChallengeUserId;
 
     @Override
     protected int getMetricsCategory() {
@@ -67,13 +75,22 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mContext = getActivity();
+        mProfileChallengeUserId = Utils.getManagedProfileId(
+                UserManager.get(mContext), UserHandle.myUserId());
         mSecure = new LockPatternUtils(getActivity()).isSecure(UserHandle.myUserId());
+        mSecureProfile = (mProfileChallengeUserId != UserHandle.USER_NULL)
+                && new LockPatternUtils(getActivity()).isSecure(mProfileChallengeUserId);
 
         addPreferencesFromResource(R.xml.configure_notification_settings);
 
         initPulse();
         initLockscreenNotifications();
 
+        if (mProfileChallengeUserId != UserHandle.USER_NULL) {
+            addPreferencesFromResource(R.xml.configure_notification_settings_profile);
+            initLockscreenNotificationsForProfile();
+        }
+
     }
 
     @Override
@@ -126,8 +143,6 @@
         }
     }
 
-    // === Lockscreen (public / private) notifications ===
-
     private void initLockscreenNotifications() {
         mLockscreen = (NotificationLockscreenPreference) getPreferenceScreen().findPreference(
                 KEY_LOCK_SCREEN_NOTIFICATIONS);
@@ -187,6 +202,71 @@
         }
     }
 
+    // === Lockscreen (public / private) notifications ===
+    private void initLockscreenNotificationsForProfile() {
+        mLockscreenProfile = (NotificationLockscreenPreference) getPreferenceScreen()
+                .findPreference(KEY_LOCK_SCREEN_PROFILE_NOTIFICATIONS);
+        if (mLockscreenProfile == null) {
+            Log.i(TAG, "Preference not found: " + KEY_LOCK_SCREEN_PROFILE_NOTIFICATIONS);
+            return;
+        }
+
+        ArrayList<CharSequence> entries = new ArrayList<>();
+        ArrayList<CharSequence> values = new ArrayList<>();
+        entries.add(getString(R.string.lock_screen_notifications_summary_disable_profile));
+        values.add(Integer.toString(R.string.lock_screen_notifications_summary_disable_profile));
+
+        String summaryShowEntry = getString(
+                R.string.lock_screen_notifications_summary_show_profile);
+        String summaryShowEntryValue = Integer.toString(
+                R.string.lock_screen_notifications_summary_show_profile);
+        entries.add(summaryShowEntry);
+        values.add(summaryShowEntryValue);
+        setRestrictedIfNotificationFeaturesDisabled(summaryShowEntry, summaryShowEntryValue,
+                KEYGUARD_DISABLE_SECURE_NOTIFICATIONS | KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS);
+
+        if (mSecureProfile) {
+            String summaryHideEntry = getString(
+                    R.string.lock_screen_notifications_summary_hide_profile);
+            String summaryHideEntryValue = Integer.toString(
+                    R.string.lock_screen_notifications_summary_hide_profile);
+            entries.add(summaryHideEntry);
+            values.add(summaryHideEntryValue);
+            setRestrictedIfNotificationFeaturesDisabled(summaryHideEntry, summaryHideEntryValue,
+                    KEYGUARD_DISABLE_SECURE_NOTIFICATIONS);
+        }
+
+        mLockscreenProfile.setEntries(entries.toArray(new CharSequence[entries.size()]));
+        mLockscreenProfile.setEntryValues(values.toArray(new CharSequence[values.size()]));
+        updateLockscreenNotificationsForProfile();
+        if (mLockscreenProfile.getEntries().length > 1) {
+            mLockscreenProfile.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+                @Override
+                public boolean onPreferenceChange(Preference preference, Object newValue) {
+                    final int val = Integer.parseInt((String) newValue);
+                    if (val == mLockscreenSelectedValueProfile) {
+                        return false;
+                    }
+                    final boolean enabled =
+                            val != R.string.lock_screen_notifications_summary_disable_profile;
+                    final boolean show =
+                            val == R.string.lock_screen_notifications_summary_show_profile;
+                    Settings.Secure.putIntForUser(getContentResolver(),
+                            Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS,
+                            show ? 1 : 0, mProfileChallengeUserId);
+                    Settings.Secure.putIntForUser(getContentResolver(),
+                            Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS,
+                            enabled ? 1 : 0, mProfileChallengeUserId);
+                    mLockscreenSelectedValueProfile = val;
+                    return true;
+                }
+            });
+        } else {
+            // There is one or less option for the user, disable the drop down.
+            mLockscreenProfile.setEnabled(false);
+        }
+    }
+
     private void setRestrictedIfNotificationFeaturesDisabled(CharSequence entry,
             CharSequence entryValue, int keyguardNotificationFeatures) {
         EnforcedAdmin admin = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
@@ -195,28 +275,54 @@
             RestrictedItem item = new RestrictedItem(entry, entryValue, admin);
             mLockscreen.addRestrictedItem(item);
         }
+        if (mProfileChallengeUserId != UserHandle.USER_NULL) {
+            EnforcedAdmin profileAdmin = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
+                    mContext, keyguardNotificationFeatures, mProfileChallengeUserId);
+            if (profileAdmin != null) {
+                RestrictedItem item = new RestrictedItem(entry, entryValue, profileAdmin);
+                mLockscreenProfile.addRestrictedItem(item);
+            }
+        }
     }
 
     private void updateLockscreenNotifications() {
         if (mLockscreen == null) {
             return;
         }
-        final boolean enabled = getLockscreenNotificationsEnabled();
-        final boolean allowPrivate = !mSecure || getLockscreenAllowPrivateNotifications();
+        final boolean enabled = getLockscreenNotificationsEnabled(UserHandle.myUserId());
+        final boolean allowPrivate = !mSecure
+                || getLockscreenAllowPrivateNotifications(UserHandle.myUserId());
         mLockscreenSelectedValue = !enabled ? R.string.lock_screen_notifications_summary_disable :
                 allowPrivate ? R.string.lock_screen_notifications_summary_show :
                 R.string.lock_screen_notifications_summary_hide;
         mLockscreen.setValue(Integer.toString(mLockscreenSelectedValue));
     }
 
-    private boolean getLockscreenNotificationsEnabled() {
-        return Settings.Secure.getInt(getContentResolver(),
-                Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0) != 0;
+    private void updateLockscreenNotificationsForProfile() {
+        if (mProfileChallengeUserId == UserHandle.USER_NULL) {
+            return;
+        }
+        if (mLockscreenProfile == null) {
+            return;
+        }
+        final boolean enabled = getLockscreenNotificationsEnabled(mProfileChallengeUserId);
+        final boolean allowPrivate = !mSecureProfile
+                || getLockscreenAllowPrivateNotifications(mProfileChallengeUserId);
+        mLockscreenSelectedValueProfile = !enabled
+                ? R.string.lock_screen_notifications_summary_disable_profile
+                        : (allowPrivate ? R.string.lock_screen_notifications_summary_show_profile
+                                : R.string.lock_screen_notifications_summary_hide_profile);
+        mLockscreenProfile.setValue(Integer.toString(mLockscreenSelectedValueProfile));
     }
 
-    private boolean getLockscreenAllowPrivateNotifications() {
-        return Settings.Secure.getInt(getContentResolver(),
-                Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0) != 0;
+    private boolean getLockscreenNotificationsEnabled(int userId) {
+        return Settings.Secure.getIntForUser(getContentResolver(),
+                Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0, userId) != 0;
+    }
+
+    private boolean getLockscreenAllowPrivateNotifications(int userId) {
+        return Settings.Secure.getIntForUser(getContentResolver(),
+                Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0, userId) != 0;
     }
 
 
@@ -253,6 +359,9 @@
             }
             if (LOCK_SCREEN_PRIVATE_URI.equals(uri) || LOCK_SCREEN_SHOW_URI.equals(uri)) {
                 updateLockscreenNotifications();
+                if (mProfileChallengeUserId != UserHandle.USER_NULL) {
+                    updateLockscreenNotificationsForProfile();
+                }
             }
         }
     }