在项目开发中,出现了这样的需求,需要语言控制状态栏的通知面板展开和收起,同时手动滑出通知面板时需要在一段时间后自动收起面板。针对需求需要对SystemUI源码进行修改处理。
目录如下:
com.android.systemui.statusbar.phone.NotificationPanelView
首先需要在NotificationPanelView
中增加监听接口:
private OnPanelChangedListener mOnPanelChangedListener;
public void setOnPanelChangedListener(OnPanelChangedListener listener) {
mOnPanelChangedListener = listener;
}
public interface OnPanelChangedListener {
void onPanelCollapsed();
void onPanelOpened();
void onPanelTouch(int action);
}
接着在面板展开onExpandingFinished
和onClosingFinished
时回调展开和收起的状态。
@Override
protected void onExpandingFinished() {
super.onExpandingFinished();
...此处代码省略
if (mOnPanelChangedListener != null) {
mOnPanelChangedListener.onPanelOpened();
}
}
@Override
protected void onClosingFinished() {
super.onClosingFinished();
resetVerticalPanelPosition();
setClosingWithAlphaFadeout(false);
if (mOnPanelChangedListener != null) {
mOnPanelChangedListener.onPanelCollapsed();
}
}
面板触摸时不能自动收起,需要重写dispatchTouchEvent
方法并回调监听:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (mOnPanelChangedListener != null) {
mOnPanelChangedListener.onPanelTouch(ev.getAction());
}
return super.dispatchTouchEvent(ev);
}
目录如下:
com.android.systemui.statusbar.phone.StatusBar
makeStatusBarView()
方法mNotificationPanel
初始化时设置监听:
mNotificationPanel.setOnPanelChangedListener(new NotificationPanelView.OnPanelChangedListener() {
@Override
public void onPanelCollapsed() {
mHandler.removeMessages(MSG_CLOSE_PANELS);
}
@Override
public void onPanelOpened() {
mHandler.removeMessages(MSG_CLOSE_PANELS);
mHandler.sendEmptyMessageDelayd(MSG_CLOSE_PANELS, AUTO_COLLAPSED_TIME);
}
@Override
public void onPanelTouch(int action) {
if (action == MotionEvent.ACTION_DOWN) {
mHandler.removeMessages(MSG_CLOSE_PANELS);
} else if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
mHandler.sendEmptyMessageDelayd(MSG_CLOSE_PANELS, AUTO_COLLAPSED_TIME);
}
}
});
原理为对通知面板收起消息MSG_CLOSE_PANELS的处理。
在StatusBar
中,可通过调用已有的togglePanel()方法控制通知面板的展开和收起,当前展开则收起,当前收起则展开。
以上不满足需求,则可增加下面方法控制展开和收起:
public void togglePanel(boolean expanded) {
if (expanded) {
animateExpandNotificationsPanel();
} else {
animateCollapsePanels();
}
}
增加一个状态控制保证准确控制展开或者准确收起。
此场景可应用于语音控制通知面板展开/收起,或者其他应用交互控制展开/收起。
以上为原生SystemUI源码的修改,具体与其他应用的通信/交互逻辑按需实现。