StatusBarWindowView.java revision 4e6b2d3e7d2c78c0575c14045469c36ab09a6a4e
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;
212f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roosimport android.content.res.TypedArray;
22198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandlerimport android.graphics.Canvas;
23198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandlerimport android.graphics.Paint;
24a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinekimport android.graphics.PorterDuff;
25a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinekimport android.graphics.PorterDuffXfermode;
26fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlockimport android.graphics.Rect;
270b99ea94f02b1002ef65aa64363d396a8876b583John Spurlockimport android.media.session.MediaSessionLegacyHelper;
28a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinekimport android.os.IBinder;
29c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.util.AttributeSet;
30c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.view.KeyEvent;
315de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wrenimport android.view.MotionEvent;
32b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandlerimport android.view.View;
33b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandlerimport android.view.ViewRootImpl;
34a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinekimport android.view.WindowManager;
35a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinekimport android.view.WindowManagerGlobal;
36c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.widget.FrameLayout;
37c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
385de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wrenimport com.android.systemui.R;
39198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandlerimport com.android.systemui.statusbar.BaseStatusBar;
40ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiimport com.android.systemui.statusbar.DragDownHelper;
41ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiimport com.android.systemui.statusbar.StatusBarState;
42fab078b01fbad026f006744016272327f7ab116bSelim Cinekimport com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
435de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
44c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
45ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggipublic class StatusBarWindowView extends FrameLayout {
46198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public static final String TAG = "StatusBarWindowView";
47198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public static final boolean DEBUG = BaseStatusBar.DEBUG;
485de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
49ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi    private DragDownHelper mDragDownHelper;
50b6d85ebfe4f9f5d3b7d7ab7b6123af02a0deb516Selim Cinek    private NotificationStackScrollLayout mStackScrollLayout;
51b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler    private NotificationPanelView mNotificationPanel;
529dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos    private View mBrightnessMirror;
535de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
542f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos    private int mRightInset = 0;
552f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos
564e6b2d3e7d2c78c0575c14045469c36ab09a6a4eSelim Cinek    private PhoneStatusBar mService;
57a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek    private final Paint mTransparentSrcPaint = new Paint();
58c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
59c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    public StatusBarWindowView(Context context, AttributeSet attrs) {
60c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        super(context, attrs);
615de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        setMotionEventSplittingEnabled(false);
62a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        mTransparentSrcPaint.setColor(0);
63a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        mTransparentSrcPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
645de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    }
655de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
665de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    @Override
67fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock    protected boolean fitSystemWindows(Rect insets) {
68fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock        if (getFitsSystemWindows()) {
692f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos            boolean paddingChanged = insets.left != getPaddingLeft()
70416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                    || insets.top != getPaddingTop()
71416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                    || insets.bottom != getPaddingBottom();
72aa8061448ec5a0e3cef9685f4186fc94e09eb78eJorim Jaggi
732f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos            // Super-special right inset handling, because scrims and backdrop need to ignore it.
742f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos            if (insets.right != mRightInset) {
752f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos                mRightInset = insets.right;
762f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos                applyMargins();
772f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos            }
782f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos            // Drop top inset, apply left inset and pass through bottom inset.
792f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos            if (paddingChanged) {
802f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos                setPadding(insets.left, 0, 0, 0);
81416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            }
82d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi            insets.left = 0;
83d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi            insets.top = 0;
84d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi            insets.right = 0;
85fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock        } else {
86e49e409311a57dd798131f29c05b9060b4075cafAdrian Roos            if (mRightInset != 0) {
87e49e409311a57dd798131f29c05b9060b4075cafAdrian Roos                mRightInset = 0;
88e49e409311a57dd798131f29c05b9060b4075cafAdrian Roos                applyMargins();
89e49e409311a57dd798131f29c05b9060b4075cafAdrian Roos            }
90416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            boolean changed = getPaddingLeft() != 0
91416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                    || getPaddingRight() != 0
92416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                    || getPaddingTop() != 0
93416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                    || getPaddingBottom() != 0;
94416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            if (changed) {
95416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi                setPadding(0, 0, 0, 0);
96416493bf66dff0aa7fcd9ea505ed10dbff1f2906Jorim Jaggi            }
97aa8061448ec5a0e3cef9685f4186fc94e09eb78eJorim Jaggi            insets.top = 0;
98fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock        }
99d7daab7b9e33cd56f2692b9ebea87ef21290c1eaJorim Jaggi        return false;
100fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock    }
101fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock
1022f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos    private void applyMargins() {
1032f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos        final int N = getChildCount();
1042f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos        for (int i = 0; i < N; i++) {
1052f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos            View child = getChildAt(i);
1062f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos            if (child.getLayoutParams() instanceof LayoutParams) {
1072f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos                LayoutParams lp = (LayoutParams) child.getLayoutParams();
1082f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos                if (!lp.ignoreRightInset && lp.rightMargin != mRightInset) {
1092f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos                    lp.rightMargin = mRightInset;
1102f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos                    child.requestLayout();
1112f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos                }
1122f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos            }
1132f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos        }
1142f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos    }
1152f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos
1162f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos    @Override
1172f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos    public FrameLayout.LayoutParams generateLayoutParams(AttributeSet attrs) {
1182f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos        return new LayoutParams(getContext(), attrs);
1192f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos    }
1202f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos
1212f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos    @Override
1222f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos    protected FrameLayout.LayoutParams generateDefaultLayoutParams() {
1232f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos        return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
1242f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos    }
1252f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos
126fba9120ce12c854a80d5ed3faf5bcca33a7a1b91John Spurlock    @Override
1274e6b2d3e7d2c78c0575c14045469c36ab09a6a4eSelim Cinek    protected void onFinishInflate() {
1284e6b2d3e7d2c78c0575c14045469c36ab09a6a4eSelim Cinek        super.onFinishInflate();
129b6d85ebfe4f9f5d3b7d7ab7b6123af02a0deb516Selim Cinek        mStackScrollLayout = (NotificationStackScrollLayout) findViewById(
130b6d85ebfe4f9f5d3b7d7ab7b6123af02a0deb516Selim Cinek                R.id.notification_stack_scroller);
131b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        mNotificationPanel = (NotificationPanelView) findViewById(R.id.notification_panel);
1329dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos        mBrightnessMirror = findViewById(R.id.brightness_mirror);
1334e6b2d3e7d2c78c0575c14045469c36ab09a6a4eSelim Cinek    }
1344e6b2d3e7d2c78c0575c14045469c36ab09a6a4eSelim Cinek
1354e6b2d3e7d2c78c0575c14045469c36ab09a6a4eSelim Cinek    public void setService(PhoneStatusBar service) {
1364e6b2d3e7d2c78c0575c14045469c36ab09a6a4eSelim Cinek        mService = service;
1374e6b2d3e7d2c78c0575c14045469c36ab09a6a4eSelim Cinek        mDragDownHelper = new DragDownHelper(getContext(), this, mStackScrollLayout, mService);
1384e6b2d3e7d2c78c0575c14045469c36ab09a6a4eSelim Cinek    }
1394e6b2d3e7d2c78c0575c14045469c36ab09a6a4eSelim Cinek
1404e6b2d3e7d2c78c0575c14045469c36ab09a6a4eSelim Cinek    @Override
1414e6b2d3e7d2c78c0575c14045469c36ab09a6a4eSelim Cinek    protected void onAttachedToWindow () {
1424e6b2d3e7d2c78c0575c14045469c36ab09a6a4eSelim Cinek        super.onAttachedToWindow();
143b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler
144b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler        // We really need to be able to animate while window animations are going on
145b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler        // so that activities may be started asynchronously from panel animations
146b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler        final ViewRootImpl root = getViewRootImpl();
147b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler        if (root != null) {
148b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler            root.setDrawDuringWindowsAnimating(true);
149b10d885c3bb9d634c1c21178319fdf1c04c16bc3Daniel Sandler        }
150a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek
151a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        // We need to ensure that our window doesn't suffer from overdraw which would normally
152a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        // occur if our window is translucent. Since we are drawing the whole window anyway with
153a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        // the scrim, we don't need the window to be cleared in the beginning.
1540e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi        if (mService.isScrimSrcModeEnabled()) {
1550e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            IBinder windowToken = getWindowToken();
1560e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            WindowManager.LayoutParams lp = (WindowManager.LayoutParams) getLayoutParams();
1570e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            lp.token = windowToken;
1580e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            setLayoutParams(lp);
1590e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            WindowManagerGlobal.getInstance().changeCanvasOpacity(windowToken, true);
1600e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            setWillNotDraw(false);
1610e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi        } else {
1620e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            setWillNotDraw(!DEBUG);
1630e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi        }
164c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    }
165c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
166c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    @Override
167c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    public boolean dispatchKeyEvent(KeyEvent event) {
168c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
169c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        switch (event.getKeyCode()) {
1708c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi            case KeyEvent.KEYCODE_BACK:
1718c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                if (!down) {
1728c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                    mService.onBackPressed();
1738c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                }
1748c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                return true;
1758c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi            case KeyEvent.KEYCODE_MENU:
1768c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                if (!down) {
1778c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                    return mService.onMenuPressed();
1788c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi                }
179342507697317436b1b9ac28b9952a655f7f0792fJorim Jaggi            case KeyEvent.KEYCODE_SPACE:
180342507697317436b1b9ac28b9952a655f7f0792fJorim Jaggi                if (!down) {
181342507697317436b1b9ac28b9952a655f7f0792fJorim Jaggi                    return mService.onSpacePressed();
182342507697317436b1b9ac28b9952a655f7f0792fJorim Jaggi                }
1830b99ea94f02b1002ef65aa64363d396a8876b583John Spurlock                break;
184d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock            case KeyEvent.KEYCODE_VOLUME_DOWN:
185d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock            case KeyEvent.KEYCODE_VOLUME_UP:
1860b99ea94f02b1002ef65aa64363d396a8876b583John Spurlock                if (mService.isDozing()) {
1870b99ea94f02b1002ef65aa64363d396a8876b583John Spurlock                    MediaSessionLegacyHelper.getHelper(mContext).sendVolumeKeyEvent(event, true);
1880b99ea94f02b1002ef65aa64363d396a8876b583John Spurlock                    return true;
189d06aa570374ecfe5c707140a12a309b1b7c07e08John Spurlock                }
1900b99ea94f02b1002ef65aa64363d396a8876b583John Spurlock                break;
191c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        }
192df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi        if (mService.interceptMediaKey(event)) {
193df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi            return true;
194df993513fbfe0e952175c1c5384458deaa1ff01aJorim Jaggi        }
195c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler        return super.dispatchKeyEvent(event);
196c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler    }
1975de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
1985de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    @Override
1999dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos    public boolean dispatchTouchEvent(MotionEvent ev) {
2009dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos        if (mBrightnessMirror != null && mBrightnessMirror.getVisibility() == VISIBLE) {
2019dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos            // Disallow new pointers while the brightness mirror is visible. This is so that you
2029dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos            // can't touch anything other than the brightness slider while the mirror is showing
2039dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos            // and the rest of the panel is transparent.
2049dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos            if (ev.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) {
2059dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos                return false;
2069dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos            }
2079dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos        }
2089dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos        return super.dispatchTouchEvent(ev);
2099dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos    }
2109dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos
2119dc3209913cf3bcb6b46b6481321a054667be9a3Adrian Roos    @Override
2125de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    public boolean onInterceptTouchEvent(MotionEvent ev) {
213b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        boolean intercept = false;
214fab078b01fbad026f006744016272327f7ab116bSelim Cinek        if (mNotificationPanel.isFullyExpanded()
21503c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi                && mStackScrollLayout.getVisibility() == View.VISIBLE
2164222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi                && mService.getBarState() == StatusBarState.KEYGUARD
2174222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi                && !mService.isBouncerShowing()) {
218ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi            intercept = mDragDownHelper.onInterceptTouchEvent(ev);
2198b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock            // wake up on a touch down event, if dozing
2208b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock            if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
2212a5e452f4f70d2dd717946dd50486cc66ea4cc43Jorim Jaggi                mService.wakeUpIfDozing(ev.getEventTime(), ev);
2228b12f22bc1f654d0afe1a5588ed3667428b305c8John Spurlock            }
223b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        }
224b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        if (!intercept) {
225b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler            super.onInterceptTouchEvent(ev);
226b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        }
2275de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        if (intercept) {
228a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            MotionEvent cancellation = MotionEvent.obtain(ev);
229a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            cancellation.setAction(MotionEvent.ACTION_CANCEL);
230b6d85ebfe4f9f5d3b7d7ab7b6123af02a0deb516Selim Cinek            mStackScrollLayout.onInterceptTouchEvent(cancellation);
23131094df5c6e3cb3a4a4faacb091e35eea1f6a5deSelim Cinek            mNotificationPanel.onInterceptTouchEvent(cancellation);
232a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            cancellation.recycle();
2335de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        }
2345de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        return intercept;
2355de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    }
2365de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren
2375de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    @Override
2385de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    public boolean onTouchEvent(MotionEvent ev) {
239b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        boolean handled = false;
240cb9400aa23b81f12d8af198187fc799d6bcf164aSelim Cinek        if (mService.getBarState() == StatusBarState.KEYGUARD) {
241ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi            handled = mDragDownHelper.onTouchEvent(ev);
242b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        }
243b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        if (!handled) {
244b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler            handled = super.onTouchEvent(ev);
245b4e56edde684c2a09cb225c99571fddb39b43b34Daniel Sandler        }
246257f283b0e4cc1c1fa4e7f2472d3ee4ab3b451d0John Spurlock        final int action = ev.getAction();
247d157ca049abd8e6761aab7b50431343869ec831aJohn Spurlock        if (!handled && (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL)) {
248257f283b0e4cc1c1fa4e7f2472d3ee4ab3b451d0John Spurlock            mService.setInteracting(StatusBarManager.WINDOW_STATUS_BAR, false);
249257f283b0e4cc1c1fa4e7f2472d3ee4ab3b451d0John Spurlock        }
2505de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren        return handled;
2515de6e94e36e2adbdd4ebfb5c1903c23c9ea3c388Chris Wren    }
252198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler
253198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    @Override
254198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    public void onDraw(Canvas canvas) {
255198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        super.onDraw(canvas);
2560e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi        if (mService.isScrimSrcModeEnabled()) {
2570e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            // We need to ensure that our window is always drawn fully even when we have paddings,
2580e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            // since we simulate it to be opaque.
2590e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            int paddedBottom = getHeight() - getPaddingBottom();
2600e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            int paddedRight = getWidth() - getPaddingRight();
2610e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            if (getPaddingTop() != 0) {
2620e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi                canvas.drawRect(0, 0, getWidth(), getPaddingTop(), mTransparentSrcPaint);
2630e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            }
2640e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            if (getPaddingBottom() != 0) {
2650e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi                canvas.drawRect(0, paddedBottom, getWidth(), getHeight(), mTransparentSrcPaint);
2660e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            }
2670e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            if (getPaddingLeft() != 0) {
2680e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi                canvas.drawRect(0, getPaddingTop(), getPaddingLeft(), paddedBottom,
2690e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi                        mTransparentSrcPaint);
2700e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            }
2710e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            if (getPaddingRight() != 0) {
2720e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi                canvas.drawRect(paddedRight, getPaddingTop(), getWidth(), paddedBottom,
2730e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi                        mTransparentSrcPaint);
2740e66439387e36876de94a60658917a7f3b0e6d27Jorim Jaggi            }
275a0fad3ba06d0352f640532e69ed3d540b3795535Selim Cinek        }
276198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        if (DEBUG) {
277198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            Paint pt = new Paint();
278198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            pt.setColor(0x80FFFF00);
279198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            pt.setStrokeWidth(12.0f);
280198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            pt.setStyle(Paint.Style.STROKE);
281198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), pt);
282198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        }
283198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    }
284ac47ff70c322614ff2ca9ad82fe41338daf55877Daniel Sandler
285ac47ff70c322614ff2ca9ad82fe41338daf55877Daniel Sandler    public void cancelExpandHelper() {
2861408eb5a58d669933c701e347fd3498ceab70f3cSelim Cinek        if (mStackScrollLayout != null) {
2871408eb5a58d669933c701e347fd3498ceab70f3cSelim Cinek            mStackScrollLayout.cancelExpandHelper();
2881a3bdd5097e83659590895991904bbc6250cd5f2Daniel Sandler        }
289ac47ff70c322614ff2ca9ad82fe41338daf55877Daniel Sandler    }
2902f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos
2912f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos    public class LayoutParams extends FrameLayout.LayoutParams {
2922f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos
2932f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos        public boolean ignoreRightInset;
2942f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos
2952f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos        public LayoutParams(int width, int height) {
2962f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos            super(width, height);
2972f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos        }
2982f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos
2992f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos        public LayoutParams(Context c, AttributeSet attrs) {
3002f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos            super(c, attrs);
3012f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos
3022f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos            TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.StatusBarWindowView_Layout);
3032f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos            ignoreRightInset = a.getBoolean(
3042f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos                    R.styleable.StatusBarWindowView_Layout_ignoreRightInset, false);
3052f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos            a.recycle();
3062f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos        }
3072f2bd9a8f845535b6ecbf1b28aecdbd0ff3bbc63Adrian Roos    }
308c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler}
309c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandler
310