Merge "Adds one more feild into RotationResolutionRequest." into sc-dev

This commit is contained in:
Yi Jiang
2021-03-11 20:55:58 +00:00
committed by Android (Google) Code Review
7 changed files with 218 additions and 78 deletions

View File

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

View File

@@ -16,12 +16,15 @@
package android.service.rotationresolver; package android.service.rotationresolver;
import android.annotation.DurationMillisLong;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.SystemApi; import android.annotation.SystemApi;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import android.view.Surface; import android.view.Surface;
import com.android.internal.util.DataClass;
/** /**
* This class represents a request to an {@link RotationResolverService}. The request contains * This class represents a request to an {@link RotationResolverService}. The request contains
* information from the system that can help RotationResolverService to determine the appropriate * information from the system that can help RotationResolverService to determine the appropriate
@@ -33,68 +36,209 @@ import android.view.Surface;
* @hide * @hide
*/ */
@SystemApi @SystemApi
@DataClass (
genParcelable = true,
genToString = true
)
public final class RotationResolutionRequest implements Parcelable { public final class RotationResolutionRequest implements Parcelable {
private final @NonNull String mPackageName; /** The Name of the package of the current fore-ground activity. */
private final int mProposedRotation; @NonNull private final String mPackageName;
private final int mCurrentRotation;
private final long mTimeoutMillis; /** 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. * Creates a new RotationResolutionRequest.
* @param currentRotation The current screen rotation of the phone. *
* @param packageName The current package name of the activity that is running in * @param packageName
* foreground. * The Name of the package of the current fore-ground activity.
* @param timeoutMillis The timeout in millisecond for the rotation request. * @param currentRotation
* @hide * 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, @DataClass.Generated.Member
@NonNull String packageName, long timeoutMillis) { public RotationResolutionRequest(
mProposedRotation = proposedRotation; @NonNull String packageName,
mCurrentRotation = currentRotation; @Surface.Rotation int currentRotation,
mPackageName = packageName; @Surface.Rotation int proposedRotation,
mTimeoutMillis = timeoutMillis; boolean shouldUseCamera,
} @DurationMillisLong long timeoutMillis) {
this.mPackageName = packageName;
@Surface.Rotation public int getProposedRotation() { com.android.internal.util.AnnotationValidations.validate(
return mProposedRotation; NonNull.class, null, mPackageName);
} this.mCurrentRotation = currentRotation;
com.android.internal.util.AnnotationValidations.validate(
public int getCurrentRotation() { Surface.Rotation.class, null, mCurrentRotation);
return 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() { public @NonNull String getPackageName() {
return mPackageName; 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; return mTimeoutMillis;
} }
@Override @Override
public int describeContents() { @DataClass.Generated.Member
return 0; 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 @Override
public void writeToParcel(@NonNull Parcel parcel, int flags) { @DataClass.Generated.Member
parcel.writeInt(mProposedRotation); public void writeToParcel(@NonNull Parcel dest, int flags) {
parcel.writeInt(mCurrentRotation); // You can override field parcelling by defining methods like:
parcel.writeString(mPackageName); // void parcelFieldName(Parcel dest, int flags) { ... }
parcel.writeLong(mTimeoutMillis);
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 = @Override
new Creator<RotationResolutionRequest>() { @DataClass.Generated.Member
@Override public int describeContents() { return 0; }
public RotationResolutionRequest createFromParcel(Parcel source) {
return new RotationResolutionRequest(source.readInt(), source.readInt(),
source.readString(), source.readLong());
}
/** @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 @Override
public RotationResolutionRequest[] newArray(int size) { public RotationResolutionRequest[] newArray(int size) {
return new RotationResolutionRequest[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") @GuardedBy("mLock")
public void resolveRotationLocked(RotationRequest request) { public void resolveRotationLocked(RotationRequest request) {
final RotationResolutionRequest remoteRequest = new RotationResolutionRequest( final RotationResolutionRequest remoteRequest = request.mRemoteRequest;
request.mProposedRotation, request.mCurrentRotation, request.mPackageName,
request.mTimeoutMillis);
post(service -> service.resolveRotation(request.mIRotationResolverCallback, remoteRequest)); post(service -> service.resolveRotation(request.mIRotationResolverCallback, remoteRequest));
// schedule a timeout. // schedule a timeout.
@@ -91,7 +89,7 @@ class RemoteRotationResolverService extends ServiceConnector.Impl<IRotationResol
request.cancelInternal(); request.cancelInternal();
} }
} }
}, request.mTimeoutMillis); }, request.mRemoteRequest.getTimeoutMillis());
} }
@VisibleForTesting @VisibleForTesting
@@ -109,28 +107,18 @@ class RemoteRotationResolverService extends ServiceConnector.Impl<IRotationResol
@GuardedBy("mLock") @GuardedBy("mLock")
boolean mIsFulfilled; boolean mIsFulfilled;
private final long mTimeoutMillis;
@VisibleForTesting @VisibleForTesting
final int mProposedRotation; final RotationResolutionRequest mRemoteRequest;
private final int mCurrentRotation;
private final String mPackageName;
boolean mIsDispatched; boolean mIsDispatched;
private final Object mLock = new Object(); private final Object mLock = new Object();
private final long mRequestStartTimeMillis; private final long mRequestStartTimeMillis;
RotationRequest( RotationRequest(
@NonNull RotationResolverInternal.RotationResolverCallbackInternal @NonNull RotationResolverInternal.RotationResolverCallbackInternal callbackInternal,
callbackInternal, int proposedRotation, int currentRotation, RotationResolutionRequest request, @NonNull CancellationSignal cancellationSignal) {
String packageName, long timeoutMillis,
@NonNull CancellationSignal cancellationSignal) {
mTimeoutMillis = timeoutMillis;
mCallbackInternal = callbackInternal; mCallbackInternal = callbackInternal;
mProposedRotation = proposedRotation; mRemoteRequest = request;
mCurrentRotation = currentRotation;
mPackageName = packageName;
mIRotationResolverCallback = new RotationResolverCallback(this); mIRotationResolverCallback = new RotationResolverCallback(this);
mCancellationSignalInternal = cancellationSignal; mCancellationSignalInternal = cancellationSignal;
mRequestStartTimeMillis = SystemClock.elapsedRealtime(); mRequestStartTimeMillis = SystemClock.elapsedRealtime();
@@ -185,8 +173,8 @@ class RemoteRotationResolverService extends ServiceConnector.Impl<IRotationResol
request.mCallbackInternal.onSuccess(rotation); request.mCallbackInternal.onSuccess(rotation);
final long timeToCalculate = final long timeToCalculate =
SystemClock.elapsedRealtime() - request.mRequestStartTimeMillis; SystemClock.elapsedRealtime() - request.mRequestStartTimeMillis;
logRotationStats(request.mProposedRotation, request.mCurrentRotation, rotation, logRotationStats(request.mRemoteRequest.getProposedRotation(),
timeToCalculate); request.mRemoteRequest.getCurrentRotation(), rotation, timeToCalculate);
Slog.d(TAG, "onSuccess:" + rotation); Slog.d(TAG, "onSuccess:" + rotation);
Slog.d(TAG, "timeToCalculate:" + timeToCalculate); Slog.d(TAG, "timeToCalculate:" + timeToCalculate);
} }
@@ -204,8 +192,9 @@ class RemoteRotationResolverService extends ServiceConnector.Impl<IRotationResol
request.mCallbackInternal.onFailure(error); request.mCallbackInternal.onFailure(error);
final long timeToCalculate = final long timeToCalculate =
SystemClock.elapsedRealtime() - request.mRequestStartTimeMillis; SystemClock.elapsedRealtime() - request.mRequestStartTimeMillis;
logRotationStats(request.mProposedRotation, request.mCurrentRotation, logRotationStats(request.mRemoteRequest.getProposedRotation(),
RESOLUTION_FAILURE, timeToCalculate); request.mRemoteRequest.getCurrentRotation(), RESOLUTION_FAILURE,
timeToCalculate);
Slog.d(TAG, "onFailure:" + error); Slog.d(TAG, "onFailure:" + error);
Slog.d(TAG, "timeToCalculate:" + timeToCalculate); Slog.d(TAG, "timeToCalculate:" + timeToCalculate);
} }

View File

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

View File

@@ -35,6 +35,7 @@ import android.os.ShellCallback;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.DeviceConfig; import android.provider.DeviceConfig;
import android.rotationresolver.RotationResolverInternal; import android.rotationresolver.RotationResolverInternal;
import android.service.rotationresolver.RotationResolutionRequest;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.IndentingPrintWriter; import android.util.IndentingPrintWriter;
import android.util.Slog; import android.util.Slog;
@@ -158,8 +159,9 @@ public class RotationResolverManagerService extends
if (mIsServiceEnabled) { if (mIsServiceEnabled) {
final RotationResolverManagerPerUserService service = getServiceForUserLocked( final RotationResolverManagerPerUserService service = getServiceForUserLocked(
UserHandle.getCallingUserId()); UserHandle.getCallingUserId());
service.resolveRotationLocked(callbackInternal, proposedRotation, final RotationResolutionRequest request = new RotationResolutionRequest("",
currentRotation, /* packageName */ "", timeout, currentRotation, proposedRotation, true, timeout);
service.resolveRotationLocked(callbackInternal, request,
cancellationSignalInternal); cancellationSignalInternal);
} else { } else {
Slog.w(TAG, "Rotation Resolver service is disabled."); 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.CancellationSignal;
import android.os.ShellCommand; import android.os.ShellCommand;
import android.rotationresolver.RotationResolverInternal.RotationResolverCallbackInternal; import android.rotationresolver.RotationResolverInternal.RotationResolverCallbackInternal;
import android.service.rotationresolver.RotationResolutionRequest;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.Surface; import android.view.Surface;
@@ -107,8 +108,10 @@ final class RotationResolverShellCommand extends ShellCommand {
} }
private int runResolveRotation() { private int runResolveRotation() {
mService.resolveRotationLocked(sTestableRotationCallbackInternal, Surface.ROTATION_0, final RotationResolutionRequest request = new RotationResolutionRequest("",
Surface.ROTATION_0, "", 2000L, new CancellationSignal()); Surface.ROTATION_0, Surface.ROTATION_0, true, 2000L);
mService.resolveRotationLocked(sTestableRotationCallbackInternal, request,
new CancellationSignal());
return 0; return 0;
} }

View File

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