Loading services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java +39 −59 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ import android.content.pm.ParceledListSlice; import android.os.Binder; import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; import android.view.SurfaceControl; import android.window.DisplayAreaAppearedInfo; import android.window.IDisplayAreaOrganizer; Loading @@ -50,8 +49,7 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl final ActivityTaskManagerService mService; private final WindowManagerGlobalLock mGlobalLock; private final HashMap<Integer, DisplayAreaOrganizerState> mOrganizersByFeatureIds = new HashMap(); private final HashMap<Integer, IDisplayAreaOrganizer> mOrganizersByFeatureIds = new HashMap(); private class DeathRecipient implements IBinder.DeathRecipient { int mFeature; Loading @@ -65,41 +63,12 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl @Override public void binderDied() { synchronized (mGlobalLock) { mOrganizersByFeatureIds.remove(mFeature).destroy(); mOrganizersByFeatureIds.remove(mFeature); removeOrganizer(mOrganizer); } } } private class DisplayAreaOrganizerState { private final IDisplayAreaOrganizer mOrganizer; private final DeathRecipient mDeathRecipient; DisplayAreaOrganizerState(IDisplayAreaOrganizer organizer, int feature) { mOrganizer = organizer; mDeathRecipient = new DeathRecipient(organizer, feature); try { organizer.asBinder().linkToDeath(mDeathRecipient, 0); } catch (RemoteException e) { // Oh well... } } void destroy() { IBinder organizerBinder = mOrganizer.asBinder(); mService.mRootWindowContainer.forAllDisplayAreas((da) -> { if (da.mOrganizer != null && da.mOrganizer.asBinder().equals(organizerBinder)) { if (da.isTaskDisplayArea() && da.asTaskDisplayArea().mCreatedByOrganizer) { // Delete the organizer created TDA when unregister. deleteTaskDisplayArea(da.asTaskDisplayArea()); } else { da.setOrganizer(null); } } }); organizerBinder.unlinkToDeath(mDeathRecipient, 0); } } DisplayAreaOrganizerController(ActivityTaskManagerService atm) { mService = atm; mGlobalLock = atm.mGlobalLock; Loading @@ -111,8 +80,7 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl @Nullable IDisplayAreaOrganizer getOrganizerByFeature(int featureId) { final DisplayAreaOrganizerState state = mOrganizersByFeatureIds.get(featureId); return state != null ? state.mOrganizer : null; return mOrganizersByFeatureIds.get(featureId); } @Override Loading @@ -126,18 +94,17 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Register display organizer=%s uid=%d", organizer.asBinder(), uid); if (mOrganizersByFeatureIds.get(feature) != null) { if (mOrganizersByFeatureIds.get(feature).mOrganizer.asBinder() .isBinderAlive()) { throw new IllegalStateException( "Replacing existing organizer currently unsupported"); } mOrganizersByFeatureIds.remove(feature).destroy(); Slog.d(TAG, "Replacing dead organizer for feature=" + feature); final DeathRecipient dr = new DeathRecipient(organizer, feature); try { organizer.asBinder().linkToDeath(dr, 0); } catch (RemoteException e) { // Oh well... } final DisplayAreaOrganizerState state = new DisplayAreaOrganizerState(organizer, feature); final List<DisplayAreaAppearedInfo> displayAreaInfos = new ArrayList<>(); mService.mRootWindowContainer.forAllDisplays(dc -> { if (!dc.isTrusted()) { Loading @@ -153,7 +120,7 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl }); }); mOrganizersByFeatureIds.put(feature, state); mOrganizersByFeatureIds.put(feature, organizer); return new ParceledListSlice<>(displayAreaInfos); } } finally { Loading @@ -170,11 +137,9 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl synchronized (mGlobalLock) { ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Unregister display organizer=%s uid=%d", organizer.asBinder(), uid); mOrganizersByFeatureIds.values().forEach((state) -> { if (state.mOrganizer.asBinder() == organizer.asBinder()) { state.destroy(); } }); mOrganizersByFeatureIds.entrySet().removeIf( entry -> entry.getValue().asBinder() == organizer.asBinder()); removeOrganizer(organizer); } } finally { Binder.restoreCallingIdentity(origId); Loading Loading @@ -225,15 +190,19 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl } final int taskDisplayAreaFeatureId = mNextTaskDisplayAreaFeatureId++; final DisplayAreaOrganizerState state = new DisplayAreaOrganizerState(organizer, taskDisplayAreaFeatureId); final DeathRecipient dr = new DeathRecipient(organizer, taskDisplayAreaFeatureId); try { organizer.asBinder().linkToDeath(dr, 0); } catch (RemoteException e) { // Oh well... } final TaskDisplayArea tda = parentRoot != null ? createTaskDisplayArea(parentRoot, name, taskDisplayAreaFeatureId) : createTaskDisplayArea(parentTda, name, taskDisplayAreaFeatureId); final DisplayAreaAppearedInfo tdaInfo = organizeDisplayArea(organizer, tda, "DisplayAreaOrganizerController.createTaskDisplayArea"); mOrganizersByFeatureIds.put(taskDisplayAreaFeatureId, state); mOrganizersByFeatureIds.put(taskDisplayAreaFeatureId, organizer); return tdaInfo; } } finally { Loading Loading @@ -261,7 +230,8 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl + "TaskDisplayArea=" + taskDisplayArea); } mOrganizersByFeatureIds.remove(taskDisplayArea.mFeatureId).destroy(); mOrganizersByFeatureIds.remove(taskDisplayArea.mFeatureId); deleteTaskDisplayArea(taskDisplayArea); } } finally { Binder.restoreCallingIdentity(origId); Loading @@ -281,10 +251,6 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl void onDisplayAreaVanished(IDisplayAreaOrganizer organizer, DisplayArea da) { ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "DisplayArea vanished name=%s", da.getName()); if (!organizer.asBinder().isBinderAlive()) { Slog.d(TAG, "Organizer died before sending onDisplayAreaVanished"); return; } try { organizer.onDisplayAreaVanished(da.getDisplayAreaInfo()); } catch (RemoteException e) { Loading @@ -301,6 +267,20 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl } } private void removeOrganizer(IDisplayAreaOrganizer organizer) { IBinder organizerBinder = organizer.asBinder(); mService.mRootWindowContainer.forAllDisplayAreas((da) -> { if (da.mOrganizer != null && da.mOrganizer.asBinder().equals(organizerBinder)) { if (da.isTaskDisplayArea() && da.asTaskDisplayArea().mCreatedByOrganizer) { // Delete the organizer created TDA when unregister. deleteTaskDisplayArea(da.asTaskDisplayArea()); } else { da.setOrganizer(null); } } }); } private DisplayAreaAppearedInfo organizeDisplayArea(IDisplayAreaOrganizer organizer, DisplayArea displayArea, String callsite) { displayArea.setOrganizer(organizer, true /* skipDisplayAreaAppeared */); Loading services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java +0 −2 Original line number Diff line number Diff line Loading @@ -57,7 +57,6 @@ import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Rect; import android.os.Binder; import android.os.IBinder; import android.platform.test.annotations.Presubmit; import android.view.SurfaceControl; import android.view.View; Loading Loading @@ -556,7 +555,6 @@ public class DisplayAreaTest extends WindowTestsBase { final DisplayArea<WindowContainer> displayArea = new DisplayArea<>( mWm, BELOW_TASKS, "NewArea", FEATURE_VENDOR_FIRST); final IDisplayAreaOrganizer mockDisplayAreaOrganizer = mock(IDisplayAreaOrganizer.class); doReturn(mock(IBinder.class)).when(mockDisplayAreaOrganizer).asBinder(); displayArea.mOrganizer = mockDisplayAreaOrganizer; spyOn(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController); mDisplayContent.addChild(displayArea, 0); Loading Loading
services/core/java/com/android/server/wm/DisplayAreaOrganizerController.java +39 −59 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ import android.content.pm.ParceledListSlice; import android.os.Binder; import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; import android.view.SurfaceControl; import android.window.DisplayAreaAppearedInfo; import android.window.IDisplayAreaOrganizer; Loading @@ -50,8 +49,7 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl final ActivityTaskManagerService mService; private final WindowManagerGlobalLock mGlobalLock; private final HashMap<Integer, DisplayAreaOrganizerState> mOrganizersByFeatureIds = new HashMap(); private final HashMap<Integer, IDisplayAreaOrganizer> mOrganizersByFeatureIds = new HashMap(); private class DeathRecipient implements IBinder.DeathRecipient { int mFeature; Loading @@ -65,41 +63,12 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl @Override public void binderDied() { synchronized (mGlobalLock) { mOrganizersByFeatureIds.remove(mFeature).destroy(); mOrganizersByFeatureIds.remove(mFeature); removeOrganizer(mOrganizer); } } } private class DisplayAreaOrganizerState { private final IDisplayAreaOrganizer mOrganizer; private final DeathRecipient mDeathRecipient; DisplayAreaOrganizerState(IDisplayAreaOrganizer organizer, int feature) { mOrganizer = organizer; mDeathRecipient = new DeathRecipient(organizer, feature); try { organizer.asBinder().linkToDeath(mDeathRecipient, 0); } catch (RemoteException e) { // Oh well... } } void destroy() { IBinder organizerBinder = mOrganizer.asBinder(); mService.mRootWindowContainer.forAllDisplayAreas((da) -> { if (da.mOrganizer != null && da.mOrganizer.asBinder().equals(organizerBinder)) { if (da.isTaskDisplayArea() && da.asTaskDisplayArea().mCreatedByOrganizer) { // Delete the organizer created TDA when unregister. deleteTaskDisplayArea(da.asTaskDisplayArea()); } else { da.setOrganizer(null); } } }); organizerBinder.unlinkToDeath(mDeathRecipient, 0); } } DisplayAreaOrganizerController(ActivityTaskManagerService atm) { mService = atm; mGlobalLock = atm.mGlobalLock; Loading @@ -111,8 +80,7 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl @Nullable IDisplayAreaOrganizer getOrganizerByFeature(int featureId) { final DisplayAreaOrganizerState state = mOrganizersByFeatureIds.get(featureId); return state != null ? state.mOrganizer : null; return mOrganizersByFeatureIds.get(featureId); } @Override Loading @@ -126,18 +94,17 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Register display organizer=%s uid=%d", organizer.asBinder(), uid); if (mOrganizersByFeatureIds.get(feature) != null) { if (mOrganizersByFeatureIds.get(feature).mOrganizer.asBinder() .isBinderAlive()) { throw new IllegalStateException( "Replacing existing organizer currently unsupported"); } mOrganizersByFeatureIds.remove(feature).destroy(); Slog.d(TAG, "Replacing dead organizer for feature=" + feature); final DeathRecipient dr = new DeathRecipient(organizer, feature); try { organizer.asBinder().linkToDeath(dr, 0); } catch (RemoteException e) { // Oh well... } final DisplayAreaOrganizerState state = new DisplayAreaOrganizerState(organizer, feature); final List<DisplayAreaAppearedInfo> displayAreaInfos = new ArrayList<>(); mService.mRootWindowContainer.forAllDisplays(dc -> { if (!dc.isTrusted()) { Loading @@ -153,7 +120,7 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl }); }); mOrganizersByFeatureIds.put(feature, state); mOrganizersByFeatureIds.put(feature, organizer); return new ParceledListSlice<>(displayAreaInfos); } } finally { Loading @@ -170,11 +137,9 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl synchronized (mGlobalLock) { ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Unregister display organizer=%s uid=%d", organizer.asBinder(), uid); mOrganizersByFeatureIds.values().forEach((state) -> { if (state.mOrganizer.asBinder() == organizer.asBinder()) { state.destroy(); } }); mOrganizersByFeatureIds.entrySet().removeIf( entry -> entry.getValue().asBinder() == organizer.asBinder()); removeOrganizer(organizer); } } finally { Binder.restoreCallingIdentity(origId); Loading Loading @@ -225,15 +190,19 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl } final int taskDisplayAreaFeatureId = mNextTaskDisplayAreaFeatureId++; final DisplayAreaOrganizerState state = new DisplayAreaOrganizerState(organizer, taskDisplayAreaFeatureId); final DeathRecipient dr = new DeathRecipient(organizer, taskDisplayAreaFeatureId); try { organizer.asBinder().linkToDeath(dr, 0); } catch (RemoteException e) { // Oh well... } final TaskDisplayArea tda = parentRoot != null ? createTaskDisplayArea(parentRoot, name, taskDisplayAreaFeatureId) : createTaskDisplayArea(parentTda, name, taskDisplayAreaFeatureId); final DisplayAreaAppearedInfo tdaInfo = organizeDisplayArea(organizer, tda, "DisplayAreaOrganizerController.createTaskDisplayArea"); mOrganizersByFeatureIds.put(taskDisplayAreaFeatureId, state); mOrganizersByFeatureIds.put(taskDisplayAreaFeatureId, organizer); return tdaInfo; } } finally { Loading Loading @@ -261,7 +230,8 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl + "TaskDisplayArea=" + taskDisplayArea); } mOrganizersByFeatureIds.remove(taskDisplayArea.mFeatureId).destroy(); mOrganizersByFeatureIds.remove(taskDisplayArea.mFeatureId); deleteTaskDisplayArea(taskDisplayArea); } } finally { Binder.restoreCallingIdentity(origId); Loading @@ -281,10 +251,6 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl void onDisplayAreaVanished(IDisplayAreaOrganizer organizer, DisplayArea da) { ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "DisplayArea vanished name=%s", da.getName()); if (!organizer.asBinder().isBinderAlive()) { Slog.d(TAG, "Organizer died before sending onDisplayAreaVanished"); return; } try { organizer.onDisplayAreaVanished(da.getDisplayAreaInfo()); } catch (RemoteException e) { Loading @@ -301,6 +267,20 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl } } private void removeOrganizer(IDisplayAreaOrganizer organizer) { IBinder organizerBinder = organizer.asBinder(); mService.mRootWindowContainer.forAllDisplayAreas((da) -> { if (da.mOrganizer != null && da.mOrganizer.asBinder().equals(organizerBinder)) { if (da.isTaskDisplayArea() && da.asTaskDisplayArea().mCreatedByOrganizer) { // Delete the organizer created TDA when unregister. deleteTaskDisplayArea(da.asTaskDisplayArea()); } else { da.setOrganizer(null); } } }); } private DisplayAreaAppearedInfo organizeDisplayArea(IDisplayAreaOrganizer organizer, DisplayArea displayArea, String callsite) { displayArea.setOrganizer(organizer, true /* skipDisplayAreaAppeared */); Loading
services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java +0 −2 Original line number Diff line number Diff line Loading @@ -57,7 +57,6 @@ import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Rect; import android.os.Binder; import android.os.IBinder; import android.platform.test.annotations.Presubmit; import android.view.SurfaceControl; import android.view.View; Loading Loading @@ -556,7 +555,6 @@ public class DisplayAreaTest extends WindowTestsBase { final DisplayArea<WindowContainer> displayArea = new DisplayArea<>( mWm, BELOW_TASKS, "NewArea", FEATURE_VENDOR_FIRST); final IDisplayAreaOrganizer mockDisplayAreaOrganizer = mock(IDisplayAreaOrganizer.class); doReturn(mock(IBinder.class)).when(mockDisplayAreaOrganizer).asBinder(); displayArea.mOrganizer = mockDisplayAreaOrganizer; spyOn(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController); mDisplayContent.addChild(displayArea, 0); Loading