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