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