Improve StatusBarManager disable*() apis

Enable adding a reason to disable api to improve debugging efforts. The goal is to have attribution data for why SystemUI elements are disabled, not just at a package level (as in the status quo) but at a sub package level. Can be tested by manually disabling flags from command line with "adb shell cmd statusbar send-disable-flag clock" and checking at the dump logs via "adb shell dumpsys statusbar".

Flag: NONE
Test: Manually tested in pixel 7.
Bug: 291319588
Change-Id: I52ff935d7d095a7bb1b698207de525bc551a45f6
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index c46ca78..931953d 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -1123,13 +1123,17 @@
     field public static final int NAV_BAR_MODE_KIDS = 1; // 0x1
   }
 
-  public static final class StatusBarManager.DisableInfo {
+  public static final class StatusBarManager.DisableInfo implements android.os.Parcelable {
     method public boolean areAllComponentsEnabled();
+    method public int describeContents();
+    method public boolean isBackDisabled();
     method public boolean isNavigateToHomeDisabled();
     method public boolean isNotificationPeekingDisabled();
     method public boolean isRecentsDisabled();
     method public boolean isSearchDisabled();
     method public boolean isStatusBarExpansionDisabled();
+    method public void writeToParcel(@NonNull android.os.Parcel, int);
+    field @NonNull public static final android.os.Parcelable.Creator<android.app.StatusBarManager.DisableInfo> CREATOR;
   }
 
   public final class SystemServiceRegistry {
diff --git a/core/api/system-lint-baseline.txt b/core/api/system-lint-baseline.txt
index 8a485d2..a6505c8 100644
--- a/core/api/system-lint-baseline.txt
+++ b/core/api/system-lint-baseline.txt
@@ -1927,6 +1927,10 @@
     New API must be flagged with @FlaggedApi: method android.app.ActivityManager.getExternalHistoricalProcessStartReasons(String,int)
 UnflaggedApi: android.app.AppOpsManager#OPSTR_RECEIVE_SANDBOX_TRIGGER_AUDIO:
     New API must be flagged with @FlaggedApi: field android.app.AppOpsManager.OPSTR_RECEIVE_SANDBOX_TRIGGER_AUDIO
+UnflaggedApi: android.app.StatusBarManager.DisableInfo#CREATOR:
+    New API must be flagged with @FlaggedApi: field android.app.StatusBarManager.DisableInfo.CREATOR
+UnflaggedApi: android.app.StatusBarManager.DisableInfo#isBackDisabled():
+    New API must be flagged with @FlaggedApi: method android.app.StatusBarManager.DisableInfo.isBackDisabled()
 UnflaggedApi: android.companion.virtual.VirtualDeviceManager.VirtualDevice#getPersistentDeviceId():
     New API must be flagged with @FlaggedApi: method android.companion.virtual.VirtualDeviceManager.VirtualDevice.getPersistentDeviceId()
 UnflaggedApi: android.content.Context#THREAD_NETWORK_SERVICE:
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index bbd6bde..2f59e43 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -455,7 +455,7 @@
     method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void togglePanel();
   }
 
-  public static final class StatusBarManager.DisableInfo {
+  public static final class StatusBarManager.DisableInfo implements android.os.Parcelable {
     method public boolean isRotationSuggestionDisabled();
   }
 
diff --git a/core/java/android/app/StatusBarManager.aidl b/core/java/android/app/StatusBarManager.aidl
new file mode 100644
index 0000000..687678c
--- /dev/null
+++ b/core/java/android/app/StatusBarManager.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2024, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app;
+
+parcelable StatusBarManager.DisableInfo;
\ No newline at end of file
diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java
index 14195c4..e6e46dd 100644
--- a/core/java/android/app/StatusBarManager.java
+++ b/core/java/android/app/StatusBarManager.java
@@ -21,6 +21,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
+import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
 import android.annotation.SystemService;
 import android.annotation.TestApi;
@@ -43,6 +44,7 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.os.IBinder;
+import android.os.Parcelable;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.UserHandle;
@@ -57,6 +59,7 @@
 import com.android.internal.statusbar.IStatusBarService;
 import com.android.internal.statusbar.IUndoMediaTransferCallback;
 import com.android.internal.statusbar.NotificationVisibility;
+import com.android.internal.util.DataClass;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -629,38 +632,49 @@
     }
 
     /**
-     * Disable some features in the status bar.  Pass the bitwise-or of the DISABLE_* flags.
-     * To re-enable everything, pass {@link #DISABLE_NONE}.
+     * @deprecated
+     * Disable some features in the status bar.  Pass the bitwise-or of the DISABLE_*
+     * flags. To re-enable everything, pass {@link #DISABLE_NONE}.
+     *
+     * This method is deprecated and callers should use
+     * {@link #requestDisabledComponent(DisableInfo, String)}
+     *
+     * @hide
+     */
+    @Deprecated
+    @UnsupportedAppUsage
+    public void disable(int what) {
+        requestDisabledComponent(new DisableInfo(what & DISABLE_MASK, what & DISABLE2_MASK), null);
+    }
+
+    /**
+     * @deprecated
+     * Disable some features in the status bar.  Pass the bitwise-or of the DISABLE_2*
+     * flags. To re-enable everything, pass {@link #DISABLE2_NONE}.
+     *
+     * This method is deprecated and callers should use
+     * {@link #requestDisabledComponent(DisableInfo, String)}
+     *
+     * @hide
+     */
+    @Deprecated
+    @UnsupportedAppUsage
+    public void disable2(int what) {
+        requestDisabledComponent(new DisableInfo(what & DISABLE_MASK, what & DISABLE2_MASK), null);
+    }
+
+    /**
+     * Disable some features in the status bar. Pass a DisableInfo object with the required flags.
      *
      * @hide
      */
     @UnsupportedAppUsage
-    public void disable(int what) {
+    public void requestDisabledComponent(DisableInfo disableInfo, String reason) {
         try {
             final int userId = Binder.getCallingUserHandle().getIdentifier();
             final IStatusBarService svc = getService();
             if (svc != null) {
-                svc.disableForUser(what, mToken, mContext.getPackageName(), userId);
-            }
-        } catch (RemoteException ex) {
-            throw ex.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Disable additional status bar features. Pass the bitwise-or of the DISABLE2_* flags.
-     * To re-enable everything, pass {@link #DISABLE_NONE}.
-     *
-     * Warning: Only pass DISABLE2_* flags into this function, do not use DISABLE_* flags.
-     *
-     * @hide
-     */
-    public void disable2(@Disable2Flags int what) {
-        try {
-            final int userId = Binder.getCallingUserHandle().getIdentifier();
-            final IStatusBarService svc = getService();
-            if (svc != null) {
-                svc.disable2ForUser(what, mToken, mContext.getPackageName(), userId);
+                svc.disableForUser(disableInfo, mToken, mContext.getPackageName(), userId, reason);
             }
         } catch (RemoteException ex) {
             throw ex.rethrowFromSystemServer();
@@ -888,18 +902,9 @@
     @SystemApi
     @RequiresPermission(android.Manifest.permission.STATUS_BAR)
     public void setDisabledForSetup(boolean disabled) {
-        try {
-            final int userId = Binder.getCallingUserHandle().getIdentifier();
-            final IStatusBarService svc = getService();
-            if (svc != null) {
-                svc.disableForUser(disabled ? DEFAULT_SETUP_DISABLE_FLAGS : DISABLE_NONE,
-                        mToken, mContext.getPackageName(), userId);
-                svc.disable2ForUser(disabled ? DEFAULT_SETUP_DISABLE2_FLAGS : DISABLE2_NONE,
-                        mToken, mContext.getPackageName(), userId);
-            }
-        } catch (RemoteException ex) {
-            throw ex.rethrowFromSystemServer();
-        }
+        int flags1 = disabled ? DEFAULT_SETUP_DISABLE_FLAGS : DISABLE_NONE;
+        DisableInfo info = new DisableInfo(flags1, DISABLE2_NONE);
+        requestDisabledComponent(info, "setDisabledForSetup");
     }
 
     /**
@@ -914,16 +919,9 @@
     @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
     @RequiresPermission(android.Manifest.permission.STATUS_BAR)
     public void setExpansionDisabledForSimNetworkLock(boolean disabled) {
-        try {
-            final int userId = Binder.getCallingUserHandle().getIdentifier();
-            final IStatusBarService svc = getService();
-            if (svc != null) {
-                svc.disableForUser(disabled ? DEFAULT_SIM_LOCKED_DISABLED_FLAGS : DISABLE_NONE,
-                        mToken, mContext.getPackageName(), userId);
-            }
-        } catch (RemoteException ex) {
-            throw ex.rethrowFromSystemServer();
-        }
+        int flags1 = disabled ? DEFAULT_SIM_LOCKED_DISABLED_FLAGS : DISABLE_NONE;
+        DisableInfo info = new DisableInfo(flags1, DISABLE2_NONE);
+        requestDisabledComponent(info, "setExpansionDisabledForSimNetworkLock");
     }
 
     /**
@@ -1315,33 +1313,75 @@
      * @hide
      */
     @SystemApi
-    public static final class DisableInfo {
+    @DataClass
+    public static final class DisableInfo implements Parcelable {
 
+        /**
+         * @hide
+         */
         private boolean mStatusBarExpansion;
+        /**
+         * @hide
+         */
         private boolean mNavigateHome;
+        /**
+         * @hide
+         */
         private boolean mNotificationPeeking;
+        /**
+         * @hide
+         */
         private boolean mRecents;
+        /**
+         * @hide
+         */
+        private boolean mBack;
+        /**
+         * @hide
+         */
         private boolean mSearch;
+        /**
+         * @hide
+         */
         private boolean mSystemIcons;
+        /**
+         * @hide
+         */
         private boolean mClock;
+        /**
+         * @hide
+         */
         private boolean mNotificationIcons;
+        /**
+         * @hide
+         */
         private boolean mRotationSuggestion;
+        /**
+         * @hide
+         */
+        private boolean mNotificationTicker;
 
         /** @hide */
+        @SuppressLint("UnflaggedApi")
         public DisableInfo(int flags1, int flags2) {
             mStatusBarExpansion = (flags1 & DISABLE_EXPAND) != 0;
             mNavigateHome = (flags1 & DISABLE_HOME) != 0;
             mNotificationPeeking = (flags1 & DISABLE_NOTIFICATION_ALERTS) != 0;
             mRecents = (flags1 & DISABLE_RECENT) != 0;
+            mBack = (flags1 & DISABLE_BACK) != 0;
             mSearch = (flags1 & DISABLE_SEARCH) != 0;
             mSystemIcons = (flags1 & DISABLE_SYSTEM_INFO) != 0;
             mClock = (flags1 & DISABLE_CLOCK) != 0;
             mNotificationIcons = (flags1 & DISABLE_NOTIFICATION_ICONS) != 0;
+            mNotificationTicker = (flags1 & DISABLE_NOTIFICATION_TICKER) != 0;
             mRotationSuggestion = (flags2 & DISABLE2_ROTATE_SUGGESTIONS) != 0;
         }
 
         /** @hide */
-        public DisableInfo() {}
+        @SuppressLint("UnflaggedApi")
+        public DisableInfo() {
+            setEnableAll();
+        }
 
         /**
          * @return {@code true} if expanding the notification shade is disabled
@@ -1369,7 +1409,7 @@
         }
 
         /** * @hide */
-        public void setNagivationHomeDisabled(boolean disabled) {
+        public void setNavigationHomeDisabled(boolean disabled) {
             mNavigateHome = disabled;
         }
 
@@ -1404,6 +1444,21 @@
         }
 
         /**
+         * @return {@code true} if mBack is disabled
+         *
+         * @hide
+         */
+        @SystemApi
+        public boolean isBackDisabled() {
+            return mBack;
+        }
+
+        /**  @hide */
+        public void setBackDisabled(boolean disabled) {
+            mBack = disabled;
+        }
+
+        /**
          * @return {@code true} if mSearch is disabled
          *
          * @hide
@@ -1461,6 +1516,20 @@
         }
 
         /**
+         * @return {@code true} if notification ticker is disabled
+         *
+         * @hide
+         */
+        public boolean isNotificationTickerDisabled() {
+            return mNotificationTicker;
+        }
+
+        /** * @hide */
+        public void setNotificationTickerDisabled(boolean disabled) {
+            mNotificationTicker = disabled;
+        }
+
+        /**
          * Returns whether the rotation suggestion is disabled.
          *
          * @hide
@@ -1470,6 +1539,11 @@
             return mRotationSuggestion;
         }
 
+        /** * @hide */
+        public void setRotationSuggestionDisabled(boolean disabled) {
+            mNotificationIcons = disabled;
+        }
+
         /**
          * @return {@code true} if no components are disabled (default state)
          * @hide
@@ -1477,8 +1551,8 @@
         @SystemApi
         public boolean areAllComponentsEnabled() {
             return !mStatusBarExpansion && !mNavigateHome && !mNotificationPeeking && !mRecents
-                    && !mSearch && !mSystemIcons && !mClock && !mNotificationIcons
-                    && !mRotationSuggestion;
+                    && !mBack && !mSearch && !mSystemIcons && !mClock && !mNotificationIcons
+                    && !mNotificationTicker && !mRotationSuggestion;
         }
 
         /** @hide */
@@ -1487,10 +1561,12 @@
             mNavigateHome = false;
             mNotificationPeeking = false;
             mRecents = false;
+            mBack = false;
             mSearch = false;
             mSystemIcons = false;
             mClock = false;
             mNotificationIcons = false;
+            mNotificationTicker = false;
             mRotationSuggestion = false;
         }
 
@@ -1500,9 +1576,9 @@
          * @hide
          */
         public boolean areAllComponentsDisabled() {
-            return mStatusBarExpansion && mNavigateHome && mNotificationPeeking
-                    && mRecents && mSearch && mSystemIcons && mClock && mNotificationIcons
-                    && mRotationSuggestion;
+            return mStatusBarExpansion && mNavigateHome && mNotificationPeeking && mRecents && mBack
+                    && mSearch && mSystemIcons && mClock && mNotificationIcons
+                    && mNotificationTicker && mRotationSuggestion;
         }
 
         /** @hide */
@@ -1511,10 +1587,12 @@
             mNavigateHome = true;
             mNotificationPeeking = true;
             mRecents = true;
+            mBack = true;
             mSearch = true;
             mSystemIcons = true;
             mClock = true;
             mNotificationIcons = true;
+            mNotificationTicker = true;
             mRotationSuggestion = true;
         }
 
@@ -1522,16 +1600,19 @@
         @Override
         public String toString() {
             StringBuilder sb = new StringBuilder();
-            sb.append("DisableInfo: ");
+
+            sb.append("Disable Info: ");
             sb.append(" mStatusBarExpansion=").append(mStatusBarExpansion ? "disabled" : "enabled");
             sb.append(" mNavigateHome=").append(mNavigateHome ? "disabled" : "enabled");
             sb.append(" mNotificationPeeking=")
                     .append(mNotificationPeeking ? "disabled" : "enabled");
             sb.append(" mRecents=").append(mRecents ? "disabled" : "enabled");
+            sb.append(" mBack=").append(mBack ? "disabled" : "enabled");
             sb.append(" mSearch=").append(mSearch ? "disabled" : "enabled");
             sb.append(" mSystemIcons=").append(mSystemIcons ? "disabled" : "enabled");
             sb.append(" mClock=").append(mClock ? "disabled" : "enabled");
             sb.append(" mNotificationIcons=").append(mNotificationIcons ? "disabled" : "enabled");
+            sb.append(" mNotificationTicker=").append(mNotificationTicker ? "disabled" : "enabled");
             sb.append(" mRotationSuggestion=").append(mRotationSuggestion ? "disabled" : "enabled");
 
             return sb.toString();
@@ -1539,7 +1620,7 @@
         }
 
         /**
-         * Convert a DisableInfo to equivalent flags
+         * Convert a DisableInfo to equivalent flags.
          * @return a pair of equivalent disable flags
          *
          * @hide
@@ -1552,14 +1633,278 @@
             if (mNavigateHome) disable1 |= DISABLE_HOME;
             if (mNotificationPeeking) disable1 |= DISABLE_NOTIFICATION_ALERTS;
             if (mRecents) disable1 |= DISABLE_RECENT;
+            if (mBack) disable1 |= DISABLE_BACK;
             if (mSearch) disable1 |= DISABLE_SEARCH;
             if (mSystemIcons) disable1 |= DISABLE_SYSTEM_INFO;
             if (mClock) disable1 |= DISABLE_CLOCK;
             if (mNotificationIcons) disable1 |= DISABLE_NOTIFICATION_ICONS;
+            if (mNotificationTicker) disable1 |= DISABLE_NOTIFICATION_TICKER;
             if (mRotationSuggestion) disable2 |= DISABLE2_ROTATE_SUGGESTIONS;
 
             return new Pair<Integer, Integer>(disable1, disable2);
         }
+
+
+
+        // Code below generated by codegen v1.0.23.
+        //
+        // DO NOT MODIFY!
+        // CHECKSTYLE:OFF Generated code
+        //
+        // To regenerate run:
+        // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/app/StatusBarManager.java
+        //
+        // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
+        //   Settings > Editor > Code Style > Formatter Control
+        //@formatter:off
+
+
+        /**
+         * Creates a new DisableInfo.
+         * @hide
+         */
+        @DataClass.Generated.Member
+        public DisableInfo(
+                boolean statusBarExpansion,
+                boolean navigateHome,
+                boolean notificationPeeking,
+                boolean recents,
+                boolean back,
+                boolean search,
+                boolean systemIcons,
+                boolean clock,
+                boolean notificationIcons,
+                boolean rotationSuggestion,
+                boolean notificationTicker) {
+            this.mStatusBarExpansion = statusBarExpansion;
+            this.mNavigateHome = navigateHome;
+            this.mNotificationPeeking = notificationPeeking;
+            this.mRecents = recents;
+            this.mBack = back;
+            this.mSearch = search;
+            this.mSystemIcons = systemIcons;
+            this.mClock = clock;
+            this.mNotificationIcons = notificationIcons;
+            this.mRotationSuggestion = rotationSuggestion;
+            this.mNotificationTicker = notificationTicker;
+
+            // onConstructed(); // You can define this method to get a callback
+        }
+
+        /**
+         * @hide
+         */
+        @DataClass.Generated.Member
+        public boolean isStatusBarExpansion() {
+            return mStatusBarExpansion;
+        }
+
+        /**
+         * @hide
+         */
+        @DataClass.Generated.Member
+        public boolean isNavigateHome() {
+            return mNavigateHome;
+        }
+
+        /**
+         * @hide
+         */
+        @DataClass.Generated.Member
+        public boolean isNotificationPeeking() {
+            return mNotificationPeeking;
+        }
+
+        /**
+         * @hide
+         */
+        @DataClass.Generated.Member
+        public boolean isRecents() {
+            return mRecents;
+        }
+
+        /**
+         * @hide
+         */
+        @DataClass.Generated.Member
+        public boolean isBack() {
+            return mBack;
+        }
+
+        /**
+         * @hide
+         */
+        @DataClass.Generated.Member
+        public boolean isSearch() {
+            return mSearch;
+        }
+
+        /**
+         * @hide
+         */
+        @DataClass.Generated.Member
+        public boolean isSystemIcons() {
+            return mSystemIcons;
+        }
+
+        /**
+         * @hide
+         */
+        @DataClass.Generated.Member
+        public boolean isClock() {
+            return mClock;
+        }
+
+        /**
+         * @hide
+         */
+        @DataClass.Generated.Member
+        public boolean isNotificationIcons() {
+            return mNotificationIcons;
+        }
+
+        /**
+         * @hide
+         */
+        @DataClass.Generated.Member
+        public boolean isRotationSuggestion() {
+            return mRotationSuggestion;
+        }
+
+        /**
+         * @hide
+         */
+        @DataClass.Generated.Member
+        public boolean isNotificationTicker() {
+            return mNotificationTicker;
+        }
+
+        /**
+         * @hide
+         */
+        @SuppressLint("UnflaggedApi")
+        @Override
+        @DataClass.Generated.Member
+        public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
+            // You can override field parcelling by defining methods like:
+            // void parcelFieldName(Parcel dest, int flags) { ... }
+
+            int flg = 0;
+            if (mStatusBarExpansion) flg |= 0x1;
+            if (mNavigateHome) flg |= 0x2;
+            if (mNotificationPeeking) flg |= 0x4;
+            if (mRecents) flg |= 0x8;
+            if (mBack) flg |= 0x10;
+            if (mSearch) flg |= 0x20;
+            if (mSystemIcons) flg |= 0x40;
+            if (mClock) flg |= 0x80;
+            if (mNotificationIcons) flg |= 0x100;
+            if (mRotationSuggestion) flg |= 0x200;
+            if (mNotificationTicker) flg |= 0x400;
+            dest.writeInt(flg);
+        }
+
+        /**
+         * @hide
+         */
+        @SuppressLint("UnflaggedApi")
+        @Override
+        @DataClass.Generated.Member
+        public int describeContents() { return 0; }
+
+        /** @hide */
+        @SuppressWarnings({"unchecked", "RedundantCast"})
+        @DataClass.Generated.Member
+        /* package-private */ DisableInfo(@NonNull android.os.Parcel in) {
+            // You can override field unparcelling by defining methods like:
+            // static FieldType unparcelFieldName(Parcel in) { ... }
+
+            int flg = in.readInt();
+            boolean statusBarExpansion = (flg & 0x1) != 0;
+            boolean navigateHome = (flg & 0x2) != 0;
+            boolean notificationPeeking = (flg & 0x4) != 0;
+            boolean recents = (flg & 0x8) != 0;
+            boolean back = (flg & 0x10) != 0;
+            boolean search = (flg & 0x20) != 0;
+            boolean systemIcons = (flg & 0x40) != 0;
+            boolean clock = (flg & 0x80) != 0;
+            boolean notificationIcons = (flg & 0x100) != 0;
+            boolean rotationSuggestion = (flg & 0x200) != 0;
+            boolean notificationTicker = (flg & 0x400) != 0;
+
+            this.mStatusBarExpansion = statusBarExpansion;
+            this.mNavigateHome = navigateHome;
+            this.mNotificationPeeking = notificationPeeking;
+            this.mRecents = recents;
+            this.mBack = back;
+            this.mSearch = search;
+            this.mSystemIcons = systemIcons;
+            this.mClock = clock;
+            this.mNotificationIcons = notificationIcons;
+            this.mRotationSuggestion = rotationSuggestion;
+            this.mNotificationTicker = notificationTicker;
+
+            // onConstructed(); // You can define this method to get a callback
+        }
+
+        @DataClass.Generated.Member
+        public static final @NonNull Parcelable.Creator<DisableInfo> CREATOR
+                = new Parcelable.Creator<DisableInfo>() {
+            @Override
+            public DisableInfo[] newArray(int size) {
+                return new DisableInfo[size];
+            }
+
+            @Override
+            public DisableInfo createFromParcel(@NonNull android.os.Parcel in) {
+                return new DisableInfo(in);
+            }
+        };
+
+        @DataClass.Generated(
+                time = 1707345957771L,
+                codegenVersion = "1.0.23",
+                sourceFile = "frameworks/base/core/java/android/app/StatusBarManager.java",
+                inputSignatures = "private  boolean mStatusBarExpansion\nprivate  "
+                        + "boolean mNavigateHome\nprivate  boolean mNotificationPeeking\nprivate  "
+                        + "boolean mRecents\nprivate  boolean mBack\nprivate  boolean "
+                        + "mSearch\nprivate  boolean mSystemIcons\nprivate  boolean mClock\nprivate"
+                        + "  boolean mNotificationIcons\nprivate  boolean mRotationSuggestion\n"
+                        + "private  boolean mNotificationTicker\npublic "
+                        + "@android.annotation.SystemApi boolean isStatusBarExpansionDisabled()\n"
+                        + "public  void setStatusBarExpansionDisabled(boolean)\npublic "
+                        + "@android.annotation.SystemApi boolean isNavigateToHomeDisabled()\n"
+                        + "public  void setNavigationHomeDisabled(boolean)\npublic "
+                        + "@android.annotation.SystemApi boolean isNotificationPeekingDisabled()\n"
+                        + "public  void setNotificationPeekingDisabled(boolean)\npublic "
+                        + "@android.annotation.SystemApi boolean isRecentsDisabled()\npublic  "
+                        + "void setRecentsDisabled(boolean)\npublic @android.annotation.SystemApi "
+                        + "boolean isBackDisabled()\npublic  void setBackDisabled(boolean)\npublic "
+                        + "@android.annotation.SystemApi boolean isSearchDisabled()\npublic  "
+                        + "void setSearchDisabled(boolean)\npublic  boolean "
+                        + "areSystemIconsDisabled()\npublic  void setSystemIconsDisabled(boolean)"
+                        + "\npublic  boolean isClockDisabled()\npublic  "
+                        + "void setClockDisabled(boolean)\npublic  "
+                        + "boolean areNotificationIconsDisabled()\npublic  "
+                        + "void setNotificationIconsDisabled(boolean)\npublic  boolean "
+                        + "isNotificationTickerDisabled()\npublic  void "
+                        + "setNotificationTickerDisabled(boolean)\npublic "
+                        + "@android.annotation.TestApi boolean isRotationSuggestionDisabled()\n"
+                        + "public  void setRotationSuggestionDisabled(boolean)\npublic "
+                        + "@android.annotation.SystemApi boolean areAllComponentsEnabled()\n"
+                        + "public  void setEnableAll()\npublic  boolean areAllComponentsDisabled()"
+                        + "\npublic  void setDisableAll()\npublic @android.annotation.NonNull "
+                        + "@java.lang.Override java.lang.String toString()\npublic  "
+                        + "android.util.Pair<java.lang.Integer,java.lang.Integer> toFlags()\n"
+                        + "class DisableInfo extends java.lang.Object implements "
+                        + "[android.os.Parcelable]\n@com.android.internal.util.DataClass")
+        @Deprecated
+        private void __metadata() {}
+
+
+        //@formatter:on
+        // End of generated code
+
     }
 
     /**
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index fc60f06..b83b2d2 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -17,6 +17,7 @@
 package com.android.internal.statusbar;
 
 import android.app.Notification;
+import android.app.StatusBarManager;
 import android.content.ComponentName;
 import android.graphics.drawable.Icon;
 import android.graphics.Rect;
@@ -52,9 +53,9 @@
     void togglePanel();
     @UnsupportedAppUsage
     void disable(int what, IBinder token, String pkg);
-    void disableForUser(int what, IBinder token, String pkg, int userId);
     void disable2(int what, IBinder token, String pkg);
-    void disable2ForUser(int what, IBinder token, String pkg, int userId);
+    void disableForUser(in StatusBarManager.DisableInfo info, IBinder token, String pkg, int userId, String reason);
+
     int[] getDisableFlags(IBinder token, int userId);
     void setIcon(String slot, String iconPackage, int iconId, int iconLevel, String contentDescription);
     @UnsupportedAppUsage
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java
index 445ba89..619f624 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java
@@ -16,11 +16,11 @@
 
 package com.android.wm.shell.draganddrop;
 
+import static android.app.StatusBarManager.DISABLE2_NONE;
 import static android.app.StatusBarManager.DISABLE_NONE;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
 import static android.content.pm.ActivityInfo.CONFIG_ASSETS_PATHS;
 import static android.content.pm.ActivityInfo.CONFIG_UI_MODE;
-import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 
 import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT;
@@ -445,18 +445,20 @@
     }
 
     private void animateFullscreenContainer(boolean visible) {
-        mStatusBarManager.disable(visible
-                ? HIDE_STATUS_BAR_FLAGS
-                : DISABLE_NONE);
+        int flags = visible ? HIDE_STATUS_BAR_FLAGS : DISABLE_NONE;
+        StatusBarManager.DisableInfo disableInfo = new StatusBarManager.DisableInfo(flags,
+                DISABLE2_NONE);
+        mStatusBarManager.requestDisabledComponent(disableInfo, "animateFullscreenContainer");
         // We're only using the first drop zone if there is one fullscreen target
         mDropZoneView1.setShowingMargin(visible);
         mDropZoneView1.setShowingHighlight(visible);
     }
 
     private void animateSplitContainers(boolean visible, Runnable animCompleteCallback) {
-        mStatusBarManager.disable(visible
-                ? HIDE_STATUS_BAR_FLAGS
-                : DISABLE_NONE);
+        int flags = visible ? HIDE_STATUS_BAR_FLAGS : DISABLE_NONE;
+        StatusBarManager.DisableInfo disableInfo = new StatusBarManager.DisableInfo(flags,
+                DISABLE2_NONE);
+        mStatusBarManager.requestDisabledComponent(disableInfo, "animateSplitContainers");
         mDropZoneView1.setShowingMargin(visible);
         mDropZoneView2.setShowingMargin(visible);
         Animator animator = mDropZoneView1.getAnimator();
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
index a95ddb5..6afcac1 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
@@ -2689,10 +2689,12 @@
         protected final void setRotationSuggestionsEnabled(boolean enabled) {
             try {
                 final int userId = Binder.getCallingUserHandle().getIdentifier();
-                final int what = enabled
-                        ? StatusBarManager.DISABLE2_NONE
-                        : StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS;
-                mStatusBarService.disable2ForUser(what, mToken, mContext.getPackageName(), userId);
+                StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+                if (enabled) {
+                    info.setRotationSuggestionDisabled(true);
+                }
+                mStatusBarService.disableForUser(info, mToken, mContext.getPackageName(), userId,
+                        "setRotationSuggestionsEnabled");
             } catch (RemoteException ex) {
                 throw ex.rethrowFromSystemServer();
             }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 39bbf07..b7e4eb2 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.keyguard;
 
+import static android.app.StatusBarManager.DISABLE2_NONE;
 import static android.app.StatusBarManager.SESSION_KEYGUARD;
 import static android.provider.Settings.Secure.LOCK_SCREEN_LOCK_AFTER_TIMEOUT;
 import static android.provider.Settings.System.LOCKSCREEN_SOUNDS_ENABLED;
@@ -3402,9 +3403,12 @@
             //  unless disable is called to show un-hide it once first
             if (forceClearFlags) {
                 try {
-                    mStatusBarService.disableForUser(flags, mStatusBarDisableToken,
+                    StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo(flags,
+                            DISABLE2_NONE);
+                    mStatusBarService.disableForUser(info, mStatusBarDisableToken,
                             mContext.getPackageName(),
-                            mSelectedUserInteractor.getSelectedUserId(true));
+                            mSelectedUserInteractor.getSelectedUserId(true),
+                            "adjustStatusBarLocked - force clear flags");
                 } catch (RemoteException e) {
                     Log.d(TAG, "Failed to force clear flags", e);
                 }
@@ -3430,9 +3434,11 @@
             }
 
             try {
-                mStatusBarService.disableForUser(flags, mStatusBarDisableToken,
-                        mContext.getPackageName(),
-                        mSelectedUserInteractor.getSelectedUserId(true));
+                StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo(flags,
+                        DISABLE2_NONE);
+                mStatusBarService.disableForUser(info, mStatusBarDisableToken,
+                        mContext.getPackageName(), mSelectedUserInteractor.getSelectedUserId(true),
+                        "adjustStatusBarLocked - set disable flags");
             } catch (RemoteException e) {
                 Log.d(TAG, "Failed to set disable flags: " + flags, e);
             }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
index 3e7089c..0f3f122 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
@@ -16,7 +16,6 @@
 
 package com.android.systemui.statusbar.phone;
 
-import static android.app.StatusBarManager.DISABLE_HOME;
 import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN;
 import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
 import static android.app.StatusBarManager.WindowVisibleState;
@@ -1005,8 +1004,14 @@
                 // this handling this post-init task. We force an update in this case, and use a new
                 // token to not conflict with any other disabled flags already requested by SysUI
                 Binder token = new Binder();
-                mBarService.disable(DISABLE_HOME, token, mContext.getPackageName());
-                mBarService.disable(0, token, mContext.getPackageName());
+                int userId = mContext.getUserId();
+                StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+                info.setNavigationHomeDisabled(true);
+                mBarService.disableForUser(info, token, mContext.getPackageName(),
+                        userId, "set the initial view visibility");
+
+                mBarService.disableForUser(new StatusBarManager.DisableInfo(), token,
+                        mContext.getPackageName(), userId, "set the initial view visibility");
             } catch (RemoteException ex) {
                 ex.rethrowFromSystemServer();
             }
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java
index 82d9377..05010f88 100644
--- a/services/core/java/com/android/server/UiModeManagerService.java
+++ b/services/core/java/com/android/server/UiModeManagerService.java
@@ -1986,9 +1986,11 @@
         // the status bar should be totally disabled, the calls below will
         // have no effect until the device is unlocked.
         if (mStatusBarManager != null) {
-            mStatusBarManager.disable(mCarModeEnabled
-                    ? StatusBarManager.DISABLE_NOTIFICATION_TICKER
-                    : StatusBarManager.DISABLE_NONE);
+            StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+            if (mCarModeEnabled) {
+                info.setNotificationTickerDisabled(true);
+            }
+            mStatusBarManager.requestDisabledComponent(info, "adjustStatusBarCarModeLocked");
         }
 
         if (mNotificationManager == null) {
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 4955358..fd316ea 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -20,7 +20,9 @@
 import static android.Manifest.permission.INTERACT_ACROSS_USERS;
 import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
 import static android.app.StatusBarManager.DISABLE2_GLOBAL_ACTIONS;
+import static android.app.StatusBarManager.DISABLE2_MASK;
 import static android.app.StatusBarManager.DISABLE2_NOTIFICATION_SHADE;
+import static android.app.StatusBarManager.DISABLE_MASK;
 import static android.app.StatusBarManager.NAV_BAR_MODE_DEFAULT;
 import static android.app.StatusBarManager.NAV_BAR_MODE_KIDS;
 import static android.app.StatusBarManager.NavBarMode;
@@ -220,8 +222,9 @@
         int what1;
         int what2;
         IBinder token;
+        private String mReason;
 
-        public DisableRecord(int userId, IBinder token) {
+        DisableRecord(int userId, IBinder token) {
             this.userId = userId;
             this.token = token;
             try {
@@ -234,12 +237,12 @@
         @Override
         public void binderDied() {
             Slog.i(TAG, "binder died for pkg=" + pkg);
-            disableForUser(0, token, pkg, userId);
-            disable2ForUser(0, token, pkg, userId);
+            StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+            disableForUser(info, token, pkg, userId, "Binder Died");
             token.unlinkToDeath(this, 0);
         }
 
-        public void setFlags(int what, int which, String pkg) {
+        public void setFlags(int what, int which, String pkg, String reason) {
             switch (which) {
                 case 1:
                     what1 = what;
@@ -253,6 +256,7 @@
                     break;
             }
             this.pkg = pkg;
+            this.mReason = reason;
         }
 
         public int getFlags(int which) {
@@ -271,8 +275,8 @@
 
         @Override
         public String toString() {
-            return String.format("userId=%d what1=0x%08X what2=0x%08X pkg=%s token=%s",
-                    userId, what1, what2, pkg, token);
+            return String.format("userId=%d what1=0x%08X what2=0x%08X pkg=%s token=%s reason=%s",
+                    userId, what1, what2, pkg, token, mReason);
         }
     }
 
@@ -1160,57 +1164,59 @@
         return mTracingEnabled;
     }
 
-    // TODO(b/117478341): make it aware of multi-display if needed.
+    /**
+     * @deprecated
+     * Disable some features in the status bar.
+     *
+     * This method is deprecated and callers should use
+     * {@link #disableForUser(StatusBarManager.DisableInfo, IBinder, String, int, String)}
+     *
+     * @hide
+     */
+    @Deprecated
     @Override
     public void disable(int what, IBinder token, String pkg) {
-        disableForUser(what, token, pkg, mCurrentUserId);
+        StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo(what & DISABLE_MASK,
+                what & DISABLE2_MASK);
+        disableForUser(info, token, pkg, mCurrentUserId, null);
     }
 
-    // TODO(b/117478341): make it aware of multi-display if needed.
-    @Override
-    public void disableForUser(int what, IBinder token, String pkg, int userId) {
-        enforceStatusBar();
-
-        synchronized (mLock) {
-            disableLocked(DEFAULT_DISPLAY, userId, what, token, pkg, 1);
-        }
-    }
-
-    // TODO(b/117478341): make it aware of multi-display if needed.
     /**
-     * Disable additional status bar features. Pass the bitwise-or of the DISABLE2_* flags.
-     * To re-enable everything, pass {@link #DISABLE2_NONE}.
+     * @deprecated
+     * Disable some features in the status bar.
      *
-     * Warning: Only pass DISABLE2_* flags into this function, do not use DISABLE_* flags.
+     * This method is deprecated and callers should use
+     * {@link #disableForUser(StatusBarManager.DisableInfo, IBinder, String, int, String)}
+     *
+     * @hide
      */
+    @Deprecated
     @Override
     public void disable2(int what, IBinder token, String pkg) {
-        disable2ForUser(what, token, pkg, mCurrentUserId);
+        StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo(what & DISABLE_MASK,
+                what & DISABLE2_MASK);
+        disableForUser(info, token, pkg, mCurrentUserId, null);
     }
 
     // TODO(b/117478341): make it aware of multi-display if needed.
-    /**
-     * Disable additional status bar features for a given user. Pass the bitwise-or of the
-     * DISABLE2_* flags. To re-enable everything, pass {@link #DISABLE_NONE}.
-     *
-     * Warning: Only pass DISABLE2_* flags into this function, do not use DISABLE_* flags.
-     */
     @Override
-    public void disable2ForUser(int what, IBinder token, String pkg, int userId) {
+    public void disableForUser(StatusBarManager.DisableInfo disableInfo, IBinder token, String pkg,
+            int userId, String reason) {
         enforceStatusBar();
-
         synchronized (mLock) {
-            disableLocked(DEFAULT_DISPLAY, userId, what, token, pkg, 2);
+            Pair<Integer, Integer> flags = disableInfo.toFlags();
+            disableLocked(DEFAULT_DISPLAY, userId, flags.first, token, pkg, 1, reason);
+            disableLocked(DEFAULT_DISPLAY, userId, flags.second, token, pkg, 2, reason);
         }
     }
 
     private void disableLocked(int displayId, int userId, int what, IBinder token, String pkg,
-            int whichFlag) {
+            int whichFlag, String reason) {
         // It's important that the the callback and the call to mBar get done
         // in the same order when multiple threads are calling this function
         // so they are paired correctly.  The messages on the handler will be
         // handled in the order they were enqueued, but will be outside the lock.
-        manageDisableListLocked(userId, what, token, pkg, whichFlag);
+        manageDisableListLocked(userId, what, token, pkg, whichFlag, reason);
 
         // Ensure state for the current user is applied, even if passed a non-current user.
         final int net1 = gatherDisableActionsLocked(mCurrentUserId, 1);
@@ -1359,7 +1365,7 @@
         // also allows calls from window manager which is in this process.
         enforceStatusBarService();
 
-        final int unknownFlags = flags & ~StatusBarManager.DISABLE_MASK;
+        final int unknownFlags = flags & ~DISABLE_MASK;
         if (unknownFlags != 0) {
             Slog.e(TAG, "Unknown disable flags: 0x" + Integer.toHexString(unknownFlags),
                     new RuntimeException());
@@ -1368,7 +1374,8 @@
         if (SPEW) Slog.d(TAG, "setDisableFlags(0x" + Integer.toHexString(flags) + ")");
 
         synchronized (mLock) {
-            disableLocked(displayId, mCurrentUserId, flags, mSysUiVisToken, cause, 1);
+            disableLocked(displayId, mCurrentUserId, flags, mSysUiVisToken, cause, 1,
+                    "setDisableFlags");
         }
     }
 
@@ -2423,7 +2430,8 @@
     // ================================================================================
 
     // lock on mDisableRecords
-    void manageDisableListLocked(int userId, int what, IBinder token, String pkg, int which) {
+    void manageDisableListLocked(int userId, int what, IBinder token, String pkg, int which,
+            String reason) {
         if (SPEW) {
             Slog.d(TAG, "manageDisableList userId=" + userId
                     + " what=0x" + Integer.toHexString(what) + " pkg=" + pkg);
@@ -2445,7 +2453,7 @@
 
         // Update existing record
         if (record != null) {
-            record.setFlags(what, which, pkg);
+            record.setFlags(what, which, pkg, reason);
             if (record.isEmpty()) {
                 mDisableRecords.remove(i);
                 record.token.unlinkToDeath(record, 0);
@@ -2455,7 +2463,7 @@
 
         // Record doesn't exist, so we create a new one
         record = new DisableRecord(userId, token);
-        record.setFlags(what, which, pkg);
+        record.setFlags(what, which, pkg, reason);
         mDisableRecords.add(record);
     }
 
diff --git a/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java b/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java
index d6bf02f..adb55b4 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java
@@ -16,8 +16,6 @@
 
 import static android.app.StatusBarManager.DEFAULT_SETUP_DISABLE2_FLAGS;
 import static android.app.StatusBarManager.DEFAULT_SETUP_DISABLE_FLAGS;
-import static android.app.StatusBarManager.DISABLE2_NONE;
-import static android.app.StatusBarManager.DISABLE_NONE;
 
 import android.app.StatusBarManager.DisableInfo;
 import android.content.ComponentName;
@@ -27,7 +25,6 @@
 import android.os.RemoteException;
 import android.os.ShellCommand;
 import android.service.quicksettings.TileService;
-import android.util.Pair;
 
 import java.io.PrintWriter;
 
@@ -144,25 +141,17 @@
         String arg = getNextArgRequired();
         String pkg = mContext.getPackageName();
         boolean disable = Boolean.parseBoolean(arg);
-
-        if (disable) {
-            mInterface.disable(DEFAULT_SETUP_DISABLE_FLAGS, sToken, pkg);
-            mInterface.disable2(DEFAULT_SETUP_DISABLE2_FLAGS, sToken, pkg);
-        } else {
-            mInterface.disable(DISABLE_NONE, sToken, pkg);
-            mInterface.disable2(DISABLE2_NONE, sToken, pkg);
-        }
-
+        int userId = Binder.getCallingUserHandle().getIdentifier();
+        DisableInfo info = disable ? new DisableInfo(DEFAULT_SETUP_DISABLE_FLAGS,
+                DEFAULT_SETUP_DISABLE2_FLAGS) : new DisableInfo();
+        mInterface.disableForUser(info, sToken, pkg, userId, "runDisableForSetup");
         return 0;
     }
 
     private int runSendDisableFlag() {
         String pkg = mContext.getPackageName();
-        int disable1 = DISABLE_NONE;
-        int disable2 = DISABLE2_NONE;
-
+        int userId = Binder.getCallingUserHandle().getIdentifier();
         DisableInfo info = new DisableInfo();
-
         String arg = getNextArg();
         while (arg != null) {
             switch (arg) {
@@ -170,7 +159,7 @@
                     info.setSearchDisabled(true);
                     break;
                 case "home":
-                    info.setNagivationHomeDisabled(true);
+                    info.setNavigationHomeDisabled(true);
                     break;
                 case "recents":
                     info.setRecentsDisabled(true);
@@ -197,10 +186,7 @@
             arg = getNextArg();
         }
 
-        Pair<Integer, Integer> flagPair = info.toFlags();
-
-        mInterface.disable(flagPair.first, sToken, pkg);
-        mInterface.disable2(flagPair.second, sToken, pkg);
+        mInterface.disableForUser(info, sToken, pkg, userId, "Shell Commands");
 
         return 0;
     }
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 6f0985a..df2b84b 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -15039,8 +15039,10 @@
             if (statusBarService != null) {
                 int flags1 = disabled ? STATUS_BAR_DISABLE_MASK : StatusBarManager.DISABLE_NONE;
                 int flags2 = disabled ? STATUS_BAR_DISABLE2_MASK : StatusBarManager.DISABLE2_NONE;
-                statusBarService.disableForUser(flags1, mToken, mContext.getPackageName(), userId);
-                statusBarService.disable2ForUser(flags2, mToken, mContext.getPackageName(), userId);
+                StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo(flags1,
+                        flags2);
+                statusBarService.disableForUser(info, mToken, mContext.getPackageName(), userId,
+                        "setStatusBarDisabledInternal");
                 return true;
             }
         } catch (RemoteException e) {
diff --git a/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java b/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java
index 6bcfebc..3ab8d37 100644
--- a/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java
+++ b/tests/StatusBar/src/com/android/statusbartest/StatusBarTest.java
@@ -176,19 +176,25 @@
         },
         new Test("Disable Alerts") {
             public void run() {
-                mStatusBarManager.disable(StatusBarManager.DISABLE_NOTIFICATION_ALERTS);
+                StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+                info.setNotificationPeekingDisabled(true);
+                mStatusBarManager.requestDisabledComponent(info, "test");
             }
         },
         new Test("Disable Ticker") {
             public void run() {
-                mStatusBarManager.disable(StatusBarManager.DISABLE_NOTIFICATION_TICKER);
+                StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+                info.setNotificationTickerDisabled(true);
+                mStatusBarManager.requestDisabledComponent(info, "test");
             }
         },
         new Test("Disable Expand in 3 sec.") {
             public void run() {
                 mHandler.postDelayed(new Runnable() {
                         public void run() {
-                            mStatusBarManager.disable(StatusBarManager.DISABLE_EXPAND);
+                            StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+                            info.setStatusBarExpansionDisabled(true);
+                            mStatusBarManager.requestDisabledComponent(info, "test");
                         }
                     }, 3000);
             }
@@ -197,7 +203,9 @@
             public void run() {
                 mHandler.postDelayed(new Runnable() {
                         public void run() {
-                            mStatusBarManager.disable(StatusBarManager.DISABLE_NOTIFICATION_ICONS);
+                            StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+                            info.setNotificationIconsDisabled(true);
+                            mStatusBarManager.requestDisabledComponent(info, "test");
                         }
                     }, 3000);
             }
@@ -206,56 +214,73 @@
             public void run() {
                 mHandler.postDelayed(new Runnable() {
                         public void run() {
-                            mStatusBarManager.disable(StatusBarManager.DISABLE_EXPAND
-                                    | StatusBarManager.DISABLE_NOTIFICATION_ICONS);
+                            StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+                            info.setStatusBarExpansionDisabled(true);
+                            info.setNotificationIconsDisabled(true);
+                            mStatusBarManager.requestDisabledComponent(info, "test");
                         }
                     }, 3000);
             }
         },
         new Test("Disable Home (StatusBarManager)") {
             public void run() {
-                mStatusBarManager.disable(StatusBarManager.DISABLE_HOME);
+                StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+                info.setNavigationHomeDisabled(true);
+                mStatusBarManager.requestDisabledComponent(info, "test");
             }
         },
         new Test("Disable Back (StatusBarManager)") {
             public void run() {
-                mStatusBarManager.disable(StatusBarManager.DISABLE_BACK);
+                StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+                info.setBackDisabled(true);
+                mStatusBarManager.requestDisabledComponent(info, "test");
             }
         },
         new Test("Disable Recent (StatusBarManager)") {
             public void run() {
-                mStatusBarManager.disable(StatusBarManager.DISABLE_RECENT);
+                StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+                info.setRecentsDisabled(true);
+                mStatusBarManager.requestDisabledComponent(info, "test");
             }
         },
         new Test("Disable Clock") {
             public void run() {
-                mStatusBarManager.disable(StatusBarManager.DISABLE_CLOCK);
+                StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+                info.setClockDisabled(true);
+                mStatusBarManager.requestDisabledComponent(info, "test");
             }
         },
         new Test("Disable System Info") {
             public void run() {
-                mStatusBarManager.disable(StatusBarManager.DISABLE_SYSTEM_INFO);
+                StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+                info.setSystemIconsDisabled(true);
+                mStatusBarManager.requestDisabledComponent(info, "test");
             }
         },
         new Test("Disable everything in 3 sec") {
             public void run() {
                 mHandler.postDelayed(new Runnable() {
                         public void run() {
-                            mStatusBarManager.disable(~StatusBarManager.DISABLE_NONE);
+                            StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+                            info.setDisableAll();
+                            mStatusBarManager.requestDisabledComponent(info, "test");
                         }
                     }, 3000);
             }
         },
         new Test("Enable everything") {
             public void run() {
-                mStatusBarManager.disable(StatusBarManager.DISABLE_NONE);
+                StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+                mStatusBarManager.requestDisabledComponent(info, "test");
             }
         },
         new Test("Enable everything in 3 sec.") {
             public void run() {
                 mHandler.postDelayed(new Runnable() {
                         public void run() {
-                            mStatusBarManager.disable(0);
+                            StatusBarManager.DisableInfo info = new StatusBarManager.DisableInfo();
+                            info.setEnableAll();
+                            mStatusBarManager.requestDisabledComponent(info, "test");
                         }
                     }, 3000);
             }