diff --git a/services/core/java/com/android/server/audio/RotationHelper.java b/services/core/java/com/android/server/audio/RotationHelper.java index 359cc360bbc78..ad20ed895805e 100644 --- a/services/core/java/com/android/server/audio/RotationHelper.java +++ b/services/core/java/com/android/server/audio/RotationHelper.java @@ -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) { } - } - } - } } \ No newline at end of file