Adds one more feild into RotationResolutionRequest.

Adds a boolean to indicate whether the camera should be used to resolve
rotation.

Also used codegen to auto generated the RotationResolutionRequest class.

Bug: 178128148
Bug: 181151868
Test: atest RotationResolverManagerPerUserServiceTest, tested the
feature locally.
CTS-Coverage-Bug: 178219876

Change-Id: I892d7c7de37fec700cfd3e1f5dfaed29eaf70ac4
This commit is contained in:
Yi Jiang
2021-02-25 17:58:16 -08:00
parent 11891c768c
commit 0f73fd4907
7 changed files with 218 additions and 78 deletions

View File

@@ -9931,11 +9931,13 @@ package android.service.resumeonreboot {
package android.service.rotationresolver {
public final class RotationResolutionRequest implements android.os.Parcelable {
ctor public RotationResolutionRequest(@NonNull String, int, int, boolean, long);
method public int describeContents();
method public int getCurrentRotation();
method @NonNull public String getPackageName();
method public int getProposedRotation();
method public long getTimeoutMillis();
method public boolean shouldUseCamera();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.service.rotationresolver.RotationResolutionRequest> CREATOR;
}

View File

@@ -16,12 +16,15 @@
package android.service.rotationresolver;
import android.annotation.DurationMillisLong;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.view.Surface;
import com.android.internal.util.DataClass;
/**
* This class represents a request to an {@link RotationResolverService}. The request contains
* information from the system that can help RotationResolverService to determine the appropriate
@@ -33,68 +36,209 @@ import android.view.Surface;
* @hide
*/
@SystemApi
@DataClass (
genParcelable = true,
genToString = true
)
public final class RotationResolutionRequest implements Parcelable {
private final @NonNull String mPackageName;
private final int mProposedRotation;
private final int mCurrentRotation;
private final long mTimeoutMillis;
/** The Name of the package of the current fore-ground activity. */
@NonNull private final String mPackageName;
/** The current rotation of the screen. */
@Surface.Rotation private final int mCurrentRotation;
/** The proposed screen rotation in the system. */
@Surface.Rotation private final int mProposedRotation;
/** Whether should use camera signal to resolver rotation. */
private final boolean mShouldUseCamera;
/** The timeout of the request. */
@DurationMillisLong private final long mTimeoutMillis;
// Code below generated by codegen v1.0.22.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
//
// To regenerate run:
// $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/service/rotationresolver/RotationResolutionRequest.java
//
// To exclude the generated code from IntelliJ auto-formatting enable (one-time):
// Settings > Editor > Code Style > Formatter Control
//@formatter:off
/**
* @param proposedRotation The system proposed screen rotation.
* @param currentRotation The current screen rotation of the phone.
* @param packageName The current package name of the activity that is running in
* foreground.
* @param timeoutMillis The timeout in millisecond for the rotation request.
* @hide
* Creates a new RotationResolutionRequest.
*
* @param packageName
* The Name of the package of the current fore-ground activity.
* @param currentRotation
* The current rotation of the screen.
* @param proposedRotation
* The proposed screen rotation in the system.
* @param shouldUseCamera
* Whether should use camera signal to resolver rotation.
* @param timeoutMillis
* The timeout of the request.
*/
public RotationResolutionRequest(int proposedRotation, int currentRotation,
@NonNull String packageName, long timeoutMillis) {
mProposedRotation = proposedRotation;
mCurrentRotation = currentRotation;
mPackageName = packageName;
mTimeoutMillis = timeoutMillis;
}
@Surface.Rotation public int getProposedRotation() {
return mProposedRotation;
}
public int getCurrentRotation() {
return mCurrentRotation;
@DataClass.Generated.Member
public RotationResolutionRequest(
@NonNull String packageName,
@Surface.Rotation int currentRotation,
@Surface.Rotation int proposedRotation,
boolean shouldUseCamera,
@DurationMillisLong long timeoutMillis) {
this.mPackageName = packageName;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mPackageName);
this.mCurrentRotation = currentRotation;
com.android.internal.util.AnnotationValidations.validate(
Surface.Rotation.class, null, mCurrentRotation);
this.mProposedRotation = proposedRotation;
com.android.internal.util.AnnotationValidations.validate(
Surface.Rotation.class, null, mProposedRotation);
this.mShouldUseCamera = shouldUseCamera;
this.mTimeoutMillis = timeoutMillis;
com.android.internal.util.AnnotationValidations.validate(
DurationMillisLong.class, null, mTimeoutMillis);
// onConstructed(); // You can define this method to get a callback
}
/**
* The Name of the package of the current fore-ground activity.
*/
@DataClass.Generated.Member
public @NonNull String getPackageName() {
return mPackageName;
}
public long getTimeoutMillis() {
/**
* The current rotation of the screen.
*/
@DataClass.Generated.Member
public @Surface.Rotation int getCurrentRotation() {
return mCurrentRotation;
}
/**
* The proposed screen rotation in the system.
*/
@DataClass.Generated.Member
public @Surface.Rotation int getProposedRotation() {
return mProposedRotation;
}
/**
* Whether should use camera signal to resolver rotation.
*/
@DataClass.Generated.Member
public boolean shouldUseCamera() {
return mShouldUseCamera;
}
/**
* The timeout of the request.
*/
@DataClass.Generated.Member
public @DurationMillisLong long getTimeoutMillis() {
return mTimeoutMillis;
}
@Override
public int describeContents() {
return 0;
@DataClass.Generated.Member
public String toString() {
// You can override field toString logic by defining methods like:
// String fieldNameToString() { ... }
return "RotationResolutionRequest { " +
"packageName = " + mPackageName + ", " +
"currentRotation = " + mCurrentRotation + ", " +
"proposedRotation = " + mProposedRotation + ", " +
"shouldUseCamera = " + mShouldUseCamera + ", " +
"timeoutMillis = " + mTimeoutMillis +
" }";
}
@Override
public void writeToParcel(@NonNull Parcel parcel, int flags) {
parcel.writeInt(mProposedRotation);
parcel.writeInt(mCurrentRotation);
parcel.writeString(mPackageName);
parcel.writeLong(mTimeoutMillis);
@DataClass.Generated.Member
public void writeToParcel(@NonNull Parcel dest, int flags) {
// You can override field parcelling by defining methods like:
// void parcelFieldName(Parcel dest, int flags) { ... }
byte flg = 0;
if (mShouldUseCamera) flg |= 0x8;
dest.writeByte(flg);
dest.writeString(mPackageName);
dest.writeInt(mCurrentRotation);
dest.writeInt(mProposedRotation);
dest.writeLong(mTimeoutMillis);
}
public static final @NonNull Creator<RotationResolutionRequest> CREATOR =
new Creator<RotationResolutionRequest>() {
@Override
public RotationResolutionRequest createFromParcel(Parcel source) {
return new RotationResolutionRequest(source.readInt(), source.readInt(),
source.readString(), source.readLong());
}
@Override
@DataClass.Generated.Member
public int describeContents() { return 0; }
/** @hide */
@SuppressWarnings({"unchecked", "RedundantCast"})
@DataClass.Generated.Member
/* package-private */ RotationResolutionRequest(@NonNull Parcel in) {
// You can override field unparcelling by defining methods like:
// static FieldType unparcelFieldName(Parcel in) { ... }
byte flg = in.readByte();
boolean shouldUseCamera = (flg & 0x8) != 0;
String packageName = in.readString();
int currentRotation = in.readInt();
int proposedRotation = in.readInt();
long timeoutMillis = in.readLong();
this.mPackageName = packageName;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mPackageName);
this.mCurrentRotation = currentRotation;
com.android.internal.util.AnnotationValidations.validate(
Surface.Rotation.class, null, mCurrentRotation);
this.mProposedRotation = proposedRotation;
com.android.internal.util.AnnotationValidations.validate(
Surface.Rotation.class, null, mProposedRotation);
this.mShouldUseCamera = shouldUseCamera;
this.mTimeoutMillis = timeoutMillis;
com.android.internal.util.AnnotationValidations.validate(
DurationMillisLong.class, null, mTimeoutMillis);
// onConstructed(); // You can define this method to get a callback
}
@DataClass.Generated.Member
public static final @NonNull Parcelable.Creator<RotationResolutionRequest> CREATOR
= new Parcelable.Creator<RotationResolutionRequest>() {
@Override
public RotationResolutionRequest[] newArray(int size) {
return new RotationResolutionRequest[size];
}
@Override
public RotationResolutionRequest createFromParcel(@NonNull Parcel in) {
return new RotationResolutionRequest(in);
}
};
@DataClass.Generated(
time = 1615402421314L,
codegenVersion = "1.0.22",
sourceFile = "frameworks/base/core/java/android/service/rotationresolver/RotationResolutionRequest.java",
inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.view.Surface.Rotation int mCurrentRotation\nprivate final @android.view.Surface.Rotation int mProposedRotation\nprivate final boolean mShouldUseCamera\nprivate final @android.annotation.DurationMillisLong long mTimeoutMillis\nclass RotationResolutionRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genParcelable=true, genToString=true)")
@Deprecated
private void __metadata() {}
//@formatter:on
// End of generated code
}

View File

@@ -77,9 +77,7 @@ class RemoteRotationResolverService extends ServiceConnector.Impl<IRotationResol
@GuardedBy("mLock")
public void resolveRotationLocked(RotationRequest request) {
final RotationResolutionRequest remoteRequest = new RotationResolutionRequest(
request.mProposedRotation, request.mCurrentRotation, request.mPackageName,
request.mTimeoutMillis);
final RotationResolutionRequest remoteRequest = request.mRemoteRequest;
post(service -> service.resolveRotation(request.mIRotationResolverCallback, remoteRequest));
// schedule a timeout.
@@ -91,7 +89,7 @@ class RemoteRotationResolverService extends ServiceConnector.Impl<IRotationResol
request.cancelInternal();
}
}
}, request.mTimeoutMillis);
}, request.mRemoteRequest.getTimeoutMillis());
}
@VisibleForTesting
@@ -109,28 +107,18 @@ class RemoteRotationResolverService extends ServiceConnector.Impl<IRotationResol
@GuardedBy("mLock")
boolean mIsFulfilled;
private final long mTimeoutMillis;
@VisibleForTesting
final int mProposedRotation;
private final int mCurrentRotation;
private final String mPackageName;
final RotationResolutionRequest mRemoteRequest;
boolean mIsDispatched;
private final Object mLock = new Object();
private final long mRequestStartTimeMillis;
RotationRequest(
@NonNull RotationResolverInternal.RotationResolverCallbackInternal
callbackInternal, int proposedRotation, int currentRotation,
String packageName, long timeoutMillis,
@NonNull CancellationSignal cancellationSignal) {
mTimeoutMillis = timeoutMillis;
@NonNull RotationResolverInternal.RotationResolverCallbackInternal callbackInternal,
RotationResolutionRequest request, @NonNull CancellationSignal cancellationSignal) {
mCallbackInternal = callbackInternal;
mProposedRotation = proposedRotation;
mCurrentRotation = currentRotation;
mPackageName = packageName;
mRemoteRequest = request;
mIRotationResolverCallback = new RotationResolverCallback(this);
mCancellationSignalInternal = cancellationSignal;
mRequestStartTimeMillis = SystemClock.elapsedRealtime();
@@ -185,8 +173,8 @@ class RemoteRotationResolverService extends ServiceConnector.Impl<IRotationResol
request.mCallbackInternal.onSuccess(rotation);
final long timeToCalculate =
SystemClock.elapsedRealtime() - request.mRequestStartTimeMillis;
logRotationStats(request.mProposedRotation, request.mCurrentRotation, rotation,
timeToCalculate);
logRotationStats(request.mRemoteRequest.getProposedRotation(),
request.mRemoteRequest.getCurrentRotation(), rotation, timeToCalculate);
Slog.d(TAG, "onSuccess:" + rotation);
Slog.d(TAG, "timeToCalculate:" + timeToCalculate);
}
@@ -204,8 +192,9 @@ class RemoteRotationResolverService extends ServiceConnector.Impl<IRotationResol
request.mCallbackInternal.onFailure(error);
final long timeToCalculate =
SystemClock.elapsedRealtime() - request.mRequestStartTimeMillis;
logRotationStats(request.mProposedRotation, request.mCurrentRotation,
RESOLUTION_FAILURE, timeToCalculate);
logRotationStats(request.mRemoteRequest.getProposedRotation(),
request.mRemoteRequest.getCurrentRotation(), RESOLUTION_FAILURE,
timeToCalculate);
Slog.d(TAG, "onFailure:" + error);
Slog.d(TAG, "timeToCalculate:" + timeToCalculate);
}

View File

@@ -34,11 +34,11 @@ import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.CancellationSignal;
import android.rotationresolver.RotationResolverInternal;
import android.service.rotationresolver.RotationResolutionRequest;
import android.service.rotationresolver.RotationResolverService;
import android.text.TextUtils;
import android.util.IndentingPrintWriter;
import android.util.Slog;
import android.view.Surface;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
@@ -95,14 +95,14 @@ final class RotationResolverManagerPerUserService extends
@VisibleForTesting
void resolveRotationLocked(
@NonNull RotationResolverInternal.RotationResolverCallbackInternal callbackInternal,
@Surface.Rotation int proposedRotation, @Surface.Rotation int currentRotation,
String packageName, long timeoutMillis,
@NonNull RotationResolutionRequest request,
@NonNull CancellationSignal cancellationSignalInternal) {
if (!isServiceAvailableLocked()) {
Slog.w(TAG, "Service is not available at this moment.");
callbackInternal.onFailure(ROTATION_RESULT_FAILURE_CANCELLED);
logRotationStats(proposedRotation, currentRotation, RESOLUTION_UNAVAILABLE);
logRotationStats(request.getProposedRotation(), request.getCurrentRotation(),
RESOLUTION_UNAVAILABLE);
return;
}
@@ -114,8 +114,7 @@ final class RotationResolverManagerPerUserService extends
}
mCurrentRequest = new RemoteRotationResolverService.RotationRequest(callbackInternal,
proposedRotation, currentRotation, packageName, timeoutMillis,
cancellationSignalInternal);
request, cancellationSignalInternal);
cancellationSignalInternal.setOnCancelListener(() -> {
synchronized (mLock) {

View File

@@ -35,6 +35,7 @@ import android.os.ShellCallback;
import android.os.UserHandle;
import android.provider.DeviceConfig;
import android.rotationresolver.RotationResolverInternal;
import android.service.rotationresolver.RotationResolutionRequest;
import android.text.TextUtils;
import android.util.IndentingPrintWriter;
import android.util.Slog;
@@ -158,8 +159,9 @@ public class RotationResolverManagerService extends
if (mIsServiceEnabled) {
final RotationResolverManagerPerUserService service = getServiceForUserLocked(
UserHandle.getCallingUserId());
service.resolveRotationLocked(callbackInternal, proposedRotation,
currentRotation, /* packageName */ "", timeout,
final RotationResolutionRequest request = new RotationResolutionRequest("",
currentRotation, proposedRotation, true, timeout);
service.resolveRotationLocked(callbackInternal, request,
cancellationSignalInternal);
} else {
Slog.w(TAG, "Rotation Resolver service is disabled.");

View File

@@ -22,6 +22,7 @@ import android.content.ComponentName;
import android.os.CancellationSignal;
import android.os.ShellCommand;
import android.rotationresolver.RotationResolverInternal.RotationResolverCallbackInternal;
import android.service.rotationresolver.RotationResolutionRequest;
import android.text.TextUtils;
import android.view.Surface;
@@ -107,8 +108,10 @@ final class RotationResolverShellCommand extends ShellCommand {
}
private int runResolveRotation() {
mService.resolveRotationLocked(sTestableRotationCallbackInternal, Surface.ROTATION_0,
Surface.ROTATION_0, "", 2000L, new CancellationSignal());
final RotationResolutionRequest request = new RotationResolutionRequest("",
Surface.ROTATION_0, Surface.ROTATION_0, true, 2000L);
mService.resolveRotationLocked(sTestableRotationCallbackInternal, request,
new CancellationSignal());
return 0;
}

View File

@@ -31,6 +31,7 @@ import android.content.pm.ServiceInfo;
import android.os.CancellationSignal;
import android.os.RemoteException;
import android.rotationresolver.RotationResolverInternal;
import android.service.rotationresolver.RotationResolutionRequest;
import android.view.Surface;
import androidx.test.core.app.ApplicationProvider;
@@ -58,6 +59,7 @@ public class RotationResolverManagerPerUserServiceTest {
private Context mContext;
private CancellationSignal mCancellationSignal;
private RotationResolverManagerPerUserService mService;
private RotationResolutionRequest mRequest;
@Before
public void setUp() throws RemoteException {
@@ -79,9 +81,10 @@ public class RotationResolverManagerPerUserServiceTest {
mCancellationSignal = new CancellationSignal();
mRequest = new RotationResolutionRequest("", Surface.ROTATION_0, Surface.ROTATION_0,
true, 1000L);
this.mService.mCurrentRequest = new RemoteRotationResolverService.RotationRequest(
mMockCallbackInternal, Surface.ROTATION_0, Surface.ROTATION_0, "", 1000L,
mCancellationSignal);
mMockCallbackInternal, mRequest, mCancellationSignal);
this.mService.getMaster().mIsServiceEnabled = true;
@@ -99,8 +102,7 @@ public class RotationResolverManagerPerUserServiceTest {
RotationResolverInternal.RotationResolverCallbackInternal callbackInternal =
Mockito.mock(RotationResolverInternal.RotationResolverCallbackInternal.class);
mService.resolveRotationLocked(callbackInternal, Surface.ROTATION_0, Surface.ROTATION_0,
"", 1000L, mCancellationSignal);
mService.resolveRotationLocked(callbackInternal, mRequest, mCancellationSignal);
verify(callbackInternal).onSuccess(anyInt());
}
@@ -110,8 +112,7 @@ public class RotationResolverManagerPerUserServiceTest {
Mockito.mock(RotationResolverInternal.RotationResolverCallbackInternal.class);
final CancellationSignal cancellationSignal = new CancellationSignal();
mService.resolveRotationLocked(callbackInternal, Surface.ROTATION_0, Surface.ROTATION_0,
"", 1000L, cancellationSignal);
mService.resolveRotationLocked(callbackInternal, mRequest, cancellationSignal);
cancellationSignal.cancel();
}
@@ -132,7 +133,7 @@ public class RotationResolverManagerPerUserServiceTest {
@Override
public void resolveRotationLocked(RotationRequest request) {
request.mCallbackInternal.onSuccess(request.mProposedRotation);
request.mCallbackInternal.onSuccess(request.mRemoteRequest.getProposedRotation());
}
}
}