一起看看StatusBarManagerService(三)

2023-12-14 21:45:08

写在前面

StatusBarManagerService中API涉及systemui的多个模块;本篇主要介绍StatusBarManagerService中与通知栏相关的API和几个通用API。
因为我对系统UI了解的不全,其他API暂不整理,怕误人子弟。。


通知栏相关函数解析

1.展开通知栏

void animateExpandNotificationsPanel()

// CentralSurfacesCommandQueueCallbacks

@Override
public void animateExpandNotificationsPanel() {
    if (CentralSurfaces.SPEW) {
        Log.d(CentralSurfaces.TAG,
                "animateExpand: mExpandedVisible=" + mShadeController.isExpandedVisible());
    }
    if (!mCommandQueue.panelsEnabled()) {
        return;
    }

    mShadeViewController.expandToNotifications();
}

// NotificationPanelViewController

@Override
public void expandToNotifications() {
    if (mSplitShadeEnabled && (isShadeFullyExpanded() || isExpandingOrCollapsing())) {
        return;
    }
    if (mQsController.getExpanded()) {
        mQsController.flingQs(0, FLING_COLLAPSE);
    } else {
        expand(true /* animate */);
    }
}
2.关闭通知栏

void animateCollapsePanels(int flags, boolean force)

// CentralSurfacesCommandQueueCallbacks

@Override
public void animateCollapsePanels(int flags, boolean force) {
    mShadeController.animateCollapsePanels(flags, force, false /* delayed */,
            1.0f /* speedUpFactor */);
}

// ShadeControllerImpl

@Override
public void animateCollapsePanels(int flags, boolean force, boolean delayed,
        float speedUpFactor) {
    if (!force && mStatusBarStateController.getState() != StatusBarState.SHADE) {
        runPostCollapseRunnables();
        return;
    }
    if (SPEW) {
        Log.d(TAG,
                "animateCollapse(): mExpandedVisible=" + mExpandedVisible + "flags=" + flags);
    }
    if (getNotificationShadeWindowView() != null
            && mNotificationPanelViewController.canBeCollapsed()
            && (flags & CommandQueue.FLAG_EXCLUDE_NOTIFICATION_PANEL) == 0) {
        // release focus immediately to kick off focus change transition
        mNotificationShadeWindowController.setNotificationShadeFocusable(false);

        mNotificationShadeWindowViewController.cancelExpandHelper();
        mNotificationPanelViewController.collapse(true, delayed, speedUpFactor);
    }
}
3.togglePanel

void togglePanel() 如果板子展开,就关闭;如果板子关闭,就展开

@Override
public void togglePanel() {
    if (mCentralSurfaces.isPanelExpanded()) {
        mShadeController.animateCollapseShade();
    } else {
        animateExpandNotificationsPanel();
    }
}
4.展开QS

原生通知栏上方区域有header和QS区域,QS(quick settings)区域提供了多个系统设置的快捷开关;
QS区域也可以进行展开和关闭,touch事件在NotificationShadeWindow中统一进行分发。
void animateExpandSettingsPanel(String obj)

@Override
public void animateExpandSettingsPanel(@Nullable String subPanel) {
    if (CentralSurfaces.SPEW) {
        Log.d(CentralSurfaces.TAG,
                "animateExpand: mExpandedVisible=" + mShadeController.isExpandedVisible());
    }
    if (!mCommandQueue.panelsEnabled()) {
        return;
    }

    // Settings are not available in setup
    if (!mDeviceProvisionedController.isCurrentUserSetup()) return;

    mShadeViewController.expandToQs();
}
5.addQsTile/remQsTile/clickTile

void addQsTile(ComponentName tile)
void remQsTile(ComponentName tile)
void clickTile(ComponentName tile)
Tile为quick settings区域的单个操作按钮;系统提供了三方增加/移除/点击对应tile的API。

@Override
public void addQsTile(ComponentName tile) {
    mQSHost.addTile(tile);
}


// 触发点击tile

@Override
public void clickTile(ComponentName tile) {
    // Can't inject this because it changes with the QS fragment
    QSPanelController qsPanelController = mCentralSurfaces.getQSPanelController();
    if (qsPanelController != null) {
        qsPanelController.clickTile(tile);
    }
}

通用相关函数解析

1.setImeWindowStatus

void setImeWindowStatus(int displayId, IBinder token, int vis,@BackDispositionMode int backDisposition, boolean showImeSwitcher)
当前输入法界面是否调起

// NavigationBar

@Override
public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition,
        boolean showImeSwitcher) {
    if (displayId != mDisplayId) {
        return;
    }
    boolean imeShown = mNavBarHelper.isImeShown(vis);
    showImeSwitcher = imeShown && showImeSwitcher;
    int hints = Utilities.calculateBackDispositionHints(mNavigationIconHints, backDisposition,
            imeShown, showImeSwitcher);
    if (hints == mNavigationIconHints) return;

    setNavigationIconHints(hints);
    checkBarModes();
    updateSystemUiStateFlags();
}
2.showToast/hideToast

通过systemui展示toast,供无界面的系统应用使用;弹toast需要context
void showToast(int uid, String packageName, IBinder token, CharSequence text,IBinder windowToken, int duration,@Nullable ITransientNotificationCallback callback, int displayId)
void hideToast(String packageName, IBinder token)

@Override
@MainThread
public void showToast(int uid, String packageName, IBinder token, CharSequence text,
        IBinder windowToken, int duration, @Nullable ITransientNotificationCallback callback,
        int displayId) {
    Runnable showToastRunnable = () -> {
        UserHandle userHandle = UserHandle.getUserHandleForUid(uid);
        Context context = mContext.createContextAsUser(userHandle, 0);

        DisplayManager mDisplayManager = mContext.getSystemService(DisplayManager.class);
        Display display = mDisplayManager.getDisplay(displayId);

        Context displayContext = context.createDisplayContext(mDisplayManager.getDisplay(displayId));
        mToast = mToastFactory.createToast(mContext /* sysuiContext */, text, packageName,
                userHandle.getIdentifier(), mOrientation);

        if (mToast.getInAnimation() != null) {
            mToast.getInAnimation().start();
        }

        mCallback = callback;
        mPresenter = new ToastPresenter(displayContext, mIAccessibilityManager,
                mNotificationManager, packageName);
        // Set as trusted overlay so touches can pass through toasts
        mPresenter.getLayoutParams().setTrustedOverlay();
        mToastLogger.logOnShowToast(uid, packageName, text.toString(), token.toString());
        mPresenter.show(mToast.getView(), token, tempWindowToken, duration, mToast.getGravity(),
                mToast.getXOffset(), mToast.getYOffset(), mToast.getHorizontalMargin(),
                mToast.getVerticalMargin(), mCallback, mToast.hasCustomAnimation());
    };
    if (mToastOutAnimatorListener != null) {
        // if we're currently animating out a toast, show new toast after prev toast is hidden
        mToastOutAnimatorListener.setShowNextToastRunnable(showToastRunnable);
    } else if (mPresenter != null) {
        // if there's a toast already showing that we haven't tried hiding yet, hide it and
        // then show the next toast after its hidden animation is done
        hideCurrentToast(showToastRunnable);
    } else {
        // else, show this next toast immediately
        showToastRunnable.run();
    }
}

@Override
@MainThread
public void hideToast(String packageName, IBinder token) {
    if (mPresenter == null || !Objects.equals(mPresenter.getPackageName(), packageName)
            || !Objects.equals(mPresenter.getToken(), token)) {
        Log.w(TAG, "Attempt to hide non-current toast from package " + packageName);
        return;
    }
    mToastLogger.logOnHideToast(packageName, token.toString());
    hideCurrentToast(null);
}

写在后面

如果文章中有错误的地方,希望各位大佬们批评指正~

If you like this article, it is written by Johnny Deng.
If not, I don’t know who wrote it.

文章来源:https://blog.csdn.net/asd501823206/article/details/135004502
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。