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;
23a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinekimport android.graphics.PorterDuff;
24a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinekimport android.graphics.PorterDuffXfermode;
25fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlockimport android.graphics.Rect;
260b99ea94f02b1002ef65aa64363d396a8876b583John Spurlockimport android.media.session.MediaSessionLegacyHelper;
27a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinekimport android.os.IBinder;
28c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.util.AttributeSet;
29c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.view.KeyEvent;
305de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wrenimport android.view.MotionEvent;
31b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandlerimport android.view.View;
32b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandlerimport android.view.ViewRootImpl;
33a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinekimport android.view.WindowManager;
34a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinekimport android.view.WindowManagerGlobal;
35c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.widget.FrameLayout;
36c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
375de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wrenimport com.android.systemui.R;
38198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandlerimport com.android.systemui.statusbar.BaseStatusBar;
39ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiimport com.android.systemui.statusbar.DragDownHelper;
40ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiimport com.android.systemui.statusbar.StatusBarState;
41fab078b01fbad026f006744016272327f7ab116bSelim Cinekimport com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
425de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
43c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
44ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggipublic class StatusBarWindowView extends FrameLayout {
45198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public static final String TAG = "StatusBarWindowView";
46198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public static final boolean DEBUG = BaseStatusBar.DEBUG;
475de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
48ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi    private DragDownHelper mDragDownHelper;
49b6d85ebfe4f9f5d3b7d7ab7b6123af02a0deb516Selim Cinek    private NotificationStackScrollLayout mStackScrollLayout;
50b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler    private NotificationPanelView mNotificationPanel;
519dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos    private View mBrightnessMirror;
525de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
53c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    PhoneStatusBar mService;
54a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    private final Paint mTransparentSrcPaint = new Paint();
55c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
56c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    public StatusBarWindowView(Context context, AttributeSet attrs) {
57c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        super(context, attrs);
585de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        setMotionEventSplittingEnabled(false);
59a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        mTransparentSrcPaint.setColor(0);
60a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        mTransparentSrcPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
615de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    }
625de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
635de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    @Override
64fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock    protected boolean fitSystemWindows(Rect insets) {
65fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock        if (getFitsSystemWindows()) {
66416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            boolean changed = insets.left != getPaddingLeft()
67416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                    || insets.top != getPaddingTop()
68416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                    || insets.right != getPaddingRight()
69416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                    || insets.bottom != getPaddingBottom();
70416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            if (changed) {
71416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                setPadding(insets.left, insets.top, insets.right, 0);
72416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            }
73d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi            insets.left = 0;
74d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi            insets.top = 0;
75d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi            insets.right = 0;
76fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock        } else {
77416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            boolean changed = getPaddingLeft() != 0
78416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                    || getPaddingRight() != 0
79416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                    || getPaddingTop() != 0
80416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                    || getPaddingBottom() != 0;
81416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            if (changed) {
82416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                setPadding(0, 0, 0, 0);
83416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            }
84fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock        }
85d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi        return false;
86fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock    }
87fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock
88fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock    @Override
895de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    protected void onAttachedToWindow () {
905de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        super.onAttachedToWindow();
9167b2260093774f5866f781aede52830440f4ed0eSelim Cinek
92b6d85ebfe4f9f5d3b7d7ab7b6123af02a0deb516Selim Cinek        mStackScrollLayout = (NotificationStackScrollLayout) findViewById(
93b6d85ebfe4f9f5d3b7d7ab7b6123af02a0deb516Selim Cinek                R.id.notification_stack_scroller);
94b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        mNotificationPanel = (NotificationPanelView) findViewById(R.id.notification_panel);
95ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        mDragDownHelper = new DragDownHelper(getContext(), this, mStackScrollLayout, mService);
969dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos        mBrightnessMirror = findViewById(R.id.brightness_mirror);
97b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler
98b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler        // We really need to be able to animate while window animations are going on
99b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler        // so that activities may be started asynchronously from panel animations
100b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler        final ViewRootImpl root = getViewRootImpl();
101b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler        if (root != null) {
102b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler            root.setDrawDuringWindowsAnimating(true);
103b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler        }
104a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek
105a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        // We need to ensure that our window doesn't suffer from overdraw which would normally
106a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        // occur if our window is translucent. Since we are drawing the whole window anyway with
107a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        // the scrim, we don't need the window to be cleared in the beginning.
1080e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi        if (mService.isScrimSrcModeEnabled()) {
1090e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            IBinder windowToken = getWindowToken();
1100e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            WindowManager.LayoutParams lp = (WindowManager.LayoutParams) getLayoutParams();
1110e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            lp.token = windowToken;
1120e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            setLayoutParams(lp);
1130e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            WindowManagerGlobal.getInstance().changeCanvasOpacity(windowToken, true);
1140e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            setWillNotDraw(false);
1150e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi        } else {
1160e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            setWillNotDraw(!DEBUG);
1170e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi        }
118c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    }
119c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
120c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    @Override
121c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    public boolean dispatchKeyEvent(KeyEvent event) {
122c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
123c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        switch (event.getKeyCode()) {
1248c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi            case KeyEvent.KEYCODE_BACK:
1258c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                if (!down) {
1268c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                    mService.onBackPressed();
1278c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                }
1288c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                return true;
1298c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi            case KeyEvent.KEYCODE_MENU:
1308c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                if (!down) {
1318c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                    return mService.onMenuPressed();
1328c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                }
133342507697317436b1b9ac28b9952a655f7f0792fJorim Jaggi            case KeyEvent.KEYCODE_SPACE:
134342507697317436b1b9ac28b9952a655f7f0792fJorim Jaggi                if (!down) {
135342507697317436b1b9ac28b9952a655f7f0792fJorim Jaggi                    return mService.onSpacePressed();
136342507697317436b1b9ac28b9952a655f7f0792fJorim Jaggi                }
1370b99ea94f02b1002ef65aa64363d396a8876b583John Spurlock                break;
138d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock            case KeyEvent.KEYCODE_VOLUME_DOWN:
139d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock            case KeyEvent.KEYCODE_VOLUME_UP:
1400b99ea94f02b1002ef65aa64363d396a8876b583John Spurlock                if (mService.isDozing()) {
1410b99ea94f02b1002ef65aa64363d396a8876b583John Spurlock                    MediaSessionLegacyHelper.getHelper(mContext).sendVolumeKeyEvent(event, true);
1420b99ea94f02b1002ef65aa64363d396a8876b583John Spurlock                    return true;
143d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock                }
1440b99ea94f02b1002ef65aa64363d396a8876b583John Spurlock                break;
145c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        }
146df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi        if (mService.interceptMediaKey(event)) {
147df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi            return true;
148df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi        }
149c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        return super.dispatchKeyEvent(event);
150c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    }
1515de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
1525de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    @Override
1539dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos    public boolean dispatchTouchEvent(MotionEvent ev) {
1549dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos        if (mBrightnessMirror != null && mBrightnessMirror.getVisibility() == VISIBLE) {
1559dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos            // Disallow new pointers while the brightness mirror is visible. This is so that you
1569dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos            // can't touch anything other than the brightness slider while the mirror is showing
1579dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos            // and the rest of the panel is transparent.
1589dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos            if (ev.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) {
1599dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos                return false;
1609dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos            }
1619dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos        }
1629dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos        return super.dispatchTouchEvent(ev);
1639dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos    }
1649dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos
1659dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos    @Override
1665de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    public boolean onInterceptTouchEvent(MotionEvent ev) {
167b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        boolean intercept = false;
168fab078b01fbad026f006744016272327f7ab116bSelim Cinek        if (mNotificationPanel.isFullyExpanded()
16903c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi                && mStackScrollLayout.getVisibility() == View.VISIBLE
1704222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi                && mService.getBarState() == StatusBarState.KEYGUARD
17158bef33499ee317a95a25bf520dddabc68ccee9aJorim Jaggi                && !mService.isQsExpanded()
1724222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi                && !mService.isBouncerShowing()) {
173ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi            intercept = mDragDownHelper.onInterceptTouchEvent(ev);
1748b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock            // wake up on a touch down event, if dozing
1758b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock            if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
1762a5e452f4f70d2dd717946dd50486cc66ea4cc43Jorim Jaggi                mService.wakeUpIfDozing(ev.getEventTime(), ev);
1778b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock            }
178b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        }
179b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        if (!intercept) {
180b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler            super.onInterceptTouchEvent(ev);
181b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        }
1825de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        if (intercept) {
183a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            MotionEvent cancellation = MotionEvent.obtain(ev);
184a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            cancellation.setAction(MotionEvent.ACTION_CANCEL);
185b6d85ebfe4f9f5d3b7d7ab7b6123af02a0deb516Selim Cinek            mStackScrollLayout.onInterceptTouchEvent(cancellation);
18631094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek            mNotificationPanel.onInterceptTouchEvent(cancellation);
187a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            cancellation.recycle();
1885de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        }
1895de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        return intercept;
1905de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    }
1915de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
1925de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    @Override
1935de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    public boolean onTouchEvent(MotionEvent ev) {
194b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        boolean handled = false;
195d692dd0d806e05c179af3beee7508ce311977abcJorim Jaggi        if (mService.getBarState() == StatusBarState.KEYGUARD && !mService.isQsExpanded()) {
196ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi            handled = mDragDownHelper.onTouchEvent(ev);
197b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        }
198b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        if (!handled) {
199b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler            handled = super.onTouchEvent(ev);
200b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        }
201257f283b0e4cc1c1fa4e7f2472d3ee4ab3b451d0John Spurlock        final int action = ev.getAction();
202d157ca049abd8e6761aab7b50431343869ec831aJohn Spurlock        if (!handled && (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL)) {
203257f283b0e4cc1c1fa4e7f2472d3ee4ab3b451d0John Spurlock            mService.setInteracting(StatusBarManager.WINDOW_STATUS_BAR, false);
204257f283b0e4cc1c1fa4e7f2472d3ee4ab3b451d0John Spurlock        }
2055de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        return handled;
2065de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    }
207198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler
208198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    @Override
209198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public void onDraw(Canvas canvas) {
210198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        super.onDraw(canvas);
2110e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi        if (mService.isScrimSrcModeEnabled()) {
2120e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            // We need to ensure that our window is always drawn fully even when we have paddings,
2130e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            // since we simulate it to be opaque.
2140e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            int paddedBottom = getHeight() - getPaddingBottom();
2150e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            int paddedRight = getWidth() - getPaddingRight();
2160e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            if (getPaddingTop() != 0) {
2170e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi                canvas.drawRect(0, 0, getWidth(), getPaddingTop(), mTransparentSrcPaint);
2180e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            }
2190e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            if (getPaddingBottom() != 0) {
2200e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi                canvas.drawRect(0, paddedBottom, getWidth(), getHeight(), mTransparentSrcPaint);
2210e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            }
2220e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            if (getPaddingLeft() != 0) {
2230e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi                canvas.drawRect(0, getPaddingTop(), getPaddingLeft(), paddedBottom,
2240e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi                        mTransparentSrcPaint);
2250e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            }
2260e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            if (getPaddingRight() != 0) {
2270e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi                canvas.drawRect(paddedRight, getPaddingTop(), getWidth(), paddedBottom,
2280e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi                        mTransparentSrcPaint);
2290e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            }
230a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        }
231198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        if (DEBUG) {
232198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            Paint pt = new Paint();
233198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            pt.setColor(0x80FFFF00);
234198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            pt.setStrokeWidth(12.0f);
235198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            pt.setStyle(Paint.Style.STROKE);
236198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), pt);
237198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        }
238198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    }
239ac47ff70c322614ff2ca9ad82fe41338daf55877Daniel Sandler
240ac47ff70c322614ff2ca9ad82fe41338daf55877Daniel Sandler    public void cancelExpandHelper() {
2411408eb5a58d669933c701e347fd3498ceab70f3cSelim Cinek        if (mStackScrollLayout != null) {
2421408eb5a58d669933c701e347fd3498ceab70f3cSelim Cinek            mStackScrollLayout.cancelExpandHelper();
2431a3bdd5097e83659590895991904bbc6250cd5f2Daniel Sandler        }
244ac47ff70c322614ff2ca9ad82fe41338daf55877Daniel Sandler    }
245c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler}
246c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
247