diff options
39 files changed, 411 insertions, 368 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index fc488457e3b2..8ed79a3f2338 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -8114,7 +8114,7 @@ package android.telephony { } public final class SmsCbMessage implements android.os.Parcelable { - ctor public SmsCbMessage(int, int, int, @NonNull android.telephony.SmsCbLocation, int, @Nullable String, @Nullable String, int, @Nullable android.telephony.SmsCbEtwsInfo, @Nullable android.telephony.SmsCbCmasInfo); + ctor public SmsCbMessage(int, int, int, @NonNull android.telephony.SmsCbLocation, int, @Nullable String, @Nullable String, int, @Nullable android.telephony.SmsCbEtwsInfo, @Nullable android.telephony.SmsCbCmasInfo, int); method @NonNull public static android.telephony.SmsCbMessage createFromCursor(@NonNull android.database.Cursor); method public int describeContents(); method @Nullable public android.telephony.SmsCbCmasInfo getCmasWarningInfo(); @@ -8129,6 +8129,7 @@ package android.telephony { method public long getReceivedTime(); method public int getSerialNumber(); method public int getServiceCategory(); + method public int getSlotIndex(); method public boolean isCmasMessage(); method public boolean isEmergencyMessage(); method public boolean isEtwsMessage(); @@ -8276,6 +8277,7 @@ package android.telephony { method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String iccTransmitApduLogicalChannelBySlot(int, int, int, int, int, int, int, @Nullable String); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isApplicationOnUicc(int); method public boolean isDataConnectivityPossible(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isDataEnabledForApn(int); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isEmergencyAssistanceEnabled(); method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isIdle(); method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isOffhook(); diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h index f0db1b0128a1..3d002d2efdd0 100644 --- a/cmds/statsd/src/StatsLogProcessor.h +++ b/cmds/statsd/src/StatsLogProcessor.h @@ -248,19 +248,6 @@ private: FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm); FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_WithActivation); - FRIEND_TEST(DimensionInConditionE2eTest, TestCreateCountMetric_NoLink_OR_CombinationCondition); - FRIEND_TEST(DimensionInConditionE2eTest, TestCreateCountMetric_Link_OR_CombinationCondition); - FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_OR_CombinationCondition); - FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_Link_OR_CombinationCondition); - - FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_SimpleCondition); - FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_Link_SimpleCondition); - FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_SimpleCondition); - - FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_AND_CombinationCondition); - FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_AND_CombinationCondition); - FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_Link_AND_CombinationCondition); - FRIEND_TEST(AnomalyDetectionE2eTest, TestSlicedCountMetric_single_bucket); FRIEND_TEST(AnomalyDetectionE2eTest, TestSlicedCountMetric_multiple_buckets); FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_single_bucket); diff --git a/core/java/android/app/ITaskStackListener.aidl b/core/java/android/app/ITaskStackListener.aidl index 750020eb5bb8..0ba1989e681c 100644 --- a/core/java/android/app/ITaskStackListener.aidl +++ b/core/java/android/app/ITaskStackListener.aidl @@ -197,4 +197,11 @@ oneway interface ITaskStackListener { * Called when any additions or deletions to the recent tasks list have been made. */ void onRecentTaskListUpdated(); + + /** + * Called when Recent Tasks list is frozen or unfrozen. + * + * @param frozen if true, Recents Tasks list is currently frozen, false otherwise + */ + void onRecentTaskListFrozenChanged(boolean frozen); } diff --git a/core/java/android/app/TaskStackListener.java b/core/java/android/app/TaskStackListener.java index 46045faecbd4..f21aaf3867fd 100644 --- a/core/java/android/app/TaskStackListener.java +++ b/core/java/android/app/TaskStackListener.java @@ -190,4 +190,8 @@ public abstract class TaskStackListener extends ITaskStackListener.Stub { @Override public void onRecentTaskListUpdated() throws RemoteException { } + + @Override + public void onRecentTaskListFrozenChanged(boolean frozen) { + } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java index 5ddf89c08887..6186589ab086 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java @@ -17,6 +17,7 @@ package com.android.systemui.shared.system; import android.app.ActivityManager.RunningTaskInfo; +import android.app.ITaskStackListener; import android.content.ComponentName; import android.os.IBinder; import android.os.UserHandle; @@ -106,6 +107,9 @@ public abstract class TaskStackChangeListener { */ public void onRecentTaskListUpdated() { } + /** @see ITaskStackListener#onRecentTaskListFrozenChanged(boolean) */ + public void onRecentTaskListFrozenChanged(boolean frozen) { } + /** * Checks that the current user matches the process. Since * {@link android.app.ITaskStackListener} is not multi-user aware, handlers of diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java index 820057a168a0..8d823ca34b39 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java @@ -224,6 +224,12 @@ public class TaskStackChangeListeners extends TaskStackListener { mHandler.obtainMessage(H.ON_TASK_LIST_UPDATED).sendToTarget(); } + @Override + public void onRecentTaskListFrozenChanged(boolean frozen) { + mHandler.obtainMessage(H.ON_TASK_LIST_FROZEN_UNFROZEN, frozen ? 1 : 0, 0 /* unused */) + .sendToTarget(); + } + private final class H extends Handler { private static final int ON_TASK_STACK_CHANGED = 1; private static final int ON_TASK_SNAPSHOT_CHANGED = 2; @@ -247,6 +253,7 @@ public class TaskStackChangeListeners extends TaskStackListener { private static final int ON_TASK_DISPLAY_CHANGED = 20; private static final int ON_TASK_LIST_UPDATED = 21; private static final int ON_SINGLE_TASK_DISPLAY_EMPTY = 22; + private static final int ON_TASK_LIST_FROZEN_UNFROZEN = 23; public H(Looper looper) { @@ -408,6 +415,12 @@ public class TaskStackChangeListeners extends TaskStackListener { } break; } + case ON_TASK_LIST_FROZEN_UNFROZEN: { + for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) { + mTaskStackListeners.get(i).onRecentTaskListFrozenChanged(msg.arg1 != 0); + } + break; + } } } } diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 08f75e600bc5..9209a21a61d7 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -192,34 +192,38 @@ public final class ActiveServices { @Override public void stopForegroundServicesForUidPackage(final int uid, final String packageName) { synchronized (mAm) { - final ServiceMap smap = getServiceMapLocked(UserHandle.getUserId(uid)); - final int N = smap.mServicesByInstanceName.size(); - final ArrayList<ServiceRecord> toStop = new ArrayList<>(N); - for (int i = 0; i < N; i++) { - final ServiceRecord r = smap.mServicesByInstanceName.valueAt(i); - if (uid == r.serviceInfo.applicationInfo.uid - || packageName.equals(r.serviceInfo.packageName)) { - if (r.isForeground) { - toStop.add(r); - } - } - } + stopAllForegroundServicesLocked(uid, packageName); + } + } + } - // Now stop them all - final int numToStop = toStop.size(); - if (numToStop > 0 && DEBUG_FOREGROUND_SERVICE) { - Slog.i(TAG, "Package " + packageName + "/" + uid - + " entering FAS with foreground services"); - } - for (int i = 0; i < numToStop; i++) { - final ServiceRecord r = toStop.get(i); - if (DEBUG_FOREGROUND_SERVICE) { - Slog.i(TAG, " Stopping fg for service " + r); - } - setServiceForegroundInnerLocked(r, 0, null, 0, 0); + void stopAllForegroundServicesLocked(final int uid, final String packageName) { + final ServiceMap smap = getServiceMapLocked(UserHandle.getUserId(uid)); + final int N = smap.mServicesByInstanceName.size(); + final ArrayList<ServiceRecord> toStop = new ArrayList<>(N); + for (int i = 0; i < N; i++) { + final ServiceRecord r = smap.mServicesByInstanceName.valueAt(i); + if (uid == r.serviceInfo.applicationInfo.uid + || packageName.equals(r.serviceInfo.packageName)) { + if (r.isForeground) { + toStop.add(r); } } } + + // Now stop them all + final int numToStop = toStop.size(); + if (numToStop > 0 && DEBUG_FOREGROUND_SERVICE) { + Slog.i(TAG, "Package " + packageName + "/" + uid + + " in FAS with foreground services"); + } + for (int i = 0; i < numToStop; i++) { + final ServiceRecord r = toStop.get(i); + if (DEBUG_FOREGROUND_SERVICE) { + Slog.i(TAG, " Stopping fg for service " + r); + } + setServiceForegroundInnerLocked(r, 0, null, 0, 0); + } } /** @@ -1019,12 +1023,23 @@ public final class ActiveServices { } } if (!aa.mAppOnTop) { - if (active == null) { - active = new ArrayList<>(); + // Transitioning a fg-service host app out of top: if it's bg restricted, + // it loses the fg service state now. + if (!appRestrictedAnyInBackground(aa.mUid, aa.mPackageName)) { + if (active == null) { + active = new ArrayList<>(); + } + if (DEBUG_FOREGROUND_SERVICE) Slog.d(TAG, "Adding active: pkg=" + + aa.mPackageName + ", uid=" + aa.mUid); + active.add(aa); + } else { + if (DEBUG_FOREGROUND_SERVICE) { + Slog.d(TAG, "bg-restricted app " + + aa.mPackageName + "/" + aa.mUid + + " exiting top; demoting fg services "); + } + stopAllForegroundServicesLocked(aa.mUid, aa.mPackageName); } - if (DEBUG_FOREGROUND_SERVICE) Slog.d(TAG, "Adding active: pkg=" - + aa.mPackageName + ", uid=" + aa.mUid); - active.add(aa); } } smap.removeMessages(ServiceMap.MSG_UPDATE_FOREGROUND_APPS); diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index 4213168b6ec7..89908f04a6b3 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -53,7 +53,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.ActivityManager; -import android.app.AppOpsManager; import android.app.ApplicationPackageManager; import android.app.IActivityManager; import android.content.Context; @@ -793,13 +792,13 @@ public class PermissionManagerService extends IPermissionManager.Stub { final CheckPermissionDelegate checkPermissionDelegate; synchronized (mLock) { - if (mCheckPermissionDelegate == null) { - return checkPermissionImpl(permName, pkgName, userId); - } checkPermissionDelegate = mCheckPermissionDelegate; } + if (checkPermissionDelegate == null) { + return checkPermissionImpl(permName, pkgName, userId); + } return checkPermissionDelegate.checkPermission(permName, pkgName, userId, - PermissionManagerService.this::checkPermissionImpl); + this::checkPermissionImpl); } private int checkPermissionImpl(String permName, String pkgName, int userId) { @@ -845,23 +844,7 @@ public class PermissionManagerService extends IPermissionManager.Stub { private boolean checkSinglePermissionInternal(int uid, @NonNull PermissionsState permissionsState, @NonNull String permissionName) { - boolean hasPermission = permissionsState.hasPermission(permissionName, - UserHandle.getUserId(uid)); - - if (!hasPermission && mSettings.isPermissionRuntime(permissionName)) { - final String[] packageNames = mContext.getPackageManager().getPackagesForUid(uid); - final int packageNamesSize = packageNames != null ? packageNames.length : 0; - for (int i = 0; i < packageNamesSize; i++) { - final PackageParser.Package pkg = mPackageManagerInt.getPackage(packageNames[i]); - if (pkg != null && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M - && pkg.requestedPermissions.contains(permissionName)) { - hasPermission = true; - break; - } - } - } - - if (!hasPermission) { + if (!permissionsState.hasPermission(permissionName, UserHandle.getUserId(uid))) { return false; } @@ -885,13 +868,13 @@ public class PermissionManagerService extends IPermissionManager.Stub { final CheckPermissionDelegate checkPermissionDelegate; synchronized (mLock) { - if (mCheckPermissionDelegate == null) { - return checkUidPermissionImpl(permName, uid); - } checkPermissionDelegate = mCheckPermissionDelegate; } + if (checkPermissionDelegate == null) { + return checkUidPermissionImpl(permName, uid); + } return checkPermissionDelegate.checkUidPermission(permName, uid, - PermissionManagerService.this::checkUidPermissionImpl); + this::checkUidPermissionImpl); } private int checkUidPermissionImpl(String permName, int uid) { diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 88b17936d93d..237a7712ce9b 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -23,6 +23,7 @@ import static android.app.AppOpsManager.OP_TOAST_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; import static android.content.Context.CONTEXT_RESTRICTED; import static android.content.Context.WINDOW_SERVICE; +import static android.content.pm.PackageManager.FEATURE_AUTOMOTIVE; import static android.content.pm.PackageManager.FEATURE_HDMI_CEC; import static android.content.pm.PackageManager.FEATURE_LEANBACK; import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE; @@ -385,6 +386,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { BurnInProtectionHelper mBurnInProtectionHelper; private DisplayFoldController mDisplayFoldController; AppOpsManager mAppOpsManager; + private boolean mHasFeatureAuto; private boolean mHasFeatureWatch; private boolean mHasFeatureLeanback; private boolean mHasFeatureHdmiCec; @@ -1753,6 +1755,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mDisplayManager = mContext.getSystemService(DisplayManager.class); mHasFeatureWatch = mContext.getPackageManager().hasSystemFeature(FEATURE_WATCH); mHasFeatureLeanback = mContext.getPackageManager().hasSystemFeature(FEATURE_LEANBACK); + mHasFeatureAuto = mContext.getPackageManager().hasSystemFeature(FEATURE_AUTOMOTIVE); mHasFeatureHdmiCec = mContext.getPackageManager().hasSystemFeature(FEATURE_HDMI_CEC); mAccessibilityShortcutController = new AccessibilityShortcutController(mContext, new Handler(), mCurrentUserId); @@ -5222,7 +5225,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { awakenDreams(); } - if (!isUserSetupComplete()) { + if (!mHasFeatureAuto && !isUserSetupComplete()) { Slog.i(TAG, "Not going home because user setup is in progress."); return; } diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index e54daf28677f..976fd52f17e5 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -90,7 +90,6 @@ import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE; import static android.view.WindowManager.TRANSIT_TASK_CLOSE; import static com.android.server.am.ActivityRecordProto.APP_WINDOW_TOKEN; -import static com.android.server.am.ActivityRecordProto.CONFIGURATION_CONTAINER; import static com.android.server.am.ActivityRecordProto.FRONT_OF_TASK; import static com.android.server.am.ActivityRecordProto.IDENTIFIER; import static com.android.server.am.ActivityRecordProto.PROC_ID; @@ -145,9 +144,6 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLAS import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_FREE_RESIZE; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_WINDOWING_MODE_RESIZE; -import static com.android.server.wm.IdentifierProto.HASH_CODE; -import static com.android.server.wm.IdentifierProto.TITLE; -import static com.android.server.wm.IdentifierProto.USER_ID; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_ADD_REMOVE; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_ORIENTATION; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_STARTING_WINDOW; @@ -1578,7 +1574,7 @@ final class ActivityRecord extends AppWindowToken { final TaskRecord task = getTaskRecord(); EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY, mUserId, System.identityHashCode(this), - task.taskId, shortComponentName, reason); + task.mTaskId, shortComponentName, reason); final ArrayList<ActivityRecord> activities = task.mActivities; final int index = activities.indexOf(this); if (index < (activities.size() - 1)) { @@ -1838,7 +1834,7 @@ final class ActivityRecord extends AppWindowToken { } EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY, mUserId, - System.identityHashCode(this), getTaskRecord().taskId, shortComponentName, reason); + System.identityHashCode(this), getTaskRecord().mTaskId, shortComponentName, reason); boolean removedFromHistory = false; @@ -1976,7 +1972,7 @@ final class ActivityRecord extends AppWindowToken { // work. // TODO: If the callers to removeTask() changes such that we have multiple places // where we are destroying the task, move this back into removeTask() - mStackSupervisor.removeTaskByIdLocked(task.taskId, false /* killProcess */, + mStackSupervisor.removeTaskByIdLocked(task.mTaskId, false /* killProcess */, !REMOVE_FROM_RECENTS, reason); } @@ -2090,7 +2086,7 @@ final class ActivityRecord extends AppWindowToken { final String strData = data != null ? data.toSafeString() : null; EventLog.writeEvent(tag, - mUserId, System.identityHashCode(this), task.taskId, + mUserId, System.identityHashCode(this), task.mTaskId, shortComponentName, intent.getAction(), intent.getType(), strData, intent.getFlags()); } @@ -3244,7 +3240,7 @@ final class ActivityRecord extends AppWindowToken { || (onlyRoot && activityNdx > task.findRootIndex(true /* effectiveRoot */))) { return INVALID_TASK_ID; } - return task.taskId; + return task.mTaskId; } static ActivityRecord isInStackLocked(IBinder token) { @@ -3299,8 +3295,8 @@ final class ActivityRecord extends AppWindowToken { Bitmap icon; if (_taskDescription.getIconFilename() == null && (icon = _taskDescription.getIcon()) != null) { - final String iconFilename = createImageFilename(createTime, task.taskId); - final File iconFile = new File(TaskPersister.getUserImagesDir(task.userId), + final String iconFilename = createImageFilename(createTime, task.mTaskId); + final File iconFile = new File(TaskPersister.getUserImagesDir(task.mUserId), iconFilename); final String iconFilePath = iconFile.getAbsolutePath(); mAtmService.getRecentTasks().saveImage(icon, iconFilePath); @@ -3359,7 +3355,7 @@ final class ActivityRecord extends AppWindowToken { void setRequestedOrientation(int requestedOrientation) { setOrientation(requestedOrientation, mayFreezeScreenLocked()); mAtmService.getTaskChangeNotificationController().notifyActivityRequestedOrientationChanged( - task.taskId, requestedOrientation); + task.mTaskId, requestedOrientation); } private void setOrientation(int requestedOrientation, boolean freezeScreenIfNeeded) { @@ -4065,7 +4061,7 @@ final class ActivityRecord extends AppWindowToken { + " preserveWindow=" + preserveWindow); EventLog.writeEvent(andResume ? AM_RELAUNCH_RESUME_ACTIVITY : AM_RELAUNCH_ACTIVITY, mUserId, System.identityHashCode(this), - task.taskId, shortComponentName); + task.mTaskId, shortComponentName); startFreezingScreenLocked(0); @@ -4400,7 +4396,7 @@ final class ActivityRecord extends AppWindowToken { @Override public String toString() { if (stringName != null) { - return stringName + " t" + (task == null ? INVALID_TASK_ID : task.taskId) + + return stringName + " t" + (task == null ? INVALID_TASK_ID : task.mTaskId) + (finishing ? " f}" : "") + (mIsExiting ? " mIsExiting=" : "") + "}"; } StringBuilder sb = new StringBuilder(128); diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 24f58f19294e..595925442053 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -775,7 +775,7 @@ class ActivityStack extends ConfigurationContainer { // multi-window mode. final String packageName = topActivity.info.applicationInfo.packageName; mService.getTaskChangeNotificationController().notifyActivityForcedResizable( - topTask.taskId, FORCED_RESIZEABLE_REASON_SPLIT_SCREEN, packageName); + topTask.mTaskId, FORCED_RESIZEABLE_REASON_SPLIT_SCREEN, packageName); } mService.deferWindowLayout(); @@ -1114,7 +1114,7 @@ class ActivityStack extends ConfigurationContainer { final ActivityRecord topRunningActivityLocked(IBinder token, int taskId) { for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { TaskRecord task = mTaskHistory.get(taskNdx); - if (task.taskId == taskId) { + if (task.mTaskId == taskId) { continue; } ArrayList<ActivityRecord> activities = task.mActivities; @@ -1150,7 +1150,7 @@ class ActivityStack extends ConfigurationContainer { TaskRecord taskForIdLocked(int id) { for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { final TaskRecord task = mTaskHistory.get(taskNdx); - if (task.taskId == id) { + if (task.mTaskId == id) { return task; } } @@ -1345,7 +1345,7 @@ class ActivityStack extends ConfigurationContainer { if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": voice session"); continue; } - if (task.userId != userId) { + if (task.mUserId != userId) { // Looking for a different task. if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": different user"); continue; @@ -2863,7 +2863,7 @@ class ActivityStack extends ConfigurationContainer { next.notifyAppResumed(next.stopped); EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY, next.mUserId, - System.identityHashCode(next), next.getTaskRecord().taskId, + System.identityHashCode(next), next.getTaskRecord().mTaskId, next.shortComponentName); next.sleeping = false; @@ -2973,7 +2973,7 @@ class ActivityStack extends ConfigurationContainer { // The task can't be shown, put non-current user tasks below current user tasks. while (maxPosition > 0) { final TaskRecord tmpTask = mTaskHistory.get(maxPosition - 1); - if (!mStackSupervisor.isCurrentProfileLocked(tmpTask.userId) + if (!mStackSupervisor.isCurrentProfileLocked(tmpTask.mUserId) || tmpTask.topRunningActivityLocked() == null) { break; } @@ -3026,7 +3026,7 @@ class ActivityStack extends ConfigurationContainer { void startActivityLocked(ActivityRecord r, ActivityRecord focusedTopActivity, boolean newTask, boolean keepCurTransition, ActivityOptions options) { TaskRecord rTask = r.getTaskRecord(); - final int taskId = rTask.taskId; + final int taskId = rTask.mTaskId; final boolean allowMoveToFront = options == null || !options.getAvoidMoveToFront(); // mLaunchTaskBehind tasks get placed at the back of the task stack. if (!r.mLaunchTaskBehind && allowMoveToFront @@ -4098,7 +4098,7 @@ class ActivityStack extends ConfigurationContainer { Slog.w(TAG, "Force removing " + r + ": app died, no saved state"); EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY, r.mUserId, System.identityHashCode(r), - r.getTaskRecord().taskId, r.shortComponentName, + r.getTaskRecord().mTaskId, r.shortComponentName, "proc died without state saved"); } } else { @@ -4223,7 +4223,7 @@ class ActivityStack extends ConfigurationContainer { } mRootActivityContainer.resumeFocusedStacksTopActivities(); - EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, tr.userId, tr.taskId); + EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, tr.mUserId, tr.mTaskId); mService.getTaskChangeNotificationController().notifyTaskMovedToFront(tr.getTaskInfo()); } finally { getDisplay().continueUpdateImeTarget(); @@ -4520,7 +4520,7 @@ class ActivityStack extends ConfigurationContainer { continue; } if (task.effectiveUid != callingUid) { - if (task.userId != userId && !crossUser && !profileIds.contains(task.userId)) { + if (task.mUserId != userId && !crossUser && !profileIds.contains(task.mUserId)) { // Skip if the caller does not have cross user permission or cannot access // the task's profile continue; @@ -4545,7 +4545,7 @@ class ActivityStack extends ConfigurationContainer { // For the focused stack top task, update the last stack active time so that it can // be used to determine the order of the tasks (it may not be set for newly created // tasks) - task.lastActiveTime = SystemClock.elapsedRealtime(); + task.touchActiveTime(); topTask = false; } tasksOut.add(task); @@ -4654,7 +4654,7 @@ class ActivityStack extends ConfigurationContainer { if (needSep) { pw.println(""); } - pw.println(prefix + "Task id #" + task.taskId); + pw.println(prefix + "Task id #" + task.mTaskId); pw.println(prefix + "mBounds=" + task.getRequestedOverrideBounds()); pw.println(prefix + "mMinWidth=" + task.mMinWidth); pw.println(prefix + "mMinHeight=" + task.mMinHeight); @@ -4732,7 +4732,7 @@ class ActivityStack extends ConfigurationContainer { final boolean removed = mTaskHistory.remove(task); if (removed) { - EventLog.writeEvent(EventLogTags.AM_REMOVE_TASK, task.taskId, getStackId()); + EventLog.writeEvent(EventLogTags.AM_REMOVE_TASK, task.mTaskId, getStackId()); } removeActivitiesFromLRUList(task); @@ -4884,7 +4884,7 @@ class ActivityStack extends ConfigurationContainer { mStackSupervisor.scheduleUpdatePictureInPictureModeIfNeeded(task, prevStack); } else if (task.voiceSession != null) { try { - task.voiceSession.taskStarted(task.intent, task.taskId); + task.voiceSession.taskStarted(task.intent, task.mTaskId); } catch (RemoteException e) { } } diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java index 3dff51d47f21..f1284d81bfbf 100644 --- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java @@ -821,7 +821,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { + " with results=" + results + " newIntents=" + newIntents + " andResume=" + andResume); EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, r.mUserId, - System.identityHashCode(r), task.taskId, r.shortComponentName); + System.identityHashCode(r), task.mTaskId, r.shortComponentName); if (r.isActivityTypeHome()) { // Home process is the root process of the task. updateHomeProcess(task.mActivities.get(0).app); @@ -1765,7 +1765,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { moveTasksToFullscreenStackLocked(stack, !ON_TOP); } else { for (int i = tasks.size() - 1; i >= 0; i--) { - removeTaskByIdLocked(tasks.get(i).taskId, true /* killProcess */, + removeTaskByIdLocked(tasks.get(i).mTaskId, true /* killProcess */, REMOVE_FROM_RECENTS, "remove-stack"); } } @@ -1817,7 +1817,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { // Find any running services associated with this app and stop if needed. final Message msg = PooledLambda.obtainMessage(ActivityManagerInternal::cleanUpServices, - mService.mAmInternal, tr.userId, component, new Intent(tr.getBaseIntent())); + mService.mAmInternal, tr.mUserId, component, new Intent(tr.getBaseIntent())); mService.mH.sendMessage(msg); if (!killProcess) { @@ -1834,7 +1834,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { SparseArray<WindowProcessController> uids = pmap.valueAt(i); for (int j = 0; j < uids.size(); j++) { WindowProcessController proc = uids.valueAt(j); - if (proc.mUserId != tr.userId) { + if (proc.mUserId != tr.mUserId) { // Don't kill process for a different user. continue; } @@ -1916,7 +1916,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { if (wasTrimmed) { // Task was trimmed from the recent tasks list -- remove the active task record as well // since the user won't really be able to go back to it - removeTaskByIdLocked(task.taskId, killProcess, false /* removeFromRecents */, + removeTaskByIdLocked(task.mTaskId, killProcess, false /* removeFromRecents */, "recent-task-trimmed"); } task.removedFromRecents(); @@ -2477,7 +2477,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { return; } mService.getTaskChangeNotificationController().notifyActivityForcedResizable( - task.taskId, reason, topActivity.info.applicationInfo.packageName); + task.mTaskId, reason, topActivity.info.applicationInfo.packageName); } void activityRelaunchedLocked(IBinder token) { @@ -2699,7 +2699,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { * @param task The task to put into resizing mode */ void setResizingDuringAnimation(TaskRecord task) { - mResizingTasksDuringAnimation.add(task.taskId); + mResizingTasksDuringAnimation.add(task.mTaskId); task.setTaskDockedResizing(true); } @@ -2761,7 +2761,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { // If the user must confirm credentials (e.g. when first launching a work app and the // Work Challenge is present) let startActivityInPackage handle the intercepting. - if (!mService.mAmInternal.shouldConfirmCredentials(task.userId) + if (!mService.mAmInternal.shouldConfirmCredentials(task.mUserId) && task.getRootActivity() != null) { final ActivityRecord targetActivity = task.getTopActivity(); @@ -2770,7 +2770,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { mActivityMetricsLogger.notifyActivityLaunching(task.intent); try { mService.moveTaskToFrontLocked(null /* appThread */, null /* callingPackage */, - task.taskId, 0, options, true /* fromRecents */); + task.mTaskId, 0, options, true /* fromRecents */); // Apply options to prevent pendingOptions be taken by client to make sure // the override pending app transition will be applied immediately. targetActivity.applyOptionsLocked(); @@ -2787,7 +2787,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { callingPackage = task.mCallingPackage; intent = task.intent; intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY); - userId = task.userId; + userId = task.mUserId; return mService.getActivityStartController().startActivityInPackage( task.mCallingUid, callingPid, callingUid, callingPackage, intent, null, null, null, 0, 0, options, userId, task, "startActivityFromRecents", diff --git a/services/core/java/com/android/server/wm/ActivityStartInterceptor.java b/services/core/java/com/android/server/wm/ActivityStartInterceptor.java index cc69b5a7205f..effd154a6aa0 100644 --- a/services/core/java/com/android/server/wm/ActivityStartInterceptor.java +++ b/services/core/java/com/android/server/wm/ActivityStartInterceptor.java @@ -274,7 +274,7 @@ class ActivityStartInterceptor { // ConfirmCredentials intent and unassign it, as otherwise the task will move to // front even if ConfirmCredentials is cancelled. if (mInTask != null) { - mIntent.putExtra(EXTRA_TASK_ID, mInTask.taskId); + mIntent.putExtra(EXTRA_TASK_ID, mInTask.mTaskId); mInTask = null; } if (mActivityOptions == null) { diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 38e5e3e6beb5..939789307333 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1557,7 +1557,7 @@ class ActivityStarter { ); if (newTask) { EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, mStartActivity.mUserId, - mStartActivity.getTaskRecord().taskId); + mStartActivity.getTaskRecord().mTaskId); } mStartActivity.logStartActivity( EventLogTags.AM_CREATE_ACTIVITY, mStartActivity.getTaskRecord()); diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 299ab8a538ce..750fc6832627 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -1618,7 +1618,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { // because we don't support returning them across task boundaries. Also, to // keep backwards compatibility we remove the task from recents when finishing // task with root activity. - res = mStackSupervisor.removeTaskByIdLocked(tr.taskId, false /* killProcess */, + res = mStackSupervisor.removeTaskByIdLocked(tr.mTaskId, false /* killProcess */, finishWithRootActivity, "finish-activity"); if (!res) { Slog.i(TAG, "Removing task failed to finish activity"); @@ -2233,7 +2233,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { final TaskRecord tr = mRootActivityContainer.anyTaskForId(id, MATCH_TASK_IN_STACKS_OR_RECENT_TASKS); if (tr != null) { - return tr.lastTaskDescription; + return tr.mTaskDescription; } } return null; @@ -3032,7 +3032,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } if (structure != null) { // Pre-fill the task/activity component for all assist data receivers - structure.setTaskId(pae.activity.getTaskRecord().taskId); + structure.setTaskId(pae.activity.getTaskRecord().mTaskId); structure.setActivityComponent(pae.activity.mActivityComponent); structure.setHomeActivity(pae.isHome); } @@ -3059,7 +3059,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { // Caller wants result sent back to them. sendBundle = new Bundle(); sendBundle.putInt(ActivityTaskManagerInternal.ASSIST_TASK_ID, - pae.activity.getTaskRecord().taskId); + pae.activity.getTaskRecord().mTaskId); sendBundle.putBinder(ActivityTaskManagerInternal.ASSIST_ACTIVITY_ID, pae.activity.assistToken); sendBundle.putBundle(ASSIST_KEY_DATA, pae.extras); @@ -3155,11 +3155,11 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { stack.removeTask(task, "addAppTask", REMOVE_TASK_MODE_DESTROYING); return INVALID_TASK_ID; } - task.lastTaskDescription.copyFrom(description); + task.mTaskDescription.copyFrom(description); // TODO: Send the thumbnail to WM to store it. - return task.taskId; + return task.mTaskId; } } finally { Binder.restoreCallingIdentity(callingIdent); @@ -4967,8 +4967,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { if (lastTask != task) { lastTask = task; pw.print("TASK "); pw.print(lastTask.affinity); - pw.print(" id="); pw.print(lastTask.taskId); - pw.print(" userId="); pw.println(lastTask.userId); + pw.print(" id="); pw.print(lastTask.mTaskId); + pw.print(" userId="); pw.println(lastTask.mUserId); if (dumpAll) { lastTask.dump(pw, " "); } diff --git a/services/core/java/com/android/server/wm/LaunchParamsPersister.java b/services/core/java/com/android/server/wm/LaunchParamsPersister.java index d364a3765c22..013607e65367 100644 --- a/services/core/java/com/android/server/wm/LaunchParamsPersister.java +++ b/services/core/java/com/android/server/wm/LaunchParamsPersister.java @@ -198,7 +198,7 @@ class LaunchParamsPersister { void saveTask(TaskRecord task) { final ComponentName name = task.realActivity; - final int userId = task.userId; + final int userId = task.mUserId; PersistableLaunchParams params; ArrayMap<ComponentName, PersistableLaunchParams> map = mMap.get(userId); if (map == null) { @@ -247,7 +247,7 @@ class LaunchParamsPersister { void getLaunchParams(TaskRecord task, ActivityRecord activity, LaunchParams outParams) { final ComponentName name = task != null ? task.realActivity : activity.mActivityComponent; - final int userId = task != null ? task.userId : activity.mUserId; + final int userId = task != null ? task.mUserId : activity.mUserId; outParams.reset(); Map<ComponentName, PersistableLaunchParams> map = mMap.get(userId); diff --git a/services/core/java/com/android/server/wm/LockTaskController.java b/services/core/java/com/android/server/wm/LockTaskController.java index b30da5e156e2..dc45686a1359 100644 --- a/services/core/java/com/android/server/wm/LockTaskController.java +++ b/services/core/java/com/android/server/wm/LockTaskController.java @@ -317,12 +317,12 @@ public class LockTaskController { } // Allow recents activity if enabled by policy - if (task.isActivityTypeRecents() && isRecentsAllowed(task.userId)) { + if (task.isActivityTypeRecents() && isRecentsAllowed(task.mUserId)) { return false; } // Allow emergency calling when the device is protected by a locked keyguard - if (isKeyguardAllowed(task.userId) && isEmergencyCallTask(task)) { + if (isKeyguardAllowed(task.mUserId) && isEmergencyCallTask(task)) { return false; } @@ -474,7 +474,7 @@ public class LockTaskController { if (mLockTaskModeTasks.isEmpty()) { if (DEBUG_LOCKTASK) Slog.d(TAG_LOCKTASK, "removeLockedTask: task=" + task + " last task, reverting locktask mode. Callers=" + Debug.getCallers(3)); - mHandler.post(() -> performStopLockTask(task.userId)); + mHandler.post(() -> performStopLockTask(task.mUserId)); } } @@ -537,7 +537,7 @@ public class LockTaskController { StatusBarManagerInternal statusBarManager = LocalServices.getService( StatusBarManagerInternal.class); if (statusBarManager != null) { - statusBarManager.showScreenPinningRequest(task.taskId); + statusBarManager.showScreenPinningRequest(task.mTaskId); } return; } @@ -570,11 +570,11 @@ public class LockTaskController { final Intent taskIntent = task.intent; if (mLockTaskModeTasks.isEmpty() && taskIntent != null) { - mSupervisor.mRecentTasks.onLockTaskModeStateChanged(lockTaskModeState, task.userId); + mSupervisor.mRecentTasks.onLockTaskModeStateChanged(lockTaskModeState, task.mUserId); // Start lock task on the handler thread mHandler.post(() -> performStartLockTask( taskIntent.getComponent().getPackageName(), - task.userId, + task.mUserId, lockTaskModeState)); } if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "setLockTaskMode: Locking to " + task + @@ -640,7 +640,7 @@ public class LockTaskController { || lockedTask.mLockTaskAuth == LOCK_TASK_AUTH_WHITELISTED; if (mLockTaskModeState != LOCK_TASK_MODE_LOCKED - || lockedTask.userId != userId + || lockedTask.mUserId != userId || !wasWhitelisted || isWhitelisted) { continue; } @@ -704,7 +704,7 @@ public class LockTaskController { } mLockTaskFeatures.put(userId, flags); - if (!mLockTaskModeTasks.isEmpty() && userId == mLockTaskModeTasks.get(0).userId) { + if (!mLockTaskModeTasks.isEmpty() && userId == mLockTaskModeTasks.get(0).mUserId) { mHandler.post(() -> { if (mLockTaskModeState == LOCK_TASK_MODE_LOCKED) { setStatusBarState(mLockTaskModeState, userId); diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index fb6b5da87f2d..71696778f891 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -120,7 +120,7 @@ class RecentTasks { // Comparator to sort by taskId private static final Comparator<TaskRecord> TASK_ID_COMPARATOR = - (lhs, rhs) -> rhs.taskId - lhs.taskId; + (lhs, rhs) -> rhs.mTaskId - lhs.mTaskId; // Placeholder variables to keep track of activities/apps that are no longer avialble while // iterating through the recents list @@ -272,9 +272,14 @@ class RecentTasks { * app, or a timeout occurs. */ void setFreezeTaskListReordering() { + // Only fire the callback once per quickswitch session, not on every individual switch + if (!mFreezeTaskListReordering) { + mTaskNotificationController.notifyTaskListFrozen(true); + mFreezeTaskListReordering = true; + } + // Always update the reordering time when this is called to ensure that the timeout // is reset - mFreezeTaskListReordering = true; mService.mH.removeCallbacks(mResetFreezeTaskListOnTimeoutRunnable); mService.mH.postDelayed(mResetFreezeTaskListOnTimeoutRunnable, mFreezeTaskListTimeoutMs); } @@ -302,6 +307,7 @@ class RecentTasks { trimInactiveRecentTasks(); mTaskNotificationController.notifyTaskStackChanged(); + mTaskNotificationController.notifyTaskListFrozen(false); } /** @@ -458,8 +464,8 @@ class RecentTasks { // Check if any tasks are added before recents is loaded final SparseBooleanArray preaddedTasks = new SparseBooleanArray(); for (final TaskRecord task : mTasks) { - if (task.userId == userId && shouldPersistTaskLocked(task)) { - preaddedTasks.put(task.taskId, true); + if (task.mUserId == userId && shouldPersistTaskLocked(task)) { + preaddedTasks.put(task.mTaskId, true); } } @@ -527,12 +533,12 @@ class RecentTasks { if (shouldPersistTaskLocked(task)) { // Set of persisted taskIds for task.userId should not be null here // TODO Investigate why it can happen. For now initialize with an empty set - if (mPersistedTaskIds.get(task.userId) == null) { - Slog.wtf(TAG, "No task ids found for userId " + task.userId + ". task=" + task + if (mPersistedTaskIds.get(task.mUserId) == null) { + Slog.wtf(TAG, "No task ids found for userId " + task.mUserId + ". task=" + task + " mPersistedTaskIds=" + mPersistedTaskIds); - mPersistedTaskIds.put(task.userId, new SparseBooleanArray()); + mPersistedTaskIds.put(task.mUserId, new SparseBooleanArray()); } - mPersistedTaskIds.get(task.userId).put(task.taskId, true); + mPersistedTaskIds.get(task.mUserId).put(task.mTaskId, true); } } } @@ -608,7 +614,7 @@ class RecentTasks { for (int i = mTasks.size() - 1; i >= 0; --i) { TaskRecord tr = mTasks.get(i); - if (tr.userId == userId) { + if (tr.mUserId == userId) { if(DEBUG_TASKS) Slog.i(TAG_TASKS, "remove RecentTask " + tr + " when finishing user" + userId); remove(tr); @@ -622,11 +628,11 @@ class RecentTasks { final TaskRecord tr = mTasks.get(i); if (tr.realActivity != null && packageNames.contains(tr.realActivity.getPackageName()) - && tr.userId == userId + && tr.mUserId == userId && tr.realActivitySuspended != suspended) { tr.realActivitySuspended = suspended; if (suspended) { - mSupervisor.removeTaskByIdLocked(tr.taskId, false, + mSupervisor.removeTaskByIdLocked(tr.mTaskId, false, REMOVE_FROM_RECENTS, "suspended-package"); } notifyTaskPersisterLocked(tr, false); @@ -640,7 +646,7 @@ class RecentTasks { } for (int i = mTasks.size() - 1; i >= 0; --i) { final TaskRecord tr = mTasks.get(i); - if (tr.userId == userId && !mService.getLockTaskController().isTaskWhitelisted(tr)) { + if (tr.mUserId == userId && !mService.getLockTaskController().isTaskWhitelisted(tr)) { remove(tr); } } @@ -651,10 +657,10 @@ class RecentTasks { final TaskRecord tr = mTasks.get(i); final String taskPackageName = tr.getBaseIntent().getComponent().getPackageName(); - if (tr.userId != userId) continue; + if (tr.mUserId != userId) continue; if (!taskPackageName.equals(packageName)) continue; - mSupervisor.removeTaskByIdLocked(tr.taskId, true, REMOVE_FROM_RECENTS, + mSupervisor.removeTaskByIdLocked(tr.mTaskId, true, REMOVE_FROM_RECENTS, "remove-package-task"); } } @@ -663,7 +669,7 @@ class RecentTasks { Set<Integer> profileIds = getProfileIds(userId); for (int i = mTasks.size() - 1; i >= 0; --i) { final TaskRecord tr = mTasks.get(i); - if (!profileIds.contains(tr.userId)) continue; + if (!profileIds.contains(tr.mUserId)) continue; if (isVisibleRecentTask(tr)) { mTasks.remove(i); notifyTaskRemoved(tr, true /* wasTrimmed */, true /* killProcess */); @@ -675,7 +681,7 @@ class RecentTasks { int userId) { for (int i = mTasks.size() - 1; i >= 0; --i) { final TaskRecord tr = mTasks.get(i); - if (userId != UserHandle.USER_ALL && tr.userId != userId) { + if (userId != UserHandle.USER_ALL && tr.mUserId != userId) { continue; } @@ -683,7 +689,7 @@ class RecentTasks { final boolean sameComponent = cn != null && cn.getPackageName().equals(packageName) && (filterByClasses == null || filterByClasses.contains(cn.getClassName())); if (sameComponent) { - mSupervisor.removeTaskByIdLocked(tr.taskId, false, + mSupervisor.removeTaskByIdLocked(tr.mTaskId, false, REMOVE_FROM_RECENTS, "disabled-package"); } } @@ -709,7 +715,7 @@ class RecentTasks { final IPackageManager pm = AppGlobals.getPackageManager(); for (int i = recentsCount - 1; i >= 0; i--) { final TaskRecord task = mTasks.get(i); - if (userId != UserHandle.USER_ALL && task.userId != userId) { + if (userId != UserHandle.USER_ALL && task.mUserId != userId) { // Only look at tasks for the user ID of interest. continue; } @@ -826,7 +832,7 @@ class RecentTasks { if (intent == null || !callingPackage.equals(intent.getComponent().getPackageName())) { continue; } - AppTaskImpl taskImpl = new AppTaskImpl(mService, tr.taskId, callingUid); + AppTaskImpl taskImpl = new AppTaskImpl(mService, tr.mTaskId, callingUid); list.add(taskImpl.asBinder()); } return list; @@ -908,7 +914,7 @@ class RecentTasks { } // Only add calling user or related users recent tasks - if (!includedUsers.contains(Integer.valueOf(tr.userId))) { + if (!includedUsers.contains(Integer.valueOf(tr.mUserId))) { if (DEBUG_RECENTS) Slog.d(TAG_RECENTS, "Skipping, not user: " + tr); continue; } @@ -972,7 +978,7 @@ class RecentTasks { if ((task.isPersistable || task.inRecents) && (stack == null || !stack.isHomeOrRecentsStack())) { if (TaskPersister.DEBUG) Slog.d(TAG, "adding to persistentTaskIds task=" + task); - persistentTaskIds.add(task.taskId); + persistentTaskIds.add(task.mTaskId); } else { if (TaskPersister.DEBUG) Slog.d(TAG, "omitting from persistentTaskIds task=" + task); @@ -997,7 +1003,7 @@ class RecentTasks { if (isVisibleRecentTask(tr)) { numVisibleTasks++; if (isInVisibleRange(tr, i, numVisibleTasks, false /* skipExcludedCheck */)) { - res.put(tr.taskId, true); + res.put(tr.mTaskId, true); } } } @@ -1011,7 +1017,7 @@ class RecentTasks { final int recentsCount = mTasks.size(); for (int i = 0; i < recentsCount; i++) { TaskRecord tr = mTasks.get(i); - if (tr.taskId == id) { + if (tr.mTaskId == id) { return tr; } } @@ -1024,7 +1030,7 @@ class RecentTasks { void add(TaskRecord task) { if (DEBUG_RECENTS_TRIM_TASKS) Slog.d(TAG, "add: task=" + task); - final boolean isAffiliated = task.mAffiliatedTaskId != task.taskId + final boolean isAffiliated = task.mAffiliatedTaskId != task.mTaskId || task.mNextAffiliateTaskId != INVALID_TASK_ID || task.mPrevAffiliateTaskId != INVALID_TASK_ID; @@ -1138,7 +1144,7 @@ class RecentTasks { if (needAffiliationFix) { if (DEBUG_RECENTS) Slog.d(TAG_RECENTS, "addRecent: regrouping affiliations"); - cleanupLocked(task.userId); + cleanupLocked(task.mUserId); } // Trim the set of tasks to the active set @@ -1248,13 +1254,13 @@ class RecentTasks { if (DEBUG_RECENTS_TRIM_TASKS) Slog.d(TAG, "isActiveRecentTask: task=" + task + " globalMax=" + mGlobalMaxNumTasks); - if (quietProfileUserIds.get(task.userId)) { + if (quietProfileUserIds.get(task.mUserId)) { // Quiet profile user's tasks are never active if (DEBUG_RECENTS_TRIM_TASKS) Slog.d(TAG, "\tisQuietProfileTask=true"); return false; } - if (task.mAffiliatedTaskId != INVALID_TASK_ID && task.mAffiliatedTaskId != task.taskId) { + if (task.mAffiliatedTaskId != INVALID_TASK_ID && task.mAffiliatedTaskId != task.mTaskId) { // Keep the task active if its affiliated task is also active final TaskRecord affiliatedTask = getTask(task.mAffiliatedTaskId); if (affiliatedTask != null) { @@ -1430,7 +1436,7 @@ class RecentTasks { final TaskRecord tr = mTasks.get(i); if (task != tr) { if (!hasCompatibleActivityTypeAndWindowingMode(task, tr) - || task.userId != tr.userId) { + || task.mUserId != tr.mUserId) { continue; } final Intent trIntent = tr.intent; @@ -1485,7 +1491,7 @@ class RecentTasks { final int affiliateId = startTask.mAffiliatedTaskId; // Quick identification of isolated tasks. I.e. those not launched behind. - if (startTask.taskId == affiliateId && startTask.mPrevAffiliate == null && + if (startTask.mTaskId == affiliateId && startTask.mPrevAffiliate == null && startTask.mNextAffiliate == null) { // There is still a slim chance that there are other tasks that point to this task // and that the chain is so messed up that this task no longer points to them but @@ -1581,7 +1587,7 @@ class RecentTasks { } else { // Verify middle of the chain's next points back to the one before. if (cur.mNextAffiliate != prev - || cur.mNextAffiliateTaskId != prev.taskId) { + || cur.mNextAffiliateTaskId != prev.mTaskId) { Slog.wtf(TAG, "Bad chain @" + endIndex + ": middle task " + cur + " @" + endIndex + " has bad next affiliate " diff --git a/services/core/java/com/android/server/wm/RecentsAnimation.java b/services/core/java/com/android/server/wm/RecentsAnimation.java index 0075c15cbca5..062cdc5b2b60 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimation.java +++ b/services/core/java/com/android/server/wm/RecentsAnimation.java @@ -492,7 +492,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks, for (int i = targetStack.getChildCount() - 1; i >= 0; i--) { final TaskRecord task = targetStack.getChildAt(i); - if (task.userId == mUserId + if (task.mUserId == mUserId && task.getBaseIntent().getComponent().equals(mTargetIntent.getComponent())) { return task.getTopActivity(); } diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java index 8a47c5aa81a3..d523be8fd30b 100644 --- a/services/core/java/com/android/server/wm/RootActivityContainer.java +++ b/services/core/java/com/android/server/wm/RootActivityContainer.java @@ -1103,7 +1103,7 @@ class RootActivityContainer extends ConfigurationContainer } } } - return finishedTask != null ? finishedTask.taskId : INVALID_TASK_ID; + return finishedTask != null ? finishedTask.mTaskId : INVALID_TASK_ID; } boolean resumeFocusedStacksTopActivities() { @@ -1260,14 +1260,14 @@ class RootActivityContainer extends ConfigurationContainer int[] taskUserIds = new int[numTasks]; for (int i = 0; i < numTasks; ++i) { final TaskRecord task = tasks.get(i); - taskIds[i] = task.taskId; + taskIds[i] = task.mTaskId; taskNames[i] = task.origActivity != null ? task.origActivity.flattenToString() : task.realActivity != null ? task.realActivity.flattenToString() : task.getTopActivity() != null ? task.getTopActivity().packageName : "unknown"; taskBounds[i] = new Rect(); task.getWindowContainerBounds(taskBounds[i]); - taskUserIds[i] = task.userId; + taskUserIds[i] = task.mUserId; } info.taskIds = taskIds; info.taskNames = taskNames; @@ -2103,7 +2103,7 @@ class RootActivityContainer extends ConfigurationContainer // picker for personal files, opened by a work app, should still get locked. if (taskTopActivityIsUser(task, userId)) { mService.getTaskChangeNotificationController().notifyTaskProfileLocked( - task.taskId, userId); + task.mTaskId, userId); } } } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 2ad91029212f..42fb3319d8e7 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -67,7 +67,9 @@ class Task extends WindowContainer<AppWindowToken> implements ConfigurationConta // TODO: Track parent marks like this in WindowContainer. TaskStack mStack; + /* Unique identifier for this task. */ final int mTaskId; + /* User for which this task was created. */ final int mUserId; private boolean mDeferRemoval = false; @@ -101,6 +103,8 @@ class Task extends WindowContainer<AppWindowToken> implements ConfigurationConta private boolean mDragResizing; private int mDragResizeMode; + // This represents the last resolved activity values for this task + // NOTE: This value needs to be persisted with each task private TaskDescription mTaskDescription; // If set to true, the task will report that it is not in the floating diff --git a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java index 5e8831d47c12..a61c908e0f6f 100644 --- a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java +++ b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java @@ -58,6 +58,7 @@ class TaskChangeNotificationController { private static final int NOTIFY_TASK_DISPLAY_CHANGED_LISTENERS_MSG = 23; private static final int NOTIFY_TASK_LIST_UPDATED_LISTENERS_MSG = 24; private static final int NOTIFY_SINGLE_TASK_DISPLAY_EMPTY = 25; + private static final int NOTIFY_TASK_LIST_FROZEN_UNFROZEN_MSG = 26; // Delay in notifying task stack change listeners (in millis) private static final int NOTIFY_TASK_STACK_CHANGE_LISTENERS_DELAY = 100; @@ -174,6 +175,10 @@ class TaskChangeNotificationController { l.onRecentTaskListUpdated(); }; + private final TaskStackConsumer mNotifyTaskListFrozen = (l, m) -> { + l.onRecentTaskListFrozenChanged(m.arg1 != 0); + }; + @FunctionalInterface public interface TaskStackConsumer { void accept(ITaskStackListener t, Message m) throws RemoteException; @@ -265,6 +270,9 @@ class TaskChangeNotificationController { case NOTIFY_TASK_LIST_UPDATED_LISTENERS_MSG: forAllRemoteListeners(mNotifyTaskListUpdated, msg); break; + case NOTIFY_TASK_LIST_FROZEN_UNFROZEN_MSG: + forAllRemoteListeners(mNotifyTaskListFrozen, msg); + break; } } } @@ -342,7 +350,7 @@ class TaskChangeNotificationController { void notifyActivityPinned(ActivityRecord r) { mHandler.removeMessages(NOTIFY_ACTIVITY_PINNED_LISTENERS_MSG); final Message msg = mHandler.obtainMessage(NOTIFY_ACTIVITY_PINNED_LISTENERS_MSG, - r.getTaskRecord().taskId, r.getStackId(), r.packageName); + r.getTaskRecord().mTaskId, r.getStackId(), r.packageName); msg.sendingUid = r.mUserId; forAllLocalListeners(mNotifyActivityPinned, msg); msg.sendToTarget(); @@ -549,4 +557,12 @@ class TaskChangeNotificationController { forAllLocalListeners(mNotifyTaskListUpdated, msg); msg.sendToTarget(); } + + /** @see ITaskStackListener#onRecentTaskListFrozenChanged(boolean) */ + void notifyTaskListFrozen(boolean frozen) { + final Message msg = mHandler.obtainMessage(NOTIFY_TASK_LIST_FROZEN_UNFROZEN_MSG, + frozen ? 1 : 0, 0 /* unused */); + forAllLocalListeners(mNotifyTaskListFrozen, msg); + msg.sendToTarget(); + } } diff --git a/services/core/java/com/android/server/wm/TaskPersister.java b/services/core/java/com/android/server/wm/TaskPersister.java index 06bdcc04e9c8..f9a75d3d4943 100644 --- a/services/core/java/com/android/server/wm/TaskPersister.java +++ b/services/core/java/com/android/server/wm/TaskPersister.java @@ -122,7 +122,7 @@ public class TaskPersister implements PersisterQueue.Listener { mPersisterQueue.removeItems( item -> { File file = new File(item.mFilePath); - return file.getName().startsWith(Integer.toString(task.taskId)); + return file.getName().startsWith(Integer.toString(task.mTaskId)); }, ImageWriteQueueItem.class); } @@ -262,7 +262,7 @@ public class TaskPersister implements PersisterQueue.Listener { } for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) { final TaskRecord task = tasks.get(taskNdx); - if (task.taskId == taskId) { + if (task.mTaskId == taskId) { return task; } } @@ -329,14 +329,14 @@ public class TaskPersister implements PersisterQueue.Listener { // read the same thing again. // mWriteQueue.add(new TaskWriteQueueItem(task)); - final int taskId = task.taskId; + final int taskId = task.mTaskId; if (mService.mRootActivityContainer.anyTaskForId(taskId, MATCH_TASK_IN_STACKS_OR_RECENT_TASKS) != null) { // Should not happen. Slog.wtf(TAG, "Existing task with taskId " + taskId + "found"); - } else if (userId != task.userId) { + } else if (userId != task.mUserId) { // Should not happen. - Slog.wtf(TAG, "Task with userId " + task.userId + " found in " + Slog.wtf(TAG, "Task with userId " + task.mUserId + " found in " + userTasksDir.getAbsolutePath()); } else { // Looks fine. @@ -560,14 +560,14 @@ public class TaskPersister implements PersisterQueue.Listener { FileOutputStream file = null; AtomicFile atomicFile = null; try { - File userTasksDir = getUserTasksDir(task.userId); + File userTasksDir = getUserTasksDir(task.mUserId); if (!userTasksDir.isDirectory() && !userTasksDir.mkdirs()) { - Slog.e(TAG, "Failure creating tasks directory for user " + task.userId + Slog.e(TAG, "Failure creating tasks directory for user " + task.mUserId + ": " + userTasksDir + " Dropping persistence for task " + task); return; } atomicFile = new AtomicFile(new File(userTasksDir, - String.valueOf(task.taskId) + TASK_FILENAME_SUFFIX)); + String.valueOf(task.mTaskId) + TASK_FILENAME_SUFFIX)); file = atomicFile.startWrite(); file.write(stringWriter.toString().getBytes()); file.write('\n'); diff --git a/services/core/java/com/android/server/wm/TaskRecord.java b/services/core/java/com/android/server/wm/TaskRecord.java index 8b2ef7f07560..75333c728e0b 100644 --- a/services/core/java/com/android/server/wm/TaskRecord.java +++ b/services/core/java/com/android/server/wm/TaskRecord.java @@ -208,7 +208,7 @@ class TaskRecord extends ConfigurationContainer { */ private static TaskRecordFactory sTaskRecordFactory; - final int taskId; // Unique identifier for this task. + final int mTaskId; // Unique identifier for this task. String affinity; // The affinity name for this task, or null; may change identity. String rootAffinity; // Initial base affinity, or null; does not change from initial root. final IVoiceInteractionSession voiceSession; // Voice interaction session driving task @@ -234,7 +234,7 @@ class TaskRecord extends ConfigurationContainer { boolean hasBeenVisible; // Set if any activities in the task have been visible to the user. String stringName; // caching of toString() result. - int userId; // user for which this task was created + int mUserId; // user for which this task was created boolean mUserSetupComplete; // The user set-up is complete as of the last time the task activity // was changed. @@ -262,7 +262,7 @@ class TaskRecord extends ConfigurationContainer { // This represents the last resolved activity values for this task // NOTE: This value needs to be persisted with each task - TaskDescription lastTaskDescription = new TaskDescription(); + TaskDescription mTaskDescription; /** List of all activities in the task arranged in history order */ final ArrayList<ActivityRecord> mActivities; @@ -282,7 +282,7 @@ class TaskRecord extends ConfigurationContainer { /** Only used for persistable tasks, otherwise 0. The last time this task was moved. Used for * determining the order when restoring. Sign indicates whether last task movement was to front * (positive) or back (negative). Absolute value indicates time. */ - long mLastTimeMoved = System.currentTimeMillis(); + long mLastTimeMoved; /** If original intent did not allow relinquishing task identity, save that information */ private boolean mNeverRelinquishIdentity = true; @@ -304,7 +304,7 @@ class TaskRecord extends ConfigurationContainer { int mCallingUid; String mCallingPackage; - final ActivityTaskManagerService mService; + final ActivityTaskManagerService mAtmService; private final Rect mTmpStableBounds = new Rect(); private final Rect mTmpNonDecorBounds = new Rect(); @@ -342,60 +342,25 @@ class TaskRecord extends ConfigurationContainer { * Don't use constructor directly. Use {@link #create(ActivityTaskManagerService, int, * ActivityInfo, Intent, TaskDescription)} instead. */ - TaskRecord(ActivityTaskManagerService service, int _taskId, ActivityInfo info, Intent _intent, - IVoiceInteractionSession _voiceSession, IVoiceInteractor _voiceInteractor) { - mService = service; - userId = UserHandle.getUserId(info.applicationInfo.uid); - taskId = _taskId; - lastActiveTime = SystemClock.elapsedRealtime(); - mAffiliatedTaskId = _taskId; - voiceSession = _voiceSession; - voiceInteractor = _voiceInteractor; - isAvailable = true; - mActivities = new ArrayList<>(); - mCallingUid = info.applicationInfo.uid; - mCallingPackage = info.packageName; - setIntent(_intent, info); - setMinDimensions(info); - touchActiveTime(); - mService.getTaskChangeNotificationController().notifyTaskCreated(_taskId, realActivity); - } - - /** - * Don't use constructor directly. - * Use {@link #create(ActivityTaskManagerService, int, ActivityInfo, - * Intent, IVoiceInteractionSession, IVoiceInteractor)} instead. - */ - TaskRecord(ActivityTaskManagerService service, int _taskId, ActivityInfo info, Intent _intent, - TaskDescription _taskDescription) { - mService = service; - userId = UserHandle.getUserId(info.applicationInfo.uid); - taskId = _taskId; - lastActiveTime = SystemClock.elapsedRealtime(); - mAffiliatedTaskId = _taskId; - voiceSession = null; - voiceInteractor = null; - isAvailable = true; - mActivities = new ArrayList<>(); - mCallingUid = info.applicationInfo.uid; - mCallingPackage = info.packageName; - setIntent(_intent, info); - setMinDimensions(info); - - isPersistable = true; - // Clamp to [1, max]. - maxRecents = Math.min(Math.max(info.maxRecents, 1), - ActivityTaskManager.getMaxAppRecentsLimitStatic()); - - lastTaskDescription = _taskDescription; - touchActiveTime(); - mService.getTaskChangeNotificationController().notifyTaskCreated(_taskId, realActivity); - } - - /** - * Don't use constructor directly. This is only used by XML parser. - */ - TaskRecord(ActivityTaskManagerService service, int _taskId, Intent _intent, + TaskRecord(ActivityTaskManagerService atmService, int _taskId, ActivityInfo info, + Intent _intent, IVoiceInteractionSession _voiceSession, + IVoiceInteractor _voiceInteractor, TaskDescription _taskDescription) { + this(atmService, _taskId, _intent, null /*_affinityIntent*/, null /*_affinity*/, + null /*_rootAffinity*/, null /*_realActivity*/, null /*_origActivity*/, + false /*_rootWasReset*/, false /*_autoRemoveRecents*/, false /*_askedCompatMode*/, + UserHandle.getUserId(info.applicationInfo.uid), 0 /*_effectiveUid*/, + null /*_lastDescription*/, new ArrayList<>(), System.currentTimeMillis(), + true /*neverRelinquishIdentity*/, + _taskDescription != null ? _taskDescription : new TaskDescription(), + _taskId, INVALID_TASK_ID, INVALID_TASK_ID, 0 /*taskAffiliationColor*/, + info.applicationInfo.uid, info.packageName, info.resizeMode, + info.supportsPictureInPicture(), false /*_realActivitySuspended*/, + false /*userSetupComplete*/, INVALID_MIN_SIZE, INVALID_MIN_SIZE, info, + _voiceSession, _voiceInteractor); + } + + /** Don't use constructor directly. This is only used by XML parser. */ + TaskRecord(ActivityTaskManagerService atmService, int _taskId, Intent _intent, Intent _affinityIntent, String _affinity, String _rootAffinity, ComponentName _realActivity, ComponentName _origActivity, boolean _rootWasReset, boolean _autoRemoveRecents, boolean _askedCompatMode, int _userId, @@ -404,15 +369,15 @@ class TaskRecord extends ConfigurationContainer { TaskDescription _lastTaskDescription, int taskAffiliation, int prevTaskId, int nextTaskId, int taskAffiliationColor, int callingUid, String callingPackage, int resizeMode, boolean supportsPictureInPicture, boolean _realActivitySuspended, - boolean userSetupComplete, int minWidth, int minHeight) { - mService = service; - taskId = _taskId; - intent = _intent; + boolean userSetupComplete, int minWidth, int minHeight, ActivityInfo info, + IVoiceInteractionSession _voiceSession, IVoiceInteractor _voiceInteractor) { + mAtmService = atmService; + mTaskId = _taskId; affinityIntent = _affinityIntent; affinity = _affinity; rootAffinity = _rootAffinity; - voiceSession = null; - voiceInteractor = null; + voiceSession = _voiceSession; + voiceInteractor = _voiceInteractor; realActivity = _realActivity; realActivitySuspended = _realActivitySuspended; origActivity = _origActivity; @@ -420,15 +385,15 @@ class TaskRecord extends ConfigurationContainer { isAvailable = true; autoRemoveRecents = _autoRemoveRecents; askedCompatMode = _askedCompatMode; - userId = _userId; + mUserId = _userId; mUserSetupComplete = userSetupComplete; effectiveUid = _effectiveUid; - lastActiveTime = SystemClock.elapsedRealtime(); + touchActiveTime(); lastDescription = _lastDescription; mActivities = activities; mLastTimeMoved = lastTimeMoved; mNeverRelinquishIdentity = neverRelinquishIdentity; - lastTaskDescription = _lastTaskDescription; + mTaskDescription = _lastTaskDescription; mAffiliatedTaskId = taskAffiliation; mAffiliatedTaskColor = taskAffiliationColor; mPrevAffiliateTaskId = prevTaskId; @@ -437,9 +402,15 @@ class TaskRecord extends ConfigurationContainer { mCallingPackage = callingPackage; mResizeMode = resizeMode; mSupportsPictureInPicture = supportsPictureInPicture; - mMinWidth = minWidth; - mMinHeight = minHeight; - mService.getTaskChangeNotificationController().notifyTaskCreated(_taskId, realActivity); + if (info != null) { + setIntent(_intent, info); + setMinDimensions(info); + } else { + intent = _intent; + mMinWidth = minWidth; + mMinHeight = minHeight; + } + mAtmService.getTaskChangeNotificationController().notifyTaskCreated(_taskId, realActivity); } Task getTask() { @@ -458,9 +429,9 @@ class TaskRecord extends ConfigurationContainer { if (stack == null) { throw new IllegalArgumentException("TaskRecord: invalid stack=" + mStack); } - EventLog.writeEvent(WM_TASK_CREATED, taskId, stack.mStackId); - mTask = new Task(taskId, stack, userId, mService.mWindowManager, mResizeMode, - mSupportsPictureInPicture, lastTaskDescription, this); + EventLog.writeEvent(WM_TASK_CREATED, mTaskId, stack.mStackId); + mTask = new Task(mTaskId, stack, mUserId, mAtmService.mWindowManager, mResizeMode, + mSupportsPictureInPicture, mTaskDescription, this); final int position = onTop ? POSITION_TOP : POSITION_BOTTOM; if (!mDisplayedBounds.isEmpty()) { @@ -487,14 +458,14 @@ class TaskRecord extends ConfigurationContainer { final boolean isVoiceSession = voiceSession != null; if (isVoiceSession) { try { - voiceSession.taskFinished(intent, taskId); + voiceSession.taskFinished(intent, mTaskId); } catch (RemoteException e) { } } if (autoRemoveFromRecents() || isVoiceSession) { // Task creator asked to remove this when done, or this task was a voice // interaction, so it should not remain on the recent tasks list. - mService.mStackSupervisor.mRecentTasks.remove(this); + mAtmService.mStackSupervisor.mRecentTasks.remove(this); } removeWindowContainer(); @@ -502,9 +473,9 @@ class TaskRecord extends ConfigurationContainer { @VisibleForTesting void removeWindowContainer() { - mService.getLockTaskController().clearLockedTask(this); + mAtmService.getLockTaskController().clearLockedTask(this); if (mTask == null) { - if (DEBUG_STACK) Slog.i(TAG_WM, "removeTask: could not find taskId=" + taskId); + if (DEBUG_STACK) Slog.i(TAG_WM, "removeTask: could not find taskId=" + mTaskId); return; } mTask.removeIfPossible(); @@ -514,11 +485,11 @@ class TaskRecord extends ConfigurationContainer { // default configuration the next time it launches. setBounds(null); } - mService.getTaskChangeNotificationController().notifyTaskRemoved(taskId); + mAtmService.getTaskChangeNotificationController().notifyTaskRemoved(mTaskId); } - public void onSnapshotChanged(TaskSnapshot snapshot) { - mService.getTaskChangeNotificationController().notifyTaskSnapshotChanged(taskId, snapshot); + void onSnapshotChanged(TaskSnapshot snapshot) { + mAtmService.getTaskChangeNotificationController().notifyTaskSnapshotChanged(mTaskId, snapshot); } void setResizeMode(int resizeMode) { @@ -527,13 +498,13 @@ class TaskRecord extends ConfigurationContainer { } mResizeMode = resizeMode; mTask.setResizeable(resizeMode); - mService.mRootActivityContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS); - mService.mRootActivityContainer.resumeFocusedStacksTopActivities(); + mAtmService.mRootActivityContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS); + mAtmService.mRootActivityContainer.resumeFocusedStacksTopActivities(); } void setTaskDockedResizing(boolean resizing) { if (mTask == null) { - Slog.w(TAG_WM, "setTaskDockedResizing: taskId " + taskId + " not found."); + Slog.w(TAG_WM, "setTaskDockedResizing: taskId " + mTaskId + " not found."); return; } mTask.setTaskDockedResizing(resizing); @@ -541,11 +512,11 @@ class TaskRecord extends ConfigurationContainer { // TODO: Consolidate this with the resize() method below. public void requestResize(Rect bounds, int resizeMode) { - mService.resizeTask(taskId, bounds, resizeMode); + mAtmService.resizeTask(mTaskId, bounds, resizeMode); } boolean resize(Rect bounds, int resizeMode, boolean preserveWindow, boolean deferResume) { - mService.deferWindowLayout(); + mAtmService.deferWindowLayout(); try { if (!isResizeable()) { @@ -568,7 +539,7 @@ class TaskRecord extends ConfigurationContainer { setBounds(bounds); if (!inFreeformWindowingMode()) { // re-restore the task so it can have the proper stack association. - mService.mStackSupervisor.restoreRecentTaskLocked(this, null, !ON_TOP); + mAtmService.mStackSupervisor.restoreRecentTaskLocked(this, null, !ON_TOP); } return true; } @@ -582,7 +553,7 @@ class TaskRecord extends ConfigurationContainer { // This method assumes that the task is already placed in the right stack. // we do not mess with that decision and we only do the resize! - Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "am.resizeTask_" + taskId); + Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "am.resizeTask_" + mTaskId); boolean updatedConfig = false; mTmpConfig.setTo(getResolvedOverrideConfiguration()); @@ -606,9 +577,9 @@ class TaskRecord extends ConfigurationContainer { // this won't cause tons of irrelevant windows being preserved because only // activities in this task may experience a bounds change. Configs for other // activities stay the same. - mService.mRootActivityContainer.ensureActivitiesVisible(r, 0, preserveWindow); + mAtmService.mRootActivityContainer.ensureActivitiesVisible(r, 0, preserveWindow); if (!kept) { - mService.mRootActivityContainer.resumeFocusedStacksTopActivities(); + mAtmService.mRootActivityContainer.resumeFocusedStacksTopActivities(); } } } @@ -619,7 +590,7 @@ class TaskRecord extends ConfigurationContainer { Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); return kept; } finally { - mService.continueWindowLayout(); + mAtmService.continueWindowLayout(); } } @@ -687,9 +658,9 @@ class TaskRecord extends ConfigurationContainer { boolean reparent(ActivityStack preferredStack, int position, @ReparentMoveStackMode int moveStackMode, boolean animate, boolean deferResume, boolean schedulePictureInPictureModeChange, String reason) { - final ActivityStackSupervisor supervisor = mService.mStackSupervisor; - final RootActivityContainer root = mService.mRootActivityContainer; - final WindowManagerService windowManager = mService.mWindowManager; + final ActivityStackSupervisor supervisor = mAtmService.mStackSupervisor; + final RootActivityContainer root = mAtmService.mRootActivityContainer; + final WindowManagerService windowManager = mAtmService.mWindowManager; final ActivityStack sourceStack = getStack(); final ActivityStack toStack = supervisor.getReparentTargetStack(this, preferredStack, position == MAX_VALUE); @@ -725,7 +696,7 @@ class TaskRecord extends ConfigurationContainer { windowManager.setWillReplaceWindow(topActivity.appToken, animate); } - mService.deferWindowLayout(); + mAtmService.deferWindowLayout(); boolean kept = true; try { final ActivityRecord r = topRunningActivityLocked(); @@ -764,7 +735,7 @@ class TaskRecord extends ConfigurationContainer { // Notify the voice session if required if (voiceSession != null) { try { - voiceSession.taskStarted(intent, taskId); + voiceSession.taskStarted(intent, mTaskId); } catch (RemoteException e) { } } @@ -776,7 +747,7 @@ class TaskRecord extends ConfigurationContainer { wasPaused, reason); } if (!animate) { - mService.mStackSupervisor.mNoAnimActivities.add(topActivity); + mAtmService.mStackSupervisor.mNoAnimActivities.add(topActivity); } // We might trigger a configuration change. Save the current task bounds for freezing. @@ -795,7 +766,7 @@ class TaskRecord extends ConfigurationContainer { } else if (toStackWindowingMode == WINDOWING_MODE_FREEFORM) { Rect bounds = getLaunchBounds(); if (bounds == null) { - mService.mStackSupervisor.getLaunchParamsController().layoutTask(this, null); + mAtmService.mStackSupervisor.getLaunchParamsController().layoutTask(this, null); bounds = configBounds; } kept = resize(bounds, RESIZE_MODE_FORCED, !mightReplaceWindow, deferResume); @@ -803,13 +774,13 @@ class TaskRecord extends ConfigurationContainer { if (toStackSplitScreenPrimary && moveStackMode == REPARENT_KEEP_STACK_AT_FRONT) { // Move recents to front so it is not behind home stack when going into docked // mode - mService.mStackSupervisor.moveRecentsStackToFront(reason); + mAtmService.mStackSupervisor.moveRecentsStackToFront(reason); } kept = resize(toStack.getRequestedOverrideBounds(), RESIZE_MODE_SYSTEM, !mightReplaceWindow, deferResume); } } finally { - mService.continueWindowLayout(); + mAtmService.continueWindowLayout(); } if (mightReplaceWindow) { @@ -846,7 +817,7 @@ class TaskRecord extends ConfigurationContainer { void cancelWindowTransition() { if (mTask == null) { - Slog.w(TAG_WM, "cancelWindowTransition: taskId " + taskId + " not found."); + Slog.w(TAG_WM, "cancelWindowTransition: taskId " + mTaskId + " not found."); return; } mTask.cancelTaskWindowTransition(); @@ -859,7 +830,7 @@ class TaskRecord extends ConfigurationContainer { // TODO: Move this to {@link TaskWindowContainerController} once recent tasks are more // synchronized between AM and WM. - return mService.mWindowManager.getTaskSnapshot(taskId, userId, reducedResolution, + return mAtmService.mWindowManager.getTaskSnapshot(mTaskId, mUserId, reducedResolution, restoreFromDisk); } @@ -938,9 +909,9 @@ class TaskRecord extends ConfigurationContainer { // task as having a true root activity. rootWasReset = true; } - userId = UserHandle.getUserId(info.applicationInfo.uid); - mUserSetupComplete = Settings.Secure.getIntForUser(mService.mContext.getContentResolver(), - USER_SETUP_COMPLETE, 0, userId) != 0; + mUserId = UserHandle.getUserId(info.applicationInfo.uid); + mUserSetupComplete = Settings.Secure.getIntForUser( + mAtmService.mContext.getContentResolver(), USER_SETUP_COMPLETE, 0, mUserId) != 0; if ((info.flags & ActivityInfo.FLAG_AUTO_REMOVE_FROM_RECENTS) != 0) { // If the activity itself has requested auto-remove, then just always do it. autoRemoveRecents = true; @@ -993,12 +964,12 @@ class TaskRecord extends ConfigurationContainer { void setPrevAffiliate(TaskRecord prevAffiliate) { mPrevAffiliate = prevAffiliate; - mPrevAffiliateTaskId = prevAffiliate == null ? INVALID_TASK_ID : prevAffiliate.taskId; + mPrevAffiliateTaskId = prevAffiliate == null ? INVALID_TASK_ID : prevAffiliate.mTaskId; } void setNextAffiliate(TaskRecord nextAffiliate) { mNextAffiliate = nextAffiliate; - mNextAffiliateTaskId = nextAffiliate == null ? INVALID_TASK_ID : nextAffiliate.taskId; + mNextAffiliateTaskId = nextAffiliate == null ? INVALID_TASK_ID : nextAffiliate.mTaskId; } <T extends ActivityStack> T getStack() { @@ -1061,7 +1032,7 @@ class TaskRecord extends ConfigurationContainer { @Override protected void onParentChanged() { super.onParentChanged(); - mService.mRootActivityContainer.updateUIDsPresentOnDisplay(); + mAtmService.mRootActivityContainer.updateUIDsPresentOnDisplay(); } // Close up recents linked list. @@ -1080,13 +1051,13 @@ class TaskRecord extends ConfigurationContainer { closeRecentsChain(); if (inRecents) { inRecents = false; - mService.notifyTaskPersisterLocked(this, false); + mAtmService.notifyTaskPersisterLocked(this, false); } clearRootProcess(); - mService.mWindowManager.mTaskSnapshotController.notifyTaskRemovedFromRecents( - taskId, userId); + mAtmService.mWindowManager.mTaskSnapshotController.notifyTaskRemovedFromRecents( + mTaskId, mUserId); } void setTaskToAffiliateWith(TaskRecord taskToAffiliateWith) { @@ -1235,7 +1206,7 @@ class TaskRecord extends ConfigurationContainer { boolean okToShowLocked() { // NOTE: If {@link TaskRecord#topRunningActivity} return is not null then it is // okay to show the activity when locked. - return mService.mStackSupervisor.isCurrentProfileLocked(userId) + return mAtmService.mStackSupervisor.isCurrentProfileLocked(mUserId) || topRunningActivityLocked() != null; } @@ -1324,7 +1295,7 @@ class TaskRecord extends ConfigurationContainer { updateEffectiveIntent(); if (r.isPersistable()) { - mService.notifyTaskPersisterLocked(this, false); + mAtmService.notifyTaskPersisterLocked(this, false); } if (r.getParent() != null) { @@ -1335,7 +1306,7 @@ class TaskRecord extends ConfigurationContainer { // Make sure the list of display UID whitelists is updated // now that this record is in a new task. - mService.mRootActivityContainer.updateUIDsPresentOnDisplay(); + mAtmService.mRootActivityContainer.updateUIDsPresentOnDisplay(); } /** @@ -1360,14 +1331,14 @@ class TaskRecord extends ConfigurationContainer { numFullscreen--; } if (r.isPersistable()) { - mService.notifyTaskPersisterLocked(this, false); + mAtmService.notifyTaskPersisterLocked(this, false); } if (inPinnedWindowingMode()) { // We normally notify listeners of task stack changes on pause, however pinned stack // activities are normally in the paused state so no notification will be sent there // before the activity is removed. We send it here so instead. - mService.getTaskChangeNotificationController().notifyTaskStackChanged(); + mAtmService.getTaskChangeNotificationController().notifyTaskStackChanged(); } if (mActivities.isEmpty()) { @@ -1530,10 +1501,10 @@ class TaskRecord extends ConfigurationContainer { } final String pkg = (realActivity != null) ? realActivity.getPackageName() : null; - final LockTaskController lockTaskController = mService.getLockTaskController(); + final LockTaskController lockTaskController = mAtmService.getLockTaskController(); switch (r.lockTaskLaunchMode) { case LOCK_TASK_LAUNCH_MODE_DEFAULT: - mLockTaskAuth = lockTaskController.isPackageWhitelisted(userId, pkg) + mLockTaskAuth = lockTaskController.isPackageWhitelisted(mUserId, pkg) ? LOCK_TASK_AUTH_WHITELISTED : LOCK_TASK_AUTH_PINNABLE; break; @@ -1546,7 +1517,7 @@ class TaskRecord extends ConfigurationContainer { break; case LOCK_TASK_LAUNCH_MODE_IF_WHITELISTED: - mLockTaskAuth = lockTaskController.isPackageWhitelisted(userId, pkg) + mLockTaskAuth = lockTaskController.isPackageWhitelisted(mUserId, pkg) ? LOCK_TASK_AUTH_LAUNCHABLE : LOCK_TASK_AUTH_PINNABLE; break; } @@ -1555,7 +1526,7 @@ class TaskRecord extends ConfigurationContainer { } private boolean isResizeable(boolean checkSupportsPip) { - return (mService.mForceResizableActivities || ActivityInfo.isResizeableMode(mResizeMode) + return (mAtmService.mForceResizableActivities || ActivityInfo.isResizeableMode(mResizeMode) || (checkSupportsPip && mSupportsPictureInPicture)); } @@ -1568,8 +1539,8 @@ class TaskRecord extends ConfigurationContainer { // A task can not be docked even if it is considered resizeable because it only supports // picture-in-picture mode but has a non-resizeable resizeMode return super.supportsSplitScreenWindowingMode() - && mService.mSupportsSplitScreenMultiWindow - && (mService.mForceResizableActivities + && mAtmService.mSupportsSplitScreenMultiWindow + && (mAtmService.mForceResizableActivities || (isResizeable(false /* checkSupportsPip */) && !ActivityInfo.isPreserveOrientationMode(mResizeMode))); } @@ -1582,7 +1553,7 @@ class TaskRecord extends ConfigurationContainer { * secondary display. */ boolean canBeLaunchedOnDisplay(int displayId) { - return mService.mStackSupervisor.canPlaceEntityOnDisplay(displayId, + return mAtmService.mStackSupervisor.canPlaceEntityOnDisplay(displayId, -1 /* don't check PID */, -1 /* don't check UID */, null /* activityInfo */); } @@ -1700,15 +1671,15 @@ class TaskRecord extends ConfigurationContainer { } topActivity = false; } - lastTaskDescription = new TaskDescription(label, null, iconResource, iconFilename, + mTaskDescription = new TaskDescription(label, null, iconResource, iconFilename, colorPrimary, colorBackground, statusBarColor, navigationBarColor, statusBarContrastWhenTransparent, navigationBarContrastWhenTransparent); if (mTask != null) { - mTask.setTaskDescription(lastTaskDescription); + mTask.setTaskDescription(mTaskDescription); } // Update the task affiliation color if we are the parent of the group - if (taskId == mAffiliatedTaskId) { - mAffiliatedTaskColor = lastTaskDescription.getPrimaryColor(); + if (mTaskId == mAffiliatedTaskId) { + mAffiliatedTaskColor = mTaskDescription.getPrimaryColor(); } } } @@ -1767,9 +1738,9 @@ class TaskRecord extends ConfigurationContainer { // to do this for the pinned stack as the bounds are controlled by the system. if (!inPinnedWindowingMode() && mStack != null) { final int defaultMinSizeDp = - mService.mRootActivityContainer.mDefaultMinSizeOfResizeableTaskDp; + mAtmService.mRootActivityContainer.mDefaultMinSizeOfResizeableTaskDp; final ActivityDisplay display = - mService.mRootActivityContainer.getActivityDisplay(mStack.mDisplayId); + mAtmService.mRootActivityContainer.getActivityDisplay(mStack.mDisplayId); final float density = (float) display.getConfiguration().densityDpi / DisplayMetrics.DENSITY_DEFAULT; final int defaultMinSize = (int) (defaultMinSizeDp * density); @@ -1849,7 +1820,7 @@ class TaskRecord extends ConfigurationContainer { final boolean wasInMultiWindowMode = inMultiWindowMode(); super.onConfigurationChanged(newParentConfig); if (wasInMultiWindowMode != inMultiWindowMode()) { - mService.mStackSupervisor.scheduleUpdateMultiWindowMode(this); + mAtmService.mStackSupervisor.scheduleUpdateMultiWindowMode(this); } // If the configuration supports persistent bounds (eg. Freeform), keep track of the @@ -1890,7 +1861,7 @@ class TaskRecord extends ConfigurationContainer { } // Saves the new state so that we can launch the activity at the same location. - mService.mStackSupervisor.mLaunchParamsPersister.saveTask(this); + mAtmService.mStackSupervisor.mLaunchParamsPersister.saveTask(this); } /** @@ -2293,7 +2264,7 @@ class TaskRecord extends ConfigurationContainer { if (mLastNonFullscreenBounds != null) { setBounds(mLastNonFullscreenBounds); } else { - mService.mStackSupervisor.getLaunchParamsController().layoutTask(this, null); + mAtmService.mStackSupervisor.getLaunchParamsController().layoutTask(this, null); } } else { setBounds(inStack.getRequestedOverrideBounds()); @@ -2354,9 +2325,9 @@ class TaskRecord extends ConfigurationContainer { */ void fillTaskInfo(TaskInfo info) { getNumRunningActivities(mReuseActivitiesReport); - info.userId = userId; + info.userId = mUserId; info.stackId = getStackId(); - info.taskId = taskId; + info.taskId = mTaskId; info.displayId = mStack == null ? Display.INVALID_DISPLAY : mStack.mDisplayId; info.isRunning = getTopActivity() != null; info.baseIntent = new Intent(getBaseIntent()); @@ -2370,7 +2341,7 @@ class TaskRecord extends ConfigurationContainer { info.realActivity = realActivity; info.numActivities = mReuseActivitiesReport.numActivities; info.lastActiveTime = lastActiveTime; - info.taskDescription = new ActivityManager.TaskDescription(lastTaskDescription); + info.taskDescription = new ActivityManager.TaskDescription(mTaskDescription); info.supportsSplitScreenMultiWindow = supportsSplitScreenWindowingMode(); info.resizeMode = mResizeMode; info.configuration.setTo(getConfiguration()); @@ -2386,7 +2357,7 @@ class TaskRecord extends ConfigurationContainer { } void dump(PrintWriter pw, String prefix) { - pw.print(prefix); pw.print("userId="); pw.print(userId); + pw.print(prefix); pw.print("userId="); pw.print(mUserId); pw.print(" effectiveUid="); UserHandle.formatUid(pw, effectiveUid); pw.print(" mCallingUid="); UserHandle.formatUid(pw, mCallingUid); pw.print(" mUserSetupComplete="); pw.print(mUserSetupComplete); @@ -2440,7 +2411,7 @@ class TaskRecord extends ConfigurationContainer { pw.print(" mReuseTask="); pw.print(mReuseTask); pw.print(" mLockTaskAuth="); pw.println(lockTaskAuthToString()); } - if (mAffiliatedTaskId != taskId || mPrevAffiliateTaskId != INVALID_TASK_ID + if (mAffiliatedTaskId != mTaskId || mPrevAffiliateTaskId != INVALID_TASK_ID || mPrevAffiliate != null || mNextAffiliateTaskId != INVALID_TASK_ID || mNextAffiliate != null) { pw.print(prefix); pw.print("affiliation="); pw.print(mAffiliatedTaskId); @@ -2487,7 +2458,7 @@ class TaskRecord extends ConfigurationContainer { if (stringName != null) { sb.append(stringName); sb.append(" U="); - sb.append(userId); + sb.append(mUserId); sb.append(" StackId="); sb.append(getStackId()); sb.append(" sz="); @@ -2498,7 +2469,7 @@ class TaskRecord extends ConfigurationContainer { sb.append("TaskRecord{"); sb.append(Integer.toHexString(System.identityHashCode(this))); sb.append(" #"); - sb.append(taskId); + sb.append(mTaskId); if (affinity != null) { sb.append(" A="); sb.append(affinity); @@ -2523,7 +2494,7 @@ class TaskRecord extends ConfigurationContainer { final long token = proto.start(fieldId); super.writeToProto(proto, CONFIGURATION_CONTAINER, logLevel); - proto.write(ID, taskId); + proto.write(ID, mTaskId); for (int i = mActivities.size() - 1; i >= 0; i--) { ActivityRecord activity = mActivities.get(i); activity.writeToProto(proto, ACTIVITIES); @@ -2573,7 +2544,7 @@ class TaskRecord extends ConfigurationContainer { void saveToXml(XmlSerializer out) throws IOException, XmlPullParserException { if (DEBUG_RECENTS) Slog.i(TAG_RECENTS, "Saving task=" + this); - out.attribute(null, ATTR_TASKID, String.valueOf(taskId)); + out.attribute(null, ATTR_TASKID, String.valueOf(mTaskId)); if (realActivity != null) { out.attribute(null, ATTR_REALACTIVITY, realActivity.flattenToShortString()); } @@ -2596,7 +2567,7 @@ class TaskRecord extends ConfigurationContainer { out.attribute(null, ATTR_ROOTHASRESET, String.valueOf(rootWasReset)); out.attribute(null, ATTR_AUTOREMOVERECENTS, String.valueOf(autoRemoveRecents)); out.attribute(null, ATTR_ASKEDCOMPATMODE, String.valueOf(askedCompatMode)); - out.attribute(null, ATTR_USERID, String.valueOf(userId)); + out.attribute(null, ATTR_USERID, String.valueOf(mUserId)); out.attribute(null, ATTR_USER_SETUP_COMPLETE, String.valueOf(mUserSetupComplete)); out.attribute(null, ATTR_EFFECTIVE_UID, String.valueOf(effectiveUid)); out.attribute(null, ATTR_LASTTIMEMOVED, String.valueOf(mLastTimeMoved)); @@ -2604,8 +2575,8 @@ class TaskRecord extends ConfigurationContainer { if (lastDescription != null) { out.attribute(null, ATTR_LASTDESCRIPTION, lastDescription.toString()); } - if (lastTaskDescription != null) { - lastTaskDescription.saveToXml(out); + if (mTaskDescription != null) { + mTaskDescription.saveToXml(out); } out.attribute(null, ATTR_TASK_AFFILIATION_COLOR, String.valueOf(mAffiliatedTaskColor)); out.attribute(null, ATTR_TASK_AFFILIATION, String.valueOf(mAffiliatedTaskId)); @@ -2692,13 +2663,14 @@ class TaskRecord extends ConfigurationContainer { TaskRecord create(ActivityTaskManagerService service, int taskId, ActivityInfo info, Intent intent, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) { - return new TaskRecord( - service, taskId, info, intent, voiceSession, voiceInteractor); + return new TaskRecord(service, taskId, info, intent, voiceSession, voiceInteractor, + null /*taskDescription*/); } TaskRecord create(ActivityTaskManagerService service, int taskId, ActivityInfo info, Intent intent, TaskDescription taskDescription) { - return new TaskRecord(service, taskId, info, intent, taskDescription); + return new TaskRecord(service, taskId, info, intent, null /*voiceSession*/, + null /*voiceInteractor*/, taskDescription); } /** @@ -2720,7 +2692,8 @@ class TaskRecord extends ConfigurationContainer { lastTimeMoved, neverRelinquishIdentity, lastTaskDescription, taskAffiliation, prevTaskId, nextTaskId, taskAffiliationColor, callingUid, callingPackage, resizeMode, supportsPictureInPicture, realActivitySuspended, userSetupComplete, - minWidth, minHeight); + minWidth, minHeight, null /*ActivityInfo*/, null /*_voiceSession*/, + null /*_voiceInteractor*/); } TaskRecord restoreFromXml(XmlPullParser in, ActivityStackSupervisor stackSupervisor) diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index d7116d8bbd87..1c0d1561de90 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -702,7 +702,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio } ActivityRecord hist = mActivities.get(0); intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, hist.packageName); - intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, hist.getTaskRecord().taskId); + intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, hist.getTaskRecord().mTaskId); } boolean shouldKillProcessForRemovedTask(TaskRecord tr) { @@ -713,7 +713,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio return false; } final TaskRecord otherTask = activity.getTaskRecord(); - if (tr.taskId != otherTask.taskId && otherTask.inRecents) { + if (tr.mTaskId != otherTask.mTaskId && otherTask.inRecents) { // Don't kill process(es) that has an activity in a different task that is // also in recents. return false; diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java index 69cc9b256b83..fff32215493b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityDisplayTests.java @@ -317,24 +317,24 @@ public class ActivityDisplayTests extends ActivityTestsBase { doAnswer(invocation -> { display.positionChildAtTop(stack3, false); return true; - }).when(mSupervisor).removeTaskByIdLocked(eq(task4.taskId), anyBoolean(), anyBoolean(), + }).when(mSupervisor).removeTaskByIdLocked(eq(task4.mTaskId), anyBoolean(), anyBoolean(), any()); // Removing stacks from the display while removing stacks. doAnswer(invocation -> { display.removeChild(stack2); return true; - }).when(mSupervisor).removeTaskByIdLocked(eq(task2.taskId), anyBoolean(), anyBoolean(), + }).when(mSupervisor).removeTaskByIdLocked(eq(task2.mTaskId), anyBoolean(), anyBoolean(), any()); runnable.run(); - verify(mSupervisor).removeTaskByIdLocked(eq(task4.taskId), anyBoolean(), anyBoolean(), + verify(mSupervisor).removeTaskByIdLocked(eq(task4.mTaskId), anyBoolean(), anyBoolean(), any()); - verify(mSupervisor).removeTaskByIdLocked(eq(task3.taskId), anyBoolean(), anyBoolean(), + verify(mSupervisor).removeTaskByIdLocked(eq(task3.mTaskId), anyBoolean(), anyBoolean(), any()); - verify(mSupervisor).removeTaskByIdLocked(eq(task2.taskId), anyBoolean(), anyBoolean(), + verify(mSupervisor).removeTaskByIdLocked(eq(task2.mTaskId), anyBoolean(), anyBoolean(), any()); - verify(mSupervisor).removeTaskByIdLocked(eq(task1.taskId), anyBoolean(), anyBoolean(), + verify(mSupervisor).removeTaskByIdLocked(eq(task1.mTaskId), anyBoolean(), anyBoolean(), any()); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java index 9e1df913b22c..1eeca91e29d0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackSupervisorTests.java @@ -127,7 +127,7 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase { mSupervisor.handleNonResizableTaskIfNeeded(task, newDisplay.getWindowingMode(), newDisplay.mDisplayId, stack); // The top activity is unresizable, so it should notify the activity is forced resizing. - verify(taskChangeNotifier).notifyActivityForcedResizable(eq(task.taskId), + verify(taskChangeNotifier).notifyActivityForcedResizable(eq(task.mTaskId), eq(FORCED_RESIZEABLE_REASON_SECONDARY_DISPLAY), eq(unresizableActivity.packageName)); reset(taskChangeNotifier); diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java index 668ad78e5900..77fbdcf8ff52 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java @@ -42,7 +42,6 @@ import android.content.res.Configuration; import android.os.Build; import android.os.UserHandle; import android.service.voice.IVoiceInteractionSession; -import android.testing.DexmakerShareClassLoaderRule; import android.util.Pair; import android.view.DisplayInfo; @@ -385,9 +384,10 @@ class ActivityTestsBase extends SystemServiceTestsBase { intent.setFlags(mFlags); final TaskRecord task = new TaskRecord(mSupervisor.mService, mTaskId, aInfo, - intent /*intent*/, mVoiceSession, null /*_voiceInteractor*/); + intent /*intent*/, mVoiceSession, null /*_voiceInteractor*/, + null /*taskDescription*/); spyOn(task); - task.userId = mUserId; + task.mUserId = mUserId; if (mStack != null) { mStack.moveToFront("test"); @@ -396,8 +396,6 @@ class ActivityTestsBase extends SystemServiceTestsBase { spyOn(task.mTask); } - task.touchActiveTime(); - return task; } } diff --git a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java index be2ee2909a22..46435ebd8e15 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java @@ -422,7 +422,7 @@ public class LaunchParamsControllerTests extends ActivityTestsBase { @Override void saveTask(TaskRecord task) { - final int userId = task.userId; + final int userId = task.mUserId; final ComponentName realActivity = task.realActivity; mTmpParams.mPreferredDisplayId = task.getStack().mDisplayId; mTmpParams.mWindowingMode = task.getWindowingMode(); @@ -436,7 +436,7 @@ public class LaunchParamsControllerTests extends ActivityTestsBase { @Override void getLaunchParams(TaskRecord task, ActivityRecord activity, LaunchParams params) { - final int userId = task != null ? task.userId : activity.mUserId; + final int userId = task != null ? task.mUserId : activity.mUserId; final ComponentName name = task != null ? task.realActivity : activity.mActivityComponent; diff --git a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java index 49d778f023e5..7115af9f1ee9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java @@ -115,16 +115,16 @@ public class LaunchParamsPersisterTests extends ActivityTestsBase { ACTIVITY_TYPE_STANDARD, /* onTop */ true); mTestTask = new TaskBuilder(mSupervisor).setComponent(TEST_COMPONENT).setStack(stack) .build(); - mTestTask.userId = TEST_USER_ID; + mTestTask.mUserId = TEST_USER_ID; mTestTask.mLastNonFullscreenBounds = TEST_BOUNDS; mTestTask.hasBeenVisible = true; mTaskWithDifferentComponent = new TaskBuilder(mSupervisor) .setComponent(ALTERNATIVE_COMPONENT).build(); - mTaskWithDifferentComponent.userId = TEST_USER_ID; + mTaskWithDifferentComponent.mUserId = TEST_USER_ID; mTaskWithDifferentUser = new TaskBuilder(mSupervisor).setComponent(TEST_COMPONENT).build(); - mTaskWithDifferentUser.userId = ALTERNATIVE_USER_ID; + mTaskWithDifferentUser.mUserId = ALTERNATIVE_USER_ID; mTarget = new LaunchParamsPersister(mPersisterQueue, mSupervisor, mUserFolderGetter); diff --git a/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java index 47c76fc28d15..05e173c957d3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java @@ -707,7 +707,7 @@ public class LockTaskControllerTest { TaskRecord tr = mock(TaskRecord.class); tr.mLockTaskAuth = lockTaskAuth; tr.intent = intent; - tr.userId = TEST_USER_ID; + tr.mUserId = TEST_USER_ID; return tr; } diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index 445a5cc50d51..cc598ffa63bd 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -882,7 +882,7 @@ public class RecentTasksTest extends ActivityTestsBase { @Test public void testNotRestoreRecentTaskApis() { final TaskRecord task = createTaskBuilder(".Task").build(); - final int taskId = task.taskId; + final int taskId = task.mTaskId; mRecentTasks.add(task); // Only keep the task in RecentTasks. task.removeWindowContainer(); @@ -968,7 +968,7 @@ public class RecentTasksTest extends ActivityTestsBase { TEST_USER_0_ID, 0).getList(); assertTrue(expectedTasks.length == infos.size()); for (int i = 0; i < infos.size(); i++) { - assertTrue(expectedTasks[i].taskId == infos.get(i).taskId); + assertTrue(expectedTasks[i].mTaskId == infos.get(i).taskId); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java index c6ffc4641261..ebedde7d4460 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java @@ -345,7 +345,7 @@ public class RecentsAnimationTest extends ActivityTestsBase { .setCreateTask(true) .setComponent(new ComponentName(mContext.getPackageName(), "Home2")) .build(); - otherUserHomeActivity.getTaskRecord().userId = TEST_USER_ID; + otherUserHomeActivity.getTaskRecord().mUserId = TEST_USER_ID; ActivityStack fullscreenStack = display.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java index 86e307b4f0a5..0f8fb0417d01 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskRecordTests.java @@ -119,7 +119,7 @@ public class TaskRecordTests extends ActivityTestsBase { final byte[] serializedBytes = serializeToBytes(expected); final TaskRecord actual = restoreFromBytes(serializedBytes); - assertEquals(expected.taskId, actual.taskId); + assertEquals(expected.mTaskId, actual.mTaskId); assertEquals(expected.mLastNonFullscreenBounds, actual.mLastNonFullscreenBounds); } @@ -132,7 +132,7 @@ public class TaskRecordTests extends ActivityTestsBase { @Test public void testCopyBaseIntentForTaskInfo() { final TaskRecord task = createTaskRecord(1); - task.lastTaskDescription = new ActivityManager.TaskDescription(); + task.mTaskDescription = new ActivityManager.TaskDescription(); final TaskInfo info = task.getTaskInfo(); // The intent of info should be a copy so assert that they are different instances. @@ -648,9 +648,9 @@ public class TaskRecordTests extends ActivityTestsBase { final TaskRecord task1 = getTestTask(); final ActivityRecord activity1 = task1.getChildAt(0); - assertEquals(task0.taskId, + assertEquals(task0.mTaskId, ActivityRecord.getTaskForActivityLocked(activity0.appToken, false /* onlyRoot */)); - assertEquals(task1.taskId, + assertEquals(task1.mTaskId, ActivityRecord.getTaskForActivityLocked(activity1.appToken, false /* onlyRoot */)); } @@ -669,9 +669,9 @@ public class TaskRecordTests extends ActivityTestsBase { // Add one more on top final ActivityRecord activity2 = new ActivityBuilder(mService).setTask(task).build(); - assertEquals(task.taskId, + assertEquals(task.mTaskId, ActivityRecord.getTaskForActivityLocked(activity0.appToken, true /* onlyRoot */)); - assertEquals(task.taskId, + assertEquals(task.mTaskId, ActivityRecord.getTaskForActivityLocked(activity1.appToken, true /* onlyRoot */)); assertEquals("No task must be reported for activity that is above root", INVALID_TASK_ID, ActivityRecord.getTaskForActivityLocked(activity2.appToken, true /* onlyRoot */)); @@ -692,9 +692,9 @@ public class TaskRecordTests extends ActivityTestsBase { // Add one more on top final ActivityRecord activity2 = new ActivityBuilder(mService).setTask(task).build(); - assertEquals(task.taskId, + assertEquals(task.mTaskId, ActivityRecord.getTaskForActivityLocked(activity0.appToken, true /* onlyRoot */)); - assertEquals(task.taskId, + assertEquals(task.mTaskId, ActivityRecord.getTaskForActivityLocked(activity1.appToken, true /* onlyRoot */)); assertEquals("No task must be reported for activity that is above root", INVALID_TASK_ID, ActivityRecord.getTaskForActivityLocked(activity2.appToken, true /* onlyRoot */)); @@ -718,11 +718,11 @@ public class TaskRecordTests extends ActivityTestsBase { // Add one more activity on top final ActivityRecord activity2 = new ActivityBuilder(mService).setTask(task).build(); - assertEquals(task.taskId, + assertEquals(task.mTaskId, ActivityRecord.getTaskForActivityLocked(activity0.appToken, false /* onlyRoot */)); - assertEquals(task.taskId, + assertEquals(task.mTaskId, ActivityRecord.getTaskForActivityLocked(activity1.appToken, false /* onlyRoot */)); - assertEquals(task.taskId, + assertEquals(task.mTaskId, ActivityRecord.getTaskForActivityLocked(activity2.appToken, false /* onlyRoot */)); } @@ -832,8 +832,8 @@ public class TaskRecordTests extends ActivityTestsBase { private TaskRecord createTaskRecord(int taskId) { return new TaskRecord(mService, taskId, new Intent(), null, null, null, ActivityBuilder.getDefaultComponent(), null, false, false, false, 0, 10050, null, - new ArrayList<>(), 0, false, null, 0, 0, 0, 0, 0, null, 0, false, false, false, 0, 0 - ); + new ArrayList<>(), 0, false, null, 0, 0, 0, 0, 0, null, 0, false, false, false, 0, + 0, null /*ActivityInfo*/, null /*_voiceSession*/, null /*_voiceInteractor*/); } private static class TestTaskRecordFactory extends TaskRecordFactory { diff --git a/telephony/java/android/provider/Telephony.java b/telephony/java/android/provider/Telephony.java index 67b252e52db9..bc29b595b0bb 100644 --- a/telephony/java/android/provider/Telephony.java +++ b/telephony/java/android/provider/Telephony.java @@ -3962,13 +3962,21 @@ public final class Telephony { public static final Uri CONTENT_URI = Uri.parse("content://cellbroadcasts"); /** - * The id of the subscription which received this cell broadcast message. + * The subscription which received this cell broadcast message. + * @deprecated use {@link #SLOT_INDEX} instead. * <P>Type: INTEGER</P> * @hide */ public static final String SUB_ID = "sub_id"; /** + * The slot which received this cell broadcast message. + * <P>Type: INTEGER</P> + * @hide + */ + public static final String SLOT_INDEX = "slot_index"; + + /** * Message geographical scope. Valid values are: * <ul> * <li>{@link android.telephony.SmsCbMessage#GEOGRAPHICAL_SCOPE_CELL_WIDE}. meaning the @@ -4202,7 +4210,7 @@ public final class Telephony { public static final String MAXIMUM_WAIT_TIME = "maximum_wait_time"; /** - * Query columns for instantiating {@link android.telephony.CellBroadcastMessage} objects. + * Query columns for instantiating com.android.cellbroadcastreceiver.CellBroadcastMessage. * @hide */ @NonNull @@ -4235,6 +4243,7 @@ public final class Telephony { */ public static final String[] QUERY_COLUMNS_FWK = { _ID, + SLOT_INDEX, GEOGRAPHICAL_SCOPE, PLMN, LAC, diff --git a/telephony/java/android/telephony/SmsCbMessage.java b/telephony/java/android/telephony/SmsCbMessage.java index c078764cfa24..dc991b9a3ea7 100644 --- a/telephony/java/android/telephony/SmsCbMessage.java +++ b/telephony/java/android/telephony/SmsCbMessage.java @@ -207,17 +207,19 @@ public final class SmsCbMessage implements Parcelable { /** CMAS warning area coordinates. */ private final List<Geometry> mGeometries; + private int mSlotIndex = 0; + /** * Create a new SmsCbMessage with the specified data. */ public SmsCbMessage(int messageFormat, int geographicalScope, int serialNumber, @NonNull SmsCbLocation location, int serviceCategory, @Nullable String language, @Nullable String body, int priority, @Nullable SmsCbEtwsInfo etwsWarningInfo, - @Nullable SmsCbCmasInfo cmasWarningInfo) { + @Nullable SmsCbCmasInfo cmasWarningInfo, int slotIndex) { this(messageFormat, geographicalScope, serialNumber, location, serviceCategory, language, body, priority, etwsWarningInfo, cmasWarningInfo, 0 /* maximumWaitingTime */, - null /* geometries */, System.currentTimeMillis()); + null /* geometries */, System.currentTimeMillis(), slotIndex); } /** @@ -227,7 +229,8 @@ public final class SmsCbMessage implements Parcelable { public SmsCbMessage(int messageFormat, int geographicalScope, int serialNumber, SmsCbLocation location, int serviceCategory, String language, String body, int priority, SmsCbEtwsInfo etwsWarningInfo, SmsCbCmasInfo cmasWarningInfo, - int maximumWaitTimeSec, List<Geometry> geometries, long receivedTimeMillis) { + int maximumWaitTimeSec, List<Geometry> geometries, long receivedTimeMillis, + int slotIndex) { mMessageFormat = messageFormat; mGeographicalScope = geographicalScope; mSerialNumber = serialNumber; @@ -241,6 +244,7 @@ public final class SmsCbMessage implements Parcelable { mReceivedTimeMillis = receivedTimeMillis; mGeometries = geometries; mMaximumWaitTimeSec = maximumWaitTimeSec; + mSlotIndex = slotIndex; } /** @@ -278,6 +282,7 @@ public final class SmsCbMessage implements Parcelable { String geoStr = in.readString(); mGeometries = geoStr != null ? CbGeoUtils.parseGeometriesFromString(geoStr) : null; mMaximumWaitTimeSec = in.readInt(); + mSlotIndex = in.readInt(); } /** @@ -312,6 +317,7 @@ public final class SmsCbMessage implements Parcelable { dest.writeString( mGeometries != null ? CbGeoUtils.encodeGeometriesToString(mGeometries) : null); dest.writeInt(mMaximumWaitTimeSec); + dest.writeInt(mSlotIndex); } @NonNull @@ -423,6 +429,14 @@ public final class SmsCbMessage implements Parcelable { } /** + * Get the slotIndex associated with this message. + * @return the slotIndex associated with this message + */ + public int getSlotIndex() { + return mSlotIndex; + } + + /** * Get the message format ({@link #MESSAGE_FORMAT_3GPP} or {@link #MESSAGE_FORMAT_3GPP2}). * @return an integer representing 3GPP or 3GPP2 message format */ @@ -502,6 +516,7 @@ public final class SmsCbMessage implements Parcelable { + (mEtwsWarningInfo != null ? (", " + mEtwsWarningInfo.toString()) : "") + (mCmasWarningInfo != null ? (", " + mCmasWarningInfo.toString()) : "") + ", maximumWaitingTime = " + mMaximumWaitTimeSec + + ", slotIndex = " + mSlotIndex + ", geo=" + (mGeometries != null ? CbGeoUtils.encodeGeometriesToString(mGeometries) : "null") + '}'; @@ -522,6 +537,7 @@ public final class SmsCbMessage implements Parcelable { @NonNull public ContentValues getContentValues() { ContentValues cv = new ContentValues(16); + cv.put(CellBroadcasts.SLOT_INDEX, mSlotIndex); cv.put(CellBroadcasts.GEOGRAPHICAL_SCOPE, mGeographicalScope); if (mLocation.getPlmn() != null) { cv.put(CellBroadcasts.PLMN, mLocation.getPlmn()); @@ -563,6 +579,7 @@ public final class SmsCbMessage implements Parcelable { } cv.put(CellBroadcasts.MAXIMUM_WAIT_TIME, mMaximumWaitTimeSec); + cv.put(CellBroadcasts.SLOT_INDEX, mSlotIndex); return cv; } @@ -584,6 +601,7 @@ public final class SmsCbMessage implements Parcelable { String body = cursor.getString(cursor.getColumnIndexOrThrow(CellBroadcasts.MESSAGE_BODY)); int format = cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.MESSAGE_FORMAT)); int priority = cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.MESSAGE_PRIORITY)); + int slotIndex = cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.SLOT_INDEX)); String plmn; int plmnColumn = cursor.getColumnIndex(CellBroadcasts.PLMN); @@ -681,7 +699,7 @@ public final class SmsCbMessage implements Parcelable { return new SmsCbMessage(format, geoScope, serialNum, location, category, language, body, priority, etwsInfo, cmasInfo, maximumWaitTimeSec, geometries, - receivedTimeMillis); + receivedTimeMillis, slotIndex); } /** diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index b584e9d23773..5fde85fdd229 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -11407,10 +11407,13 @@ public class TelephonyManager { * 3) APN type is whitelisted. E.g. MMS is whitelisted if * {@link SubscriptionManager#setAlwaysAllowMmsData} is turned on. * + * @param apnType Value indicating the apn type. Apn types are defined in {@link ApnSetting}. * @return whether data is enabled for a apn type. * * @hide */ + @SystemApi + @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isDataEnabledForApn(@ApnType int apnType) { String pkgForDebug = mContext != null ? mContext.getOpPackageName() : "<unknown>"; try { diff --git a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java index d892e559c899..4654437fb49c 100644 --- a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java +++ b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java @@ -878,8 +878,9 @@ public class SmsMessage extends SmsMessageBase { * Parses a broadcast SMS, possibly containing a CMAS alert. * * @param plmn the PLMN for a broadcast SMS + * @param subId */ - public SmsCbMessage parseBroadcastSms(String plmn) { + public SmsCbMessage parseBroadcastSms(String plmn, int subId) { BearerData bData = BearerData.decode(mEnvelope.bearerData, mEnvelope.serviceCategory); if (bData == null) { Rlog.w(LOG_TAG, "BearerData.decode() returned null"); @@ -895,7 +896,7 @@ public class SmsMessage extends SmsMessageBase { return new SmsCbMessage(SmsCbMessage.MESSAGE_FORMAT_3GPP2, SmsCbMessage.GEOGRAPHICAL_SCOPE_PLMN_WIDE, bData.messageId, location, mEnvelope.serviceCategory, bData.getLanguage(), bData.userData.payloadStr, - bData.priority, null, bData.cmasWarningInfo); + bData.priority, null, bData.cmasWarningInfo, subId); } /** diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmSmsCbMessage.java b/telephony/java/com/android/internal/telephony/gsm/GsmSmsCbMessage.java index c65c45fa015b..c3d490a6d5cf 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmSmsCbMessage.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmSmsCbMessage.java @@ -90,9 +90,10 @@ public class GsmSmsCbMessage { * Create a new SmsCbMessage object from a header object plus one or more received PDUs. * * @param pdus PDU bytes + * @slotIndex slotIndex for which received sms cb message */ public static SmsCbMessage createSmsCbMessage(Context context, SmsCbHeader header, - SmsCbLocation location, byte[][] pdus) + SmsCbLocation location, byte[][] pdus, int slotIndex) throws IllegalArgumentException { long receivedTimeMillis = System.currentTimeMillis(); if (header.isEtwsPrimaryNotification()) { @@ -104,7 +105,7 @@ public class GsmSmsCbMessage { header.getSerialNumber(), location, header.getServiceCategory(), null, getEtwsPrimaryMessage(context, header.getEtwsInfo().getWarningType()), SmsCbMessage.MESSAGE_PRIORITY_EMERGENCY, header.getEtwsInfo(), - header.getCmasInfo(), 0, null /* geometries */, receivedTimeMillis); + header.getCmasInfo(), 0, null /* geometries */, receivedTimeMillis, slotIndex); } else if (header.isUmtsFormat()) { // UMTS format has only 1 PDU byte[] pdu = pdus[0]; @@ -138,7 +139,7 @@ public class GsmSmsCbMessage { header.getGeographicalScope(), header.getSerialNumber(), location, header.getServiceCategory(), language, body, priority, header.getEtwsInfo(), header.getCmasInfo(), maximumWaitingTimeSec, geometries, - receivedTimeMillis); + receivedTimeMillis, slotIndex); } else { String language = null; StringBuilder sb = new StringBuilder(); @@ -154,7 +155,7 @@ public class GsmSmsCbMessage { header.getGeographicalScope(), header.getSerialNumber(), location, header.getServiceCategory(), language, sb.toString(), priority, header.getEtwsInfo(), header.getCmasInfo(), 0, null /* geometries */, - receivedTimeMillis); + receivedTimeMillis, slotIndex); } } |