android:layout_height="match_parent"
android:layout_weight="1"/>
- <com.android.systemui.statusbar.car.CarFacetButton
- android:id="@+id/note"
+ <!-- Click handling will be initialized in CarNavigationBarView because its
+ id = notifications which is treated special for the opening of the notification panel
+ -->
+ <com.android.systemui.statusbar.car.CarNavigationButton
+ android:id="@+id/notifications"
style="@style/NavigationBarButton"
- systemui:icon="@drawable/car_ic_notification"
- systemui:intent="intent:#Intent;component=com.android.car.notification/.CarNotificationCenterActivity;launchFlags=0x14000000;end"
- systemui:packages="com.android.car.notification"
+ android:src="@drawable/car_ic_notification"
systemui:selectedIcon="@drawable/car_ic_notification_selected"
systemui:useMoreIcon="false"
/>
package com.android.systemui.statusbar.car;
import android.content.Context;
+import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
*/
class CarNavigationBarView extends LinearLayout {
private View mNavButtons;
- private CarFacetButton mNotificationsButton;
+ private View mNotificationsButton;
private CarStatusBar mCarStatusBar;
private Context mContext;
private View mLockScreenButtons;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (mStatusBarWindowTouchListener != null) {
- // forward touch events to the status bar window so it can add a drag down
+ boolean shouldConsumeEvent = shouldConsumeNotificationButtonEvent(ev);
+ // Forward touch events to the status bar window so it can drag
// windows if required (Notification shade)
mStatusBarWindowTouchListener.onTouch(this, ev);
+ // return true if child views should not receive this event.
+ if (shouldConsumeEvent) {
+ return true;
+ }
}
return super.onInterceptTouchEvent(ev);
}
+ /**
+ * If the motion event is over top of the notification button while the notification
+ * panel is open, we need the statusbar touch listeners handle the event instead of the button.
+ * Since the statusbar listener will trigger a close of the notification panel before the
+ * any button click events are fired this will prevent reopening the panel.
+ *
+ * Note: we can't use requestDisallowInterceptTouchEvent because the gesture detector will
+ * always receive the ACTION_DOWN and thus think a longpress happened if no other events are
+ * received
+ *
+ * @return true if the notification button should not receive the event
+ */
+ private boolean shouldConsumeNotificationButtonEvent(MotionEvent ev) {
+ if (mNotificationsButton == null || !mCarStatusBar.isNotificationPanelOpen()) {
+ return false;
+ }
+ Rect notificationButtonLocation = new Rect();
+ mNotificationsButton.getHitRect(notificationButtonLocation);
+ return notificationButtonLocation.contains((int) ev.getX(), (int) ev.getY());
+ }
+
void setStatusBar(CarStatusBar carStatusBar) {
mCarStatusBar = carStatusBar;
new CloseNotificationGestureListener() {
@Override
protected void close() {
- animateCollapsePanels();
+ if (mPanelExpanded) {
+ animateCollapsePanels();
+ }
}
});
// Attached to the NavBars to close the notification shade
new NavBarCloseNotificationGestureListener() {
@Override
protected void close() {
- animateCollapsePanels();
+ if (mPanelExpanded) {
+ animateCollapsePanels();
+ }
}
});
mNavBarNotificationTouchListener =
mNotificationViewController.enable();
}
+ /**
+ * @return true if the notification panel is currently visible
+ */
+ boolean isNotificationPanelOpen() {
+ return mPanelExpanded;
+ }
+
@Override
public void animateExpandNotificationsPanel() {
if (!mCommandQueue.panelsEnabled() || !mUserSetup) {