ZenPreferences observe zen changes from USER_ALL

Zen manual rule changes are changed by USER_SYSTEM, so Zen Preference
Controllers must register their content observers for zen changes and
zen config changes to USER_ALL instead of just their own user id.

Change-Id: I75194b62ab5e5b21dffbf04bba5009659bb41d81
Fixes: 70028673
Test: make ROBOTEST_FILTER=ZenModeButtonPreferenceControllerTest RunSettingsRoboTests -j40
diff --git a/src/com/android/settings/notification/AbstractZenModePreferenceController.java b/src/com/android/settings/notification/AbstractZenModePreferenceController.java
index ec275b2..de2e8fd 100644
--- a/src/com/android/settings/notification/AbstractZenModePreferenceController.java
+++ b/src/com/android/settings/notification/AbstractZenModePreferenceController.java
@@ -22,10 +22,12 @@
 import android.database.ContentObserver;
 import android.net.Uri;
 import android.os.Handler;
+import android.os.UserHandle;
 import android.provider.Settings;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -37,7 +39,8 @@
         AbstractPreferenceController implements PreferenceControllerMixin, LifecycleObserver,
         OnResume, OnPause {
 
-    private SettingObserver mSettingObserver;
+    @VisibleForTesting
+    protected SettingObserver mSettingObserver;
     private final String KEY;
     final private NotificationManager mNotificationManager;
 
@@ -94,8 +97,8 @@
         }
 
         public void register(ContentResolver cr) {
-            cr.registerContentObserver(ZEN_MODE_URI, false, this);
-            cr.registerContentObserver(ZEN_MODE_CONFIG_ETAG_URI, false, this);
+            cr.registerContentObserver(ZEN_MODE_URI, false, this, UserHandle.USER_ALL);
+            cr.registerContentObserver(ZEN_MODE_CONFIG_ETAG_URI, false, this, UserHandle.USER_ALL);
         }
 
         public void unregister(ContentResolver cr) {
diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeButtonPreferenceControllerTest.java
index a1b4dab..a6f7b2b 100644
--- a/tests/robotests/src/com/android/settings/notification/ZenModeButtonPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ZenModeButtonPreferenceControllerTest.java
@@ -130,4 +130,21 @@
         verify(mZenButtonOn).setVisibility(View.VISIBLE);
         verify(mZenButtonOff).setVisibility(View.GONE);
     }
+
+    @Test
+    public void updateState_otherUserChangedZen() {
+        final Preference mockPref = mock(Preference.class);
+        Settings.Global.putInt(mContentResolver, ZEN_MODE, ZEN_MODE_OFF);
+        mController.updateState(mockPref);
+        verify(mZenButtonOn).setVisibility(View.VISIBLE);
+        verify(mZenButtonOff).setVisibility(View.GONE);
+
+        Settings.Global.putInt(mContentResolver, ZEN_MODE, ZEN_MODE_IMPORTANT_INTERRUPTIONS);
+        final int GUEST_USER_ID = 10;
+        mController.mSettingObserver.onChange(false,
+                Settings.Global.getUriFor(Settings.Global.ZEN_MODE), GUEST_USER_ID);
+
+        verify(mZenButtonOn).setVisibility(View.GONE);
+        verify(mZenButtonOff).setVisibility(View.VISIBLE);
+    }
 }
\ No newline at end of file