Don't pass deviceId in ActivityClientRecord
Refactor to pass it directly from the execute() method in LaunchActivityItem. - Removed TODO suggested in review of ag/20723446 - Also stopped sending INVALID id from WindowProcessController and always send the top activity deviceId to the app process. Note: this will incur in a slight behavioral change: when an activity is re-started, this will not count as the last activity started in terms of which device ID is assigned to non-UI Contexts. This is not expected to cause any problems and the behavior is documented in a new CTS test that covers this case. Bug: 263402465 Test: atest DeviceAssociationTests Change-Id: I64e8342374cc41e47a671827751e3e04f88d85d5
This commit is contained in:
@@ -554,9 +554,6 @@ public final class ActivityThread extends ClientTransactionHandler
|
||||
boolean hideForNow;
|
||||
Configuration createdConfig;
|
||||
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.
|
||||
private Configuration tmpConfig = new Configuration();
|
||||
// Callback used for updating activity override config and camera compat control state.
|
||||
@@ -619,7 +616,7 @@ public final class ActivityThread extends ClientTransactionHandler
|
||||
}
|
||||
|
||||
public ActivityClientRecord(IBinder token, Intent intent, int ident,
|
||||
ActivityInfo info, Configuration overrideConfig, int deviceId,
|
||||
ActivityInfo info, Configuration overrideConfig,
|
||||
String referrer, IVoiceInteractor voiceInteractor, Bundle state,
|
||||
PersistableBundle persistentState, List<ResultInfo> pendingResults,
|
||||
List<ReferrerIntent> pendingNewIntents, ActivityOptions activityOptions,
|
||||
@@ -641,7 +638,6 @@ public final class ActivityThread extends ClientTransactionHandler
|
||||
this.isForward = isForward;
|
||||
this.profilerInfo = profilerInfo;
|
||||
this.overrideConfig = overrideConfig;
|
||||
this.mDeviceId = deviceId;
|
||||
this.packageInfo = client.getPackageInfoNoCheck(activityInfo.applicationInfo);
|
||||
mActivityOptions = activityOptions;
|
||||
mLaunchedFromBubble = launchedFromBubble;
|
||||
@@ -3872,7 +3868,7 @@ public final class ActivityThread extends ClientTransactionHandler
|
||||
*/
|
||||
@Override
|
||||
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
|
||||
// we are back active so skip it.
|
||||
unscheduleGcIdler();
|
||||
@@ -3885,7 +3881,7 @@ public final class ActivityThread extends ClientTransactionHandler
|
||||
|
||||
// Make sure we are running with the most recent config.
|
||||
mConfigurationController.handleConfigurationChanged(null, null);
|
||||
updateDeviceIdForNonUIContexts(r.mDeviceId);
|
||||
updateDeviceIdForNonUIContexts(deviceId);
|
||||
|
||||
if (localLOGV) Slog.v(
|
||||
TAG, "Handling launch of " + r);
|
||||
@@ -5942,7 +5938,7 @@ public final class ActivityThread extends ClientTransactionHandler
|
||||
r.startsNotResumed = startsNotResumed;
|
||||
r.overrideConfig = overrideConfig;
|
||||
|
||||
handleLaunchActivity(r, pendingActions, customIntent);
|
||||
handleLaunchActivity(r, pendingActions, mLastReportedDeviceId, customIntent);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -188,7 +188,7 @@ public abstract class ClientTransactionHandler {
|
||||
|
||||
/** Perform activity launch. */
|
||||
public abstract Activity handleLaunchActivity(@NonNull ActivityClientRecord r,
|
||||
PendingTransactionActions pendingActions, Intent customIntent);
|
||||
PendingTransactionActions pendingActions, int deviceId, Intent customIntent);
|
||||
|
||||
/** Perform activity start. */
|
||||
public abstract void handleStartActivity(@NonNull ActivityClientRecord r,
|
||||
|
||||
@@ -96,11 +96,11 @@ public class LaunchActivityItem extends ClientTransactionItem {
|
||||
PendingTransactionActions pendingActions) {
|
||||
Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
|
||||
ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,
|
||||
mOverrideConfig, mDeviceId, mReferrer, mVoiceInteractor, mState, mPersistentState,
|
||||
mOverrideConfig, mReferrer, mVoiceInteractor, mState, mPersistentState,
|
||||
mPendingResults, mPendingNewIntents, mActivityOptions, mIsForward, mProfilerInfo,
|
||||
client, mAssistToken, mShareableActivityToken, mLaunchedFromBubble,
|
||||
mTaskFragmentToken);
|
||||
client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
|
||||
client.handleLaunchActivity(r, pendingActions, mDeviceId, null /* customIntent */);
|
||||
Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ import static android.app.servertransaction.TransactionExecutorHelper.transactio
|
||||
|
||||
import android.app.ActivityThread.ActivityClientRecord;
|
||||
import android.app.ClientTransactionHandler;
|
||||
import android.content.Context;
|
||||
import android.os.IBinder;
|
||||
import android.util.IntArray;
|
||||
import android.util.Slog;
|
||||
@@ -218,7 +219,7 @@ public class TransactionExecutor {
|
||||
switch (state) {
|
||||
case ON_CREATE:
|
||||
mTransactionHandler.handleLaunchActivity(r, mPendingActions,
|
||||
null /* customIntent */);
|
||||
Context.DEVICE_ID_INVALID, null /* customIntent */);
|
||||
break;
|
||||
case ON_START:
|
||||
mTransactionHandler.handleStartActivity(r, mPendingActions,
|
||||
|
||||
@@ -51,6 +51,7 @@ import android.app.ActivityThread.ActivityClientRecord;
|
||||
import android.app.LoadedApk;
|
||||
import android.app.servertransaction.PendingTransactionActions;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
@@ -293,7 +294,7 @@ public class ActivityThreadClientTest {
|
||||
|
||||
private Activity launchActivity(ActivityClientRecord r) {
|
||||
return mThread.handleLaunchActivity(r, null /* pendingActions */,
|
||||
null /* customIntent */);
|
||||
Context.DEVICE_ID_DEFAULT, null /* customIntent */);
|
||||
}
|
||||
|
||||
private void startActivity(ActivityClientRecord r) {
|
||||
@@ -347,7 +348,7 @@ public class ActivityThreadClientTest {
|
||||
doNothing().when(packageInfo).updateApplicationInfo(any(), any());
|
||||
|
||||
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 /* pendingResults */, null /* pendingNewIntents */,
|
||||
null /* activityOptions */, true /* isForward */, null /* profilerInfo */,
|
||||
|
||||
@@ -1432,8 +1432,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
|
||||
return;
|
||||
}
|
||||
|
||||
dispatchConfiguration(config, topActivityDeviceChanged ? mLastTopActivityDeviceId
|
||||
: Context.DEVICE_ID_INVALID);
|
||||
dispatchConfiguration(config);
|
||||
}
|
||||
|
||||
private int getTopActivityDeviceId() {
|
||||
@@ -1483,10 +1482,6 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
|
||||
}
|
||||
|
||||
void dispatchConfiguration(Configuration config) {
|
||||
dispatchConfiguration(config, getTopActivityDeviceId());
|
||||
}
|
||||
|
||||
void dispatchConfiguration(Configuration config, int deviceId) {
|
||||
mHasPendingConfigurationChange = false;
|
||||
if (mThread == null) {
|
||||
if (Build.IS_DEBUGGABLE && mHasImeService) {
|
||||
@@ -1513,16 +1508,10 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
|
||||
}
|
||||
}
|
||||
|
||||
scheduleConfigurationChange(mThread, config, deviceId);
|
||||
scheduleConfigurationChange(mThread, 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,
|
||||
config);
|
||||
if (Build.IS_DEBUGGABLE && mHasImeService) {
|
||||
@@ -1532,7 +1521,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
|
||||
mHasCachedConfiguration = false;
|
||||
try {
|
||||
mAtm.getLifecycleManager().scheduleTransaction(thread,
|
||||
ConfigurationChangeItem.obtain(config, deviceId));
|
||||
ConfigurationChangeItem.obtain(config, mLastTopActivityDeviceId));
|
||||
} catch (Exception e) {
|
||||
Slog.e(TAG_CONFIGURATION, "Failed to schedule configuration change: " + mOwner, e);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user