Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3233ae9e authored by Kshitij Gupta's avatar Kshitij Gupta Committed by Android (Google) Code Review
Browse files

Merge "NotificationMemoryLogger: Drop usages of runBlocking" into main

parents ef15f9c2 1d47640c
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ import androidx.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.Dumpable;
import com.android.systemui.Flags;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
@@ -119,6 +120,7 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Queue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;

@@ -161,7 +163,8 @@ public class NotifCollection implements Dumpable, PipelineDumpable {
    private final NotificationDismissibilityProvider mDismissibilityProvider;
    private final BundleInteractionLogger mBundleLogger;

    private final Map<String, NotificationEntry> mNotificationSet = new ArrayMap<>();
    private final Map<String, NotificationEntry> mNotificationSet =
            Flags.doNotUseRunBlocking() ? new ConcurrentHashMap<>() : new ArrayMap<>();
    private final Collection<NotificationEntry> mReadOnlyNotificationSet =
            Collections.unmodifiableCollection(mNotificationSet.values());
    private final HashMap<String, FutureDismissal> mFutureDismissals = new HashMap<>();
@@ -238,7 +241,9 @@ public class NotifCollection implements Dumpable, PipelineDumpable {

    /** @see NotifPipeline#getAllNotifs() */
    Collection<NotificationEntry> getAllNotifs() {
        if (!Flags.doNotUseRunBlocking()) {
            Assert.isMainThread();
        }
        return mReadOnlyNotificationSet;
    }

+9 −4
Original line number Diff line number Diff line
@@ -28,11 +28,12 @@ import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.shared.system.SysUiStatsLog
import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.Flags.doNotUseRunBlocking
import kotlinx.coroutines.CoroutineDispatcher
import java.lang.Exception
import java.util.concurrent.Executor
import javax.inject.Inject
import kotlin.math.roundToInt
import kotlinx.coroutines.CoroutineDispatcher

/** Periodically logs current state of notification memory consumption. */
@SysUISingleton
@@ -91,7 +92,7 @@ constructor(

            try {
                // Notifications can only be retrieved on the main thread, so switch to that thread.
                val notifications = getAllNotificationsOnMainThread()
                val notifications = getAllNotifications()
                val notificationMemoryUse =
                    NotificationMemoryMeter.notificationMemoryUse(notifications)
                        .sortedWith(
@@ -144,11 +145,15 @@ constructor(
            return StatsManager.PULL_SUCCESS
        }

    private fun getAllNotificationsOnMainThread() =
    private fun getAllNotifications() =
        if (doNotUseRunBlocking()) {
            traceSection("NML#getNotifications") { notificationPipeline.allNotifs.toList() }
        } else {
            runBlocking(context = mainDispatcher) {
                traceSection("NML#getNotifications") { notificationPipeline.allNotifs.toList() }
            }
        }
}

/** Aggregates memory usage data by package and style, returning sums. */
@VisibleForTesting
+21 −4
Original line number Diff line number Diff line
@@ -20,10 +20,12 @@ import android.app.Notification
import android.app.StatsManager
import android.graphics.Bitmap
import android.graphics.drawable.Icon
import android.platform.test.flag.junit.FlagsParameterization
import android.platform.test.flag.junit.FlagsParameterization.allCombinationsOf
import android.stats.sysui.NotificationEnums
import android.util.StatsEvent
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.Flags.FLAG_DO_NOT_USE_RUN_BLOCKING
import com.android.systemui.SysuiTestCase
import com.android.systemui.log.assertLogsWtf
import com.android.systemui.shared.system.SysUiStatsLog
@@ -35,7 +37,6 @@ import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Expect
import com.google.common.truth.Truth.assertThat
import java.lang.RuntimeException
import kotlinx.coroutines.Dispatchers
import org.junit.Before
import org.junit.Rule
@@ -44,10 +45,13 @@ import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters


@SmallTest
@RunWith(AndroidJUnit4::class)
class NotificationMemoryLoggerTest : SysuiTestCase() {
@RunWith(ParameterizedAndroidJunit4::class)
class NotificationMemoryLoggerTest(flags: FlagsParameterization) : SysuiTestCase() {

    @Rule @JvmField val expect = Expect.create()

@@ -56,6 +60,19 @@ class NotificationMemoryLoggerTest : SysuiTestCase() {

    @Mock private lateinit var statsManager: StatsManager

    companion object {
        @JvmStatic
        @Parameters(name = "{0}")
        fun getParams(): List<FlagsParameterization> {
            return allCombinationsOf(FLAG_DO_NOT_USE_RUN_BLOCKING)
        }
    }

    init {
        mSetFlagsRule.setFlagsParameterization(flags)
    }


    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)