Loading core/api/test-current.txt +0 −1 Original line number Diff line number Diff line Loading @@ -2440,7 +2440,6 @@ package android.window { } public class DisplayAreaOrganizer extends android.window.WindowOrganizer { ctor public DisplayAreaOrganizer(); method public void onDisplayAreaAppeared(@NonNull android.window.DisplayAreaInfo, @NonNull android.view.SurfaceControl); method public void onDisplayAreaVanished(@NonNull android.window.DisplayAreaInfo); method @CallSuper @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public java.util.List<android.window.DisplayAreaAppearedInfo> registerOrganizer(int); Loading core/java/android/view/WindowlessWindowManager.java +5 −1 Original line number Diff line number Diff line Loading @@ -126,6 +126,10 @@ public class WindowlessWindowManager implements IWindowSession { } } protected void attachToParentSurface(SurfaceControl.Builder b) { b.setParent(mRootSurface); } /** * IWindowSession implementation. */ Loading @@ -135,11 +139,11 @@ public class WindowlessWindowManager implements IWindowSession { DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel, InsetsState outInsetsState, InsetsSourceControl[] outActiveControls) { final SurfaceControl.Builder b = new SurfaceControl.Builder(mSurfaceSession) .setParent(mRootSurface) .setFormat(attrs.format) .setBufferSize(getSurfaceWidth(attrs), getSurfaceHeight(attrs)) .setName(attrs.getTitle().toString()) .setCallsite("WindowlessWindowManager.addToDisplay"); attachToParentSurface(b); final SurfaceControl sc = b.build(); if (((attrs.inputFeatures & Loading core/java/android/window/DisplayAreaOrganizer.java +25 −3 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.os.RemoteException; import android.view.SurfaceControl; import java.util.List; import java.util.concurrent.Executor; /** * Interface for WindowManager to delegate control of display areas. Loading Loading @@ -113,6 +114,24 @@ public class DisplayAreaOrganizer extends WindowOrganizer { */ public static final int FEATURE_RUNTIME_TASK_CONTAINER_FIRST = FEATURE_VENDOR_LAST + 1; // Callbacks WM Core are posted on this executor if it isn't null, otherwise direct calls are // made on the incoming binder call. private final Executor mExecutor; /** @hide */ public DisplayAreaOrganizer(@NonNull Executor executor) { mExecutor = executor; } /** * Gets the executor to run callbacks on. * @hide */ @NonNull public Executor getExecutor() { return mExecutor; } /** * Registers a DisplayAreaOrganizer to manage display areas for a given feature. A feature can * not be registered by multiple organizers at the same time. Loading Loading @@ -208,17 +227,20 @@ public class DisplayAreaOrganizer extends WindowOrganizer { @Override public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo, @NonNull SurfaceControl leash) { DisplayAreaOrganizer.this.onDisplayAreaAppeared(displayAreaInfo, leash); mExecutor.execute( () -> DisplayAreaOrganizer.this.onDisplayAreaAppeared(displayAreaInfo, leash)); } @Override public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) { DisplayAreaOrganizer.this.onDisplayAreaVanished(displayAreaInfo); mExecutor.execute( () -> DisplayAreaOrganizer.this.onDisplayAreaVanished(displayAreaInfo)); } @Override public void onDisplayAreaInfoChanged(@NonNull DisplayAreaInfo displayAreaInfo) { DisplayAreaOrganizer.this.onDisplayAreaInfoChanged(displayAreaInfo); mExecutor.execute( () -> DisplayAreaOrganizer.this.onDisplayAreaInfoChanged(displayAreaInfo)); } }; Loading libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java 0 → 100644 +169 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.wm.shell; import android.util.SparseArray; import android.view.SurfaceControl; import android.window.DisplayAreaInfo; import android.window.DisplayAreaOrganizer; import androidx.annotation.NonNull; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executor; /** Display area organizer for the root/default TaskDisplayAreas */ public class RootTaskDisplayAreaOrganizer extends DisplayAreaOrganizer { private static final String TAG = RootTaskDisplayAreaOrganizer.class.getSimpleName(); // Display area info. mapped by displayIds. private final SparseArray<DisplayAreaInfo> mDisplayAreasInfo = new SparseArray<>(); // Display area leashes. mapped by displayIds. private final SparseArray<SurfaceControl> mLeashes = new SparseArray<>(); private final SparseArray<ArrayList<RootTaskDisplayAreaListener>> mListeners = new SparseArray<>(); public RootTaskDisplayAreaOrganizer(Executor executor) { super(executor); registerOrganizer(FEATURE_DEFAULT_TASK_CONTAINER); } public void registerListener(int displayId, RootTaskDisplayAreaListener listener) { ArrayList<RootTaskDisplayAreaListener> listeners = mListeners.get(displayId); if (listeners == null) { listeners = new ArrayList<>(); mListeners.put(displayId, listeners); } listeners.add(listener); final DisplayAreaInfo info = mDisplayAreasInfo.get(displayId); if (info != null) { listener.onDisplayAreaAppeared(info); } } public void unregisterListener(RootTaskDisplayAreaListener listener) { for (int i = mListeners.size() - 1; i >= 0; --i) { final List<RootTaskDisplayAreaListener> listeners = mListeners.valueAt(i); if (listeners == null) continue; listeners.remove(listener); } } public void attachToDisplayArea(int displayId, SurfaceControl.Builder b) { final SurfaceControl sc = mLeashes.get(displayId); b.setParent(sc); } @Override public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo, @NonNull SurfaceControl leash) { if (displayAreaInfo.featureId != FEATURE_DEFAULT_TASK_CONTAINER) { throw new IllegalArgumentException( "Unknown feature: " + displayAreaInfo.featureId + "displayAreaInfo:" + displayAreaInfo); } final int displayId = displayAreaInfo.displayId; if (mDisplayAreasInfo.get(displayId) != null) { throw new IllegalArgumentException( "Duplicate DA for displayId: " + displayId + " displayAreaInfo:" + displayAreaInfo + " mDisplayAreasInfo.get():" + mDisplayAreasInfo.get(displayId)); } mDisplayAreasInfo.put(displayId, displayAreaInfo); ArrayList<RootTaskDisplayAreaListener> listeners = mListeners.get(displayId); if (listeners != null) { for (int i = listeners.size() - 1; i >= 0; --i) { listeners.get(i).onDisplayAreaAppeared(displayAreaInfo); } } } @Override public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) { final int displayId = displayAreaInfo.displayId; if (mDisplayAreasInfo.get(displayId) == null) { throw new IllegalArgumentException( "onDisplayAreaVanished() Unknown DA displayId: " + displayId + " displayAreaInfo:" + displayAreaInfo + " mDisplayAreasInfo.get():" + mDisplayAreasInfo.get(displayId)); } mDisplayAreasInfo.remove(displayId); ArrayList<RootTaskDisplayAreaListener> listeners = mListeners.get(displayId); if (listeners != null) { for (int i = listeners.size() - 1; i >= 0; --i) { listeners.get(i).onDisplayAreaVanished(displayAreaInfo); } } } @Override public void onDisplayAreaInfoChanged(@NonNull DisplayAreaInfo displayAreaInfo) { final int displayId = displayAreaInfo.displayId; if (mDisplayAreasInfo.get(displayId) == null) { throw new IllegalArgumentException( "onDisplayAreaInfoChanged() Unknown DA displayId: " + displayId + " displayAreaInfo:" + displayAreaInfo + " mDisplayAreasInfo.get():" + mDisplayAreasInfo.get(displayId)); } mDisplayAreasInfo.put(displayId, displayAreaInfo); ArrayList<RootTaskDisplayAreaListener> listeners = mListeners.get(displayId); if (listeners != null) { for (int i = listeners.size() - 1; i >= 0; --i) { listeners.get(i).onDisplayAreaInfoChanged(displayAreaInfo); } } } public void dump(@NonNull PrintWriter pw, String prefix) { final String innerPrefix = prefix + " "; final String childPrefix = innerPrefix + " "; pw.println(prefix + this); } @Override public String toString() { return TAG + "#" + mDisplayAreasInfo.size(); } /** Callbacks for when root task display areas change. */ public interface RootTaskDisplayAreaListener { default void onDisplayAreaAppeared(DisplayAreaInfo displayAreaInfo) { } default void onDisplayAreaVanished(DisplayAreaInfo displayAreaInfo) { } default void onDisplayAreaInfoChanged(DisplayAreaInfo displayAreaInfo) { } default void dump(@NonNull PrintWriter pw, String prefix) { } } } No newline at end of file libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java +1 −1 Original line number Diff line number Diff line Loading @@ -96,7 +96,7 @@ class AppPair implements ShellTaskOrganizer.TaskListener, SplitLayout.LayoutChan mTaskInfo2 = task2; mSplitLayout = new SplitLayout( mDisplayController.getDisplayContext(mRootTaskInfo.displayId), mRootTaskInfo.configuration, this, mRootTaskLeash); mRootTaskInfo.configuration, this, b -> b.setParent(mRootTaskLeash)); final WindowContainerToken token1 = task1.token; final WindowContainerToken token2 = task2.token; Loading Loading
core/api/test-current.txt +0 −1 Original line number Diff line number Diff line Loading @@ -2440,7 +2440,6 @@ package android.window { } public class DisplayAreaOrganizer extends android.window.WindowOrganizer { ctor public DisplayAreaOrganizer(); method public void onDisplayAreaAppeared(@NonNull android.window.DisplayAreaInfo, @NonNull android.view.SurfaceControl); method public void onDisplayAreaVanished(@NonNull android.window.DisplayAreaInfo); method @CallSuper @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public java.util.List<android.window.DisplayAreaAppearedInfo> registerOrganizer(int); Loading
core/java/android/view/WindowlessWindowManager.java +5 −1 Original line number Diff line number Diff line Loading @@ -126,6 +126,10 @@ public class WindowlessWindowManager implements IWindowSession { } } protected void attachToParentSurface(SurfaceControl.Builder b) { b.setParent(mRootSurface); } /** * IWindowSession implementation. */ Loading @@ -135,11 +139,11 @@ public class WindowlessWindowManager implements IWindowSession { DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel, InsetsState outInsetsState, InsetsSourceControl[] outActiveControls) { final SurfaceControl.Builder b = new SurfaceControl.Builder(mSurfaceSession) .setParent(mRootSurface) .setFormat(attrs.format) .setBufferSize(getSurfaceWidth(attrs), getSurfaceHeight(attrs)) .setName(attrs.getTitle().toString()) .setCallsite("WindowlessWindowManager.addToDisplay"); attachToParentSurface(b); final SurfaceControl sc = b.build(); if (((attrs.inputFeatures & Loading
core/java/android/window/DisplayAreaOrganizer.java +25 −3 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.os.RemoteException; import android.view.SurfaceControl; import java.util.List; import java.util.concurrent.Executor; /** * Interface for WindowManager to delegate control of display areas. Loading Loading @@ -113,6 +114,24 @@ public class DisplayAreaOrganizer extends WindowOrganizer { */ public static final int FEATURE_RUNTIME_TASK_CONTAINER_FIRST = FEATURE_VENDOR_LAST + 1; // Callbacks WM Core are posted on this executor if it isn't null, otherwise direct calls are // made on the incoming binder call. private final Executor mExecutor; /** @hide */ public DisplayAreaOrganizer(@NonNull Executor executor) { mExecutor = executor; } /** * Gets the executor to run callbacks on. * @hide */ @NonNull public Executor getExecutor() { return mExecutor; } /** * Registers a DisplayAreaOrganizer to manage display areas for a given feature. A feature can * not be registered by multiple organizers at the same time. Loading Loading @@ -208,17 +227,20 @@ public class DisplayAreaOrganizer extends WindowOrganizer { @Override public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo, @NonNull SurfaceControl leash) { DisplayAreaOrganizer.this.onDisplayAreaAppeared(displayAreaInfo, leash); mExecutor.execute( () -> DisplayAreaOrganizer.this.onDisplayAreaAppeared(displayAreaInfo, leash)); } @Override public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) { DisplayAreaOrganizer.this.onDisplayAreaVanished(displayAreaInfo); mExecutor.execute( () -> DisplayAreaOrganizer.this.onDisplayAreaVanished(displayAreaInfo)); } @Override public void onDisplayAreaInfoChanged(@NonNull DisplayAreaInfo displayAreaInfo) { DisplayAreaOrganizer.this.onDisplayAreaInfoChanged(displayAreaInfo); mExecutor.execute( () -> DisplayAreaOrganizer.this.onDisplayAreaInfoChanged(displayAreaInfo)); } }; Loading
libs/WindowManager/Shell/src/com/android/wm/shell/RootTaskDisplayAreaOrganizer.java 0 → 100644 +169 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.wm.shell; import android.util.SparseArray; import android.view.SurfaceControl; import android.window.DisplayAreaInfo; import android.window.DisplayAreaOrganizer; import androidx.annotation.NonNull; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executor; /** Display area organizer for the root/default TaskDisplayAreas */ public class RootTaskDisplayAreaOrganizer extends DisplayAreaOrganizer { private static final String TAG = RootTaskDisplayAreaOrganizer.class.getSimpleName(); // Display area info. mapped by displayIds. private final SparseArray<DisplayAreaInfo> mDisplayAreasInfo = new SparseArray<>(); // Display area leashes. mapped by displayIds. private final SparseArray<SurfaceControl> mLeashes = new SparseArray<>(); private final SparseArray<ArrayList<RootTaskDisplayAreaListener>> mListeners = new SparseArray<>(); public RootTaskDisplayAreaOrganizer(Executor executor) { super(executor); registerOrganizer(FEATURE_DEFAULT_TASK_CONTAINER); } public void registerListener(int displayId, RootTaskDisplayAreaListener listener) { ArrayList<RootTaskDisplayAreaListener> listeners = mListeners.get(displayId); if (listeners == null) { listeners = new ArrayList<>(); mListeners.put(displayId, listeners); } listeners.add(listener); final DisplayAreaInfo info = mDisplayAreasInfo.get(displayId); if (info != null) { listener.onDisplayAreaAppeared(info); } } public void unregisterListener(RootTaskDisplayAreaListener listener) { for (int i = mListeners.size() - 1; i >= 0; --i) { final List<RootTaskDisplayAreaListener> listeners = mListeners.valueAt(i); if (listeners == null) continue; listeners.remove(listener); } } public void attachToDisplayArea(int displayId, SurfaceControl.Builder b) { final SurfaceControl sc = mLeashes.get(displayId); b.setParent(sc); } @Override public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo, @NonNull SurfaceControl leash) { if (displayAreaInfo.featureId != FEATURE_DEFAULT_TASK_CONTAINER) { throw new IllegalArgumentException( "Unknown feature: " + displayAreaInfo.featureId + "displayAreaInfo:" + displayAreaInfo); } final int displayId = displayAreaInfo.displayId; if (mDisplayAreasInfo.get(displayId) != null) { throw new IllegalArgumentException( "Duplicate DA for displayId: " + displayId + " displayAreaInfo:" + displayAreaInfo + " mDisplayAreasInfo.get():" + mDisplayAreasInfo.get(displayId)); } mDisplayAreasInfo.put(displayId, displayAreaInfo); ArrayList<RootTaskDisplayAreaListener> listeners = mListeners.get(displayId); if (listeners != null) { for (int i = listeners.size() - 1; i >= 0; --i) { listeners.get(i).onDisplayAreaAppeared(displayAreaInfo); } } } @Override public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) { final int displayId = displayAreaInfo.displayId; if (mDisplayAreasInfo.get(displayId) == null) { throw new IllegalArgumentException( "onDisplayAreaVanished() Unknown DA displayId: " + displayId + " displayAreaInfo:" + displayAreaInfo + " mDisplayAreasInfo.get():" + mDisplayAreasInfo.get(displayId)); } mDisplayAreasInfo.remove(displayId); ArrayList<RootTaskDisplayAreaListener> listeners = mListeners.get(displayId); if (listeners != null) { for (int i = listeners.size() - 1; i >= 0; --i) { listeners.get(i).onDisplayAreaVanished(displayAreaInfo); } } } @Override public void onDisplayAreaInfoChanged(@NonNull DisplayAreaInfo displayAreaInfo) { final int displayId = displayAreaInfo.displayId; if (mDisplayAreasInfo.get(displayId) == null) { throw new IllegalArgumentException( "onDisplayAreaInfoChanged() Unknown DA displayId: " + displayId + " displayAreaInfo:" + displayAreaInfo + " mDisplayAreasInfo.get():" + mDisplayAreasInfo.get(displayId)); } mDisplayAreasInfo.put(displayId, displayAreaInfo); ArrayList<RootTaskDisplayAreaListener> listeners = mListeners.get(displayId); if (listeners != null) { for (int i = listeners.size() - 1; i >= 0; --i) { listeners.get(i).onDisplayAreaInfoChanged(displayAreaInfo); } } } public void dump(@NonNull PrintWriter pw, String prefix) { final String innerPrefix = prefix + " "; final String childPrefix = innerPrefix + " "; pw.println(prefix + this); } @Override public String toString() { return TAG + "#" + mDisplayAreasInfo.size(); } /** Callbacks for when root task display areas change. */ public interface RootTaskDisplayAreaListener { default void onDisplayAreaAppeared(DisplayAreaInfo displayAreaInfo) { } default void onDisplayAreaVanished(DisplayAreaInfo displayAreaInfo) { } default void onDisplayAreaInfoChanged(DisplayAreaInfo displayAreaInfo) { } default void dump(@NonNull PrintWriter pw, String prefix) { } } } No newline at end of file
libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPair.java +1 −1 Original line number Diff line number Diff line Loading @@ -96,7 +96,7 @@ class AppPair implements ShellTaskOrganizer.TaskListener, SplitLayout.LayoutChan mTaskInfo2 = task2; mSplitLayout = new SplitLayout( mDisplayController.getDisplayContext(mRootTaskInfo.displayId), mRootTaskInfo.configuration, this, mRootTaskLeash); mRootTaskInfo.configuration, this, b -> b.setParent(mRootTaskLeash)); final WindowContainerToken token1 = task1.token; final WindowContainerToken token2 = task2.token; Loading