diff options
7 files changed, 133 insertions, 23 deletions
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index 990ebc5fdbcd..ade13709cac5 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -31,6 +31,7 @@ import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TestApi; +import android.app.ActivityThread; import android.app.KeyguardManager; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; @@ -775,7 +776,8 @@ public final class DisplayManager { */ public void registerDisplayListener(@NonNull DisplayListener listener, @Nullable Handler handler, @EventsMask long eventsMask) { - mGlobal.registerDisplayListener(listener, handler, eventsMask); + mGlobal.registerDisplayListener(listener, handler, eventsMask, + ActivityThread.currentPackageName()); } /** diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java index 6d6085b471d9..8decd50664b3 100644 --- a/core/java/android/hardware/display/DisplayManagerGlobal.java +++ b/core/java/android/hardware/display/DisplayManagerGlobal.java @@ -25,6 +25,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; +import android.app.ActivityThread; import android.app.PropertyInvalidatedCache; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; @@ -45,8 +46,11 @@ import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; import android.os.Trace; +import android.sysprop.DisplayProperties; +import android.text.TextUtils; import android.util.Log; import android.util.Pair; +import android.util.Slog; import android.util.SparseArray; import android.view.Display; import android.view.DisplayAdjustments; @@ -72,7 +76,13 @@ import java.util.concurrent.atomic.AtomicLong; */ public final class DisplayManagerGlobal { private static final String TAG = "DisplayManager"; - private static final boolean DEBUG = false; + + private static final String EXTRA_LOGGING_PACKAGE_NAME = + DisplayProperties.debug_vri_package().orElse(null); + private static String sCurrentPackageName = ActivityThread.currentPackageName(); + private static boolean sExtraDisplayListenerLogging = initExtraLogging(); + + private static final boolean DEBUG = false || sExtraDisplayListenerLogging; // True if display info and display ids should be cached. // @@ -130,6 +140,8 @@ public final class DisplayManagerGlobal { @VisibleForTesting public DisplayManagerGlobal(IDisplayManager dm) { mDm = dm; + initExtraLogging(); + try { mWideColorSpace = ColorSpace.get( @@ -208,7 +220,7 @@ public final class DisplayManagerGlobal { registerCallbackIfNeededLocked(); - if (DEBUG) { + if (DEBUG || extraLogging()) { Log.d(TAG, "getDisplayInfo: displayId=" + displayId + ", info=" + info); } return info; @@ -321,12 +333,14 @@ public final class DisplayManagerGlobal { * If null, listener will use the handler for the current thread, and if still null, * the handler for the main thread. * If that is still null, a runtime exception will be thrown. + * @param packageName of the calling package. */ public void registerDisplayListener(@NonNull DisplayListener listener, - @Nullable Handler handler, @EventsMask long eventsMask) { + @Nullable Handler handler, @EventsMask long eventsMask, String packageName) { Looper looper = getLooperForHandler(handler); Handler springBoard = new Handler(looper); - registerDisplayListener(listener, new HandlerExecutor(springBoard), eventsMask); + registerDisplayListener(listener, new HandlerExecutor(springBoard), eventsMask, + packageName); } /** @@ -334,9 +348,11 @@ public final class DisplayManagerGlobal { * * @param listener The listener that will be called when display changes occur. * @param executor Executor for the thread that will be receiving the callbacks. Cannot be null. + * @param eventsMask Mask of events to be listened to. + * @param packageName of the calling package. */ public void registerDisplayListener(@NonNull DisplayListener listener, - @NonNull Executor executor, @EventsMask long eventsMask) { + @NonNull Executor executor, @EventsMask long eventsMask, String packageName) { if (listener == null) { throw new IllegalArgumentException("listener must not be null"); } @@ -345,15 +361,22 @@ public final class DisplayManagerGlobal { throw new IllegalArgumentException("The set of events to listen to must not be empty."); } + if (extraLogging()) { + Slog.i(TAG, "Registering Display Listener: " + + Long.toBinaryString(eventsMask) + ", packageName: " + packageName); + } + synchronized (mLock) { int index = findDisplayListenerLocked(listener); if (index < 0) { - mDisplayListeners.add(new DisplayListenerDelegate(listener, executor, eventsMask)); + mDisplayListeners.add(new DisplayListenerDelegate(listener, executor, eventsMask, + packageName)); registerCallbackIfNeededLocked(); } else { mDisplayListeners.get(index).setEventsMask(eventsMask); } updateCallbackIfNeededLocked(); + maybeLogAllDisplayListeners(); } } @@ -362,6 +385,10 @@ public final class DisplayManagerGlobal { throw new IllegalArgumentException("listener must not be null"); } + if (extraLogging()) { + Slog.i(TAG, "Unregistering Display Listener: " + listener); + } + synchronized (mLock) { int index = findDisplayListenerLocked(listener); if (index >= 0) { @@ -371,6 +398,18 @@ public final class DisplayManagerGlobal { updateCallbackIfNeededLocked(); } } + maybeLogAllDisplayListeners(); + } + + private void maybeLogAllDisplayListeners() { + if (!sExtraDisplayListenerLogging) { + return; + } + + Slog.i(TAG, "Currently Registered Display Listeners:"); + for (int i = 0; i < mDisplayListeners.size(); i++) { + Slog.i(TAG, i + ": " + mDisplayListeners.get(i)); + } } private static Looper getLooperForHandler(@Nullable Handler handler) { @@ -1148,15 +1187,20 @@ public final class DisplayManagerGlobal { private final DisplayInfo mDisplayInfo = new DisplayInfo(); private final Executor mExecutor; private AtomicLong mGenerationId = new AtomicLong(1); + private final String mPackageName; DisplayListenerDelegate(DisplayListener listener, @NonNull Executor executor, - @EventsMask long eventsMask) { + @EventsMask long eventsMask, String packageName) { mExecutor = executor; mListener = listener; mEventsMask = eventsMask; + mPackageName = packageName; } public void sendDisplayEvent(int displayId, @DisplayEvent int event, DisplayInfo info) { + if (extraLogging()) { + Slog.i(TAG, "Sending Display Event: " + eventToString(event)); + } long generationId = mGenerationId.get(); Message msg = Message.obtain(null, event, displayId, 0, info); mExecutor.execute(() -> { @@ -1177,6 +1221,14 @@ public final class DisplayManagerGlobal { } private void handleMessage(Message msg) { + if (extraLogging()) { + Slog.i(TAG, "DisplayListenerDelegate(" + eventToString(msg.what) + + ", display=" + msg.arg1 + + ", mEventsMask=" + Long.toBinaryString(mEventsMask) + + ", mPackageName=" + mPackageName + + ", msg.obj=" + msg.obj + + ", listener=" + mListener.getClass() + ")"); + } if (DEBUG) { Trace.beginSection( "DisplayListenerDelegate(" + eventToString(msg.what) @@ -1193,6 +1245,10 @@ public final class DisplayManagerGlobal { if ((mEventsMask & DisplayManager.EVENT_FLAG_DISPLAY_CHANGED) != 0) { DisplayInfo newInfo = (DisplayInfo) msg.obj; if (newInfo != null && !newInfo.equals(mDisplayInfo)) { + if (extraLogging()) { + Slog.i(TAG, "Sending onDisplayChanged: Display Changed. Info: " + + newInfo); + } mDisplayInfo.copyFrom(newInfo); mListener.onDisplayChanged(msg.arg1); } @@ -1228,6 +1284,11 @@ public final class DisplayManagerGlobal { Trace.endSection(); } } + + @Override + public String toString() { + return "mask: {" + mEventsMask + "}, for " + mListener.getClass(); + } } /** @@ -1353,4 +1414,19 @@ public final class DisplayManagerGlobal { } return "UNKNOWN"; } + + + private static boolean initExtraLogging() { + if (sCurrentPackageName == null) { + sCurrentPackageName = ActivityThread.currentPackageName(); + sExtraDisplayListenerLogging = !TextUtils.isEmpty(EXTRA_LOGGING_PACKAGE_NAME) + && EXTRA_LOGGING_PACKAGE_NAME.equals(sCurrentPackageName); + } + return sExtraDisplayListenerLogging; + } + + private static boolean extraLogging() { + return sExtraDisplayListenerLogging && EXTRA_LOGGING_PACKAGE_NAME.equals( + sCurrentPackageName); + } } diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java index 0b2b6ce33666..506945501609 100644 --- a/core/java/android/view/Display.java +++ b/core/java/android/view/Display.java @@ -26,6 +26,7 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.annotation.TestApi; +import android.app.ActivityThread; import android.app.KeyguardManager; import android.app.WindowConfiguration; import android.compat.annotation.UnsupportedAppUsage; @@ -1366,7 +1367,8 @@ public final class Display { // form of the larger DISPLAY_CHANGED event mGlobal.registerDisplayListener(toRegister, executor, DisplayManager.EVENT_FLAG_HDR_SDR_RATIO_CHANGED - | DisplayManagerGlobal.EVENT_DISPLAY_CHANGED); + | DisplayManagerGlobal.EVENT_DISPLAY_CHANGED, + ActivityThread.currentPackageName()); } } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index cf46bcccdf87..7838ce072f7d 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1549,7 +1549,8 @@ public final class ViewRootImpl implements ViewParent, mHandler, DisplayManager.EVENT_FLAG_DISPLAY_ADDED | DisplayManager.EVENT_FLAG_DISPLAY_CHANGED - | DisplayManager.EVENT_FLAG_DISPLAY_REMOVED); + | DisplayManager.EVENT_FLAG_DISPLAY_REMOVED, + mBasePackageName); } /** diff --git a/core/java/com/android/internal/jank/DisplayResolutionTracker.java b/core/java/com/android/internal/jank/DisplayResolutionTracker.java index 72a1bac28c9f..ca6c54dc0285 100644 --- a/core/java/com/android/internal/jank/DisplayResolutionTracker.java +++ b/core/java/com/android/internal/jank/DisplayResolutionTracker.java @@ -24,6 +24,7 @@ import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_IN import android.annotation.IntDef; import android.annotation.Nullable; +import android.app.ActivityThread; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManagerGlobal; import android.os.Handler; @@ -147,7 +148,8 @@ public class DisplayResolutionTracker { public void registerDisplayListener(DisplayManager.DisplayListener listener) { manager.registerDisplayListener(listener, handler, DisplayManager.EVENT_FLAG_DISPLAY_ADDED - | DisplayManager.EVENT_FLAG_DISPLAY_CHANGED); + | DisplayManager.EVENT_FLAG_DISPLAY_CHANGED, + ActivityThread.currentPackageName()); } @Override diff --git a/core/tests/coretests/src/android/hardware/display/DisplayManagerGlobalTest.java b/core/tests/coretests/src/android/hardware/display/DisplayManagerGlobalTest.java index 149f58f0a69b..c2e6b60cd680 100644 --- a/core/tests/coretests/src/android/hardware/display/DisplayManagerGlobalTest.java +++ b/core/tests/coretests/src/android/hardware/display/DisplayManagerGlobalTest.java @@ -42,8 +42,8 @@ import org.mockito.MockitoAnnotations; public class DisplayManagerGlobalTest { private static final long ALL_DISPLAY_EVENTS = DisplayManager.EVENT_FLAG_DISPLAY_ADDED - | DisplayManager.EVENT_FLAG_DISPLAY_CHANGED - | DisplayManager.EVENT_FLAG_DISPLAY_REMOVED; + | DisplayManager.EVENT_FLAG_DISPLAY_CHANGED + | DisplayManager.EVENT_FLAG_DISPLAY_REMOVED; @Mock private IDisplayManager mDisplayManager; @@ -69,7 +69,8 @@ public class DisplayManagerGlobalTest { @Test public void testDisplayListenerIsCalled_WhenDisplayEventOccurs() throws RemoteException { - mDisplayManagerGlobal.registerDisplayListener(mListener, mHandler, ALL_DISPLAY_EVENTS); + mDisplayManagerGlobal.registerDisplayListener(mListener, mHandler, ALL_DISPLAY_EVENTS, + null); Mockito.verify(mDisplayManager) .registerCallbackWithEventMask(mCallbackCaptor.capture(), anyLong()); IDisplayManagerCallback callback = mCallbackCaptor.getValue(); @@ -97,26 +98,27 @@ public class DisplayManagerGlobalTest { public void testDisplayListenerIsNotCalled_WhenClientIsNotSubscribed() throws RemoteException { // First we subscribe to all events in order to test that the subsequent calls to // registerDisplayListener will update the event mask. - mDisplayManagerGlobal.registerDisplayListener(mListener, mHandler, ALL_DISPLAY_EVENTS); + mDisplayManagerGlobal.registerDisplayListener(mListener, mHandler, ALL_DISPLAY_EVENTS, + null); Mockito.verify(mDisplayManager) .registerCallbackWithEventMask(mCallbackCaptor.capture(), anyLong()); IDisplayManagerCallback callback = mCallbackCaptor.getValue(); int displayId = 1; mDisplayManagerGlobal.registerDisplayListener(mListener, mHandler, - ALL_DISPLAY_EVENTS & ~DisplayManager.EVENT_FLAG_DISPLAY_ADDED); + ALL_DISPLAY_EVENTS & ~DisplayManager.EVENT_FLAG_DISPLAY_ADDED, null); callback.onDisplayEvent(displayId, DisplayManagerGlobal.EVENT_DISPLAY_ADDED); waitForHandler(); Mockito.verifyZeroInteractions(mListener); mDisplayManagerGlobal.registerDisplayListener(mListener, mHandler, - ALL_DISPLAY_EVENTS & ~DisplayManager.EVENT_FLAG_DISPLAY_CHANGED); + ALL_DISPLAY_EVENTS & ~DisplayManager.EVENT_FLAG_DISPLAY_CHANGED, null); callback.onDisplayEvent(displayId, DisplayManagerGlobal.EVENT_DISPLAY_CHANGED); waitForHandler(); Mockito.verifyZeroInteractions(mListener); mDisplayManagerGlobal.registerDisplayListener(mListener, mHandler, - ALL_DISPLAY_EVENTS & ~DisplayManager.EVENT_FLAG_DISPLAY_REMOVED); + ALL_DISPLAY_EVENTS & ~DisplayManager.EVENT_FLAG_DISPLAY_REMOVED, null); callback.onDisplayEvent(displayId, DisplayManagerGlobal.EVENT_DISPLAY_REMOVED); waitForHandler(); Mockito.verifyZeroInteractions(mListener); @@ -139,7 +141,7 @@ public class DisplayManagerGlobalTest { public void testDisplayManagerGlobalRegistersWithDisplayManager_WhenThereAreListeners() throws RemoteException { mDisplayManagerGlobal.registerDisplayListener(mListener, mHandler, - DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS); + DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS, null); InOrder inOrder = Mockito.inOrder(mDisplayManager); inOrder.verify(mDisplayManager) @@ -163,6 +165,7 @@ public class DisplayManagerGlobalTest { } private void waitForHandler() { - mHandler.runWithScissors(() -> { }, 0); + mHandler.runWithScissors(() -> { + }, 0); } } diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index d372f3031b81..471f56413d7c 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -493,6 +493,7 @@ public final class DisplayManagerService extends SystemService { // If we would like to keep a particular eye on a package, we can set the package name. private final boolean mExtraDisplayEventLogging; + private final String mExtraDisplayLoggingPackageName; private final BroadcastReceiver mIdleModeReceiver = new BroadcastReceiver() { @Override @@ -580,8 +581,8 @@ public final class DisplayManagerService extends SystemService { mOverlayProperties = SurfaceControl.getOverlaySupport(); mSystemReady = false; mConfigParameterProvider = new DeviceConfigParameterProvider(DeviceConfigInterface.REAL); - final String name = DisplayProperties.debug_vri_package().orElse(null); - mExtraDisplayEventLogging = !TextUtils.isEmpty(name); + mExtraDisplayLoggingPackageName = DisplayProperties.debug_vri_package().orElse(null); + mExtraDisplayEventLogging = !TextUtils.isEmpty(mExtraDisplayLoggingPackageName); } public void setupSchedulerPolicies() { @@ -2924,12 +2925,17 @@ public final class DisplayManagerService extends SystemService { // Only send updates outside of DisplayManagerService for enabled displays if (display.isEnabledLocked()) { sendDisplayEventLocked(display, event); + } else if (mExtraDisplayEventLogging) { + Slog.i(TAG, "Not Sending Display Event; display is not enabled: " + display); } } private void sendDisplayEventLocked(@NonNull LogicalDisplay display, @DisplayEvent int event) { int displayId = display.getDisplayIdLocked(); Message msg = mHandler.obtainMessage(MSG_DELIVER_DISPLAY_EVENT, displayId, event); + if (mExtraDisplayEventLogging) { + Slog.i(TAG, "Deliver Display Event on Handler: " + event); + } mHandler.sendMessage(msg); } @@ -2995,6 +3001,10 @@ public final class DisplayManagerService extends SystemService { // For cached apps, save the pending event until it becomes non-cached synchronized (mPendingCallbackSelfLocked) { PendingCallback pendingCallback = mPendingCallbackSelfLocked.get(uid); + if (extraLogging(callbackRecord.mPackageName)) { + Slog.i(TAG, + "Uid is cached: " + uid + ", pendingCallback: " + pendingCallback); + } if (pendingCallback == null) { mPendingCallbackSelfLocked.put(uid, new PendingCallback(callbackRecord, displayId, event)); @@ -3009,6 +3019,10 @@ public final class DisplayManagerService extends SystemService { mTempCallbacks.clear(); } + private boolean extraLogging(String packageName) { + return mExtraDisplayEventLogging && mExtraDisplayLoggingPackageName.equals(packageName); + } + // Runs on Handler thread. // Delivers display group event notifications to callbacks. private void deliverDisplayGroupEvent(int groupId, int event) { @@ -3451,6 +3465,7 @@ public final class DisplayManagerService extends SystemService { public final int mUid; private final IDisplayManagerCallback mCallback; private @EventsMask AtomicLong mEventsMask; + private final String mPackageName; public boolean mWifiDisplayScanRequested; @@ -3460,6 +3475,9 @@ public final class DisplayManagerService extends SystemService { mUid = uid; mCallback = callback; mEventsMask = new AtomicLong(eventsMask); + + String[] packageNames = mContext.getPackageManager().getPackagesForUid(uid); + mPackageName = packageNames == null ? null : packageNames[0]; } public void updateEventsMask(@EventsMask long eventsMask) { @@ -3468,7 +3486,8 @@ public final class DisplayManagerService extends SystemService { @Override public void binderDied() { - if (DEBUG) { + if (DEBUG || mExtraDisplayEventLogging && mExtraDisplayLoggingPackageName.equals( + mPackageName)) { Slog.d(TAG, "Display listener for pid " + mPid + " died."); } onCallbackDied(this); @@ -3479,6 +3498,11 @@ public final class DisplayManagerService extends SystemService { */ public boolean notifyDisplayEventAsync(int displayId, @DisplayEvent int event) { if (!shouldSendEvent(event)) { + if (mExtraDisplayEventLogging && mExtraDisplayLoggingPackageName.equals( + mPackageName)) { + Slog.i(TAG, + "Not sending displayEvent: " + event + " due to mask:" + mEventsMask); + } return true; } |