From 29d70688ae00f3c2d1d173534b19e5fb7e0eef5b Mon Sep 17 00:00:00 2001 From: Kweku Adams Date: Wed, 25 Jan 2023 19:01:10 +0000 Subject: [PATCH] Show calling app in Task Manager. The calling app is the one doing the work and will be the one showing the notification. Showing the source app will confuse the user and make managing the jobs more difficult. Bug: 263796348 Test: atest SystemUITests:FgsManagerControllerTest Change-Id: I5e741761c64ba8aeed430d56d7288c7c52c1639c --- .../app/job/UserVisibleJobSummary.java | 20 ++++++++++++++++-- .../server/job/controllers/JobStatus.java | 3 ++- .../systemui/qs/FgsManagerController.kt | 3 ++- .../systemui/qs/FgsManagerControllerTest.java | 21 +++++++++++++------ 4 files changed, 37 insertions(+), 10 deletions(-) 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 a2e8eb4a0a8a3..3ecb4b60f720a 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 @@ -1391,7 +1391,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();