/* * Copyright (C) 2016 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.graphics.Rect; import android.view.View; import com.android.systemui.statusbar.policy.BatteryController; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT; /** * Controls how light status bar flag applies to the icons. */ public class LightStatusBarController implements BatteryController.BatteryStateChangeCallback { private final StatusBarIconController mIconController; private final BatteryController mBatteryController; private FingerprintUnlockController mFingerprintUnlockController; private int mFullscreenStackVisibility; private int mDockedStackVisibility; private boolean mFullscreenLight; private boolean mDockedLight; private int mLastStatusBarMode; private final Rect mLastFullscreenBounds = new Rect(); private final Rect mLastDockedBounds = new Rect(); public LightStatusBarController(StatusBarIconController iconController, BatteryController batteryController) { mIconController = iconController; mBatteryController = batteryController; batteryController.addStateChangedCallback(this); } public void setFingerprintUnlockController( FingerprintUnlockController fingerprintUnlockController) { mFingerprintUnlockController = fingerprintUnlockController; } public void onSystemUiVisibilityChanged(int fullscreenStackVis, int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds, boolean sbModeChanged, int statusBarMode) { int oldFullscreen = mFullscreenStackVisibility; int newFullscreen = (oldFullscreen & ~mask) | (fullscreenStackVis & mask); int diffFullscreen = newFullscreen ^ oldFullscreen; int oldDocked = mDockedStackVisibility; int newDocked = (oldDocked & ~mask) | (dockedStackVis & mask); int diffDocked = newDocked ^ oldDocked; if ((diffFullscreen & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0 || (diffDocked & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0 || sbModeChanged || !mLastFullscreenBounds.equals(fullscreenStackBounds) || !mLastDockedBounds.equals(dockedStackBounds)) { mFullscreenLight = isLight(newFullscreen, statusBarMode); mDockedLight = isLight(newDocked, statusBarMode); update(fullscreenStackBounds, dockedStackBounds); } mFullscreenStackVisibility = newFullscreen; mDockedStackVisibility = newDocked; mLastStatusBarMode = statusBarMode; mLastFullscreenBounds.set(fullscreenStackBounds); mLastDockedBounds.set(dockedStackBounds); } private boolean isLight(int vis, int statusBarMode) { boolean isTransparentBar = (statusBarMode == MODE_TRANSPARENT || statusBarMode == MODE_LIGHTS_OUT_TRANSPARENT); boolean allowLight = isTransparentBar && !mBatteryController.isPowerSave(); boolean light = (vis & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0; return allowLight && light; } private boolean animateChange() { if (mFingerprintUnlockController == null) { return false; } int unlockMode = mFingerprintUnlockController.getMode(); return unlockMode != FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING && unlockMode != FingerprintUnlockController.MODE_WAKE_AND_UNLOCK; } private void update(Rect fullscreenStackBounds, Rect dockedStackBounds) { boolean hasDockedStack = !dockedStackBounds.isEmpty(); // If both are light or fullscreen is light and there is no docked stack, all icons get // dark. if ((mFullscreenLight && mDockedLight) || (mFullscreenLight && !hasDockedStack)) { mIconController.setIconsDarkArea(null); mIconController.setIconsDark(true, animateChange()); } // If no one is light or the fullscreen is not light and there is no docked stack, // all icons become white. else if ((!mFullscreenLight && !mDockedLight) || (!mFullscreenLight && !hasDockedStack)) { mIconController.setIconsDark(false, animateChange()); } // Not the same for every stack, magic! else { Rect bounds = mFullscreenLight ? fullscreenStackBounds : dockedStackBounds; if (bounds.isEmpty()) { mIconController.setIconsDarkArea(null); } else { mIconController.setIconsDarkArea(bounds); } mIconController.setIconsDark(true, animateChange()); } } @Override public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) { } @Override public void onPowerSaveChanged(boolean isPowerSave) { onSystemUiVisibilityChanged(mFullscreenStackVisibility, mDockedStackVisibility, 0 /* mask */, mLastFullscreenBounds, mLastDockedBounds, true /* sbModeChange*/, mLastStatusBarMode); } }