PhoneStatusBarView.java revision 9f96711e1adf4a28f961c440da1626ad40c03bc8
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
17package com.android.systemui.statusbar.phone;
18
19import android.content.Context;
20import android.util.AttributeSet;
21import android.util.EventLog;
22import android.view.MotionEvent;
23import android.view.View;
24import android.view.accessibility.AccessibilityEvent;
25
26import com.android.systemui.DejankUtils;
27import com.android.systemui.EventLogTags;
28
29public class PhoneStatusBarView extends PanelBar {
30    private static final String TAG = "PhoneStatusBarView";
31    private static final boolean DEBUG = PhoneStatusBar.DEBUG;
32    private static final boolean DEBUG_GESTURES = false;
33
34    PhoneStatusBar mBar;
35
36    boolean mIsFullyOpenedPanel = false;
37    private final PhoneStatusBarTransitions mBarTransitions;
38    private ScrimController mScrimController;
39    private float mMinFraction;
40    private float mPanelFraction;
41    private Runnable mHideExpandedRunnable = new Runnable() {
42        @Override
43        public void run() {
44            mBar.makeExpandedInvisible();
45        }
46    };
47
48    public PhoneStatusBarView(Context context, AttributeSet attrs) {
49        super(context, attrs);
50
51        mBarTransitions = new PhoneStatusBarTransitions(this);
52    }
53
54    public BarTransitions getBarTransitions() {
55        return mBarTransitions;
56    }
57
58    public void setBar(PhoneStatusBar bar) {
59        mBar = bar;
60    }
61
62    public void setScrimController(ScrimController scrimController) {
63        mScrimController = scrimController;
64    }
65
66    @Override
67    public void onFinishInflate() {
68        mBarTransitions.init();
69    }
70
71    @Override
72    public boolean panelEnabled() {
73        return mBar.panelsEnabled();
74    }
75
76    @Override
77    public boolean onRequestSendAccessibilityEventInternal(View child, AccessibilityEvent event) {
78        if (super.onRequestSendAccessibilityEventInternal(child, event)) {
79            // The status bar is very small so augment the view that the user is touching
80            // with the content of the status bar a whole. This way an accessibility service
81            // may announce the current item as well as the entire content if appropriate.
82            AccessibilityEvent record = AccessibilityEvent.obtain();
83            onInitializeAccessibilityEvent(record);
84            dispatchPopulateAccessibilityEvent(record);
85            event.appendRecord(record);
86            return true;
87        }
88        return false;
89    }
90
91    @Override
92    public void onPanelPeeked() {
93        super.onPanelPeeked();
94        mBar.makeExpandedVisible(false);
95    }
96
97    @Override
98    public void onPanelCollapsed() {
99        super.onPanelCollapsed();
100        // Close the status bar in the next frame so we can show the end of the animation.
101        DejankUtils.postAfterTraversal(mHideExpandedRunnable);
102        mIsFullyOpenedPanel = false;
103    }
104
105    public void removePendingHideExpandedRunnables() {
106        DejankUtils.removeCallbacks(mHideExpandedRunnable);
107    }
108
109    @Override
110    public void onPanelFullyOpened() {
111        super.onPanelFullyOpened();
112        if (!mIsFullyOpenedPanel) {
113            mPanel.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
114        }
115        mIsFullyOpenedPanel = true;
116    }
117
118    @Override
119    public boolean onTouchEvent(MotionEvent event) {
120        boolean barConsumedEvent = mBar.interceptTouchEvent(event);
121
122        if (DEBUG_GESTURES) {
123            if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {
124                EventLog.writeEvent(EventLogTags.SYSUI_PANELBAR_TOUCH,
125                        event.getActionMasked(), (int) event.getX(), (int) event.getY(),
126                        barConsumedEvent ? 1 : 0);
127            }
128        }
129
130        return barConsumedEvent || super.onTouchEvent(event);
131    }
132
133    @Override
134    public void onTrackingStarted() {
135        super.onTrackingStarted();
136        mBar.onTrackingStarted();
137        mScrimController.onTrackingStarted();
138    }
139
140    @Override
141    public void onClosingFinished() {
142        super.onClosingFinished();
143        mBar.onClosingFinished();
144    }
145
146    @Override
147    public void onTrackingStopped(boolean expand) {
148        super.onTrackingStopped(expand);
149        mBar.onTrackingStopped(expand);
150    }
151
152    @Override
153    public void onExpandingFinished() {
154        super.onExpandingFinished();
155        mScrimController.onExpandingFinished();
156    }
157
158    @Override
159    public boolean onInterceptTouchEvent(MotionEvent event) {
160        return mBar.interceptTouchEvent(event) || super.onInterceptTouchEvent(event);
161    }
162
163    @Override
164    public void panelScrimMinFractionChanged(float minFraction) {
165        if (mMinFraction != minFraction) {
166            mMinFraction = minFraction;
167            updateScrimFraction();
168        }
169    }
170
171    @Override
172    public void panelExpansionChanged(float frac, boolean expanded) {
173        super.panelExpansionChanged(frac, expanded);
174        mPanelFraction = frac;
175        updateScrimFraction();
176    }
177
178    private void updateScrimFraction() {
179        float scrimFraction = Math.max(mPanelFraction - mMinFraction / (1.0f - mMinFraction), 0);
180        mScrimController.setPanelExpansion(scrimFraction);
181    }
182}
183