Merge "Extract DebugDrawable from NPVC into its own class" into tm-qpr-dev am: 793936a15b
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20345808 Change-Id: Ic6ebb8a30bb1415b8fca244b972b4bbccd516b91 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user