/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.statusbar.phone; import android.content.Context; import android.util.AttributeSet; import android.util.EventLog; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import com.android.systemui.BatteryMeterView; import com.android.systemui.DejankUtils; import com.android.systemui.Dependency; import com.android.systemui.EventLogTags; import com.android.systemui.R; import com.android.systemui.statusbar.policy.DarkIconDispatcher; import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver; public class PhoneStatusBarView extends PanelBar { private static final String TAG = "PhoneStatusBarView"; private static final boolean DEBUG = StatusBar.DEBUG; private static final boolean DEBUG_GESTURES = false; StatusBar mBar; boolean mIsFullyOpenedPanel = false; private final PhoneStatusBarTransitions mBarTransitions; private ScrimController mScrimController; private float mMinFraction; private float mPanelFraction; private Runnable mHideExpandedRunnable = new Runnable() { @Override public void run() { if (mPanelFraction == 0.0f) { mBar.makeExpandedInvisible(); } } }; private DarkReceiver mBattery; public PhoneStatusBarView(Context context, AttributeSet attrs) { super(context, attrs); mBarTransitions = new PhoneStatusBarTransitions(this); } public BarTransitions getBarTransitions() { return mBarTransitions; } public void setBar(StatusBar bar) { mBar = bar; } public void setScrimController(ScrimController scrimController) { mScrimController = scrimController; } @Override public void onFinishInflate() { mBarTransitions.init(); mBattery = findViewById(R.id.battery); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); // Always have Battery meters in the status bar observe the dark/light modes. Dependency.get(DarkIconDispatcher.class).addDarkReceiver(mBattery); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); Dependency.get(DarkIconDispatcher.class).removeDarkReceiver(mBattery); } @Override public boolean panelEnabled() { return mBar.panelsEnabled(); } @Override public boolean onRequestSendAccessibilityEventInternal(View child, AccessibilityEvent event) { if (super.onRequestSendAccessibilityEventInternal(child, event)) { // The status bar is very small so augment the view that the user is touching // with the content of the status bar a whole. This way an accessibility service // may announce the current item as well as the entire content if appropriate. AccessibilityEvent record = AccessibilityEvent.obtain(); onInitializeAccessibilityEvent(record); dispatchPopulateAccessibilityEvent(record); event.appendRecord(record); return true; } return false; } @Override public void onPanelPeeked() { super.onPanelPeeked(); mBar.makeExpandedVisible(false); } @Override public void onPanelCollapsed() { super.onPanelCollapsed(); // Close the status bar in the next frame so we can show the end of the animation. post(mHideExpandedRunnable); mIsFullyOpenedPanel = false; } public void removePendingHideExpandedRunnables() { removeCallbacks(mHideExpandedRunnable); } @Override public void onPanelFullyOpened() { super.onPanelFullyOpened(); if (!mIsFullyOpenedPanel) { mPanel.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); } mIsFullyOpenedPanel = true; } @Override public boolean onTouchEvent(MotionEvent event) { boolean barConsumedEvent = mBar.interceptTouchEvent(event); if (DEBUG_GESTURES) { if (event.getActionMasked() != MotionEvent.ACTION_MOVE) { EventLog.writeEvent(EventLogTags.SYSUI_PANELBAR_TOUCH, event.getActionMasked(), (int) event.getX(), (int) event.getY(), barConsumedEvent ? 1 : 0); } } return barConsumedEvent || super.onTouchEvent(event); } @Override public void onTrackingStarted() { super.onTrackingStarted(); mBar.onTrackingStarted(); mScrimController.onTrackingStarted(); removePendingHideExpandedRunnables(); } @Override public void onClosingFinished() { super.onClosingFinished(); mBar.onClosingFinished(); } @Override public void onTrackingStopped(boolean expand) { super.onTrackingStopped(expand); mBar.onTrackingStopped(expand); } @Override public void onExpandingFinished() { super.onExpandingFinished(); mScrimController.onExpandingFinished(); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { return mBar.interceptTouchEvent(event) || super.onInterceptTouchEvent(event); } @Override public void panelScrimMinFractionChanged(float minFraction) { if (mMinFraction != minFraction) { mMinFraction = minFraction; updateScrimFraction(); } } @Override public void panelExpansionChanged(float frac, boolean expanded) { super.panelExpansionChanged(frac, expanded); mPanelFraction = frac; updateScrimFraction(); } private void updateScrimFraction() { float scrimFraction = mPanelFraction; if (mMinFraction < 1.0f) { scrimFraction = Math.max((mPanelFraction - mMinFraction) / (1.0f - mMinFraction), 0); } mScrimController.setPanelExpansion(scrimFraction); } public void onDensityOrFontScaleChanged() { ViewGroup.LayoutParams layoutParams = getLayoutParams(); layoutParams.height = getResources().getDimensionPixelSize( R.dimen.status_bar_height); setLayoutParams(layoutParams); } }