Merge "Extract DebugDrawable from NPVC into its own class" into tm-qpr-dev

This commit is contained in:
Shawn Lee
2022-11-07 18:53:35 +00:00
committed by Android (Google) Code Review
2 changed files with 166 additions and 95 deletions

View File

@@ -0,0 +1,142 @@
/*
* 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 Set<Integer> mDebugTextUsedYPositions;
private final Paint mDebugPaint;
public DebugDrawable(
NotificationPanelViewController notificationPanelViewController,
NotificationPanelView notificationPanelView,
NotificationStackScrollLayoutController notificationStackScrollLayoutController,
LockIconViewController lockIconViewController
) {
mNotificationPanelViewController = notificationPanelViewController;
mView = notificationPanelView;
mNotificationStackScrollLayoutController = notificationStackScrollLayoutController;
mLockIconViewController = lockIconViewController;
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, mNotificationPanelViewController.calculatePanelHeightQsExpanded(),
Color.GREEN, "calculatePanelHeightQsExpanded()");
drawDebugInfo(canvas, mNotificationPanelViewController.calculatePanelHeightQsExpanded(),
Color.YELLOW, "calculatePanelHeightShade()");
drawDebugInfo(canvas,
(int) mNotificationPanelViewController.calculateNotificationsTopPadding(),
Color.MAGENTA, "calculateNotificationsTopPadding()");
drawDebugInfo(canvas, mNotificationPanelViewController.getClockPositionResult().clockY,
Color.GRAY, "mClockPositionResult.clockY");
drawDebugInfo(canvas, (int) mLockIconViewController.getTop(), Color.GRAY,
"mLockIconViewController.getTop()");
if (mNotificationPanelViewController.getKeyguardShowing()) {
// 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;
}
}

View File

@@ -56,15 +56,10 @@ import android.app.StatusBarManager;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.res.Resources; import android.content.res.Resources;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.graphics.Canvas;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Insets; import android.graphics.Insets;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.Region; import android.graphics.Region;
import android.graphics.drawable.Drawable;
import android.hardware.biometrics.SensorLocationInternal; import android.hardware.biometrics.SensorLocationInternal;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.os.Bundle; import android.os.Bundle;
@@ -229,10 +224,8 @@ import com.android.wm.shell.animation.FlingAnimationUtils;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
import javax.inject.Inject; import javax.inject.Inject;
@@ -899,7 +892,8 @@ public final class NotificationPanelViewController {
mView.setOnApplyWindowInsetsListener((v, insets) -> onApplyShadeWindowInsets(insets)); mView.setOnApplyWindowInsetsListener((v, insets) -> onApplyShadeWindowInsets(insets));
if (DEBUG_DRAWABLE) { if (DEBUG_DRAWABLE) {
mView.getOverlay().add(new DebugDrawable()); mView.getOverlay().add(new DebugDrawable(this, mView,
mNotificationStackScrollLayoutController, mLockIconViewController));
} }
mKeyguardUnfoldTransition = unfoldComponent.map( mKeyguardUnfoldTransition = unfoldComponent.map(
@@ -1512,6 +1506,10 @@ public final class NotificationPanelViewController {
updateClock(); updateClock();
} }
public KeyguardClockPositionAlgorithm.Result getClockPositionResult() {
return mClockPositionResult;
}
@ClockSize @ClockSize
private int computeDesiredClockSize() { private int computeDesiredClockSize() {
if (mSplitShadeEnabled) { if (mSplitShadeEnabled) {
@@ -2976,7 +2974,7 @@ public final class NotificationPanelViewController {
} }
} }
private float calculateNotificationsTopPadding() { float calculateNotificationsTopPadding() {
if (mSplitShadeEnabled) { if (mSplitShadeEnabled) {
return mKeyguardShowing ? getKeyguardNotificationStaticPadding() : 0; return mKeyguardShowing ? getKeyguardNotificationStaticPadding() : 0;
} }
@@ -3010,6 +3008,18 @@ public final class NotificationPanelViewController {
} }
} }
public boolean getKeyguardShowing() {
return mKeyguardShowing;
}
public float getKeyguardNotificationTopPadding() {
return mKeyguardNotificationTopPadding;
}
public float getKeyguardNotificationBottomPadding() {
return mKeyguardNotificationBottomPadding;
}
/** Returns the topPadding of notifications when on keyguard not respecting QS expansion. */ /** Returns the topPadding of notifications when on keyguard not respecting QS expansion. */
private int getKeyguardNotificationStaticPadding() { private int getKeyguardNotificationStaticPadding() {
if (!mKeyguardShowing) { if (!mKeyguardShowing) {
@@ -3279,7 +3289,6 @@ public final class NotificationPanelViewController {
return !mSplitShadeEnabled && (isInSettings() || mIsPanelCollapseOnQQS); return !mSplitShadeEnabled && (isInSettings() || mIsPanelCollapseOnQQS);
} }
@VisibleForTesting
int getMaxPanelHeight() { int getMaxPanelHeight() {
int min = mStatusBarMinHeight; int min = mStatusBarMinHeight;
if (!(mBarState == KEYGUARD) if (!(mBarState == KEYGUARD)
@@ -3405,7 +3414,7 @@ public final class NotificationPanelViewController {
} }
} }
private int calculatePanelHeightQsExpanded() { int calculatePanelHeightQsExpanded() {
float float
notificationHeight = notificationHeight =
mNotificationStackScrollLayoutController.getHeight() mNotificationStackScrollLayoutController.getHeight()
@@ -4369,6 +4378,10 @@ public final class NotificationPanelViewController {
if (DEBUG_DRAWABLE) mHeaderDebugInfo = text; if (DEBUG_DRAWABLE) mHeaderDebugInfo = text;
} }
public String getHeaderDebugInfo() {
return mHeaderDebugInfo;
}
public void onThemeChanged() { public void onThemeChanged() {
mConfigurationListener.onThemeChanged(); mConfigurationListener.onThemeChanged();
} }
@@ -4818,7 +4831,6 @@ public final class NotificationPanelViewController {
setExpandedHeight(getMaxPanelTransitionDistance() * frac); setExpandedHeight(getMaxPanelTransitionDistance() * frac);
} }
@VisibleForTesting
float getExpandedHeight() { float getExpandedHeight() {
return mExpandedHeight; return mExpandedHeight;
} }
@@ -5520,89 +5532,6 @@ public final class NotificationPanelViewController {
} }
} }
private final class DebugDrawable extends Drawable {
private final Set<Integer> mDebugTextUsedYPositions = new HashSet<>();
private final Paint mDebugPaint = new Paint();
@Override
public void draw(@NonNull Canvas canvas) {
mDebugTextUsedYPositions.clear();
mDebugPaint.setColor(Color.RED);
mDebugPaint.setStrokeWidth(2);
mDebugPaint.setStyle(Paint.Style.STROKE);
mDebugPaint.setTextSize(24);
if (mHeaderDebugInfo != null) canvas.drawText(mHeaderDebugInfo, 50, 100, mDebugPaint);
drawDebugInfo(canvas, getMaxPanelHeight(), Color.RED, "getMaxPanelHeight()");
drawDebugInfo(canvas, (int) getExpandedHeight(), Color.BLUE, "getExpandedHeight()");
drawDebugInfo(canvas, calculatePanelHeightQsExpanded(), Color.GREEN,
"calculatePanelHeightQsExpanded()");
drawDebugInfo(canvas, calculatePanelHeightShade(), Color.YELLOW,
"calculatePanelHeightShade()");
drawDebugInfo(canvas, (int) calculateNotificationsTopPadding(), Color.MAGENTA,
"calculateNotificationsTopPadding()");
drawDebugInfo(canvas, mClockPositionResult.clockY, Color.GRAY,
"mClockPositionResult.clockY");
drawDebugInfo(canvas, (int) mLockIconViewController.getTop(), Color.GRAY,
"mLockIconViewController.getTop()");
if (mKeyguardShowing) {
// Notifications have the space between those two lines.
drawDebugInfo(canvas,
mNotificationStackScrollLayoutController.getTop() +
(int) mKeyguardNotificationTopPadding,
Color.RED,
"NSSL.getTop() + mKeyguardNotificationTopPadding");
drawDebugInfo(canvas, mNotificationStackScrollLayoutController.getBottom() -
(int) mKeyguardNotificationBottomPadding,
Color.RED,
"NSSL.getBottom() - mKeyguardNotificationBottomPadding");
}
mDebugPaint.setColor(Color.CYAN);
canvas.drawLine(0, mClockPositionResult.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;
}
}
@NonNull @NonNull
private WindowInsets onApplyShadeWindowInsets(WindowInsets insets) { private WindowInsets onApplyShadeWindowInsets(WindowInsets insets) {
// the same types of insets that are handled in NotificationShadeWindowView // the same types of insets that are handled in NotificationShadeWindowView