Use consolidated zen policy for dnd

Instead of using the default notification policy,
use the consolidated zen policy when do not disturb
is in priority only dnd mode

Bug: 111474881
Test: atest ZenModeHelperTest ZenPolicyTest ZenModeFilteringTest AudioManagerTest
Test: atest SystemUITests ZenModeExtractorTest
Change-Id: I88934103a56f06d4a4f620a8f557347331a79627
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index b988c55..326df49 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -33,19 +33,19 @@
 import android.os.Handler;
 import android.provider.AlarmClock;
 import android.service.notification.ZenModeConfig;
-import android.widget.FrameLayout;
-import androidx.annotation.VisibleForTesting;
 import android.text.format.DateUtils;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.Pair;
 import android.view.View;
 import android.view.WindowInsets;
+import android.widget.FrameLayout;
 import android.widget.ImageView;
-import android.widget.LinearLayout;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
+import androidx.annotation.VisibleForTesting;
+
 import com.android.settingslib.Utils;
 import com.android.systemui.BatteryMeterView;
 import com.android.systemui.Dependency;
@@ -56,8 +56,8 @@
 import com.android.systemui.statusbar.phone.PhoneStatusBarView;
 import com.android.systemui.statusbar.phone.StatusBarIconController;
 import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager;
-import com.android.systemui.statusbar.policy.Clock;
 import com.android.systemui.statusbar.phone.StatusIconContainer;
+import com.android.systemui.statusbar.policy.Clock;
 import com.android.systemui.statusbar.policy.DarkIconDispatcher;
 import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;
 import com.android.systemui.statusbar.policy.DateView;
@@ -205,7 +205,7 @@
 
         boolean ringerVisible = false;
         if (!ZenModeConfig.isZenOverridingRinger(mZenController.getZen(),
-                mZenController.getConfig())) {
+                mZenController.getConsolidatedPolicy())) {
             if (mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
                 mRingerModeIcon.setImageResource(R.drawable.stat_sys_ringer_vibrate);
                 mRingerModeTextView.setText(R.string.qs_status_phone_vibrate);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
index 553165b..0e6efc8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
@@ -57,6 +57,7 @@
 import android.util.ArraySet;
 import android.util.Log;
 import android.util.Pair;
+
 import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
 import com.android.internal.telephony.IccCardConstants;
 import com.android.internal.telephony.TelephonyIntents;
@@ -391,7 +392,7 @@
             zenDescription = mContext.getString(R.string.interruption_level_priority);
         }
 
-        if (!ZenModeConfig.isZenOverridingRinger(zen, mZenController.getConfig())) {
+        if (!ZenModeConfig.isZenOverridingRinger(zen, mZenController.getConsolidatedPolicy())) {
             if (audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_VIBRATE) {
                 volumeVisible = true;
                 volumeIconId = R.drawable.stat_sys_ringer_vibrate;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java
index 4ee8059..ad19729 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.statusbar.policy;
 
+import android.app.NotificationManager;
 import android.content.ComponentName;
 import android.net.Uri;
 import android.service.notification.Condition;
@@ -29,6 +30,8 @@
     int getZen();
     ZenRule getManualRule();
     ZenModeConfig getConfig();
+    /** Gets consolidated zen policy that will apply when DND is on in priority only mode */
+    NotificationManager.Policy getConsolidatedPolicy();
     long getNextAlarm();
     boolean isZenAvailable();
     ComponentName getEffectsSuppressor();
@@ -45,6 +48,8 @@
         default void onEffectsSupressorChanged() {}
         default void onManualRuleChanged(ZenRule rule) {}
         default void onConfigChanged(ZenModeConfig config) {}
+        /** Called when the consolidated zen policy changes */
+        default void onConsolidatedPolicyChanged(NotificationManager.Policy policy) {}
     }
 
 }
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
index 8d2552f..89ccff0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
@@ -69,6 +69,7 @@
     private ZenModeConfig mConfig;
     private int mZenMode;
     private long mZenUpdateTime;
+    private NotificationManager.Policy mConsolidatedNotificationPolicy;
 
     public ZenModeControllerImpl(Context context, Handler handler) {
         super(context);
@@ -91,6 +92,7 @@
         updateZenMode(mModeSetting.getValue());
         mConfigSetting.setListening(true);
         updateZenModeConfig();
+        updateConsolidatedNotificationPolicy();
         mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
         mSetupObserver = new SetupObserver(handler);
         mSetupObserver.register();
@@ -153,6 +155,11 @@
     }
 
     @Override
+    public NotificationManager.Policy getConsolidatedPolicy() {
+        return mConsolidatedNotificationPolicy;
+    }
+
+    @Override
     public long getNextAlarm() {
         final AlarmManager.AlarmClockInfo info = mAlarmManager.getNextAlarmClock(mUserId);
         return info != null ? info.getTriggerTime() : 0;
@@ -217,6 +224,12 @@
         }
     }
 
+    private void fireConsolidatedPolicyChanged(NotificationManager.Policy policy) {
+        synchronized (mCallbacksLock) {
+            Utils.safeForeach(mCallbacks, c -> c.onConsolidatedPolicyChanged(policy));
+        }
+    }
+
     @VisibleForTesting
     protected void fireConfigChanged(ZenModeConfig config) {
         synchronized (mCallbacksLock) {
@@ -231,6 +244,16 @@
     }
 
     @VisibleForTesting
+    protected void updateConsolidatedNotificationPolicy() {
+        final NotificationManager.Policy policy = mNoMan.getConsolidatedNotificationPolicy();
+        if (!Objects.equals(policy, mConsolidatedNotificationPolicy)) {
+            mConsolidatedNotificationPolicy = policy;
+            fireConsolidatedPolicyChanged(policy);
+        }
+    }
+
+
+    @VisibleForTesting
     protected void updateZenModeConfig() {
         final ZenModeConfig config = mNoMan.getZenModeConfig();
         if (Objects.equals(config, mConfig)) return;
@@ -238,9 +261,19 @@
         mConfig = config;
         mZenUpdateTime = System.currentTimeMillis();
         fireConfigChanged(config);
+
         final ZenRule newRule = config != null ? config.manualRule : null;
-        if (Objects.equals(oldRule, newRule)) return;
-        fireManualRuleChanged(newRule);
+        if (!Objects.equals(oldRule, newRule)) {
+            fireManualRuleChanged(newRule);
+        }
+
+        final NotificationManager.Policy consolidatedPolicy =
+                mNoMan.getConsolidatedNotificationPolicy();
+        if (!Objects.equals(consolidatedPolicy, mConsolidatedNotificationPolicy)) {
+            mConsolidatedNotificationPolicy = consolidatedPolicy;
+            fireConsolidatedPolicyChanged(consolidatedPolicy);
+        }
+
     }
 
     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@@ -260,6 +293,7 @@
         pw.println("ZenModeControllerImpl:");
         pw.println("  mZenMode=" + mZenMode);
         pw.println("  mConfig=" + mConfig);
+        pw.println("  mConsolidatedNotificationPolicy=" + mConsolidatedNotificationPolicy);
         pw.println("  mZenUpdateTime=" + DateFormat.format("MM-dd HH:mm:ss", mZenUpdateTime));
     }