Merge "Use DisplayListener instead of WindowRotationListener in AudioService."

This commit is contained in:
TreeHugger Robot
2017-06-27 16:37:41 +00:00
committed by Android (Google) Code Review

View File

@@ -17,15 +17,13 @@
package com.android.server.audio;
import android.content.Context;
import android.hardware.display.DisplayManager;
import android.media.AudioSystem;
import android.os.Handler;
import android.util.Log;
import android.view.OrientationEventListener;
import android.view.Surface;
import android.view.WindowManager;
import com.android.server.policy.WindowOrientationListener;
/**
* Class to handle device rotation events for AudioService, and forward device rotation
* to the audio HALs through AudioSystem.
@@ -42,18 +40,17 @@ class RotationHelper {
private static final String TAG = "AudioService.RotationHelper";
private static AudioOrientationListener sOrientationListener;
private static AudioWindowOrientationListener sWindowOrientationListener;
private static AudioDisplayListener sDisplayListener;
private static final Object sRotationLock = new Object();
private static int sDeviceRotation = Surface.ROTATION_0; // R/W synchronized on sRotationLock
private static Context sContext;
private static Handler sHandler;
/**
* post conditions:
* - (sWindowOrientationListener != null) xor (sOrientationListener != null)
* - sWindowOrientationListener xor sOrientationListener is enabled
* - sDisplayListener != null
* - sContext != null
*/
static void init(Context context, Handler handler) {
@@ -61,34 +58,20 @@ class RotationHelper {
throw new IllegalArgumentException("Invalid null context");
}
sContext = context;
sWindowOrientationListener = new AudioWindowOrientationListener(context, handler);
sWindowOrientationListener.enable();
if (!sWindowOrientationListener.canDetectOrientation()) {
// cannot use com.android.server.policy.WindowOrientationListener, revert to public
// orientation API
Log.i(TAG, "Not using WindowOrientationListener, reverting to OrientationListener");
sWindowOrientationListener.disable();
sWindowOrientationListener = null;
sOrientationListener = new AudioOrientationListener(context);
sOrientationListener.enable();
}
sHandler = handler;
sDisplayListener = new AudioDisplayListener();
enable();
}
static void enable() {
if (sWindowOrientationListener != null) {
sWindowOrientationListener.enable();
} else {
sOrientationListener.enable();
}
((DisplayManager) sContext.getSystemService(Context.DISPLAY_SERVICE))
.registerDisplayListener(sDisplayListener, sHandler);
updateOrientation();
}
static void disable() {
if (sWindowOrientationListener != null) {
sWindowOrientationListener.disable();
} else {
sOrientationListener.disable();
}
((DisplayManager) sContext.getSystemService(Context.DISPLAY_SERVICE))
.unregisterDisplayListener(sDisplayListener);
}
/**
@@ -128,84 +111,21 @@ class RotationHelper {
}
/**
* Uses android.view.OrientationEventListener
* Uses android.hardware.display.DisplayManager.DisplayListener
*/
final static class AudioOrientationListener extends OrientationEventListener {
AudioOrientationListener(Context context) {
super(context);
final static class AudioDisplayListener implements DisplayManager.DisplayListener {
@Override
public void onDisplayAdded(int displayId) {
}
@Override
public void onOrientationChanged(int orientation) {
public void onDisplayRemoved(int displayId) {
}
@Override
public void onDisplayChanged(int displayId) {
updateOrientation();
}
}
/**
* Uses com.android.server.policy.WindowOrientationListener
*/
final static class AudioWindowOrientationListener extends WindowOrientationListener {
private static RotationCheckThread sRotationCheckThread;
AudioWindowOrientationListener(Context context, Handler handler) {
super(context, handler);
}
public void onProposedRotationChanged(int rotation) {
updateOrientation();
if (sRotationCheckThread != null) {
sRotationCheckThread.endCheck();
}
sRotationCheckThread = new RotationCheckThread();
sRotationCheckThread.beginCheck();
}
}
/**
* When com.android.server.policy.WindowOrientationListener report an orientation change,
* the UI may not have rotated yet. This thread polls with gradually increasing delays
* the new orientation.
*/
final static class RotationCheckThread extends Thread {
// how long to wait between each rotation check
private final int[] WAIT_TIMES_MS = { 10, 20, 50, 100, 100, 200, 200, 500 };
private int mWaitCounter;
private final Object mCounterLock = new Object();
RotationCheckThread() {
super("RotationCheck");
}
void beginCheck() {
synchronized(mCounterLock) {
mWaitCounter = 0;
}
try {
start();
} catch (IllegalStateException e) { }
}
void endCheck() {
synchronized(mCounterLock) {
mWaitCounter = WAIT_TIMES_MS.length;
}
}
public void run() {
while (mWaitCounter < WAIT_TIMES_MS.length) {
int waitTimeMs;
synchronized(mCounterLock) {
waitTimeMs = mWaitCounter < WAIT_TIMES_MS.length ?
WAIT_TIMES_MS[mWaitCounter] : 0;
mWaitCounter++;
}
try {
if (waitTimeMs > 0) {
sleep(waitTimeMs);
updateOrientation();
}
} catch (InterruptedException e) { }
}
}
}
}