resolved conflicts for merge of 57bb5f5c to master
Change-Id: Id5dfe7fc919305658312771a031c0764cef5515c
This commit is contained in:
@@ -204,6 +204,20 @@ public final class PowerManager {
|
||||
*/
|
||||
public static final int DOZE_WAKE_LOCK = 0x00000040;
|
||||
|
||||
/**
|
||||
* Wake lock level: Keep the device awake enough to allow drawing to occur.
|
||||
* <p>
|
||||
* This is used by the window manager to allow applications to draw while the
|
||||
* system is dozing. It currently has no effect unless the power manager is in
|
||||
* the dozing state.
|
||||
* </p><p>
|
||||
* Requires the {@link android.Manifest.permission#DEVICE_POWER} permission.
|
||||
* </p>
|
||||
*
|
||||
* {@hide}
|
||||
*/
|
||||
public static final int DRAW_WAKE_LOCK = 0x00000080;
|
||||
|
||||
/**
|
||||
* Mask for the wake lock level component of a combined wake lock level and flags integer.
|
||||
*
|
||||
@@ -489,6 +503,7 @@ public final class PowerManager {
|
||||
case FULL_WAKE_LOCK:
|
||||
case PROXIMITY_SCREEN_OFF_WAKE_LOCK:
|
||||
case DOZE_WAKE_LOCK:
|
||||
case DRAW_WAKE_LOCK:
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Must specify a valid wake lock level.");
|
||||
|
||||
@@ -194,4 +194,19 @@ interface IWindowSession {
|
||||
void onRectangleOnScreenRequested(IBinder token, in Rect rectangle);
|
||||
|
||||
IWindowId getWindowId(IBinder window);
|
||||
|
||||
/**
|
||||
* When the system is dozing in a low-power partially suspended state, pokes a short
|
||||
* lived wake lock and ensures that the display is ready to accept the next frame
|
||||
* of content drawn in the window.
|
||||
*
|
||||
* This mechanism is bound to the window rather than to the display manager or the
|
||||
* power manager so that the system can ensure that the window is actually visible
|
||||
* and prevent runaway applications from draining the battery. This is similar to how
|
||||
* FLAG_KEEP_SCREEN_ON works.
|
||||
*
|
||||
* This method is synchronous because it may need to acquire a wake lock before returning.
|
||||
* The assumption is that this method will be called rather infrequently.
|
||||
*/
|
||||
void pokeDrawLock(IBinder window);
|
||||
}
|
||||
|
||||
@@ -47,6 +47,7 @@ import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
import android.os.PowerManager;
|
||||
import android.os.Process;
|
||||
import android.os.RemoteException;
|
||||
import android.os.SystemClock;
|
||||
@@ -838,6 +839,7 @@ public final class ViewRootImpl implements ViewParent,
|
||||
final int newDisplayState = mDisplay.getState();
|
||||
if (oldDisplayState != newDisplayState) {
|
||||
mAttachInfo.mDisplayState = newDisplayState;
|
||||
pokeDrawLockIfNeeded();
|
||||
if (oldDisplayState != Display.STATE_UNKNOWN) {
|
||||
final int oldScreenState = toViewScreenState(oldDisplayState);
|
||||
final int newScreenState = toViewScreenState(newDisplayState);
|
||||
@@ -868,6 +870,19 @@ public final class ViewRootImpl implements ViewParent,
|
||||
}
|
||||
};
|
||||
|
||||
void pokeDrawLockIfNeeded() {
|
||||
final int displayState = mAttachInfo.mDisplayState;
|
||||
if (mView != null && mAdded && mTraversalScheduled
|
||||
&& (displayState == Display.STATE_DOZE
|
||||
|| displayState == Display.STATE_DOZE_SUSPEND)) {
|
||||
try {
|
||||
mWindowSession.pokeDrawLock(mWindow);
|
||||
} catch (RemoteException ex) {
|
||||
// System server died, oh well.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void requestFitSystemWindows() {
|
||||
checkThread();
|
||||
@@ -1042,6 +1057,7 @@ public final class ViewRootImpl implements ViewParent,
|
||||
scheduleConsumeBatchedInput();
|
||||
}
|
||||
notifyRendererOfFramePending();
|
||||
pokeDrawLockIfNeeded();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user