Home | History | Annotate | Download | only in phone
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.systemui.statusbar.phone;
     18 
     19 import android.content.Context;
     20 import android.content.res.Resources;
     21 import android.util.AttributeSet;
     22 import android.util.EventLog;
     23 import android.view.MotionEvent;
     24 import android.view.View;
     25 import android.view.accessibility.AccessibilityEvent;
     26 
     27 import com.android.systemui.EventLogTags;
     28 import com.android.systemui.R;
     29 
     30 public class PhoneStatusBarView extends PanelBar {
     31     private static final String TAG = "PhoneStatusBarView";
     32     private static final boolean DEBUG = PhoneStatusBar.DEBUG;
     33     private static final boolean DEBUG_GESTURES = false;
     34 
     35     PhoneStatusBar mBar;
     36 
     37     PanelView mLastFullyOpenedPanel = null;
     38     PanelView mNotificationPanel;
     39     private final PhoneStatusBarTransitions mBarTransitions;
     40     private ScrimController mScrimController;
     41 
     42     public PhoneStatusBarView(Context context, AttributeSet attrs) {
     43         super(context, attrs);
     44 
     45         Resources res = getContext().getResources();
     46         mBarTransitions = new PhoneStatusBarTransitions(this);
     47     }
     48 
     49     public BarTransitions getBarTransitions() {
     50         return mBarTransitions;
     51     }
     52 
     53     public void setBar(PhoneStatusBar bar) {
     54         mBar = bar;
     55     }
     56 
     57     public void setScrimController(ScrimController scrimController) {
     58         mScrimController = scrimController;
     59     }
     60 
     61     @Override
     62     public void onFinishInflate() {
     63         mBarTransitions.init();
     64     }
     65 
     66     @Override
     67     public void addPanel(PanelView pv) {
     68         super.addPanel(pv);
     69         if (pv.getId() == R.id.notification_panel) {
     70             mNotificationPanel = pv;
     71         }
     72     }
     73 
     74     @Override
     75     public boolean panelsEnabled() {
     76         return mBar.panelsEnabled();
     77     }
     78 
     79     @Override
     80     public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) {
     81         if (super.onRequestSendAccessibilityEvent(child, event)) {
     82             // The status bar is very small so augment the view that the user is touching
     83             // with the content of the status bar a whole. This way an accessibility service
     84             // may announce the current item as well as the entire content if appropriate.
     85             AccessibilityEvent record = AccessibilityEvent.obtain();
     86             onInitializeAccessibilityEvent(record);
     87             dispatchPopulateAccessibilityEvent(record);
     88             event.appendRecord(record);
     89             return true;
     90         }
     91         return false;
     92     }
     93 
     94     @Override
     95     public PanelView selectPanelForTouch(MotionEvent touch) {
     96         // No double swiping. If either panel is open, nothing else can be pulled down.
     97         return mNotificationPanel.getExpandedHeight() > 0
     98                 ? null
     99                 : mNotificationPanel;
    100     }
    101 
    102     @Override
    103     public void onPanelPeeked() {
    104         super.onPanelPeeked();
    105         mBar.makeExpandedVisible(false);
    106     }
    107 
    108     @Override
    109     public void onAllPanelsCollapsed() {
    110         super.onAllPanelsCollapsed();
    111 
    112         // Close the status bar in the next frame so we can show the end of the animation.
    113         postOnAnimation(new Runnable() {
    114             @Override
    115             public void run() {
    116                 mBar.makeExpandedInvisible();
    117             }
    118         });
    119         mLastFullyOpenedPanel = null;
    120     }
    121 
    122     @Override
    123     public void onPanelFullyOpened(PanelView openPanel) {
    124         super.onPanelFullyOpened(openPanel);
    125         if (openPanel != mLastFullyOpenedPanel) {
    126             openPanel.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
    127         }
    128         mLastFullyOpenedPanel = openPanel;
    129     }
    130 
    131     @Override
    132     public boolean onTouchEvent(MotionEvent event) {
    133         boolean barConsumedEvent = mBar.interceptTouchEvent(event);
    134 
    135         if (DEBUG_GESTURES) {
    136             if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {
    137                 EventLog.writeEvent(EventLogTags.SYSUI_PANELBAR_TOUCH,
    138                         event.getActionMasked(), (int) event.getX(), (int) event.getY(),
    139                         barConsumedEvent ? 1 : 0);
    140             }
    141         }
    142 
    143         return barConsumedEvent || super.onTouchEvent(event);
    144     }
    145 
    146     @Override
    147     public void onTrackingStarted(PanelView panel) {
    148         super.onTrackingStarted(panel);
    149         mBar.onTrackingStarted();
    150         mScrimController.onTrackingStarted();
    151     }
    152 
    153     @Override
    154     public void onClosingFinished() {
    155         super.onClosingFinished();
    156         mBar.onClosingFinished();
    157     }
    158 
    159     @Override
    160     public void onTrackingStopped(PanelView panel, boolean expand) {
    161         super.onTrackingStopped(panel, expand);
    162         mBar.onTrackingStopped(expand);
    163     }
    164 
    165     @Override
    166     public void onExpandingFinished() {
    167         super.onExpandingFinished();
    168         mScrimController.onExpandingFinished();
    169     }
    170 
    171     @Override
    172     public boolean onInterceptTouchEvent(MotionEvent event) {
    173         return mBar.interceptTouchEvent(event) || super.onInterceptTouchEvent(event);
    174     }
    175 
    176     @Override
    177     public void panelExpansionChanged(PanelView panel, float frac, boolean expanded) {
    178         super.panelExpansionChanged(panel, frac, expanded);
    179         mScrimController.setPanelExpansion(frac);
    180         mBar.updateCarrierLabelVisibility(false);
    181     }
    182 }
    183