Merge "Log source with visibility change"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 852e81d..71ef973 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5585,10 +5585,8 @@
     <string name="user_remove_user_menu">Delete <xliff:g id="user_name">%1$s</xliff:g> from this device</string>
     <!-- User lock screen settings header[CHAR LIMIT=40] -->
     <string name="user_lockscreen_settings">Lock screen settings</string>
-    <!-- User settings item to allow creating new users from locks creen [CHAR LIMIT=40] -->
-    <string name="user_add_on_lockscreen_menu">Add users</string>
-    <!-- User settings user_add_on_lockscreen_menu item summary [CHAR LIMIT=40] -->
-    <string name="user_add_on_lockscreen_menu_summary">when device is locked</string>
+    <!-- User settings item to allow creating new users from locks screen [CHAR LIMIT=50] -->
+    <string name="user_add_on_lockscreen_menu">Add users from lock screen</string>
     <!-- User details new user name [CHAR LIMIT=30] -->
     <string name="user_new_user_name">New user</string>
     <!-- User details new restricted profile name [CHAR LIMIT=30] -->
@@ -6168,7 +6166,7 @@
     <string name="boot_sounds_title">Power on sounds</string>
 
     <!-- Sound: Title for the Do not Disturb option and associated settings page. [CHAR LIMIT=30] -->
-    <string name="zen_mode_settings_title">Do not disturb</string>
+    <string name="zen_mode_settings_title">Do not disturb preferences</string>
 
     <!-- Do not disturb: Title for the Priority interruptions option and associated settings page. [CHAR LIMIT=30] -->
     <string name="zen_mode_priority_settings_title">Priority only allows</string>
diff --git a/res/xml/user_and_accounts_settings.xml b/res/xml/user_and_accounts_settings.xml
index 9bb39f6..bc3ac6c 100644
--- a/res/xml/user_and_accounts_settings.xml
+++ b/res/xml/user_and_accounts_settings.xml
@@ -49,8 +49,6 @@
     <com.android.settingslib.RestrictedSwitchPreference
         android:key="add_users_when_locked"
         android:title="@string/user_add_on_lockscreen_menu"
-        android:summary="@string/user_add_on_lockscreen_menu_summary"
-        settings:useAdditionalSummary="true"
         android:order="105"/>
 
     <PreferenceCategory
diff --git a/res/xml/user_settings.xml b/res/xml/user_settings.xml
index 1375ed4..45d0b90 100644
--- a/res/xml/user_settings.xml
+++ b/res/xml/user_settings.xml
@@ -33,9 +33,7 @@
             android:title="@string/user_lockscreen_settings">
         <com.android.settingslib.RestrictedSwitchPreference
                 android:key="add_users_when_locked"
-                android:title="@string/user_add_on_lockscreen_menu"
-                android:summary="@string/user_add_on_lockscreen_menu_summary"
-                settings:useAdditionalSummary="true" />
+                android:title="@string/user_add_on_lockscreen_menu" />
     </PreferenceCategory>
     <Preference
         android:key="emergency_info"
diff --git a/src/com/android/settings/notification/ZenModePreferenceController.java b/src/com/android/settings/notification/ZenModePreferenceController.java
index 61bbe9a..1427d5a 100644
--- a/src/com/android/settings/notification/ZenModePreferenceController.java
+++ b/src/com/android/settings/notification/ZenModePreferenceController.java
@@ -16,14 +16,22 @@
 
 package com.android.settings.notification;
 
+import android.app.NotificationManager;
 import android.content.Context;
+import android.support.v7.preference.Preference;
+import com.android.settings.R;
 
 public class ZenModePreferenceController extends AdjustVolumeRestrictedPreferenceController {
 
     private static final String KEY_ZEN_MODE = "zen_mode";
+    private String mSummaryPrefix;
+
+    private ZenModeSettings.SummaryBuilder mSummaryBuilder;
 
     public ZenModePreferenceController(Context context) {
         super(context);
+        mSummaryBuilder = new ZenModeSettings.SummaryBuilder(context);
+        mSummaryPrefix = context.getString(R.string.zen_mode_priority_settings_title) + " ";
     }
 
     @Override
@@ -36,4 +44,12 @@
         return true;
     }
 
+    @Override
+    public void updateState(Preference preference) {
+        super.updateState(preference);
+        if (preference.isEnabled()) {
+            preference.setSummary(mSummaryPrefix + mSummaryBuilder.getPrioritySettingSummary(
+                NotificationManager.from(mContext).getNotificationPolicy()));
+        }
+    }
 }
diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java
index 1d5f09e..6266af9 100644
--- a/src/com/android/settings/notification/ZenModeSettings.java
+++ b/src/com/android/settings/notification/ZenModeSettings.java
@@ -34,6 +34,7 @@
     private Preference mPrioritySettings;
     private Preference mVisualSettings;
     private Policy mPolicy;
+    private SummaryBuilder mSummaryBuilder;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -45,6 +46,7 @@
         mPrioritySettings = root.findPreference(KEY_PRIORITY_SETTINGS);
         mVisualSettings = root.findPreference(KEY_VISUAL_SETTINGS);
         mPolicy = NotificationManager.from(mContext).getNotificationPolicy();
+        mSummaryBuilder = new SummaryBuilder(getContext());
     }
 
     @Override
@@ -77,62 +79,80 @@
     }
 
     private void updatePrioritySettingsSummary() {
-        String s = getResources().getString(R.string.zen_mode_alarms);
-        s = append(s, isCategoryEnabled(mPolicy, Policy.PRIORITY_CATEGORY_REMINDERS),
-                R.string.zen_mode_reminders);
-        s = append(s, isCategoryEnabled(mPolicy, Policy.PRIORITY_CATEGORY_EVENTS),
-                R.string.zen_mode_events);
-        if (isCategoryEnabled(mPolicy, Policy.PRIORITY_CATEGORY_MESSAGES)) {
-            if (mPolicy.priorityMessageSenders == Policy.PRIORITY_SENDERS_ANY) {
-                s = append(s, true, R.string.zen_mode_all_messages);
-            } else {
-                s = append(s, true, R.string.zen_mode_selected_messages);
-            }
-        }
-        if (isCategoryEnabled(mPolicy, Policy.PRIORITY_CATEGORY_CALLS)) {
-            if (mPolicy.priorityCallSenders == Policy.PRIORITY_SENDERS_ANY) {
-                s = append(s, true, R.string.zen_mode_all_callers);
-            } else {
-                s = append(s, true, R.string.zen_mode_selected_callers);
-            }
-        } else if (isCategoryEnabled(mPolicy, Policy.PRIORITY_CATEGORY_REPEAT_CALLERS)) {
-            s = append(s, true, R.string.zen_mode_repeat_callers);
-        }
-        mPrioritySettings.setSummary(s);
+        mPrioritySettings.setSummary(mSummaryBuilder.getPrioritySettingSummary(mPolicy));
     }
 
     private void updateVisualSettingsSummary() {
-        String s = getString(R.string.zen_mode_all_visual_interruptions);
-        if (isEffectSuppressed(Policy.SUPPRESSED_EFFECT_SCREEN_ON)
-                && isEffectSuppressed(Policy.SUPPRESSED_EFFECT_SCREEN_OFF)) {
-            s = getString(R.string.zen_mode_no_visual_interruptions);
-        } else if (isEffectSuppressed(Policy.SUPPRESSED_EFFECT_SCREEN_ON)) {
-            s = getString(R.string.zen_mode_screen_on_visual_interruptions);
-        } else if (isEffectSuppressed(Policy.SUPPRESSED_EFFECT_SCREEN_OFF)) {
-            s = getString(R.string.zen_mode_screen_off_visual_interruptions);
-        }
-        mVisualSettings.setSummary(s);
-    }
-
-    private boolean isEffectSuppressed(int effect) {
-        return (mPolicy.suppressedVisualEffects & effect) != 0;
-    }
-
-    private boolean isCategoryEnabled(Policy policy, int categoryType) {
-        return (policy.priorityCategories & categoryType) != 0;
-    }
-
-    @VisibleForTesting
-    String append(String s, boolean condition, int resId) {
-        if (condition) {
-            final Context context = getContext();
-            return context.getString(R.string.join_many_items_middle, s, context.getString(resId));
-        }
-        return s;
+        mVisualSettings.setSummary(mSummaryBuilder.getVisualSettingSummary(mPolicy));
     }
 
     @Override
     protected int getHelpResource() {
         return R.string.help_uri_interruptions;
     }
+
+    public static class SummaryBuilder {
+
+        private Context mContext;
+
+        public SummaryBuilder(Context context) {
+            mContext = context;
+        }
+
+        String getPrioritySettingSummary(Policy policy) {
+            String s = mContext.getString(R.string.zen_mode_alarms);
+            s = append(s, isCategoryEnabled(policy, Policy.PRIORITY_CATEGORY_REMINDERS),
+                R.string.zen_mode_reminders);
+            s = append(s, isCategoryEnabled(policy, Policy.PRIORITY_CATEGORY_EVENTS),
+                R.string.zen_mode_events);
+            if (isCategoryEnabled(policy, Policy.PRIORITY_CATEGORY_MESSAGES)) {
+                if (policy.priorityMessageSenders == Policy.PRIORITY_SENDERS_ANY) {
+                    s = append(s, true, R.string.zen_mode_all_messages);
+                } else {
+                    s = append(s, true, R.string.zen_mode_selected_messages);
+                }
+            }
+            if (isCategoryEnabled(policy, Policy.PRIORITY_CATEGORY_CALLS)) {
+                if (policy.priorityCallSenders == Policy.PRIORITY_SENDERS_ANY) {
+                    s = append(s, true, R.string.zen_mode_all_callers);
+                } else {
+                    s = append(s, true, R.string.zen_mode_selected_callers);
+                }
+            } else if (isCategoryEnabled(policy, Policy.PRIORITY_CATEGORY_REPEAT_CALLERS)) {
+                s = append(s, true, R.string.zen_mode_repeat_callers);
+            }
+            return s;
+        }
+
+        String getVisualSettingSummary(Policy policy) {
+            String s = mContext.getString(R.string.zen_mode_all_visual_interruptions);
+            if (isEffectSuppressed(policy, Policy.SUPPRESSED_EFFECT_SCREEN_ON)
+                && isEffectSuppressed(policy, Policy.SUPPRESSED_EFFECT_SCREEN_OFF)) {
+                s = mContext.getString(R.string.zen_mode_no_visual_interruptions);
+            } else if (isEffectSuppressed(policy, Policy.SUPPRESSED_EFFECT_SCREEN_ON)) {
+                s = mContext.getString(R.string.zen_mode_screen_on_visual_interruptions);
+            } else if (isEffectSuppressed(policy, Policy.SUPPRESSED_EFFECT_SCREEN_OFF)) {
+                s = mContext.getString(R.string.zen_mode_screen_off_visual_interruptions);
+            }
+            return s;
+        }
+
+        @VisibleForTesting
+        String append(String s, boolean condition, int resId) {
+            if (condition) {
+                return mContext.getString(
+                    R.string.join_many_items_middle, s, mContext.getString(resId));
+            }
+            return s;
+        }
+
+        private boolean isCategoryEnabled(Policy policy, int categoryType) {
+            return (policy.priorityCategories & categoryType) != 0;
+        }
+
+        private boolean isEffectSuppressed(Policy policy, int effect) {
+            return (policy.suppressedVisualEffects & effect) != 0;
+        }
+
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/notification/ZenModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ZenModePreferenceControllerTest.java
index 155e6ea..a31fb5e 100644
--- a/tests/robotests/src/com/android/settings/notification/ZenModePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ZenModePreferenceControllerTest.java
@@ -16,7 +16,10 @@
 
 package com.android.settings.notification;
 
+import android.app.NotificationManager;
+import android.app.NotificationManager.Policy;
 import android.content.Context;
+import android.support.v7.preference.Preference;
 
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
@@ -27,8 +30,13 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
@@ -36,6 +44,12 @@
 
     @Mock
     private Context mContext;
+    @Mock
+    private Preference mPreference;
+    @Mock
+    private NotificationManager mNotificationManager;
+    @Mock
+    private Policy mPolicy;
 
     private ZenModePreferenceController mController;
 
@@ -43,6 +57,9 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mController = new ZenModePreferenceController(mContext);
+        when(mContext.getSystemService(Context.NOTIFICATION_SERVICE))
+            .thenReturn(mNotificationManager);
+        when(mNotificationManager.getNotificationPolicy()).thenReturn(mPolicy);
     }
 
     @Test
@@ -50,4 +67,22 @@
         assertThat(mController.isAvailable()).isTrue();
     }
 
+    @Test
+    public void updateState_preferenceEnabled_shouldSetSummary() {
+        when(mPreference.isEnabled()).thenReturn(true);
+
+        mController.updateState(mPreference);
+
+        verify(mPreference).setSummary(anyString());
+    }
+
+    @Test
+    public void updateState_preferenceDisabled_shouldNotSetSummary() {
+        when(mPreference.isEnabled()).thenReturn(false);
+
+        mController.updateState(mPreference);
+
+        verify(mPreference, never()).setSummary(anyString());
+    }
+
 }
diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeSettingsTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeSettingsTest.java
index 40cfed5..7a3742d 100644
--- a/tests/robotests/src/com/android/settings/notification/ZenModeSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ZenModeSettingsTest.java
@@ -36,21 +36,20 @@
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class ZenModeSettingsTest {
 
-    private ZenModeSettings mSettings;
+    private ZenModeSettings.SummaryBuilder mBuilder;
     private Context mContext;
 
     @Before
     public void setUp() {
         mContext = RuntimeEnvironment.application.getApplicationContext();
-        mSettings = spy(ZenModeSettings.class);
-        doReturn(mContext).when(mSettings).getContext();
+        mBuilder = new ZenModeSettings.SummaryBuilder(mContext);
     }
 
     @Test
     public void testAppend_conditionFalse_shouldNotAppend() {
         String original = "test";
 
-        final String result = mSettings.append(original, false, R.string.zen_mode_alarms);
+        final String result = mBuilder.append(original, false, R.string.zen_mode_alarms);
 
         assertThat(result).isEqualTo(original);
     }
@@ -60,7 +59,7 @@
         String original = "test";
         String alarm = mContext.getString(R.string.zen_mode_alarms);
 
-        final String result = mSettings.append(original, true, R.string.zen_mode_alarms);
+        final String result = mBuilder.append(original, true, R.string.zen_mode_alarms);
 
         assertThat(result).contains(alarm);
     }