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

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

Refactor the TraceurMessenger code into a ServiceConnection class.

This change has identical behavior to the code that was already there.
The reason behind it is to distinguish the behavioral changes from the
refactor for the following code changes to the Issue Recording Service
code.

Bug: 364824477
Test: Verified that this code still works the exact same as before.
Flag: EXEMPT non-behavioral, small refactor
Change-Id: I3d320d84392393cf27e05a6a9202872c0f2b6a7d
parent a7f8642f
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@ class IssueRecordingServiceSessionTest : SysuiTestCase() {
    private val bgExecutor = kosmos.fakeExecutor
    private val userContextProvider: UserContextProvider = kosmos.userTracker
    private val dialogTransitionAnimator: DialogTransitionAnimator = kosmos.dialogTransitionAnimator
    private lateinit var traceurMessageSender: TraceurMessageSender
    private lateinit var traceurConnection: TraceurConnection
    private val issueRecordingState =
        IssueRecordingState(kosmos.userTracker, kosmos.userFileManager)

@@ -65,13 +65,13 @@ class IssueRecordingServiceSessionTest : SysuiTestCase() {

    @Before
    fun setup() {
        traceurMessageSender = mock<TraceurMessageSender>()
        traceurConnection = mock<TraceurConnection>()
        underTest =
            IssueRecordingServiceSession(
                bgExecutor,
                dialogTransitionAnimator,
                panelInteractor,
                traceurMessageSender,
                traceurConnection,
                issueRecordingState,
                iActivityManager,
                notificationManager,
@@ -85,7 +85,7 @@ class IssueRecordingServiceSessionTest : SysuiTestCase() {
        bgExecutor.runAllReady()

        Truth.assertThat(issueRecordingState.isRecording).isTrue()
        verify(traceurMessageSender).startTracing(any<TraceConfig>())
        verify(traceurConnection).startTracing(any<TraceConfig>())
    }

    @Test
@@ -94,7 +94,7 @@ class IssueRecordingServiceSessionTest : SysuiTestCase() {
        bgExecutor.runAllReady()

        Truth.assertThat(issueRecordingState.isRecording).isFalse()
        verify(traceurMessageSender).stopTracing()
        verify(traceurConnection).stopTracing()
    }

    @Test
@@ -124,7 +124,7 @@ class IssueRecordingServiceSessionTest : SysuiTestCase() {
        underTest.share(0, uri, mContext)
        bgExecutor.runAllReady()

        verify(traceurMessageSender).shareTraces(mContext, uri)
        verify(traceurConnection).shareTraces(mContext, uri)
    }

    @Test
+6 −6
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ class RecordIssueDialogDelegateTest : SysuiTestCase() {
    @Mock private lateinit var sysuiState: SysUiState
    @Mock private lateinit var systemUIDialogManager: SystemUIDialogManager
    @Mock private lateinit var broadcastDispatcher: BroadcastDispatcher
    @Mock private lateinit var traceurMessageSender: TraceurMessageSender
    @Mock private lateinit var traceurConnection: TraceurConnection
    private val systemClock = FakeSystemClock()
    private val bgExecutor = FakeExecutor(systemClock)
    private val mainExecutor = FakeExecutor(systemClock)
@@ -104,7 +104,7 @@ class RecordIssueDialogDelegateTest : SysuiTestCase() {
                    systemUIDialogManager,
                    sysuiState,
                    broadcastDispatcher,
                    mDialogTransitionAnimator
                    mDialogTransitionAnimator,
                )
            )

@@ -120,7 +120,7 @@ class RecordIssueDialogDelegateTest : SysuiTestCase() {
                    mediaProjectionMetricsLogger,
                    screenCaptureDisabledDialogDelegate,
                    state,
                    traceurMessageSender
                    traceurConnection,
                ) {
                    latch.countDown()
                }
@@ -166,7 +166,7 @@ class RecordIssueDialogDelegateTest : SysuiTestCase() {
        verify(mediaProjectionMetricsLogger, never())
            .notifyProjectionInitiated(
                anyInt(),
                eq(SessionCreationSource.SYSTEM_UI_SCREEN_RECORDER)
                eq(SessionCreationSource.SYSTEM_UI_SCREEN_RECORDER),
            )
        assertThat(screenRecordSwitch.isChecked).isFalse()
    }
@@ -188,7 +188,7 @@ class RecordIssueDialogDelegateTest : SysuiTestCase() {
        verify(mediaProjectionMetricsLogger)
            .notifyProjectionInitiated(
                anyInt(),
                eq(SessionCreationSource.SYSTEM_UI_SCREEN_RECORDER)
                eq(SessionCreationSource.SYSTEM_UI_SCREEN_RECORDER),
            )
        verify(factory, times(2)).create(any(SystemUIDialog.Delegate::class.java))
    }
@@ -208,7 +208,7 @@ class RecordIssueDialogDelegateTest : SysuiTestCase() {
        verify(mediaProjectionMetricsLogger)
            .notifyProjectionInitiated(
                anyInt(),
                eq(SessionCreationSource.SYSTEM_UI_SCREEN_RECORDER)
                eq(SessionCreationSource.SYSTEM_UI_SCREEN_RECORDER),
            )
        verify(factory, never()).create()
    }
+77 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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.recordissue

import android.os.IBinder
import android.os.Looper
import android.os.Messenger
import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry
import com.android.systemui.SysuiTestCase
import com.android.systemui.settings.UserContextProvider
import com.android.traceur.PresetTraceConfigs
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.Mockito.mock
import org.mockito.MockitoAnnotations
import org.mockito.kotlin.any
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever

@SmallTest
@RunWith(AndroidJUnit4::class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
class TraceurConnectionTest : SysuiTestCase() {

    @Mock private lateinit var userContextProvider: UserContextProvider

    private lateinit var underTest: TraceurConnection

    @Before
    fun setup() {
        MockitoAnnotations.initMocks(this)
        whenever(userContextProvider.userContext).thenReturn(mContext)
        underTest = TraceurConnection(userContextProvider, Looper.getMainLooper())
    }

    @Test
    fun onBoundRunnables_areRun_whenServiceIsBound() {
        val latch = CountDownLatch(1)
        underTest.onBound.add { latch.countDown() }

        underTest.onServiceConnected(
            InstrumentationRegistry.getInstrumentation().componentName,
            mock(IBinder::class.java),
        )

        latch.await()
    }

    @Test
    fun startTracing_sendsMsg_toStartTracing() {
        underTest.binder = mock(Messenger::class.java)

        underTest.startTracing(PresetTraceConfigs.getThermalConfig())

        verify(underTest.binder)!!.send(any())
    }
}
+70 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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.recordissue

import android.content.Context
import android.content.Intent
import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.settings.UserContextProvider
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mock
import org.mockito.Mockito.any
import org.mockito.MockitoAnnotations
import org.mockito.kotlin.times
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever

@SmallTest
@RunWith(AndroidJUnit4::class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
class UserAwareConnectionTest : SysuiTestCase() {

    @Mock private lateinit var userContextProvider: UserContextProvider
    @Mock private lateinit var mockContext: Context

    private lateinit var underTest: UserAwareConnection

    @Before
    fun setup() {
        MockitoAnnotations.initMocks(this)
        whenever(userContextProvider.userContext).thenReturn(mockContext)
        whenever(mockContext.bindService(any(), any(), anyInt())).thenReturn(true)
        underTest = UserAwareConnection(userContextProvider, Intent())
    }

    @Test
    fun doBindService_requestToBindToTheService_viaTheCorrectUserContext() {
        underTest.doBind()

        verify(userContextProvider).userContext
    }

    @Test
    fun doBindService_DoesntRequestToBindToTheService_IfAlreadyRequested() {
        underTest.doBind()
        underTest.doBind()
        underTest.doBind()

        verify(userContextProvider, times(1)).userContext
    }
}
+6 −6
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ import com.android.systemui.recordissue.IssueRecordingService.Companion.getStopI
import com.android.systemui.recordissue.IssueRecordingState
import com.android.systemui.recordissue.RecordIssueDialogDelegate
import com.android.systemui.recordissue.RecordIssueModule.Companion.TILE_SPEC
import com.android.systemui.recordissue.TraceurMessageSender
import com.android.systemui.recordissue.TraceurConnection
import com.android.systemui.res.R
import com.android.systemui.screenrecord.RecordingController
import com.android.systemui.screenrecord.RecordingService
@@ -78,7 +78,7 @@ constructor(
    private val dialogTransitionAnimator: DialogTransitionAnimator,
    private val panelInteractor: PanelInteractor,
    private val userContextProvider: UserContextProvider,
    private val traceurMessageSender: TraceurMessageSender,
    private val traceurConnection: TraceurConnection,
    @Background private val bgExecutor: Executor,
    private val issueRecordingState: IssueRecordingState,
    private val delegateFactory: RecordIssueDialogDelegate.Factory,
@@ -93,7 +93,7 @@ constructor(
        metricsLogger,
        statusBarStateController,
        activityStarter,
        qsLogger
        qsLogger,
    ) {

    private val onRecordingChangeListener = Runnable { refreshState() }
@@ -109,7 +109,7 @@ constructor(

    override fun handleDestroy() {
        super.handleDestroy()
        bgExecutor.execute { traceurMessageSender.unbindFromTraceur(mContext) }
        bgExecutor.execute { traceurConnection.doUnBind() }
    }

    override fun getTileLabel(): CharSequence = mContext.getString(R.string.qs_record_issue_label)
@@ -142,7 +142,7 @@ constructor(
            DELAY_MS,
            INTERVAL_MS,
            pendingServiceIntent(getStartIntent(userContextProvider.userContext)),
            pendingServiceIntent(getStopIntent(userContextProvider.userContext))
            pendingServiceIntent(getStopIntent(userContextProvider.userContext)),
        )

    private fun stopIssueRecordingService() =
@@ -154,7 +154,7 @@ constructor(
            userContextProvider.userContext,
            RecordingService.REQUEST_CODE,
            action,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE,
        )

    private fun showPrompt(expandable: Expandable?) {
Loading