diff --git a/apex/jobscheduler/framework/java/android/app/job/UserVisibleJobSummary.java b/apex/jobscheduler/framework/java/android/app/job/UserVisibleJobSummary.java index 311a9b2e81552..ba79c307395cc 100644 --- a/apex/jobscheduler/framework/java/android/app/job/UserVisibleJobSummary.java +++ b/apex/jobscheduler/framework/java/android/app/job/UserVisibleJobSummary.java @@ -30,6 +30,8 @@ import java.util.Objects; */ public class UserVisibleJobSummary implements Parcelable { private final int mCallingUid; + @NonNull + private final String mCallingPackageName; private final int mSourceUserId; @NonNull private final String mSourcePackageName; @@ -37,9 +39,11 @@ public class UserVisibleJobSummary implements Parcelable { private final String mNamespace; private final int mJobId; - public UserVisibleJobSummary(int callingUid, int sourceUserId, - @NonNull String sourcePackageName, String namespace, int jobId) { + public UserVisibleJobSummary(int callingUid, @NonNull String callingPackageName, + int sourceUserId, @NonNull String sourcePackageName, + @Nullable String namespace, int jobId) { mCallingUid = callingUid; + mCallingPackageName = callingPackageName; mSourceUserId = sourceUserId; mSourcePackageName = sourcePackageName; mNamespace = namespace; @@ -48,12 +52,18 @@ public class UserVisibleJobSummary implements Parcelable { protected UserVisibleJobSummary(Parcel in) { mCallingUid = in.readInt(); + mCallingPackageName = in.readString(); mSourceUserId = in.readInt(); mSourcePackageName = in.readString(); mNamespace = in.readString(); mJobId = in.readInt(); } + @NonNull + public String getCallingPackageName() { + return mCallingPackageName; + } + public int getCallingUid() { return mCallingUid; } @@ -62,6 +72,7 @@ public class UserVisibleJobSummary implements Parcelable { return mJobId; } + @Nullable public String getNamespace() { return mNamespace; } @@ -70,6 +81,7 @@ public class UserVisibleJobSummary implements Parcelable { return mSourceUserId; } + @NonNull public String getSourcePackageName() { return mSourcePackageName; } @@ -80,6 +92,7 @@ public class UserVisibleJobSummary implements Parcelable { if (!(o instanceof UserVisibleJobSummary)) return false; UserVisibleJobSummary that = (UserVisibleJobSummary) o; return mCallingUid == that.mCallingUid + && mCallingPackageName.equals(that.mCallingPackageName) && mSourceUserId == that.mSourceUserId && mSourcePackageName.equals(that.mSourcePackageName) && Objects.equals(mNamespace, that.mNamespace) @@ -90,6 +103,7 @@ public class UserVisibleJobSummary implements Parcelable { public int hashCode() { int result = 0; result = 31 * result + mCallingUid; + result = 31 * result + mCallingPackageName.hashCode(); result = 31 * result + mSourceUserId; result = 31 * result + mSourcePackageName.hashCode(); if (mNamespace != null) { @@ -103,6 +117,7 @@ public class UserVisibleJobSummary implements Parcelable { public String toString() { return "UserVisibleJobSummary{" + "callingUid=" + mCallingUid + + ", callingPackageName='" + mCallingPackageName + "'" + ", sourceUserId=" + mSourceUserId + ", sourcePackageName='" + mSourcePackageName + "'" + ", namespace=" + mNamespace @@ -118,6 +133,7 @@ public class UserVisibleJobSummary implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mCallingUid); + dest.writeString(mCallingPackageName); dest.writeInt(mSourceUserId); dest.writeString(mSourcePackageName); dest.writeString(mNamespace); diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java index f066b23fae846..ce33a8e08b4af 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java @@ -1396,7 +1396,8 @@ public final class JobStatus { public UserVisibleJobSummary getUserVisibleJobSummary() { if (mUserVisibleJobSummary == null) { mUserVisibleJobSummary = new UserVisibleJobSummary( - callingUid, getSourceUserId(), getSourcePackageName(), + callingUid, getServiceComponent().getPackageName(), + getSourceUserId(), getSourcePackageName(), getNamespace(), getJobId()); } return mUserVisibleJobSummary; diff --git a/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt b/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt index d1cf46caf7ab3..464b6e70b7d54 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/FgsManagerController.kt @@ -636,7 +636,8 @@ class FgsManagerControllerImpl @Inject constructor( isRunning: Boolean ) { synchronized(lock) { - val userPackageKey = UserPackage(summary.sourceUserId, summary.sourcePackageName) + val userPackageKey = UserPackage( + UserHandle.getUserId(summary.callingUid), summary.callingPackageName) if (isRunning) { runningTaskIdentifiers .getOrPut(userPackageKey) { StartTimeAndIdentifiers(systemClock) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/FgsManagerControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/FgsManagerControllerTest.java index bbd62c7ae3829..6f54f62cd70c5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/FgsManagerControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/FgsManagerControllerTest.java @@ -147,16 +147,25 @@ public class FgsManagerControllerTest extends SysuiTestCase { setUserProfiles(0); setShowUserVisibleJobs(true); - UserVisibleJobSummary j1 = new UserVisibleJobSummary(0, 0, "pkg1", null, 0); - UserVisibleJobSummary j2 = new UserVisibleJobSummary(1, 0, "pkg2", null, 1); + UserVisibleJobSummary j1 = new UserVisibleJobSummary(0, "pkg1", 0, "pkg1", null, 0); + UserVisibleJobSummary j2 = new UserVisibleJobSummary(1, "pkg2", 0, "pkg2", null, 1); + // pkg2 is performing work on behalf of pkg3. Since pkg2 will show the notification + // It should be the one shown in TaskManager. + UserVisibleJobSummary j3 = new UserVisibleJobSummary(1, "pkg2", 0, "pkg3", null, 3); Assert.assertEquals(0, mFmc.getNumRunningPackages()); mIUserVisibleJobObserver.onUserVisibleJobStateChanged(j1, true); Assert.assertEquals(1, mFmc.getNumRunningPackages()); mIUserVisibleJobObserver.onUserVisibleJobStateChanged(j2, true); Assert.assertEquals(2, mFmc.getNumRunningPackages()); + // Job3 starts running. The source package (pkg3) shouldn't matter. Since pkg2 is + // already running, the running package count shouldn't increase. + mIUserVisibleJobObserver.onUserVisibleJobStateChanged(j3, true); + Assert.assertEquals(2, mFmc.getNumRunningPackages()); mIUserVisibleJobObserver.onUserVisibleJobStateChanged(j1, false); Assert.assertEquals(1, mFmc.getNumRunningPackages()); mIUserVisibleJobObserver.onUserVisibleJobStateChanged(j2, false); + Assert.assertEquals(1, mFmc.getNumRunningPackages()); + mIUserVisibleJobObserver.onUserVisibleJobStateChanged(j3, false); Assert.assertEquals(0, mFmc.getNumRunningPackages()); } @@ -167,8 +176,8 @@ public class FgsManagerControllerTest extends SysuiTestCase { Binder b1 = new Binder(); Binder b2 = new Binder(); - UserVisibleJobSummary j1 = new UserVisibleJobSummary(0, 0, "pkg1", null, 0); - UserVisibleJobSummary j3 = new UserVisibleJobSummary(1, 0, "pkg3", null, 1); + UserVisibleJobSummary j1 = new UserVisibleJobSummary(0, "pkg1", 0, "pkg1", null, 0); + UserVisibleJobSummary j3 = new UserVisibleJobSummary(1, "pkg3", 0, "pkg3", null, 1); Assert.assertEquals(0, mFmc.getNumRunningPackages()); mIForegroundServiceObserver.onForegroundStateChanged(b1, "pkg1", 0, true); Assert.assertEquals(1, mFmc.getNumRunningPackages()); @@ -359,8 +368,8 @@ public class FgsManagerControllerTest extends SysuiTestCase { // pkg1 has only job // pkg2 has both job and fgs // pkg3 has only fgs - UserVisibleJobSummary j1 = new UserVisibleJobSummary(0, 0, "pkg1", null, 0); - UserVisibleJobSummary j2 = new UserVisibleJobSummary(1, 0, "pkg2", null, 1); + UserVisibleJobSummary j1 = new UserVisibleJobSummary(0, "pkg1", 0, "pkg1", null, 0); + UserVisibleJobSummary j2 = new UserVisibleJobSummary(1, "pkg2", 0, "pkg2", null, 1); Binder b2 = new Binder(); Binder b3 = new Binder();