summaryrefslogtreecommitdiff
path: root/core/java/android/app/ActivityThread.java
diff options
context:
space:
mode:
authorRiddle Hsu <riddlehsu@google.com>2020-05-12 09:05:17 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2020-05-12 09:05:17 +0000
commit8e726a2ef72965430f514b0d8fa17a01798e51dc (patch)
tree89e98a59b3571079dbe40836edc46d59f0eea904 /core/java/android/app/ActivityThread.java
parent80dcec801deb24186ce375da85c5b96bc2437038 (diff)
parentd490c57905bc47a4d583d69049864e6348171c61 (diff)
Merge changes from topic "b147213487" into rvc-dev
* changes: Send fixed rotation adjustments to the associated client Add support to override display adjustments by token Add fixed rotation display adjustments
Diffstat (limited to 'core/java/android/app/ActivityThread.java')
-rw-r--r--core/java/android/app/ActivityThread.java60
1 files changed, 59 insertions, 1 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index b45705924910..c75870e933f8 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -156,6 +156,8 @@ import android.util.proto.ProtoOutputStream;
import android.view.Choreographer;
import android.view.ContextThemeWrapper;
import android.view.Display;
+import android.view.DisplayAdjustments;
+import android.view.DisplayAdjustments.FixedRotationAdjustments;
import android.view.ThreadedRenderer;
import android.view.View;
import android.view.ViewDebug;
@@ -215,6 +217,7 @@ import java.util.Objects;
import java.util.TimeZone;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Consumer;
final class RemoteServiceException extends AndroidRuntimeException {
public RemoteServiceException(String msg) {
@@ -405,6 +408,9 @@ public final class ActivityThread extends ClientTransactionHandler {
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
private final ResourcesManager mResourcesManager;
+ /** The active adjustments that override the {@link DisplayAdjustments} in resources. */
+ private ArrayList<Pair<IBinder, Consumer<DisplayAdjustments>>> mActiveRotationAdjustments;
+
// Registry of remote cancellation transports pending a reply with reply handles.
@GuardedBy("this")
private @Nullable Map<SafeCancellationTransport, CancellationSignal> mRemoteCancellations;
@@ -541,6 +547,12 @@ public final class ActivityThread extends ClientTransactionHandler {
@UnsupportedAppUsage
boolean mPreserveWindow;
+ /**
+ * If non-null, the activity is launching with a specified rotation, the adjustments should
+ * be consumed before activity creation.
+ */
+ FixedRotationAdjustments mPendingFixedRotationAdjustments;
+
@LifecycleState
private int mLifecycleState = PRE_ON_CREATE;
@@ -557,7 +569,7 @@ public final class ActivityThread extends ClientTransactionHandler {
PersistableBundle persistentState, List<ResultInfo> pendingResults,
List<ReferrerIntent> pendingNewIntents, boolean isForward,
ProfilerInfo profilerInfo, ClientTransactionHandler client,
- IBinder assistToken) {
+ IBinder assistToken, FixedRotationAdjustments fixedRotationAdjustments) {
this.token = token;
this.assistToken = assistToken;
this.ident = ident;
@@ -575,6 +587,7 @@ public final class ActivityThread extends ClientTransactionHandler {
this.overrideConfig = overrideConfig;
this.packageInfo = client.getPackageInfoNoCheck(activityInfo.applicationInfo,
compatInfo);
+ mPendingFixedRotationAdjustments = fixedRotationAdjustments;
init();
}
@@ -3233,6 +3246,44 @@ public final class ActivityThread extends ClientTransactionHandler {
sendMessage(H.CLEAN_UP_CONTEXT, cci);
}
+ @Override
+ public void handleFixedRotationAdjustments(@NonNull IBinder token,
+ @Nullable FixedRotationAdjustments fixedRotationAdjustments) {
+ final Consumer<DisplayAdjustments> override = fixedRotationAdjustments != null
+ ? displayAdjustments -> displayAdjustments.setFixedRotationAdjustments(
+ fixedRotationAdjustments)
+ : null;
+ if (!mResourcesManager.overrideTokenDisplayAdjustments(token, override)) {
+ // No resources are associated with the token.
+ return;
+ }
+ if (mActivities.get(token) == null) {
+ // Only apply the override to application for activity token because the appearance of
+ // activity is usually more sensitive to the application resources.
+ return;
+ }
+
+ // Apply the last override to application resources for compatibility. Because the Resources
+ // of Display can be from application, e.g.
+ // applicationContext.getSystemService(DisplayManager.class).getDisplay(displayId)
+ // and the deprecated usage:
+ // applicationContext.getSystemService(WindowManager.class).getDefaultDisplay();
+ final Consumer<DisplayAdjustments> appOverride;
+ if (mActiveRotationAdjustments == null) {
+ mActiveRotationAdjustments = new ArrayList<>(2);
+ }
+ if (override != null) {
+ mActiveRotationAdjustments.add(Pair.create(token, override));
+ appOverride = override;
+ } else {
+ mActiveRotationAdjustments.removeIf(adjustmentsPair -> adjustmentsPair.first == token);
+ appOverride = mActiveRotationAdjustments.isEmpty()
+ ? null
+ : mActiveRotationAdjustments.get(mActiveRotationAdjustments.size() - 1).second;
+ }
+ mInitialApplication.getResources().overrideDisplayAdjustments(appOverride);
+ }
+
/** Core implementation of activity launch. */
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
ActivityInfo aInfo = r.activityInfo;
@@ -3446,6 +3497,13 @@ public final class ActivityThread extends ClientTransactionHandler {
ContextImpl appContext = ContextImpl.createActivityContext(
this, r.packageInfo, r.activityInfo, r.token, displayId, r.overrideConfig);
+ // The rotation adjustments must be applied before creating the activity, so the activity
+ // can get the adjusted display info during creation.
+ if (r.mPendingFixedRotationAdjustments != null) {
+ handleFixedRotationAdjustments(r.token, r.mPendingFixedRotationAdjustments);
+ r.mPendingFixedRotationAdjustments = null;
+ }
+
final DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance();
// For debugging purposes, if the activity's package name contains the value of
// the "debug.use-second-display" system property as a substring, then show