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