Loading libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java +27 −10 Original line number Original line Diff line number Diff line Loading @@ -56,14 +56,7 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { private final ArrayList<Pair<TransitionFilter, IRemoteTransition>> mFilters = private final ArrayList<Pair<TransitionFilter, IRemoteTransition>> mFilters = new ArrayList<>(); new ArrayList<>(); private final IBinder.DeathRecipient mTransitionDeathRecipient = private final ArrayMap<IBinder, RemoteDeathHandler> mDeathHandlers = new ArrayMap<>(); new IBinder.DeathRecipient() { @Override @BinderThread public void binderDied() { mMainExecutor.execute(() -> mFilters.clear()); } }; RemoteTransitionHandler(@NonNull ShellExecutor mainExecutor) { RemoteTransitionHandler(@NonNull ShellExecutor mainExecutor) { mMainExecutor = mainExecutor; mMainExecutor = mainExecutor; Loading @@ -71,7 +64,9 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { void addFiltered(TransitionFilter filter, IRemoteTransition remote) { void addFiltered(TransitionFilter filter, IRemoteTransition remote) { try { try { remote.asBinder().linkToDeath(mTransitionDeathRecipient, 0 /* flags */); RemoteDeathHandler handler = new RemoteDeathHandler(remote.asBinder()); remote.asBinder().linkToDeath(handler, 0 /* flags */); mDeathHandlers.put(remote.asBinder(), handler); } catch (RemoteException e) { } catch (RemoteException e) { Slog.e(TAG, "Failed to link to death"); Slog.e(TAG, "Failed to link to death"); return; return; Loading @@ -88,7 +83,8 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { } } } } if (removed) { if (removed) { remote.asBinder().unlinkToDeath(mTransitionDeathRecipient, 0 /* flags */); RemoteDeathHandler handler = mDeathHandlers.remove(remote.asBinder()); remote.asBinder().unlinkToDeath(handler, 0 /* flags */); } } } } Loading Loading @@ -206,4 +202,25 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { + " for %s: %s", transition, remote); + " for %s: %s", transition, remote); return new WindowContainerTransaction(); return new WindowContainerTransaction(); } } /** NOTE: binder deaths can alter the filter order */ private class RemoteDeathHandler implements IBinder.DeathRecipient { private final IBinder mRemote; RemoteDeathHandler(IBinder remote) { mRemote = remote; } @Override @BinderThread public void binderDied() { mMainExecutor.execute(() -> { for (int i = mFilters.size() - 1; i >= 0; --i) { if (mRemote.equals(mFilters.get(i).second.asBinder())) { mFilters.remove(i); } } }); } } } } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java +27 −10 Original line number Original line Diff line number Diff line Loading @@ -56,14 +56,7 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { private final ArrayList<Pair<TransitionFilter, IRemoteTransition>> mFilters = private final ArrayList<Pair<TransitionFilter, IRemoteTransition>> mFilters = new ArrayList<>(); new ArrayList<>(); private final IBinder.DeathRecipient mTransitionDeathRecipient = private final ArrayMap<IBinder, RemoteDeathHandler> mDeathHandlers = new ArrayMap<>(); new IBinder.DeathRecipient() { @Override @BinderThread public void binderDied() { mMainExecutor.execute(() -> mFilters.clear()); } }; RemoteTransitionHandler(@NonNull ShellExecutor mainExecutor) { RemoteTransitionHandler(@NonNull ShellExecutor mainExecutor) { mMainExecutor = mainExecutor; mMainExecutor = mainExecutor; Loading @@ -71,7 +64,9 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { void addFiltered(TransitionFilter filter, IRemoteTransition remote) { void addFiltered(TransitionFilter filter, IRemoteTransition remote) { try { try { remote.asBinder().linkToDeath(mTransitionDeathRecipient, 0 /* flags */); RemoteDeathHandler handler = new RemoteDeathHandler(remote.asBinder()); remote.asBinder().linkToDeath(handler, 0 /* flags */); mDeathHandlers.put(remote.asBinder(), handler); } catch (RemoteException e) { } catch (RemoteException e) { Slog.e(TAG, "Failed to link to death"); Slog.e(TAG, "Failed to link to death"); return; return; Loading @@ -88,7 +83,8 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { } } } } if (removed) { if (removed) { remote.asBinder().unlinkToDeath(mTransitionDeathRecipient, 0 /* flags */); RemoteDeathHandler handler = mDeathHandlers.remove(remote.asBinder()); remote.asBinder().unlinkToDeath(handler, 0 /* flags */); } } } } Loading Loading @@ -206,4 +202,25 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { + " for %s: %s", transition, remote); + " for %s: %s", transition, remote); return new WindowContainerTransaction(); return new WindowContainerTransaction(); } } /** NOTE: binder deaths can alter the filter order */ private class RemoteDeathHandler implements IBinder.DeathRecipient { private final IBinder mRemote; RemoteDeathHandler(IBinder remote) { mRemote = remote; } @Override @BinderThread public void binderDied() { mMainExecutor.execute(() -> { for (int i = mFilters.size() - 1; i >= 0; --i) { if (mRemote.equals(mFilters.get(i).second.asBinder())) { mFilters.remove(i); } } }); } } } }