Merge "Partially revert ag/10355722 to fix perf regression" into rvc-dev am: c435afa874

Change-Id: Ibd1f069d3a4e9c0e48bb5605acf918c8a94bcbc0
This commit is contained in:
Automerger Merge Worker
2020-03-05 05:52:09 +00:00
3 changed files with 20 additions and 32 deletions

View File

@@ -19,6 +19,7 @@ package com.android.systemui.statusbar
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Point
import android.graphics.Rect
import android.renderscript.Allocation
import android.renderscript.Element
@@ -26,11 +27,9 @@ import android.renderscript.RenderScript
import android.renderscript.ScriptIntrinsicBlur
import android.util.Log
import android.util.MathUtils
import android.util.Size
import android.view.WindowManager
import com.android.internal.annotations.VisibleForTesting
import com.android.internal.graphics.ColorUtils
import com.android.systemui.statusbar.notification.MediaNotificationProcessor
import javax.inject.Inject
import javax.inject.Singleton
@@ -42,9 +41,10 @@ private const val DOWNSAMPLE = 6
@Singleton
class MediaArtworkProcessor @Inject constructor() {
private val mTmpSize = Point()
private var mArtworkCache: Bitmap? = null
fun processArtwork(context: Context, artwork: Bitmap, windowType: Int): Bitmap? {
fun processArtwork(context: Context, artwork: Bitmap): Bitmap? {
if (mArtworkCache != null) {
return mArtworkCache
}
@@ -54,9 +54,10 @@ class MediaArtworkProcessor @Inject constructor() {
var output: Allocation? = null
var inBitmap: Bitmap? = null
try {
val size = getWindowSize(context, windowType)
@Suppress("DEPRECATION")
context.display?.getSize(mTmpSize)
val rect = Rect(0, 0, artwork.width, artwork.height)
MathUtils.fitRect(rect, Math.max(size.width / DOWNSAMPLE, size.height / DOWNSAMPLE))
MathUtils.fitRect(rect, Math.max(mTmpSize.x / DOWNSAMPLE, mTmpSize.y / DOWNSAMPLE))
inBitmap = Bitmap.createScaledBitmap(artwork, rect.width(), rect.height(),
true /* filter */)
// Render script blurs only support ARGB_8888, we need a conversion if we got a
@@ -98,15 +99,4 @@ class MediaArtworkProcessor @Inject constructor() {
mArtworkCache?.recycle()
mArtworkCache = null
}
@VisibleForTesting
internal fun getWindowSize(context: Context, windowType: Int): Size {
val windowContext = context.display?.let {
context.createDisplayContext(it)
.createWindowContext(windowType, null)
} ?: run { throw NullPointerException("Display is null") }
val windowManager = windowContext.getSystemService(WindowManager::class.java)
?: run { throw NullPointerException("Null window manager") }
return windowManager.currentWindowMetrics.size
}
}

View File

@@ -42,7 +42,6 @@ import android.provider.DeviceConfig.Properties;
import android.util.ArraySet;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
@@ -674,8 +673,7 @@ public class NotificationMediaManager implements Dumpable {
};
private Bitmap processArtwork(Bitmap artwork) {
return mMediaArtworkProcessor.processArtwork(mContext, artwork,
WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE);
return mMediaArtworkProcessor.processArtwork(mContext, artwork);
}
@MainThread

View File

@@ -16,14 +16,15 @@
package com.android.systemui.statusbar
import com.google.common.truth.Truth.assertThat
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Point
import android.testing.AndroidTestingRunner
import android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.google.common.truth.Truth.assertThat
import org.junit.After
import org.junit.Before
import org.junit.Test
@@ -31,7 +32,6 @@ import org.junit.runner.RunWith
private const val WIDTH = 200
private const val HEIGHT = 200
private const val WINDOW_TYPE = TYPE_NOTIFICATION_SHADE
@RunWith(AndroidTestingRunner::class)
@SmallTest
@@ -46,10 +46,10 @@ class MediaArtworkProcessorTest : SysuiTestCase() {
fun setUp() {
processor = MediaArtworkProcessor()
val size = processor.getWindowSize(context, WINDOW_TYPE)
screenWidth = size.width
screenHeight = size.height
val point = Point()
context.display.getSize(point)
screenWidth = point.x
screenHeight = point.y
}
@After
@@ -63,7 +63,7 @@ class MediaArtworkProcessorTest : SysuiTestCase() {
val artwork = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888)
Canvas(artwork).drawColor(Color.BLUE)
// WHEN the background is created from the artwork
val background = processor.processArtwork(context, artwork, WINDOW_TYPE)!!
val background = processor.processArtwork(context, artwork)!!
// THEN the background has the size of the screen that has been downsamples
assertThat(background.height).isLessThan(screenHeight)
assertThat(background.width).isLessThan(screenWidth)
@@ -76,8 +76,8 @@ class MediaArtworkProcessorTest : SysuiTestCase() {
val artwork = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888)
Canvas(artwork).drawColor(Color.BLUE)
// WHEN the background is processed twice
val background1 = processor.processArtwork(context, artwork, WINDOW_TYPE)!!
val background2 = processor.processArtwork(context, artwork, WINDOW_TYPE)!!
val background1 = processor.processArtwork(context, artwork)!!
val background2 = processor.processArtwork(context, artwork)!!
// THEN the two bitmaps are the same
// Note: This is currently broken and trying to use caching causes issues
assertThat(background1).isNotSameAs(background2)
@@ -89,7 +89,7 @@ class MediaArtworkProcessorTest : SysuiTestCase() {
val artwork = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ALPHA_8)
Canvas(artwork).drawColor(Color.BLUE)
// WHEN the background is created from the artwork
val background = processor.processArtwork(context, artwork, WINDOW_TYPE)!!
val background = processor.processArtwork(context, artwork)!!
// THEN the background has Config ARGB_8888
assertThat(background.config).isEqualTo(Bitmap.Config.ARGB_8888)
}
@@ -102,7 +102,7 @@ class MediaArtworkProcessorTest : SysuiTestCase() {
// AND the artwork is recycled
artwork.recycle()
// WHEN the background is created from the artwork
val background = processor.processArtwork(context, artwork, WINDOW_TYPE)
val background = processor.processArtwork(context, artwork)
// THEN the processed bitmap is null
assertThat(background).isNull()
}