StatusBarWindowView.java revision df993513fbfe0e952175c1c5384458deaa1ff01a
1c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler/*
2c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * Copyright (C) 2012 The Android Open Source Project
3c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler *
4c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * Licensed under the Apache License, Version 2.0 (the "License");
5c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * you may not use this file except in compliance with the License.
6c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * You may obtain a copy of the License at
7c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler *
8c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler *      http://www.apache.org/licenses/LICENSE-2.0
9c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler *
10c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * Unless required by applicable law or agreed to in writing, software
11c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * distributed under the License is distributed on an "AS IS" BASIS,
12c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * See the License for the specific language governing permissions and
14c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler * limitations under the License.
15c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler */
16c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
17c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerpackage com.android.systemui.statusbar.phone;
18c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
19257f283b0e4cc1c1fa4e7f2472d3ee4ab3b451d0John Spurlockimport android.app.StatusBarManager;
20c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.content.Context;
21198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandlerimport android.graphics.Canvas;
22198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandlerimport android.graphics.Paint;
23fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlockimport android.graphics.Rect;
24c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.util.AttributeSet;
25c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.view.KeyEvent;
265de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wrenimport android.view.MotionEvent;
27b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandlerimport android.view.View;
28b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandlerimport android.view.ViewRootImpl;
29c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.widget.FrameLayout;
30c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
315de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wrenimport com.android.systemui.ExpandHelper;
325de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wrenimport com.android.systemui.R;
33198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandlerimport com.android.systemui.statusbar.BaseStatusBar;
34ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiimport com.android.systemui.statusbar.DragDownHelper;
35ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiimport com.android.systemui.statusbar.StatusBarState;
36fab078b01fbad026f006744016272327f7ab116bSelim Cinekimport com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
375de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
38c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
39ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggipublic class StatusBarWindowView extends FrameLayout {
40198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public static final String TAG = "StatusBarWindowView";
41198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public static final boolean DEBUG = BaseStatusBar.DEBUG;
425de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
435de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    private ExpandHelper mExpandHelper;
44ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi    private DragDownHelper mDragDownHelper;
45b6d85ebfe4f9f5d3b7d7ab7b6123af02a0deb516Selim Cinek    private NotificationStackScrollLayout mStackScrollLayout;
46b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler    private NotificationPanelView mNotificationPanel;
475de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
48c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    PhoneStatusBar mService;
49c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
50c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    public StatusBarWindowView(Context context, AttributeSet attrs) {
51c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        super(context, attrs);
525de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        setMotionEventSplittingEnabled(false);
53198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        setWillNotDraw(!DEBUG);
545de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    }
555de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
565de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    @Override
57fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock    protected boolean fitSystemWindows(Rect insets) {
58fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock        if (getFitsSystemWindows()) {
59d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi            setPadding(insets.left, insets.top, insets.right, 0);
60d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi            insets.left = 0;
61d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi            insets.top = 0;
62d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi            insets.right = 0;
63fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock        } else {
64fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock            setPadding(0, 0, 0, 0);
65fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock        }
66d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi        return false;
67fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock    }
68fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock
69fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock    @Override
705de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    protected void onAttachedToWindow () {
715de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        super.onAttachedToWindow();
7267b2260093774f5866f781aede52830440f4ed0eSelim Cinek
73b6d85ebfe4f9f5d3b7d7ab7b6123af02a0deb516Selim Cinek        mStackScrollLayout = (NotificationStackScrollLayout) findViewById(
74b6d85ebfe4f9f5d3b7d7ab7b6123af02a0deb516Selim Cinek                R.id.notification_stack_scroller);
75b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        mNotificationPanel = (NotificationPanelView) findViewById(R.id.notification_panel);
76fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi        int minHeight = getResources().getDimensionPixelSize(R.dimen.notification_min_height);
77fe40f7d13bfc1faa35c9a131ce4be5104cb8f6b9Jorim Jaggi        int maxHeight = getResources().getDimensionPixelSize(R.dimen.notification_max_height);
78b6d85ebfe4f9f5d3b7d7ab7b6123af02a0deb516Selim Cinek        mExpandHelper = new ExpandHelper(getContext(), mStackScrollLayout,
7967b2260093774f5866f781aede52830440f4ed0eSelim Cinek                minHeight, maxHeight);
805de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        mExpandHelper.setEventSource(this);
81b6d85ebfe4f9f5d3b7d7ab7b6123af02a0deb516Selim Cinek        mExpandHelper.setScrollAdapter(mStackScrollLayout);
82ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        mDragDownHelper = new DragDownHelper(getContext(), this, mStackScrollLayout, mService);
83b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler
84b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler        // We really need to be able to animate while window animations are going on
85b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler        // so that activities may be started asynchronously from panel animations
86b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler        final ViewRootImpl root = getViewRootImpl();
87b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler        if (root != null) {
88b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler            root.setDrawDuringWindowsAnimating(true);
89b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler        }
90c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    }
91c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
92c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    @Override
93c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    public boolean dispatchKeyEvent(KeyEvent event) {
94c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
95c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        switch (event.getKeyCode()) {
968c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi            case KeyEvent.KEYCODE_BACK:
978c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                if (!down) {
988c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                    mService.onBackPressed();
998c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                }
1008c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                return true;
1018c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi            case KeyEvent.KEYCODE_MENU:
1028c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                if (!down) {
1038c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                    return mService.onMenuPressed();
1048c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                }
105c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        }
106df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi        if (mService.interceptMediaKey(event)) {
107df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi            return true;
108df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi        }
109c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        return super.dispatchKeyEvent(event);
110c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    }
1115de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
1125de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    @Override
1135de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    public boolean onInterceptTouchEvent(MotionEvent ev) {
114b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        boolean intercept = false;
115fab078b01fbad026f006744016272327f7ab116bSelim Cinek        if (mNotificationPanel.isFullyExpanded()
11603c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi                && mStackScrollLayout.getVisibility() == View.VISIBLE
117c1cf1aec53ec4bf201dbcd46b8950a16e9daf038Jorim Jaggi                && (mService.getBarState() == StatusBarState.SHADE
118c1cf1aec53ec4bf201dbcd46b8950a16e9daf038Jorim Jaggi                        || (mService.getBarState() == StatusBarState.SHADE_LOCKED
119c1cf1aec53ec4bf201dbcd46b8950a16e9daf038Jorim Jaggi                                && !mService.isBouncerShowing()))) {
120b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler            intercept = mExpandHelper.onInterceptTouchEvent(ev);
121ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        } else if (mNotificationPanel.isFullyExpanded()
122ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi                && mStackScrollLayout.getVisibility() == View.VISIBLE
1234222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi                && mService.getBarState() == StatusBarState.KEYGUARD
1244222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi                && !mService.isBouncerShowing()) {
125ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi            intercept = mDragDownHelper.onInterceptTouchEvent(ev);
126b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        }
127b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        if (!intercept) {
128b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler            super.onInterceptTouchEvent(ev);
129b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        }
1305de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        if (intercept) {
131a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            MotionEvent cancellation = MotionEvent.obtain(ev);
132a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            cancellation.setAction(MotionEvent.ACTION_CANCEL);
133b6d85ebfe4f9f5d3b7d7ab7b6123af02a0deb516Selim Cinek            mStackScrollLayout.onInterceptTouchEvent(cancellation);
134a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            cancellation.recycle();
1355de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        }
1365de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        return intercept;
1375de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    }
1385de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
1395de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    @Override
1405de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    public boolean onTouchEvent(MotionEvent ev) {
141b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        boolean handled = false;
142ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        if (mNotificationPanel.isFullyExpanded()
143ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi                && mService.getBarState() != StatusBarState.KEYGUARD) {
144b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler            handled = mExpandHelper.onTouchEvent(ev);
145ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        } else if (mService.getBarState() == StatusBarState.KEYGUARD) {
146ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi            handled = mDragDownHelper.onTouchEvent(ev);
147b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        }
148b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        if (!handled) {
149b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler            handled = super.onTouchEvent(ev);
150b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        }
151257f283b0e4cc1c1fa4e7f2472d3ee4ab3b451d0John Spurlock        final int action = ev.getAction();
152d157ca049abd8e6761aab7b50431343869ec831aJohn Spurlock        if (!handled && (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL)) {
153257f283b0e4cc1c1fa4e7f2472d3ee4ab3b451d0John Spurlock            mService.setInteracting(StatusBarManager.WINDOW_STATUS_BAR, false);
154257f283b0e4cc1c1fa4e7f2472d3ee4ab3b451d0John Spurlock        }
1555de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        return handled;
1565de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    }
157198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler
158198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    @Override
159198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public void onDraw(Canvas canvas) {
160198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        super.onDraw(canvas);
161198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        if (DEBUG) {
162198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            Paint pt = new Paint();
163198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            pt.setColor(0x80FFFF00);
164198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            pt.setStrokeWidth(12.0f);
165198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            pt.setStyle(Paint.Style.STROKE);
166198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), pt);
167198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        }
168198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    }
169ac47ff70c322614ff2ca9ad82fe41338daf55877Daniel Sandler
170ac47ff70c322614ff2ca9ad82fe41338daf55877Daniel Sandler    public void cancelExpandHelper() {
1711a3bdd5097e83659590895991904bbc6250cd5f2Daniel Sandler        if (mExpandHelper != null) {
1721a3bdd5097e83659590895991904bbc6250cd5f2Daniel Sandler            mExpandHelper.cancel();
1731a3bdd5097e83659590895991904bbc6250cd5f2Daniel Sandler        }
174ac47ff70c322614ff2ca9ad82fe41338daf55877Daniel Sandler    }
175c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler}
176c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
177