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