BurnInProtectionHelper.java revision c045208fef869e71622f7a1596314766138a13c4
1c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynski/*
2c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynski * Copyright (C) 2015 The Android Open Source Project
3c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynski *
4c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynski * Licensed under the Apache License, Version 2.0 (the "License");
5c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynski * you may not use this file except in compliance with the License.
6c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynski * You may obtain a copy of the License at
7c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynski *
8c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynski *      http://www.apache.org/licenses/LICENSE-2.0
9c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynski *
10c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynski * Unless required by applicable law or agreed to in writing, software
11c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynski * distributed under the License is distributed on an "AS IS" BASIS,
12c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynski * See the License for the specific language governing permissions and
14c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynski * limitations under the License
15c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynski */
16c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynski
17c045208fef869e71622f7a1596314766138a13c4Filip Gruszczynskipackage com.android.server.policy;
18d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
19d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynskiimport android.app.AlarmManager;
20d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynskiimport android.app.PendingIntent;
21d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynskiimport android.content.BroadcastReceiver;
22d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynskiimport android.content.Context;
23d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynskiimport android.content.Intent;
24d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynskiimport android.content.IntentFilter;
25d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynskiimport android.content.res.Resources;
26d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynskiimport android.hardware.display.DisplayManager;
27d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynskiimport android.hardware.display.DisplayManagerInternal;
28d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynskiimport android.os.SystemClock;
29d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynskiimport android.view.Display;
30d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
31d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynskiimport com.android.server.LocalServices;
32d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
33d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynskiimport java.io.PrintWriter;
34d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynskiimport java.util.concurrent.TimeUnit;
35d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
36d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynskipublic class BurnInProtectionHelper implements DisplayManager.DisplayListener {
37d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private static final String TAG = "BurnInProtection";
38d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
39d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    // Default value when max burnin radius is not set.
40d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    public static final int BURN_IN_RADIUS_MAX_DEFAULT = -1;
41d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
42d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private static final long BURNIN_PROTECTION_WAKEUP_INTERVAL_MS = TimeUnit.MINUTES.toMillis(1);
43d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private static final long BURNIN_PROTECTION_MINIMAL_INTERVAL_MS = TimeUnit.SECONDS.toMillis(10);
44d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
45d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private static final String ACTION_BURN_IN_PROTECTION =
46d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            "android.internal.policy.action.BURN_IN_PROTECTION";
47d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
48d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private static final int BURN_IN_SHIFT_STEP = 2;
49d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
50d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private boolean mBurnInProtectionActive;
51d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
52d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private final int mMinHorizontalBurnInOffset;
53d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private final int mMaxHorizontalBurnInOffset;
54d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private final int mMinVerticalBurnInOffset;
55d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private final int mMaxVerticalBurnInOffset;
56d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
57d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private final int mBurnInRadiusMaxSquared;
58d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
59d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private int mLastBurnInXOffset = 0;
60d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    /* 1 means increasing, -1 means decreasing */
61d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private int mXOffsetDirection = 1;
62d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private int mLastBurnInYOffset = 0;
63d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    /* 1 means increasing, -1 means decreasing */
64d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private int mYOffsetDirection = 1;
65d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
66d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private final AlarmManager mAlarmManager;
67d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private final PendingIntent mBurnInProtectionIntent;
68d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private final DisplayManagerInternal mDisplayManagerInternal;
69d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private final Display mDisplay;
70d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
71d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private BroadcastReceiver mBurnInProtectionReceiver = new BroadcastReceiver() {
72d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        @Override
73d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        public void onReceive(Context context, Intent intent) {
74d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            updateBurnInProtection();
75d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        }
76d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    };
77d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
78d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    public BurnInProtectionHelper(Context context) {
79d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        final Resources resources = context.getResources();
80d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        mMinHorizontalBurnInOffset = resources.getInteger(
81d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                com.android.internal.R.integer.config_burnInProtectionMinHorizontalOffset);
82d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        mMaxHorizontalBurnInOffset = resources.getInteger(
83d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                com.android.internal.R.integer.config_burnInProtectionMaxHorizontalOffset);
84d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        mMinVerticalBurnInOffset = resources.getInteger(
85d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                com.android.internal.R.integer.config_burnInProtectionMinVerticalOffset);
86d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        mMaxVerticalBurnInOffset = resources.getInteger(
87d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                com.android.internal.R.integer.config_burnInProtectionMaxVerticalOffset);
88d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        int burnInRadiusMax = resources.getInteger(
89d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                com.android.internal.R.integer.config_burnInProtectionMaxRadius);
90d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        if (burnInRadiusMax != BURN_IN_RADIUS_MAX_DEFAULT) {
91d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            mBurnInRadiusMaxSquared = burnInRadiusMax * burnInRadiusMax;
92d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        } else {
93d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            mBurnInRadiusMaxSquared = BURN_IN_RADIUS_MAX_DEFAULT;
94d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        }
95d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
96d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
97d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
98d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        context.registerReceiver(mBurnInProtectionReceiver,
99d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                new IntentFilter(ACTION_BURN_IN_PROTECTION));
100d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        Intent intent = new Intent(ACTION_BURN_IN_PROTECTION);
101d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        intent.setPackage(context.getPackageName());
102d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        intent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
103d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        mBurnInProtectionIntent = PendingIntent.getBroadcast(context, 0,
104d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                intent, PendingIntent.FLAG_UPDATE_CURRENT);
105d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        DisplayManager displayManager =
106d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
107d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        mDisplay = displayManager.getDisplay(Display.DEFAULT_DISPLAY);
108d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        displayManager.registerDisplayListener(this, null /* handler */);
109d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    }
110d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
111d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    public void startBurnInProtection() {
112d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        if (!mBurnInProtectionActive) {
113d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            mBurnInProtectionActive = true;
114d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            updateBurnInProtection();
115d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        }
116d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    }
117d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
118d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private void updateBurnInProtection() {
119d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        if (mBurnInProtectionActive) {
120d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            adjustOffsets();
121d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            mDisplayManagerInternal.setDisplayOffsets(mDisplay.getDisplayId(),
122d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                    mLastBurnInXOffset, mLastBurnInYOffset);
123d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            // Next adjustment at least ten seconds in the future.
124d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            long next = SystemClock.elapsedRealtime() + BURNIN_PROTECTION_MINIMAL_INTERVAL_MS;
125d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            // And aligned to the minute.
126d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            next = next - next % BURNIN_PROTECTION_WAKEUP_INTERVAL_MS
127d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                    + BURNIN_PROTECTION_WAKEUP_INTERVAL_MS;
128d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, next, mBurnInProtectionIntent);
129d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        } else {
130d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            mAlarmManager.cancel(mBurnInProtectionIntent);
131d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            mDisplayManagerInternal.setDisplayOffsets(mDisplay.getDisplayId(), 0, 0);
132d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        }
133d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    }
134d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
135d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    public void cancelBurnInProtection() {
136d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        if (mBurnInProtectionActive) {
137d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            mBurnInProtectionActive = false;
138d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            updateBurnInProtection();
139d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        }
140d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    }
141d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
142d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    /**
143d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski     * Gently shifts current burn-in offsets, minimizing the change for the user.
144d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski     *
145d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski     * Shifts are applied in following fashion:
146d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski     * 1) shift horizontally from minimum to the maximum;
147d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski     * 2) shift vertically by one from minimum to the maximum;
148d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski     * 3) shift horizontally from maximum to the minimum;
149d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski     * 4) shift vertically by one from minimum to the maximum.
150d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski     * 5) if you reach the maximum vertically, start shifting back by one from maximum to minimum.
151d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski     *
152d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski     * On top of that, stay within specified radius. If the shift distance from the center is
153d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski     * higher than the radius, skip these values and go the next position that is within the radius.
154d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski     */
155d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    private void adjustOffsets() {
156d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        do {
157d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            // By default, let's just shift the X offset.
158d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            final int xChange = mXOffsetDirection * BURN_IN_SHIFT_STEP;
159d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            mLastBurnInXOffset += xChange;
160d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            if (mLastBurnInXOffset > mMaxHorizontalBurnInOffset
161d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                    || mLastBurnInXOffset < mMinHorizontalBurnInOffset) {
162d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                // Whoops, we went too far horizontally. Let's retract..
163d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                mLastBurnInXOffset -= xChange;
164d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                // change horizontal direction..
165d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                mXOffsetDirection *= -1;
166d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                // and let's shift the Y offset.
167d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                final int yChange = mYOffsetDirection * BURN_IN_SHIFT_STEP;
168d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                mLastBurnInYOffset += yChange;
169d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                if (mLastBurnInYOffset > mMaxVerticalBurnInOffset
170d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                        || mLastBurnInYOffset < mMinVerticalBurnInOffset) {
171d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                    // Whoops, we went to far vertically. Let's retract..
172d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                    mLastBurnInYOffset -= yChange;
173d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                    // and change vertical direction.
174d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                    mYOffsetDirection *= -1;
175d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                }
176d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            }
177d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            // If we are outside of the radius, let's try again.
178d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        } while (mBurnInRadiusMaxSquared != BURN_IN_RADIUS_MAX_DEFAULT
179d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                && mLastBurnInXOffset * mLastBurnInXOffset + mLastBurnInYOffset * mLastBurnInYOffset
180d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                        > mBurnInRadiusMaxSquared);
181d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    }
182d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
183d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    public void dump(String prefix, PrintWriter pw) {
184d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        pw.println(prefix + TAG);
185d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        prefix += "  ";
186d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        pw.println(prefix + "mBurnInProtectionActive=" + mBurnInProtectionActive);
187d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        pw.println(prefix + "mHorizontalBurnInOffsetsBounds=(" + mMinHorizontalBurnInOffset + ", "
188d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                + mMaxHorizontalBurnInOffset + ")");
189d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        pw.println(prefix + "mVerticalBurnInOffsetsBounds=(" + mMinVerticalBurnInOffset + ", "
190d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                + mMaxVerticalBurnInOffset + ")");
191d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        pw.println(prefix + "mBurnInRadiusMaxSquared=" + mBurnInRadiusMaxSquared);
192d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        pw.println(prefix + "mLastBurnInOffset=(" + mLastBurnInXOffset + ", "
193d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                + mLastBurnInYOffset + ")");
194d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        pw.println(prefix + "mOfsetChangeDirections=(" + mXOffsetDirection + ", "
195d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                + mYOffsetDirection + ")");
196d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    }
197d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
198d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    @Override
199d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    public void onDisplayAdded(int i) {
200d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    }
201d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
202d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    @Override
203d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    public void onDisplayRemoved(int i) {
204d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    }
205d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski
206d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    @Override
207d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    public void onDisplayChanged(int displayId) {
208d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        if (displayId == mDisplay.getDisplayId()) {
209d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            if (mDisplay.getState() == Display.STATE_DOZE
210d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                    || mDisplay.getState() == Display.STATE_DOZE_SUSPEND) {
211d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                startBurnInProtection();
212d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            } else {
213d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski                cancelBurnInProtection();
214d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski            }
215d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski        }
216d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski    }
217d2e8640c2c1972d4f2e92d48660fa9e17d9291c4Filip Gruszczynski}
218