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