1b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato/* 2b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato * Copyright (C) 2010 The Android Open Source Project 3b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato * 4b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 5b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato * you may not use this file except in compliance with the License. 6b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato * You may obtain a copy of the License at 7b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato * 8b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato * http://www.apache.org/licenses/LICENSE-2.0 9b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato * 10b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato * Unless required by applicable law or agreed to in writing, software 11b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 12b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato * See the License for the specific language governing permissions and 14b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato * limitations under the License. 15b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato */ 16b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 17b62ac127824e9723534a197189eca58d30f15d3dJoe Onoratopackage com.android.systemui.statusbar.tablet; 18b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 19b62ac127824e9723534a197189eca58d30f15d3dJoe Onoratoimport android.content.Context; 20b62ac127824e9723534a197189eca58d30f15d3dJoe Onoratoimport android.os.Handler; 21b62ac127824e9723534a197189eca58d30f15d3dJoe Onoratoimport android.util.AttributeSet; 22b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandlerimport android.util.Slog; 23b62ac127824e9723534a197189eca58d30f15d3dJoe Onoratoimport android.view.View; 24b62ac127824e9723534a197189eca58d30f15d3dJoe Onoratoimport android.view.MotionEvent; 25b62ac127824e9723534a197189eca58d30f15d3dJoe Onoratoimport android.widget.FrameLayout; 26b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 27b62ac127824e9723534a197189eca58d30f15d3dJoe Onoratopublic class TabletStatusBarView extends FrameLayout { 28b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato private Handler mHandler; 29b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 303b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler private final int MAX_PANELS = 5; 313b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler private final View[] mIgnoreChildren = new View[MAX_PANELS]; 323b0543acf11ac4638ec5452acc4c1c6716c26880Daniel Sandler private final View[] mPanels = new View[MAX_PANELS]; 3382beadfa067b1e286fa604f8d7960d769411c954satok private final int[] mPos = new int[2]; 34b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 35b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato public TabletStatusBarView(Context context) { 36b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato super(context); 37b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato } 38b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 39b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato public TabletStatusBarView(Context context, AttributeSet attrs) { 40b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato super(context, attrs); 41b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato } 42b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 4382beadfa067b1e286fa604f8d7960d769411c954satok @Override 44b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato public boolean onInterceptTouchEvent(MotionEvent ev) { 45b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato if (ev.getAction() == MotionEvent.ACTION_DOWN) { 46b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler if (TabletStatusBar.DEBUG) { 47b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler Slog.d(TabletStatusBar.TAG, "TabletStatusBarView intercepting touch event: " + ev); 48b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler } 49fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_NOTIFICATION_PANEL); 50fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mHandler.sendEmptyMessage(TabletStatusBar.MSG_CLOSE_NOTIFICATION_PANEL); 51fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_RECENTS_PANEL); 52fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato mHandler.sendEmptyMessage(TabletStatusBar.MSG_CLOSE_RECENTS_PANEL); 5382beadfa067b1e286fa604f8d7960d769411c954satok mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_INPUT_METHODS_PANEL); 5482beadfa067b1e286fa604f8d7960d769411c954satok mHandler.sendEmptyMessage(TabletStatusBar.MSG_CLOSE_INPUT_METHODS_PANEL); 552ed08d2e70250517e5578dd650c96b14aacf9ba5Daniel Sandler mHandler.removeMessages(TabletStatusBar.MSG_STOP_TICKER); 562ed08d2e70250517e5578dd650c96b14aacf9ba5Daniel Sandler mHandler.sendEmptyMessage(TabletStatusBar.MSG_STOP_TICKER); 57b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 5844c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller for (int i=0; i < mPanels.length; i++) { 5944c66fe2cd912fcea2e9824eb421d5c8d9ffadbdJim Miller if (mPanels[i] != null && mPanels[i].getVisibility() == View.VISIBLE) { 60b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato if (eventInside(mIgnoreChildren[i], ev)) { 61b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler if (TabletStatusBar.DEBUG) { 6282beadfa067b1e286fa604f8d7960d769411c954satok Slog.d(TabletStatusBar.TAG, 6382beadfa067b1e286fa604f8d7960d769411c954satok "TabletStatusBarView eating event for view: " 6482beadfa067b1e286fa604f8d7960d769411c954satok + mIgnoreChildren[i]); 65b6d3dc68977eada24515a825c43eb01df9a4edb5Daniel Sandler } 66b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato return true; 67b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato } 68b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato } 69b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato } 70b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato } 71f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato if (TabletStatusBar.DEBUG) { 72f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato Slog.d(TabletStatusBar.TAG, "TabletStatusBarView not intercepting event"); 73f68b500bb0d4c24ccabb40284f97981d50f888a8Joe Onorato } 74b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato return super.onInterceptTouchEvent(ev); 75b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato } 76b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 77b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato private boolean eventInside(View v, MotionEvent ev) { 78b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato // assume that x and y are window coords because we are. 79b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato final int x = (int)ev.getX(); 80b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato final int y = (int)ev.getY(); 81b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 82b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato final int[] p = mPos; 83b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato v.getLocationInWindow(p); 84b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 85b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato final int l = p[0]; 86b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato final int t = p[1]; 87b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato final int r = p[0] + v.getWidth(); 88b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato final int b = p[1] + v.getHeight(); 89b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 90b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato return x >= l && x < r && y >= t && y < b; 91b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato } 92b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 93b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato public void setHandler(Handler h) { 94b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato mHandler = h; 95b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato } 96b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato 9706a0d4b5c36b3353a89ec31e097bf0b54b5f2549Daniel Sandler /** 9806a0d4b5c36b3353a89ec31e097bf0b54b5f2549Daniel Sandler * Let the status bar know that if you tap on ignore while panel is showing, don't do anything. 9906a0d4b5c36b3353a89ec31e097bf0b54b5f2549Daniel Sandler * 10006a0d4b5c36b3353a89ec31e097bf0b54b5f2549Daniel Sandler * Debounces taps on, say, a popup's trigger when the popup is already showing. 10106a0d4b5c36b3353a89ec31e097bf0b54b5f2549Daniel Sandler */ 102b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato public void setIgnoreChildren(int index, View ignore, View panel) { 103b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato mIgnoreChildren[index] = ignore; 104b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato mPanels[index] = panel; 105b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato } 106b62ac127824e9723534a197189eca58d30f15d3dJoe Onorato} 107