diff --git a/core/java/android/rotationresolver/RotationResolverInternal.java b/core/java/android/rotationresolver/RotationResolverInternal.java index 1f1a66c17d97f..57910cb092fb8 100644 --- a/core/java/android/rotationresolver/RotationResolverInternal.java +++ b/core/java/android/rotationresolver/RotationResolverInternal.java @@ -44,6 +44,7 @@ public abstract class RotationResolverInternal { * * @param callback the callback that will be called when the result is computed or an * error is captured. {@link RotationResolverCallbackInternal} + * @param packageName the package name of the fore ground activity. * @param proposedRotation the screen rotation that is proposed by the system. * @param currentRotation the current screen rotation. * @param timeoutMillis the timeout in millisecond for the query. If the query doesn't get @@ -53,8 +54,10 @@ public abstract class RotationResolverInternal { * @param cancellationSignal a cancellation signal that notifies the rotation resolver manger */ public abstract void resolveRotation(@NonNull RotationResolverCallbackInternal callback, - @Surface.Rotation int proposedRotation, @Surface.Rotation int currentRotation, - @DurationMillisLong long timeoutMillis, @NonNull CancellationSignal cancellationSignal); + String packageName, @Surface.Rotation int proposedRotation, + @Surface.Rotation int currentRotation, @DurationMillisLong long timeoutMillis, + @NonNull CancellationSignal cancellationSignal); + /** * Internal interfaces for the rotation resolver callback. diff --git a/services/core/java/com/android/server/rotationresolver/RotationResolverManagerService.java b/services/core/java/com/android/server/rotationresolver/RotationResolverManagerService.java index c029bf53809a4..a749d18e7d682 100644 --- a/services/core/java/com/android/server/rotationresolver/RotationResolverManagerService.java +++ b/services/core/java/com/android/server/rotationresolver/RotationResolverManagerService.java @@ -153,8 +153,8 @@ public class RotationResolverManagerService extends @Override public void resolveRotation( - @NonNull RotationResolverCallbackInternal callbackInternal, int proposedRotation, - int currentRotation, long timeout, + @NonNull RotationResolverCallbackInternal callbackInternal, String packageName, + int proposedRotation, int currentRotation, long timeout, @NonNull CancellationSignal cancellationSignalInternal) { Objects.requireNonNull(callbackInternal); Objects.requireNonNull(cancellationSignalInternal); @@ -165,8 +165,16 @@ public class RotationResolverManagerService extends final RotationResolverManagerPerUserService service = getServiceForUserLocked( UserHandle.getCallingUserId()); - final RotationResolutionRequest request = new RotationResolutionRequest("", - currentRotation, proposedRotation, true, timeout); + final RotationResolutionRequest request; + if (packageName == null) { + request = new RotationResolutionRequest(/* packageName */ "", + currentRotation, proposedRotation, /* shouldUseCamera */ true, + timeout); + } else { + request = new RotationResolutionRequest(packageName, currentRotation, + proposedRotation, /* shouldUseCamera */ true, timeout); + } + service.resolveRotationLocked(callbackInternal, request, cancellationSignalInternal); } else { diff --git a/services/core/java/com/android/server/wm/WindowOrientationListener.java b/services/core/java/com/android/server/wm/WindowOrientationListener.java index b971caba65afe..be6847aba12aa 100644 --- a/services/core/java/com/android/server/wm/WindowOrientationListener.java +++ b/services/core/java/com/android/server/wm/WindowOrientationListener.java @@ -1079,10 +1079,13 @@ public abstract class WindowOrientationListener { private int mDesiredRotation = -1; private boolean mRotationEvaluationScheduled; private long mRotationResolverTimeoutMillis; - + private final ActivityTaskManagerInternal mActivityTaskManagerInternal; OrientationSensorJudge() { super(); setupRotationResolverParameters(); + + mActivityTaskManagerInternal = + LocalServices.getService(ActivityTaskManagerInternal.class); } private void setupRotationResolverParameters() { @@ -1149,6 +1152,18 @@ public abstract class WindowOrientationListener { } final CancellationSignal cancellationSignal = new CancellationSignal(); + + String packageName = null; + if (mActivityTaskManagerInternal != null) { + final WindowProcessController controller = + mActivityTaskManagerInternal.getTopApp(); + if (controller != null + && controller.mInfo != null + && controller.mInfo.packageName != null) { + packageName = controller.mInfo.packageName; + } + } + mRotationResolverService.resolveRotation( new RotationResolverInternal.RotationResolverCallbackInternal() { @Override @@ -1161,6 +1176,7 @@ public abstract class WindowOrientationListener { finalizeRotation(reportedRotation); } }, + packageName, reportedRotation, mCurrentRotation, mRotationResolverTimeoutMillis, diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowOrientationListenerTest.java b/services/tests/servicestests/src/com/android/server/wm/WindowOrientationListenerTest.java index 584bcf4617175..8c92a4732b177 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WindowOrientationListenerTest.java +++ b/services/tests/servicestests/src/com/android/server/wm/WindowOrientationListenerTest.java @@ -106,8 +106,8 @@ public class WindowOrientationListenerTest { @Override public void resolveRotation(@NonNull RotationResolverCallbackInternal callback, - @Surface.Rotation int proposedRotation, @Surface.Rotation int currentRotation, - @DurationMillisLong long timeoutMillis, + String packageName, @Surface.Rotation int proposedRotation, + @Surface.Rotation int currentRotation, @DurationMillisLong long timeoutMillis, @NonNull CancellationSignal cancellationSignal) { callback.onSuccess(mResult); }