OSDN Git Service

Change CarSystemUI notification button from launching Car Notification Center to...
authorBrad Stenning <stenning@google.com>
Sat, 20 Apr 2019 18:53:17 +0000 (11:53 -0700)
committerBrad Stenning <stenning@google.com>
Wed, 24 Apr 2019 04:57:52 +0000 (04:57 +0000)
Bug: 130664005
Test: Manual
Change-Id: Ia32142c588d9afd42964182d2488f9b1133a5eb9
(cherry picked from commit 5b3dbcef9480ee6bedb554b48f433b18b63d6493)

packages/CarSystemUI/res/layout/car_navigation_bar.xml
packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java
packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java

index 34fd703..49d78b6 100644 (file)
             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"
         />
index a0f2367..6e7be06 100644 (file)
@@ -17,6 +17,7 @@
 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;
@@ -34,7 +35,7 @@ import com.android.systemui.statusbar.phone.StatusBarIconController;
  */
 class CarNavigationBarView extends LinearLayout {
     private View mNavButtons;
-    private CarFacetButton mNotificationsButton;
+    private View mNotificationsButton;
     private CarStatusBar mCarStatusBar;
     private Context mContext;
     private View mLockScreenButtons;
@@ -74,13 +75,39 @@ class CarNavigationBarView extends LinearLayout {
     @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;
index 8f8fd11..593fa0d 100644 (file)
@@ -347,7 +347,9 @@ public class CarStatusBar extends StatusBar implements
                 new CloseNotificationGestureListener() {
                     @Override
                     protected void close() {
-                        animateCollapsePanels();
+                        if (mPanelExpanded) {
+                            animateCollapsePanels();
+                        }
                     }
                 });
         // Attached to the NavBars to close the notification shade
@@ -355,7 +357,9 @@ public class CarStatusBar extends StatusBar implements
                 new NavBarCloseNotificationGestureListener() {
                     @Override
                     protected void close() {
-                        animateCollapsePanels();
+                        if (mPanelExpanded) {
+                            animateCollapsePanels();
+                        }
                     }
                 });
         mNavBarNotificationTouchListener =
@@ -514,6 +518,13 @@ public class CarStatusBar extends StatusBar implements
         mNotificationViewController.enable();
     }
 
+    /**
+     * @return true if the notification panel is currently visible
+     */
+    boolean isNotificationPanelOpen() {
+        return mPanelExpanded;
+    }
+
     @Override
     public void animateExpandNotificationsPanel() {
         if (!mCommandQueue.panelsEnabled() || !mUserSetup) {