Loading services/core/java/com/android/server/wm/Transition.java +11 −12 Original line number Original line Diff line number Diff line Loading @@ -1135,7 +1135,6 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe continue; continue; } } targets.add(wc); targets.add(wc); targets.mValidParticipants.add(wc); } } ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, " Initial targets: %s", ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, " Initial targets: %s", targets.mArray); targets.mArray); Loading @@ -1153,15 +1152,17 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe private static void populateParentChanges(Targets targets, private static void populateParentChanges(Targets targets, ArrayMap<WindowContainer, ChangeInfo> changes) { ArrayMap<WindowContainer, ChangeInfo> changes) { final ArrayList<WindowContainer<?>> intermediates = new ArrayList<>(); final ArrayList<WindowContainer<?>> intermediates = new ArrayList<>(); for (int i = targets.mValidParticipants.size() - 1; i >= 0; --i) { // Make a copy to iterate because the original array may be modified. WindowContainer<?> wc = targets.mValidParticipants.get(i); final ArrayList<WindowContainer<?>> targetList = new ArrayList<>(targets.mArray.size()); // Go up if the participant has been represented by its parent. for (int i = targets.mArray.size() - 1; i >= 0; --i) { while (targets.mArray.indexOfValue(wc) < 0 && wc.getParent() != null) { targetList.add(targets.mArray.valueAt(i)); wc = wc.getParent(); } } for (int i = targetList.size() - 1; i >= 0; --i) { final WindowContainer<?> wc = targetList.get(i); // Wallpaper must belong to the top (regardless of how nested it is in DisplayAreas). // Wallpaper must belong to the top (regardless of how nested it is in DisplayAreas). final boolean skipIntermediateReports = isWallpaper(wc); final boolean skipIntermediateReports = isWallpaper(wc); intermediates.clear(); intermediates.clear(); boolean foundParentInTargets = false; // Collect the intermediate parents between target and top changed parent. // Collect the intermediate parents between target and top changed parent. for (WindowContainer<?> p = wc.getParent(); p != null; p = p.getParent()) { for (WindowContainer<?> p = wc.getParent(); p != null; p = p.getParent()) { final ChangeInfo parentChange = changes.get(p); final ChangeInfo parentChange = changes.get(p); Loading @@ -1175,19 +1176,19 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe // The chain above the parent was processed. // The chain above the parent was processed. break; break; } } if (targets.mValidParticipants.contains(p)) { if (targetList.contains(p)) { if (skipIntermediateReports) { if (skipIntermediateReports) { changes.get(wc).mParent = p; changes.get(wc).mParent = p; } else { } else { intermediates.add(p); intermediates.add(p); } } // The parent reaches a participant. foundParentInTargets = true; break; break; } else if (reportIfNotTop(p) && !skipIntermediateReports) { } else if (reportIfNotTop(p) && !skipIntermediateReports) { intermediates.add(p); intermediates.add(p); } } } } if (intermediates.isEmpty()) continue; if (!foundParentInTargets || intermediates.isEmpty()) continue; // Add any always-report parents along the way. // Add any always-report parents along the way. changes.get(wc).mParent = intermediates.get(0); changes.get(wc).mParent = intermediates.get(0); for (int j = 0; j < intermediates.size() - 1; j++) { for (int j = 0; j < intermediates.size() - 1; j++) { Loading Loading @@ -1665,8 +1666,6 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe private static class Targets { private static class Targets { /** All targets. Its keys (depth) are sorted in ascending order naturally. */ /** All targets. Its keys (depth) are sorted in ascending order naturally. */ final SparseArray<WindowContainer<?>> mArray = new SparseArray<>(); final SparseArray<WindowContainer<?>> mArray = new SparseArray<>(); /** The initial participants which have changes. */ final ArrayList<WindowContainer<?>> mValidParticipants = new ArrayList<>(); /** The targets which were represented by their parent. */ /** The targets which were represented by their parent. */ private ArrayList<WindowContainer<?>> mRemovedTargets; private ArrayList<WindowContainer<?>> mRemovedTargets; private int mDepthFactor; private int mDepthFactor; Loading Loading
services/core/java/com/android/server/wm/Transition.java +11 −12 Original line number Original line Diff line number Diff line Loading @@ -1135,7 +1135,6 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe continue; continue; } } targets.add(wc); targets.add(wc); targets.mValidParticipants.add(wc); } } ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, " Initial targets: %s", ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, " Initial targets: %s", targets.mArray); targets.mArray); Loading @@ -1153,15 +1152,17 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe private static void populateParentChanges(Targets targets, private static void populateParentChanges(Targets targets, ArrayMap<WindowContainer, ChangeInfo> changes) { ArrayMap<WindowContainer, ChangeInfo> changes) { final ArrayList<WindowContainer<?>> intermediates = new ArrayList<>(); final ArrayList<WindowContainer<?>> intermediates = new ArrayList<>(); for (int i = targets.mValidParticipants.size() - 1; i >= 0; --i) { // Make a copy to iterate because the original array may be modified. WindowContainer<?> wc = targets.mValidParticipants.get(i); final ArrayList<WindowContainer<?>> targetList = new ArrayList<>(targets.mArray.size()); // Go up if the participant has been represented by its parent. for (int i = targets.mArray.size() - 1; i >= 0; --i) { while (targets.mArray.indexOfValue(wc) < 0 && wc.getParent() != null) { targetList.add(targets.mArray.valueAt(i)); wc = wc.getParent(); } } for (int i = targetList.size() - 1; i >= 0; --i) { final WindowContainer<?> wc = targetList.get(i); // Wallpaper must belong to the top (regardless of how nested it is in DisplayAreas). // Wallpaper must belong to the top (regardless of how nested it is in DisplayAreas). final boolean skipIntermediateReports = isWallpaper(wc); final boolean skipIntermediateReports = isWallpaper(wc); intermediates.clear(); intermediates.clear(); boolean foundParentInTargets = false; // Collect the intermediate parents between target and top changed parent. // Collect the intermediate parents between target and top changed parent. for (WindowContainer<?> p = wc.getParent(); p != null; p = p.getParent()) { for (WindowContainer<?> p = wc.getParent(); p != null; p = p.getParent()) { final ChangeInfo parentChange = changes.get(p); final ChangeInfo parentChange = changes.get(p); Loading @@ -1175,19 +1176,19 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe // The chain above the parent was processed. // The chain above the parent was processed. break; break; } } if (targets.mValidParticipants.contains(p)) { if (targetList.contains(p)) { if (skipIntermediateReports) { if (skipIntermediateReports) { changes.get(wc).mParent = p; changes.get(wc).mParent = p; } else { } else { intermediates.add(p); intermediates.add(p); } } // The parent reaches a participant. foundParentInTargets = true; break; break; } else if (reportIfNotTop(p) && !skipIntermediateReports) { } else if (reportIfNotTop(p) && !skipIntermediateReports) { intermediates.add(p); intermediates.add(p); } } } } if (intermediates.isEmpty()) continue; if (!foundParentInTargets || intermediates.isEmpty()) continue; // Add any always-report parents along the way. // Add any always-report parents along the way. changes.get(wc).mParent = intermediates.get(0); changes.get(wc).mParent = intermediates.get(0); for (int j = 0; j < intermediates.size() - 1; j++) { for (int j = 0; j < intermediates.size() - 1; j++) { Loading Loading @@ -1665,8 +1666,6 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe private static class Targets { private static class Targets { /** All targets. Its keys (depth) are sorted in ascending order naturally. */ /** All targets. Its keys (depth) are sorted in ascending order naturally. */ final SparseArray<WindowContainer<?>> mArray = new SparseArray<>(); final SparseArray<WindowContainer<?>> mArray = new SparseArray<>(); /** The initial participants which have changes. */ final ArrayList<WindowContainer<?>> mValidParticipants = new ArrayList<>(); /** The targets which were represented by their parent. */ /** The targets which were represented by their parent. */ private ArrayList<WindowContainer<?>> mRemovedTargets; private ArrayList<WindowContainer<?>> mRemovedTargets; private int mDepthFactor; private int mDepthFactor; Loading