以下の記事にて、表示レイヤーの確認を行いました。
JBの表示レイヤーについて
http://d.hatena.ne.jp/baroqueworksdev/20120630/1341084903
今回は新規追加レイヤー、NAVIGATION_BAR_PANEL_LAYERの確認です。
NAVIGATION_BAR_PANEL_LAYERの使用箇所
PhoneWindowManager#windowTypeToLayerLw()にてwindowTypeからLayerの値に変換するので、grepはTYPE_NAVIGATION_BAR_PANELで。
引っかかるのは以下の3ファイルでした。
SystemUIが使用していますね。
- com\android\systemui\statusbar\phone\PhoneStatusBar.java
- com\android\systemui\statusbar\tablet\TabletStatusBar.java
- com\android\systemui\statusbar\tablet\TabletTicker.java
PhoneStatusBar.javaに焦点をあてて調査します。
TYPE_NAVIGATION_BAR_PANELを使用しているのは以下のモジュール。
BaseStatusBar#updateSearchPanel ↓ PhoneStatusBar#getSearchLayoutParams() ←★ここでWindowLayoutのパラメータとして使用
BaseStatusBar#updateSearchPanelのモジュール内で、
mSearchPanelViewというViewをWindowにaddViewしていました。
protected void updateSearchPanel() { // Search Panel boolean visible = false; if (mSearchPanelView != null) { visible = mSearchPanelView.isShowing(); WindowManagerImpl.getDefault().removeView(mSearchPanelView); } // Provide SearchPanel with a temporary parent to allow layout params to work. LinearLayout tmpRoot = new LinearLayout(mContext); mSearchPanelView = (SearchPanelView) LayoutInflater.from(mContext).inflate( R.layout.status_bar_search_panel, tmpRoot, false); mSearchPanelView.setOnTouchListener( new TouchOutsideListener(MSG_CLOSE_SEARCH_PANEL, mSearchPanelView)); mSearchPanelView.setVisibility(View.GONE); WindowManager.LayoutParams lp = getSearchLayoutParams(mSearchPanelView.getLayoutParams()); WindowManagerImpl.getDefault().addView(mSearchPanelView, lp); mSearchPanelView.setBar(this); if (visible) { mSearchPanelView.show(true, false); } }
SearchPanelViewってなんだ?
mSearchPanelViewの表示タイミングは以下のソースを参照。
com\android\systemui\statusbar\phone\PhoneStatusBar.java
@Override public void showSearchPanel() { super.showSearchPanel(); WindowManager.LayoutParams lp = (android.view.WindowManager.LayoutParams) mNavigationBarView.getLayoutParams(); lp.flags &= ~WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; WindowManagerImpl.getDefault().updateViewLayout(mNavigationBarView, lp); } private Runnable mShowSearchPanel = new Runnable() { public void run() { showSearchPanel(); } }; View.OnTouchListener mHomeSearchActionListener = new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: if (!shouldDisableNavbarGestures()) { mHandler.removeCallbacks(mShowSearchPanel); mHandler.postDelayed(mShowSearchPanel, mShowSearchHoldoff); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: mHandler.removeCallbacks(mShowSearchPanel); break; } return false; } }; private void prepareNavigationBarView() { mNavigationBarView.reorient(); mNavigationBarView.getRecentsButton().setOnClickListener(mRecentsClickListener); mNavigationBarView.getRecentsButton().setOnTouchListener(mRecentsPanel); mNavigationBarView.getHomeButton().setOnTouchListener(mHomeSearchActionListener); updateSearchPanel(); }
ようはHomeキーを一定時間押し続けると、SearchPanelViewが表示されます。
Viewの処理はこちらのソースを参照
\sources\android-16\com\android\systemui\SearchPanelView.java