Unregister user switch observer in ActivityManagerShellCommand.

ActivityManagerShellCommand does not unregisterUserSwitchObserver
after registerUserSwitchObserver, which leads to a leak of
unnecessary callbacks. This CL adds unregistering in finally block.

Bug: 242176088
Test: Manual test with adb and perfetto.
Change-Id: I14d66a00c5dd3f881d393a386a2678835c99a900
This commit is contained in:
Yasin Kilicdere
2022-08-11 15:50:29 +01:00
parent 2667ba4602
commit 0c54aa175e

View File

@@ -51,6 +51,7 @@ import android.app.IActivityManager;
import android.app.IActivityTaskManager;
import android.app.IStopUserCallback;
import android.app.IUidObserver;
import android.app.IUserSwitchObserver;
import android.app.KeyguardManager;
import android.app.ProfilerInfo;
import android.app.RemoteServiceException.CrashedByAdbException;
@@ -1937,31 +1938,36 @@ final class ActivityManagerShellCommand extends ShellCommand {
// Register switch observer.
final CountDownLatch switchLatch = new CountDownLatch(1);
mInterface.registerUserSwitchObserver(
new UserSwitchObserver() {
@Override
public void onUserSwitchComplete(int newUserId) {
if (userId == newUserId) {
switchLatch.countDown();
}
}
}, ActivityManagerShellCommand.class.getName());
// Switch.
boolean switched = mInterface.switchUser(userId);
if (!switched) {
// Switching failed, don't wait for the user switch observer.
return false;
}
// Wait.
final IUserSwitchObserver userSwitchObserver = new UserSwitchObserver() {
@Override
public void onUserSwitchComplete(int newUserId) {
if (userId == newUserId) {
switchLatch.countDown();
}
}
};
try {
switched = switchLatch.await(USER_OPERATION_TIMEOUT_MS, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
getErrPrintWriter().println("Error: Thread interrupted unexpectedly.");
}
mInterface.registerUserSwitchObserver(userSwitchObserver,
ActivityManagerShellCommand.class.getName());
return switched;
// Switch.
boolean switched = mInterface.switchUser(userId);
if (!switched) {
// Switching failed, don't wait for the user switch observer.
return false;
}
// Wait.
try {
switched = switchLatch.await(USER_OPERATION_TIMEOUT_MS, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
getErrPrintWriter().println("Error: Thread interrupted unexpectedly.");
}
return switched;
} finally {
mInterface.unregisterUserSwitchObserver(userSwitchObserver);
}
}
int runSwitchUser(PrintWriter pw) throws RemoteException {