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

Commit dcf0fcc9 authored by Stefan Andonian's avatar Stefan Andonian
Browse files

Move the `isRecording` state in Issuerecording service into a global

settings rather than a user-specific variable.

This is important for when IssueRecordingService and RecordIssueTile are
in different user profiles. Otherwise, we run into the issue of the tile
not being updated when the notification actions switch the tile state.

Bug: 364824477
Test: Verified locally that System Tracing via the Record Issue Tile
works great in Headless System User Mode.
Flag: EXEMPT bug fix

Change-Id: I4f502229caf48d933763e0b15c1502aa9618959c
parent 8cc98bab
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.qs.tiles.impl.irecording

import android.os.Handler
import android.os.UserHandle
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
@@ -28,6 +29,7 @@ import com.android.systemui.qs.tiles.base.interactor.DataUpdateTrigger
import com.android.systemui.recordissue.IssueRecordingState
import com.android.systemui.settings.fakeUserFileManager
import com.android.systemui.settings.userTracker
import com.android.systemui.util.settings.fakeGlobalSettings
import com.google.common.truth.Truth
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.flowOf
@@ -51,7 +53,14 @@ class IssueRecordingDataInteractorTest : SysuiTestCase() {

    @Before
    fun setup() {
        state = IssueRecordingState(userTracker, userFileManager)
        state =
            IssueRecordingState(
                userTracker,
                userFileManager,
                Handler.getMain(),
                mContext.contentResolver,
                kosmos.fakeGlobalSettings,
            )
        underTest = IssueRecordingDataInteractor(state, kosmos.testScope.testScheduler)
    }

@@ -67,10 +76,12 @@ class IssueRecordingDataInteractorTest : SysuiTestCase() {
            Truth.assertThat(data?.isRecording).isFalse()

            state.isRecording = true
            state.onRecordingChangeListener.onChange(true)
            runCurrent()
            Truth.assertThat(data?.isRecording).isTrue()

            state.isRecording = false
            state.onRecordingChangeListener.onChange(true)
            runCurrent()
            Truth.assertThat(data?.isRecording).isFalse()
        }
+9 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.qs.tiles.impl.irecording

import android.os.Handler
import android.os.UserHandle
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
@@ -38,6 +39,7 @@ import com.android.systemui.settings.userFileManager
import com.android.systemui.settings.userTracker
import com.android.systemui.statusbar.phone.KeyguardDismissUtil
import com.android.systemui.statusbar.policy.keyguardStateController
import com.android.systemui.util.settings.fakeGlobalSettings
import com.google.common.truth.Truth
import kotlinx.coroutines.test.runTest
import org.junit.Before
@@ -83,7 +85,13 @@ class IssueRecordingUserActionInteractorTest : SysuiTestCase() {
            underTest =
                IssueRecordingUserActionInteractor(
                    testDispatcher,
                    IssueRecordingState(userTracker, userFileManager),
                    IssueRecordingState(
                        userTracker,
                        userFileManager,
                        Handler.getMain(),
                        mContext.contentResolver,
                        kosmos.fakeGlobalSettings,
                    ),
                    KeyguardDismissUtil(
                        keyguardStateController,
                        statusBarStateController,
+9 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.recordissue
import android.app.IActivityManager
import android.app.NotificationManager
import android.net.Uri
import android.os.Handler
import android.os.UserHandle
import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -33,6 +34,7 @@ import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor
import com.android.systemui.settings.UserContextProvider
import com.android.systemui.settings.userFileManager
import com.android.systemui.settings.userTracker
import com.android.systemui.util.settings.fakeGlobalSettings
import com.android.traceur.TraceConfig
import com.google.common.truth.Truth
import org.junit.Before
@@ -55,7 +57,13 @@ class IssueRecordingServiceSessionTest : SysuiTestCase() {
    private val dialogTransitionAnimator: DialogTransitionAnimator = kosmos.dialogTransitionAnimator
    private lateinit var traceurConnection: TraceurConnection
    private val issueRecordingState =
        IssueRecordingState(kosmos.userTracker, kosmos.userFileManager)
        IssueRecordingState(
            kosmos.userTracker,
            kosmos.userFileManager,
            Handler.getMain(),
            mContext.contentResolver,
            kosmos.fakeGlobalSettings,
        )

    private val iActivityManager = mock<IActivityManager>()
    private val notificationManager = mock<NotificationManager>()
+60 −24
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.systemui.recordissue

import android.content.ContentResolver
import android.os.Handler
import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
@@ -23,11 +25,15 @@ import com.android.systemui.SysuiTestCase
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.settings.userFileManager
import com.android.systemui.settings.userTracker
import com.android.systemui.util.settings.fakeGlobalSettings
import com.google.common.truth.Truth
import java.util.concurrent.CountDownLatch
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.MockitoAnnotations
import org.mockito.kotlin.any
import org.mockito.kotlin.verify

@SmallTest
@RunWith(AndroidJUnit4::class)
@@ -36,10 +42,19 @@ class IssueRecordingStateTest : SysuiTestCase() {

    private val kosmos = Kosmos()
    private lateinit var underTest: IssueRecordingState
    @Mock private lateinit var resolver: ContentResolver

    @Before
    fun setup() {
        underTest = IssueRecordingState(kosmos.userTracker, kosmos.userFileManager)
        MockitoAnnotations.initMocks(this)
        underTest =
            IssueRecordingState(
                kosmos.userTracker,
                kosmos.userFileManager,
                Handler.getMain(),
                resolver,
                kosmos.fakeGlobalSettings,
            )
    }

    @Test
@@ -47,7 +62,14 @@ class IssueRecordingStateTest : SysuiTestCase() {
        val expected = true

        underTest.takeBugreport = expected
        underTest = IssueRecordingState(kosmos.userTracker, kosmos.userFileManager)
        underTest =
            IssueRecordingState(
                kosmos.userTracker,
                kosmos.userFileManager,
                Handler.getMain(),
                resolver,
                kosmos.fakeGlobalSettings,
            )

        Truth.assertThat(underTest.takeBugreport).isEqualTo(expected)
    }
@@ -57,7 +79,14 @@ class IssueRecordingStateTest : SysuiTestCase() {
        val expected = true

        underTest.recordScreen = expected
        underTest = IssueRecordingState(kosmos.userTracker, kosmos.userFileManager)
        underTest =
            IssueRecordingState(
                kosmos.userTracker,
                kosmos.userFileManager,
                Handler.getMain(),
                resolver,
                kosmos.fakeGlobalSettings,
            )

        Truth.assertThat(underTest.recordScreen).isEqualTo(expected)
    }
@@ -65,7 +94,14 @@ class IssueRecordingStateTest : SysuiTestCase() {
    @Test
    fun hasUserApprovedScreenRecording_isTrue_afterBeingMarkedAsCompleted() {
        underTest.markUserApprovalForScreenRecording()
        underTest = IssueRecordingState(kosmos.userTracker, kosmos.userFileManager)
        underTest =
            IssueRecordingState(
                kosmos.userTracker,
                kosmos.userFileManager,
                Handler.getMain(),
                resolver,
                kosmos.fakeGlobalSettings,
            )

        Truth.assertThat(underTest.hasUserApprovedScreenRecording).isEqualTo(true)
    }
@@ -75,35 +111,35 @@ class IssueRecordingStateTest : SysuiTestCase() {
        val expected = setOf("a", "b", "c")

        underTest.tagTitles = expected
        underTest = IssueRecordingState(kosmos.userTracker, kosmos.userFileManager)
        underTest =
            IssueRecordingState(
                kosmos.userTracker,
                kosmos.userFileManager,
                Handler.getMain(),
                resolver,
                kosmos.fakeGlobalSettings,
            )

        Truth.assertThat(underTest.tagTitles).isEqualTo(expected)
    }

    @Test
    fun isRecording_callsListeners_onTheValueChanging() {
        val count = CountDownLatch(1)
        val listener = Runnable { count.countDown() }
    fun addListener_registersContentObserver_ifListOfListenersIsNotEmpty() {
        val listener = Runnable { /* No-op */ }

        underTest.addListener(listener)
        underTest.isRecording = true

        Truth.assertThat(count.count).isEqualTo(0)
        verify(resolver).registerContentObserver(any(), any(), any())
    }

    @Test
    fun isRecording_callsOnlyListeners_whoHaveNotBeenRemoved() {
        val count1 = CountDownLatch(1)
        val count2 = CountDownLatch(1)
        val listener1 = Runnable { count1.countDown() }
        val listener2 = Runnable { count2.countDown() }

        underTest.addListener(listener1)
        underTest.removeListener(listener1)
        underTest.addListener(listener2)
        underTest.isRecording = true

        Truth.assertThat(count1.count).isEqualTo(1)
        Truth.assertThat(count2.count).isEqualTo(0)
    fun removeListener_unRegistersContentObserver_ifListOfListenersIsEmpty() {
        val listener = Runnable { /* No-op */ }

        underTest.addListener(listener)
        underTest.removeListener(listener)

        verify(resolver).registerContentObserver(any(), any(), any())
        verify(resolver).unregisterContentObserver(any())
    }
}
+6 −4
Original line number Diff line number Diff line
@@ -111,12 +111,14 @@ constructor(

    override fun handleSetListening(listening: Boolean) {
        super.handleSetListening(listening)
        bgExecutor.execute {
            if (listening) {
                issueRecordingState.addListener(onRecordingChangeListener)
            } else {
                issueRecordingState.removeListener(onRecordingChangeListener)
            }
        }
    }

    override fun handleDestroy() {
        super.handleDestroy()
Loading