| /* |
| * Copyright (c) 2022 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.systemui.shade; |
| |
| import android.annotation.NonNull; |
| import android.graphics.Canvas; |
| import android.graphics.Color; |
| import android.graphics.ColorFilter; |
| import android.graphics.Paint; |
| import android.graphics.PixelFormat; |
| import android.graphics.drawable.Drawable; |
| |
| import com.android.keyguard.LockIconViewController; |
| import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; |
| |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| /** |
| * Drawable for NotificationPanelViewController. |
| */ |
| public class DebugDrawable extends Drawable { |
| |
| private final NotificationPanelViewController mNotificationPanelViewController; |
| private final NotificationPanelView mView; |
| private final NotificationStackScrollLayoutController mNotificationStackScrollLayoutController; |
| private final LockIconViewController mLockIconViewController; |
| private final QuickSettingsController mQsController; |
| private final Set<Integer> mDebugTextUsedYPositions; |
| private final Paint mDebugPaint; |
| |
| public DebugDrawable( |
| NotificationPanelViewController notificationPanelViewController, |
| NotificationPanelView notificationPanelView, |
| NotificationStackScrollLayoutController notificationStackScrollLayoutController, |
| LockIconViewController lockIconViewController, |
| QuickSettingsController quickSettingsController |
| ) { |
| mNotificationPanelViewController = notificationPanelViewController; |
| mView = notificationPanelView; |
| mNotificationStackScrollLayoutController = notificationStackScrollLayoutController; |
| mLockIconViewController = lockIconViewController; |
| mQsController = quickSettingsController; |
| mDebugTextUsedYPositions = new HashSet<>(); |
| mDebugPaint = new Paint(); |
| } |
| |
| @Override |
| public void draw(@androidx.annotation.NonNull @NonNull Canvas canvas) { |
| mDebugTextUsedYPositions.clear(); |
| |
| mDebugPaint.setColor(Color.RED); |
| mDebugPaint.setStrokeWidth(2); |
| mDebugPaint.setStyle(Paint.Style.STROKE); |
| mDebugPaint.setTextSize(24); |
| String headerDebugInfo = mNotificationPanelViewController.getHeaderDebugInfo(); |
| if (headerDebugInfo != null) canvas.drawText(headerDebugInfo, 50, 100, mDebugPaint); |
| |
| drawDebugInfo(canvas, mNotificationPanelViewController.getMaxPanelHeight(), |
| Color.RED, "getMaxPanelHeight()"); |
| drawDebugInfo(canvas, (int) mNotificationPanelViewController.getExpandedHeight(), |
| Color.BLUE, "getExpandedHeight()"); |
| drawDebugInfo(canvas, mQsController.calculatePanelHeightExpanded( |
| mNotificationPanelViewController.getClockPositionResult() |
| .stackScrollerPadding), |
| Color.GREEN, "calculatePanelHeightQsExpanded()"); |
| drawDebugInfo(canvas, mQsController.calculatePanelHeightExpanded( |
| mNotificationPanelViewController.getClockPositionResult() |
| .stackScrollerPadding), |
| Color.YELLOW, "calculatePanelHeightShade()"); |
| drawDebugInfo(canvas, |
| (int) mQsController.calculateNotificationsTopPadding( |
| mNotificationPanelViewController.isExpandingOrCollapsing(), |
| mNotificationPanelViewController.getKeyguardNotificationStaticPadding(), |
| mNotificationPanelViewController.getExpandedFraction()), |
| Color.MAGENTA, "calculateNotificationsTopPadding()"); |
| drawDebugInfo(canvas, mNotificationPanelViewController.getClockPositionResult().clockY, |
| Color.GRAY, "mClockPositionResult.clockY"); |
| drawDebugInfo(canvas, (int) mLockIconViewController.getTop(), Color.GRAY, |
| "mLockIconViewController.getTop()"); |
| |
| if (mNotificationPanelViewController.isKeyguardShowing()) { |
| // Notifications have the space between those two lines. |
| drawDebugInfo(canvas, |
| mNotificationStackScrollLayoutController.getTop() |
| + (int) mNotificationPanelViewController |
| .getKeyguardNotificationTopPadding(), |
| Color.RED, "NSSL.getTop() + mKeyguardNotificationTopPadding"); |
| |
| drawDebugInfo(canvas, mNotificationStackScrollLayoutController.getBottom() |
| - (int) mNotificationPanelViewController |
| .getKeyguardNotificationBottomPadding(), |
| Color.RED, "NSSL.getBottom() - mKeyguardNotificationBottomPadding"); |
| } |
| |
| mDebugPaint.setColor(Color.CYAN); |
| canvas.drawLine(0, |
| mNotificationPanelViewController.getClockPositionResult().stackScrollerPadding, |
| mView.getWidth(), mNotificationStackScrollLayoutController.getTopPadding(), |
| mDebugPaint); |
| } |
| |
| private void drawDebugInfo(Canvas canvas, int y, int color, String label) { |
| mDebugPaint.setColor(color); |
| canvas.drawLine(/* startX= */ 0, /* startY= */ y, /* stopX= */ mView.getWidth(), |
| /* stopY= */ y, mDebugPaint); |
| canvas.drawText(label + " = " + y + "px", /* x= */ 0, |
| /* y= */ computeDebugYTextPosition(y), mDebugPaint); |
| } |
| |
| private int computeDebugYTextPosition(int lineY) { |
| if (lineY - mDebugPaint.getTextSize() < 0) { |
| // Avoiding drawing out of bounds |
| lineY += mDebugPaint.getTextSize(); |
| } |
| int textY = lineY; |
| while (mDebugTextUsedYPositions.contains(textY)) { |
| textY = (int) (textY + mDebugPaint.getTextSize()); |
| } |
| mDebugTextUsedYPositions.add(textY); |
| return textY; |
| } |
| |
| @Override |
| public void setAlpha(int alpha) { |
| |
| } |
| |
| @Override |
| public void setColorFilter(ColorFilter colorFilter) { |
| |
| } |
| |
| @Override |
| public int getOpacity() { |
| return PixelFormat.UNKNOWN; |
| } |
| } |