Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit edd016fa authored by Evan Laird's avatar Evan Laird
Browse files

Add StatusBarManager#disableForSetup(boolean) @SystemApi

Allows a system app with the STATUS_BAR permission to toggle a default
set of disable flags during device setup.

Test: adb shell cmd disable-for-setup [true/false]
Bug: 114003699
Change-Id: Ieebcf7f8b101e408efe461ca64ad1114d96729c9
parent 27323241
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -526,6 +526,18 @@ package android.app {
    ctor public StatsManager.StatsUnavailableException(String, Throwable);
  }
  public class StatusBarManager {
    method public android.util.Pair<java.lang.Integer,java.lang.Integer> getDisableFlags();
    method public void setDisabledForSetup(boolean);
    field public static final int DISABLE2_NONE = 0; // 0x0
    field public static final int DISABLE_EXPAND = 65536; // 0x10000
    field public static final int DISABLE_HOME = 2097152; // 0x200000
    field public static final int DISABLE_NONE = 0; // 0x0
    field public static final int DISABLE_NOTIFICATION_ALERTS = 262144; // 0x40000
    field public static final int DISABLE_RECENT = 16777216; // 0x1000000
    field public static final int DISABLE_SEARCH = 33554432; // 0x2000000
  }
  public final class Vr2dDisplayProperties implements android.os.Parcelable {
    ctor public Vr2dDisplayProperties(int, int, int);
    method public int describeContents();
@@ -1272,6 +1284,7 @@ package android.content {
    field public static final String ROLLBACK_SERVICE = "rollback";
    field public static final String SECURE_ELEMENT_SERVICE = "secure_element";
    field public static final String STATS_MANAGER = "stats";
    field public static final String STATUS_BAR_SERVICE = "statusbar";
    field public static final String SYSTEM_UPDATE_SERVICE = "system_update";
    field public static final String VR_SERVICE = "vrmanager";
    field @Deprecated public static final String WIFI_RTT_SERVICE = "rttmanager";
+71 −2
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.app;

import android.annotation.IntDef;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.UnsupportedAppUsage;
import android.content.Context;
@@ -25,6 +26,7 @@ import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Pair;
import android.util.Slog;
import android.view.View;

@@ -40,11 +42,12 @@ import java.lang.annotation.RetentionPolicy;
public class StatusBarManager {

    /** @hide */
    @UnsupportedAppUsage
    @SystemApi
    public static final int DISABLE_EXPAND = View.STATUS_BAR_DISABLE_EXPAND;
    /** @hide */
    public static final int DISABLE_NOTIFICATION_ICONS = View.STATUS_BAR_DISABLE_NOTIFICATION_ICONS;
    /** @hide */
    @SystemApi
    public static final int DISABLE_NOTIFICATION_ALERTS
            = View.STATUS_BAR_DISABLE_NOTIFICATION_ALERTS;

@@ -56,14 +59,17 @@ public class StatusBarManager {
    /** @hide */
    public static final int DISABLE_SYSTEM_INFO = View.STATUS_BAR_DISABLE_SYSTEM_INFO;
    /** @hide */
    @SystemApi
    public static final int DISABLE_HOME = View.STATUS_BAR_DISABLE_HOME;
    /** @hide */
    @SystemApi
    public static final int DISABLE_RECENT = View.STATUS_BAR_DISABLE_RECENT;
    /** @hide */
    public static final int DISABLE_BACK = View.STATUS_BAR_DISABLE_BACK;
    /** @hide */
    public static final int DISABLE_CLOCK = View.STATUS_BAR_DISABLE_CLOCK;
    /** @hide */
    @SystemApi
    public static final int DISABLE_SEARCH = View.STATUS_BAR_DISABLE_SEARCH;

    /** @hide */
@@ -72,7 +78,7 @@ public class StatusBarManager {
            View.STATUS_BAR_DISABLE_HOME | View.STATUS_BAR_DISABLE_RECENT;

    /** @hide */
    @UnsupportedAppUsage
    @SystemApi
    public static final int DISABLE_NONE = 0x00000000;

    /** @hide */
@@ -116,6 +122,7 @@ public class StatusBarManager {
    public static final int DISABLE2_ROTATE_SUGGESTIONS = 1 << 4;

    /** @hide */
    @SystemApi
    public static final int DISABLE2_NONE = 0x00000000;

    /** @hide */
@@ -135,6 +142,21 @@ public class StatusBarManager {
    @Retention(RetentionPolicy.SOURCE)
    public @interface Disable2Flags {}

    /**
     * Default disable flags for setup
     *
     * @hide
     */
    public static final int DEFAULT_SETUP_DISABLE_FLAGS = DISABLE_NOTIFICATION_ALERTS
            | DISABLE_HOME | DISABLE_EXPAND | DISABLE_RECENT | DISABLE_CLOCK | DISABLE_SEARCH;

    /**
     * Default disable2 flags for setup
     *
     * @hide
     */
    public static final int DEFAULT_SETUP_DISABLE2_FLAGS = DISABLE2_ROTATE_SUGGESTIONS;

    /** @hide */
    public static final int NAVIGATION_HINT_BACK_ALT      = 1 << 0;
    /** @hide */
@@ -340,6 +362,53 @@ public class StatusBarManager {
        }
    }

    /**
     * Enable or disable status bar elements (notifications, clock) which are inappropriate during
     * device setup.
     *
     * @param disabled whether to apply or remove the disabled flags
     *
     * @hide
     */
    @SystemApi
    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();
        }
    }

    /**
     * Get the currently applied StatusBar disable flags
     *
     * @return a pair of Integers in the form of (disable, disable2)
     *
     * @hide
     */
    @SystemApi
    public Pair<Integer, Integer> getDisableFlags() {
        try {
            final int userId = Binder.getCallingUserHandle().getIdentifier();
            final IStatusBarService svc = getService();
            int[] flags = new int[] {0, 0};
            if (svc != null) {
                flags = svc.getDisableFlags(mToken, userId);
            }

            return new Pair<Integer, Integer>(flags[0], flags[1]);
        } catch (RemoteException ex) {
            throw ex.rethrowFromSystemServer();
        }
    }

    /** @hide */
    public static String windowStateToString(int state) {
        if (state == WINDOW_STATE_HIDING) return "WINDOW_STATE_HIDING";
+2 −1
Original line number Diff line number Diff line
@@ -3620,9 +3620,10 @@ public abstract class Context {
     *
     * @see #getSystemService(String)
     * @see android.app.StatusBarManager
     *
     * @hide
     */
    @UnsupportedAppUsage
    @SystemApi
    public static final String STATUS_BAR_SERVICE = "statusbar";

    /**
+1 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ interface IStatusBarService
    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);
    int[] getDisableFlags(IBinder token, int userId);
    void setIcon(String slot, String iconPackage, int iconId, int iconLevel, String contentDescription);
    void setIconVisibility(String slot, boolean visible);
    void removeIcon(String slot);
+50 −13
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.statusbar;
import static android.app.StatusBarManager.DISABLE2_GLOBAL_ACTIONS;
import static android.view.Display.DEFAULT_DISPLAY;

import android.annotation.Nullable;
import android.app.ActivityThread;
import android.app.Notification;
import android.app.StatusBarManager;
@@ -42,10 +43,12 @@ import android.service.notification.NotificationStats;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;

import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.statusbar.IStatusBar;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.NotificationVisibility;
@@ -660,7 +663,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
    // 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 #DISABLE_NONE}.
     * To re-enable everything, pass {@link #DISABLE2_NONE}.
     *
     * Warning: Only pass DISABLE2_* flags into this function, do not use DISABLE_* flags.
     */
@@ -698,7 +701,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
        final int net2 = gatherDisableActionsLocked(mCurrentUserId, 2);

        // TODO(b/113914868): investigation log for disappearing home button
        if (whichFlag == 1 && pkg.contains("systemui")) {
        if (whichFlag == 1 && pkg != null && pkg.contains("systemui")) {
            String disabledData = "{ ";
            for (int i = 0; i < mDisableRecords.size(); i++) {
                DisableRecord tok = mDisableRecords.get(i);
@@ -724,6 +727,30 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
        }
    }

    /**
     * Get the currently applied disable flags, in the form of one Pair<Integer, Integer>.
     *
     * @return pair of disable flags in the form of (disabled1, disabled2), where (0, 0) indicates
     * no flags are set for this token.
     */
    @Override
    public int[] getDisableFlags(IBinder token, int userId) {
        enforceStatusBar();

        int disable1 = 0;
        int disable2 = 0;
        synchronized (mLock) {
            // Find a matching record if it exists
            DisableRecord record = findMatchingRecordLocked(token, userId).second;
            if (record != null) {
                disable1 = record.what1;
                disable2 = record.what2;
            }
        }

        return new int[] {disable1, disable2};
    }

    @Override
    public void setIcon(String slot, String iconPackage, int iconId, int iconLevel,
            String contentDescription) {
@@ -1296,7 +1323,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
    @Override
    public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
            String[] args, ShellCallback callback, ResultReceiver resultReceiver) {
        (new StatusBarShellCommand(this)).exec(
        (new StatusBarShellCommand(this, mContext)).exec(
                this, in, out, err, args, callback, resultReceiver);
    }

@@ -1316,16 +1343,9 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
        }

        // Find matching record, if any
        final int N = mDisableRecords.size();
        DisableRecord record = null;
        int i;
        for (i = 0; i < N; i++) {
            DisableRecord r = mDisableRecords.get(i);
            if (r.token == token && r.userId == userId) {
                record = r;
                break;
            }
        }
        Pair<Integer, DisableRecord> match = findMatchingRecordLocked(token, userId);
        int i = match.first;
        DisableRecord record = match.second;

        // Remove record if binder is already dead
        if (!token.isBinderAlive()) {
@@ -1352,6 +1372,23 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
        mDisableRecords.add(record);
    }

    @Nullable
    @GuardedBy("mLock")
    private Pair<Integer, DisableRecord> findMatchingRecordLocked(IBinder token, int userId) {
        final int numRecords = mDisableRecords.size();
        DisableRecord record = null;
        int i;
        for (i = 0; i < numRecords; i++) {
            DisableRecord r = mDisableRecords.get(i);
            if (r.token == token && r.userId == userId) {
                record = r;
                break;
            }
        }

        return new Pair<Integer, DisableRecord>(i, record);
    }

    // lock on mDisableRecords
    int gatherDisableActionsLocked(int userId, int which) {
        final int N = mDisableRecords.size();
Loading