Merge changes from topics "cherrypick-device_id_activity-jjzdpul0z9", "cherrypick-recreate-activity" into udc-dev

* changes:
  Don't pass deviceId in ActivityClientRecord
  Update deviceId from server process when activity is destroyed
This commit is contained in:
Marco Loaiza
2023-03-01 14:48:46 +00:00
committed by Android (Google) Code Review
6 changed files with 19 additions and 33 deletions

View File

@@ -558,9 +558,6 @@ public final class ActivityThread extends ClientTransactionHandler
boolean hideForNow; boolean hideForNow;
Configuration createdConfig; Configuration createdConfig;
Configuration overrideConfig; Configuration overrideConfig;
// TODO(b/263402465): pass deviceId directly in LaunchActivityItem#execute
// The deviceId assigned by the server when this activity was first started.
int mDeviceId;
// Used for consolidating configs before sending on to Activity. // Used for consolidating configs before sending on to Activity.
private Configuration tmpConfig = new Configuration(); private Configuration tmpConfig = new Configuration();
// Callback used for updating activity override config and camera compat control state. // Callback used for updating activity override config and camera compat control state.
@@ -623,7 +620,7 @@ public final class ActivityThread extends ClientTransactionHandler
} }
public ActivityClientRecord(IBinder token, Intent intent, int ident, public ActivityClientRecord(IBinder token, Intent intent, int ident,
ActivityInfo info, Configuration overrideConfig, int deviceId, ActivityInfo info, Configuration overrideConfig,
String referrer, IVoiceInteractor voiceInteractor, Bundle state, String referrer, IVoiceInteractor voiceInteractor, Bundle state,
PersistableBundle persistentState, List<ResultInfo> pendingResults, PersistableBundle persistentState, List<ResultInfo> pendingResults,
List<ReferrerIntent> pendingNewIntents, ActivityOptions activityOptions, List<ReferrerIntent> pendingNewIntents, ActivityOptions activityOptions,
@@ -645,7 +642,6 @@ public final class ActivityThread extends ClientTransactionHandler
this.isForward = isForward; this.isForward = isForward;
this.profilerInfo = profilerInfo; this.profilerInfo = profilerInfo;
this.overrideConfig = overrideConfig; this.overrideConfig = overrideConfig;
this.mDeviceId = deviceId;
this.packageInfo = client.getPackageInfoNoCheck(activityInfo.applicationInfo); this.packageInfo = client.getPackageInfoNoCheck(activityInfo.applicationInfo);
mActivityOptions = activityOptions; mActivityOptions = activityOptions;
mLaunchedFromBubble = launchedFromBubble; mLaunchedFromBubble = launchedFromBubble;
@@ -3876,7 +3872,7 @@ public final class ActivityThread extends ClientTransactionHandler
*/ */
@Override @Override
public Activity handleLaunchActivity(ActivityClientRecord r, public Activity handleLaunchActivity(ActivityClientRecord r,
PendingTransactionActions pendingActions, Intent customIntent) { PendingTransactionActions pendingActions, int deviceId, Intent customIntent) {
// If we are getting ready to gc after going to the background, well // If we are getting ready to gc after going to the background, well
// we are back active so skip it. // we are back active so skip it.
unscheduleGcIdler(); unscheduleGcIdler();
@@ -3889,7 +3885,7 @@ public final class ActivityThread extends ClientTransactionHandler
// Make sure we are running with the most recent config. // Make sure we are running with the most recent config.
mConfigurationController.handleConfigurationChanged(null, null); mConfigurationController.handleConfigurationChanged(null, null);
updateDeviceIdForNonUIContexts(r.mDeviceId); updateDeviceIdForNonUIContexts(deviceId);
if (localLOGV) Slog.v( if (localLOGV) Slog.v(
TAG, "Handling launch of " + r); TAG, "Handling launch of " + r);
@@ -5946,7 +5942,7 @@ public final class ActivityThread extends ClientTransactionHandler
r.startsNotResumed = startsNotResumed; r.startsNotResumed = startsNotResumed;
r.overrideConfig = overrideConfig; r.overrideConfig = overrideConfig;
handleLaunchActivity(r, pendingActions, customIntent); handleLaunchActivity(r, pendingActions, mLastReportedDeviceId, customIntent);
} }
@Override @Override

View File

@@ -188,7 +188,7 @@ public abstract class ClientTransactionHandler {
/** Perform activity launch. */ /** Perform activity launch. */
public abstract Activity handleLaunchActivity(@NonNull ActivityClientRecord r, public abstract Activity handleLaunchActivity(@NonNull ActivityClientRecord r,
PendingTransactionActions pendingActions, Intent customIntent); PendingTransactionActions pendingActions, int deviceId, Intent customIntent);
/** Perform activity start. */ /** Perform activity start. */
public abstract void handleStartActivity(@NonNull ActivityClientRecord r, public abstract void handleStartActivity(@NonNull ActivityClientRecord r,

View File

@@ -96,11 +96,11 @@ public class LaunchActivityItem extends ClientTransactionItem {
PendingTransactionActions pendingActions) { PendingTransactionActions pendingActions) {
Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart"); Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo, ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,
mOverrideConfig, mDeviceId, mReferrer, mVoiceInteractor, mState, mPersistentState, mOverrideConfig, mReferrer, mVoiceInteractor, mState, mPersistentState,
mPendingResults, mPendingNewIntents, mActivityOptions, mIsForward, mProfilerInfo, mPendingResults, mPendingNewIntents, mActivityOptions, mIsForward, mProfilerInfo,
client, mAssistToken, mShareableActivityToken, mLaunchedFromBubble, client, mAssistToken, mShareableActivityToken, mLaunchedFromBubble,
mTaskFragmentToken); mTaskFragmentToken);
client.handleLaunchActivity(r, pendingActions, null /* customIntent */); client.handleLaunchActivity(r, pendingActions, mDeviceId, null /* customIntent */);
Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
} }

View File

@@ -32,6 +32,7 @@ import static android.app.servertransaction.TransactionExecutorHelper.transactio
import android.app.ActivityThread.ActivityClientRecord; import android.app.ActivityThread.ActivityClientRecord;
import android.app.ClientTransactionHandler; import android.app.ClientTransactionHandler;
import android.content.Context;
import android.os.IBinder; import android.os.IBinder;
import android.util.IntArray; import android.util.IntArray;
import android.util.Slog; import android.util.Slog;
@@ -218,7 +219,7 @@ public class TransactionExecutor {
switch (state) { switch (state) {
case ON_CREATE: case ON_CREATE:
mTransactionHandler.handleLaunchActivity(r, mPendingActions, mTransactionHandler.handleLaunchActivity(r, mPendingActions,
null /* customIntent */); Context.DEVICE_ID_INVALID, null /* customIntent */);
break; break;
case ON_START: case ON_START:
mTransactionHandler.handleStartActivity(r, mPendingActions, mTransactionHandler.handleStartActivity(r, mPendingActions,

View File

@@ -51,6 +51,7 @@ import android.app.ActivityThread.ActivityClientRecord;
import android.app.LoadedApk; import android.app.LoadedApk;
import android.app.servertransaction.PendingTransactionActions; import android.app.servertransaction.PendingTransactionActions;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
@@ -293,7 +294,7 @@ public class ActivityThreadClientTest {
private Activity launchActivity(ActivityClientRecord r) { private Activity launchActivity(ActivityClientRecord r) {
return mThread.handleLaunchActivity(r, null /* pendingActions */, return mThread.handleLaunchActivity(r, null /* pendingActions */,
null /* customIntent */); Context.DEVICE_ID_DEFAULT, null /* customIntent */);
} }
private void startActivity(ActivityClientRecord r) { private void startActivity(ActivityClientRecord r) {
@@ -347,7 +348,7 @@ public class ActivityThreadClientTest {
doNothing().when(packageInfo).updateApplicationInfo(any(), any()); doNothing().when(packageInfo).updateApplicationInfo(any(), any());
return new ActivityClientRecord(mock(IBinder.class), Intent.makeMainActivity(component), return new ActivityClientRecord(mock(IBinder.class), Intent.makeMainActivity(component),
0 /* ident */, info, new Configuration(), 0 /*deviceId */, null /* referrer */, 0 /* ident */, info, new Configuration(), null /* referrer */,
null /* voiceInteractor */, null /* state */, null /* persistentState */, null /* voiceInteractor */, null /* state */, null /* persistentState */,
null /* pendingResults */, null /* pendingNewIntents */, null /* pendingResults */, null /* pendingNewIntents */,
null /* activityOptions */, true /* isForward */, null /* profilerInfo */, null /* activityOptions */, true /* isForward */, null /* profilerInfo */,

View File

@@ -210,7 +210,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
/** Whether {@link #mLastReportedConfiguration} is deferred by the cached state. */ /** Whether {@link #mLastReportedConfiguration} is deferred by the cached state. */
private volatile boolean mHasCachedConfiguration; private volatile boolean mHasCachedConfiguration;
private int mTopActivityDeviceId = Context.DEVICE_ID_DEFAULT; private int mLastTopActivityDeviceId = Context.DEVICE_ID_DEFAULT;
/** /**
* Registered {@link DisplayArea} as a listener to override config changes. {@code null} if not * Registered {@link DisplayArea} as a listener to override config changes. {@code null} if not
* registered. * registered.
@@ -1411,8 +1411,9 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
// If deviceId for the top-activity changed, schedule passing it to the app process. // If deviceId for the top-activity changed, schedule passing it to the app process.
boolean topActivityDeviceChanged = false; boolean topActivityDeviceChanged = false;
int deviceId = getTopActivityDeviceId(); int deviceId = getTopActivityDeviceId();
if (deviceId != mTopActivityDeviceId) { if (deviceId != mLastTopActivityDeviceId) {
topActivityDeviceChanged = true; topActivityDeviceChanged = true;
mLastTopActivityDeviceId = deviceId;
} }
final Configuration config = getConfiguration(); final Configuration config = getConfiguration();
@@ -1431,15 +1432,12 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
return; return;
} }
// TODO(b/263402938): Add tests that capture the deviceId dispatch to the client. dispatchConfiguration(config);
mTopActivityDeviceId = deviceId;
dispatchConfiguration(config, topActivityDeviceChanged ? mTopActivityDeviceId
: Context.DEVICE_ID_INVALID);
} }
private int getTopActivityDeviceId() { private int getTopActivityDeviceId() {
ActivityRecord topActivity = getTopNonFinishingActivity(); ActivityRecord topActivity = getTopNonFinishingActivity();
int updatedDeviceId = mTopActivityDeviceId; int updatedDeviceId = Context.DEVICE_ID_DEFAULT;
if (topActivity != null && topActivity.mDisplayContent != null) { if (topActivity != null && topActivity.mDisplayContent != null) {
updatedDeviceId = mAtm.mTaskSupervisor.getDeviceIdForDisplayId( updatedDeviceId = mAtm.mTaskSupervisor.getDeviceIdForDisplayId(
topActivity.mDisplayContent.mDisplayId); topActivity.mDisplayContent.mDisplayId);
@@ -1484,10 +1482,6 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
} }
void dispatchConfiguration(Configuration config) { void dispatchConfiguration(Configuration config) {
dispatchConfiguration(config, getTopActivityDeviceId());
}
void dispatchConfiguration(Configuration config, int deviceId) {
mHasPendingConfigurationChange = false; mHasPendingConfigurationChange = false;
if (mThread == null) { if (mThread == null) {
if (Build.IS_DEBUGGABLE && mHasImeService) { if (Build.IS_DEBUGGABLE && mHasImeService) {
@@ -1514,16 +1508,10 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
} }
} }
scheduleConfigurationChange(mThread, config, deviceId); scheduleConfigurationChange(mThread, config);
} }
private void scheduleConfigurationChange(IApplicationThread thread, Configuration config) { private void scheduleConfigurationChange(IApplicationThread thread, Configuration config) {
// By default send invalid deviceId as no-op signal so it's not updated on the client side.
scheduleConfigurationChange(thread, config, Context.DEVICE_ID_INVALID);
}
private void scheduleConfigurationChange(IApplicationThread thread, Configuration config,
int deviceId) {
ProtoLog.v(WM_DEBUG_CONFIGURATION, "Sending to proc %s new config %s", mName, ProtoLog.v(WM_DEBUG_CONFIGURATION, "Sending to proc %s new config %s", mName,
config); config);
if (Build.IS_DEBUGGABLE && mHasImeService) { if (Build.IS_DEBUGGABLE && mHasImeService) {
@@ -1533,7 +1521,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
mHasCachedConfiguration = false; mHasCachedConfiguration = false;
try { try {
mAtm.getLifecycleManager().scheduleTransaction(thread, mAtm.getLifecycleManager().scheduleTransaction(thread,
ConfigurationChangeItem.obtain(config, deviceId)); ConfigurationChangeItem.obtain(config, mLastTopActivityDeviceId));
} catch (Exception e) { } catch (Exception e) {
Slog.e(TAG_CONFIGURATION, "Failed to schedule configuration change: " + mOwner, e); Slog.e(TAG_CONFIGURATION, "Failed to schedule configuration change: " + mOwner, e);
} }