Skip to content

Commit

Permalink
SystemUI: add burnIn protection
Browse files Browse the repository at this point in the history
Devices with AMOLED display suffer from
status-bar's notification items and nagivation bar's software keys
causing permanent burn-ins when used long-term.

Moving all items in the area
both horizontally and vertically workarounds this problem.

jrizzoli: integrate with runtime cmsdk preference

Linux4: Removed toggle from settings - the burnIn protection is always
enabled if the corresponding AOSP overlay is set to true
Updated for T

Change-Id: I35b04d1edff86a556adb3ad349569e5d82653f16
Signed-off-by: Park Ju Hyung <[email protected]>
Signed-off-by: Alex Naidis <[email protected]>
Signed-off-by: Thecrazyskull <[email protected]>
Signed-off-by: Joey Rizzoli <[email protected]>
  • Loading branch information
arter97 authored and sfX-bot committed Sep 18, 2024
1 parent f05a54e commit a1eec0d
Show file tree
Hide file tree
Showing 5 changed files with 175 additions and 0 deletions.
3 changes: 3 additions & 0 deletions packages/SystemUI/res/values/lineage_dimens.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,7 @@

<!-- Largest size an avatar might need to be drawn in the power menu user picker -->
<dimen name="global_actions_avatar_size">24dp</dimen>

<dimen name="burnin_protection_horizontal_shift">3dp</dimen>
<dimen name="burnin_protection_vertical_shift">1dp</dimen>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,13 @@ public class NavigationBarView extends FrameLayout implements TunerService.Tunab
private FloatingRotationButton mFloatingRotationButton;
private RotationButtonController mRotationButtonController;

private int mBasePaddingBottom;
private int mBasePaddingLeft;
private int mBasePaddingRight;
private int mBasePaddingTop;

private ViewGroup mNavigationBarContents;

/**
* Helper that is responsible for showing the right toast when a disallowed activity operation
* occurred. In pinned mode, we show instructions on how to break out of this mode, whilst in
Expand Down Expand Up @@ -889,12 +896,31 @@ public void setAccessibilityButtonState(final boolean visible, final boolean lon
mContextualButtonGroup.setButtonVisibility(R.id.accessibility_button, visible);
}

public void shiftNavigationBarItems(int horizontalShift, int verticalShift) {
if (mNavigationBarContents == null) {
return;
}

mNavigationBarContents.setPaddingRelative(mBasePaddingLeft + horizontalShift,
mBasePaddingTop + verticalShift,
mBasePaddingRight + horizontalShift,
mBasePaddingBottom - verticalShift);
invalidate();
}

@Override
public void onFinishInflate() {
super.onFinishInflate();
mNavigationInflaterView = findViewById(R.id.navigation_inflater);
mNavigationInflaterView.setButtonDispatchers(mButtonDispatchers);


mNavigationBarContents = (ViewGroup) findViewById(R.id.nav_buttons);

mBasePaddingLeft = mNavigationBarContents.getPaddingStart();
mBasePaddingTop = mNavigationBarContents.getPaddingTop();
mBasePaddingRight = mNavigationBarContents.getPaddingEnd();
mBasePaddingBottom = mNavigationBarContents.getPaddingBottom();
updateOrientationViews();
reloadNavIcons();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,7 @@
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.BrightnessMirrorController;
import com.android.systemui.statusbar.policy.BurnInProtectionController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
Expand Down Expand Up @@ -440,6 +441,7 @@ public void togglePanel() {
@Nullable
protected LockscreenWallpaper mLockscreenWallpaper;
private final AutoHideController mAutoHideController;
private BurnInProtectionController mBurnInProtectionController;

private final Point mCurrentDisplaySize = new Point();

Expand Down Expand Up @@ -1250,6 +1252,12 @@ protected void makeStatusBarView(@Nullable RegisterStatusBarResult result) {
mNotificationPanelViewController.updatePanelExpansionAndVisibility();
setBouncerShowingForStatusBarComponents(mBouncerShowing);
checkBarModes();

if (mContext.getResources().getBoolean(
com.android.internal.R.bool.config_enableBurnInProtection)) {
mBurnInProtectionController = new BurnInProtectionController(mContext,
this, mStatusBarView);
}
});
initializer.initializeStatusBar(mCentralSurfacesComponent);

Expand Down Expand Up @@ -3507,6 +3515,9 @@ public void onFinishedGoingToSleep() {

updateNotificationPanelTouchState();
mNotificationShadeWindowViewController.cancelCurrentTouch();
if (mBurnInProtectionController != null) {
mBurnInProtectionController.stopShiftTimer(true);
}
if (mLaunchCameraOnFinishedGoingToSleep) {
mLaunchCameraOnFinishedGoingToSleep = false;

Expand Down Expand Up @@ -3651,6 +3662,9 @@ public void onFinishedWakingUp() {
}
}
updateScrimController();
if (mBurnInProtectionController != null) {
mBurnInProtectionController.startShiftTimer(true);
}
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.inputmethodservice.InputMethodService;
Expand Down Expand Up @@ -64,6 +65,13 @@ public class PhoneStatusBarView extends FrameLayout implements Callbacks {
private final CommandQueue mCommandQueue;
private final StatusBarContentInsetsProvider mContentInsetsProvider;

private int mBasePaddingBottom;
private int mBasePaddingLeft;
private int mBasePaddingRight;
private int mBasePaddingTop;

private ViewGroup mStatusBarContents;

private DarkReceiver mBattery;
private ClockController mClockController;
private int mRotationOrientation = -1;
Expand Down Expand Up @@ -137,6 +145,18 @@ void setTouchEventHandler(Gefingerpoken handler) {
mTouchEventHandler = handler;
}

public void shiftStatusBarItems(int horizontalShift, int verticalShift) {
if (mStatusBarContents == null) {
return;
}

mStatusBarContents.setPaddingRelative(mBasePaddingLeft + horizontalShift,
mBasePaddingTop + verticalShift,
mBasePaddingRight + horizontalShift,
mBasePaddingBottom - verticalShift);
invalidate();
}

void init(StatusBarUserChipViewModel viewModel) {
StatusBarUserSwitcherContainer container = findViewById(R.id.user_switcher_container);
StatusBarUserChipViewBinder.bind(container, viewModel);
Expand All @@ -149,6 +169,13 @@ public void onFinishInflate() {
mClockController = new ClockController(getContext(), this);
mCutoutSpace = findViewById(R.id.cutout_space_view);

mStatusBarContents = (ViewGroup) findViewById(R.id.status_bar_contents);

mBasePaddingLeft = mStatusBarContents.getPaddingStart();
mBasePaddingTop = mStatusBarContents.getPaddingTop();
mBasePaddingRight = mStatusBarContents.getPaddingEnd();
mBasePaddingBottom = mStatusBarContents.getPaddingBottom();

updateResources();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
/*
* Copyright 2017 Paranoid Android
* Copyright 2020 The LineageOS 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.policy;

import android.content.Context;
import android.content.res.Resources;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;

import com.android.systemui.R;
import com.android.systemui.navigationbar.NavigationBarView;
import com.android.systemui.statusbar.phone.PhoneStatusBarView;
import com.android.systemui.statusbar.phone.CentralSurfacesImpl;

public class BurnInProtectionController {
private static final String TAG = "BurnInProtectionController";
private static final boolean DEBUG = false;
private static final long INTERVAL = 60000; // Milliseconds

private int mHorizontalShift = 0;
private int mVerticalShift = 0;
private int mHorizontalDirection = 1;
private int mVerticalDirection = 1;
private int mNavigationBarHorizontalMaxShift;
private int mNavigationBarVerticalMaxShift;
private int mHorizontalMaxShift;
private int mVerticalMaxShift;
private long mShiftInterval;

private final Handler mHandler = new Handler();
private final Runnable mRunnable = () -> {
shiftItems();
mHandler.postDelayed(this.mRunnable, INTERVAL);
};

private PhoneStatusBarView mPhoneStatusBarView;
private CentralSurfacesImpl mStatusBar;

private Context mContext;

public BurnInProtectionController(Context context, CentralSurfacesImpl statusBar,
PhoneStatusBarView phoneStatusBarView) {
mContext = context;

mPhoneStatusBarView = phoneStatusBarView;
mStatusBar = statusBar;

mHorizontalMaxShift = mContext.getResources()
.getDimensionPixelSize(R.dimen.burnin_protection_horizontal_shift);
// total of ((vertical_max_shift - 1) * 2) pixels can be moved
mVerticalMaxShift = mContext.getResources()
.getDimensionPixelSize(R.dimen.burnin_protection_vertical_shift) - 1;
}

public void startShiftTimer(boolean enabled) {
if (!enabled) return;
mHandler.removeCallbacks(mRunnable);
mHandler.postDelayed(mRunnable, INTERVAL);
if (DEBUG) Log.d(TAG, "Started shift timer");
}

public void stopShiftTimer(boolean enabled) {
if (!enabled) return;
mHandler.removeCallbacks(mRunnable);
if (DEBUG) Log.d(TAG, "Canceled shift timer");
}

private void shiftItems() {
mHorizontalShift += mHorizontalDirection;
if ((mHorizontalShift >= mHorizontalMaxShift) ||
(mHorizontalShift <= -mHorizontalMaxShift)) {
mHorizontalDirection *= -1;
}

mVerticalShift += mVerticalDirection;
if ((mVerticalShift >= mVerticalMaxShift) ||
(mVerticalShift <= -mVerticalMaxShift)) {
mVerticalDirection *= -1;
}

mPhoneStatusBarView.shiftStatusBarItems(mHorizontalShift, mVerticalShift);
NavigationBarView navigationBarView = mStatusBar.getNavigationBarView();

if (navigationBarView != null) {
navigationBarView.shiftNavigationBarItems(mHorizontalShift, mVerticalShift);
}
if (DEBUG) Log.d(TAG, "Shifting items\u2026");
}
}

0 comments on commit a1eec0d

Please sign in to comment.