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