/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.statusbar.tablet; import android.content.Context; import android.os.Handler; import android.util.AttributeSet; import android.util.Slog; import android.view.View; import android.view.MotionEvent; import android.widget.FrameLayout; public class TabletStatusBarView extends FrameLayout { private Handler mHandler; private final int MAX_PANELS = 5; private final View[] mIgnoreChildren = new View[MAX_PANELS]; private final View[] mPanels = new View[MAX_PANELS]; private final int[] mPos = new int[2]; public TabletStatusBarView(Context context) { super(context); } public TabletStatusBarView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { if (TabletStatusBar.DEBUG) { Slog.d(TabletStatusBar.TAG, "TabletStatusBarView intercepting touch event: " + ev); } mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_NOTIFICATION_PANEL); mHandler.sendEmptyMessage(TabletStatusBar.MSG_CLOSE_NOTIFICATION_PANEL); mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_RECENTS_PANEL); mHandler.sendEmptyMessage(TabletStatusBar.MSG_CLOSE_RECENTS_PANEL); mHandler.removeMessages(TabletStatusBar.MSG_CLOSE_INPUT_METHODS_PANEL); mHandler.sendEmptyMessage(TabletStatusBar.MSG_CLOSE_INPUT_METHODS_PANEL); mHandler.removeMessages(TabletStatusBar.MSG_STOP_TICKER); mHandler.sendEmptyMessage(TabletStatusBar.MSG_STOP_TICKER); for (int i=0; i < mPanels.length; i++) { if (mPanels[i] != null && mPanels[i].getVisibility() == View.VISIBLE) { if (eventInside(mIgnoreChildren[i], ev)) { if (TabletStatusBar.DEBUG) { Slog.d(TabletStatusBar.TAG, "TabletStatusBarView eating event for view: " + mIgnoreChildren[i]); } return true; } } } } if (TabletStatusBar.DEBUG) { Slog.d(TabletStatusBar.TAG, "TabletStatusBarView not intercepting event"); } return super.onInterceptTouchEvent(ev); } private boolean eventInside(View v, MotionEvent ev) { // assume that x and y are window coords because we are. final int x = (int)ev.getX(); final int y = (int)ev.getY(); final int[] p = mPos; v.getLocationInWindow(p); final int l = p[0]; final int t = p[1]; final int r = p[0] + v.getWidth(); final int b = p[1] + v.getHeight(); return x >= l && x < r && y >= t && y < b; } public void setHandler(Handler h) { mHandler = h; } /** * Let the status bar know that if you tap on ignore while panel is showing, don't do anything. * * Debounces taps on, say, a popup's trigger when the popup is already showing. */ public void setIgnoreChildren(int index, View ignore, View panel) { mIgnoreChildren[index] = ignore; mPanels[index] = panel; } }