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

Commit be89444a authored by Zhe Song's avatar Zhe Song
Browse files

Introduce AssistRepository,Interactor to model the state.

Bug: 325771449
Flag: NA
Test: unit test passed
Test: mp droid succeeded in local device.
Change-Id: Id92f27bccb16014d1e232281a20b377d264ca7ff
parent ab438ccc
Loading
Loading
Loading
Loading
+50 −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.assist.data.repository

import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.testScope
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith

@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
class AssistRepositoryTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope

    private val underTest = kosmos.assistRepository

    @Test
    fun invocationType() =
        testScope.runTest {
            val invocationType by collectLastValue(underTest.latestInvocationType)
            underTest.setLatestInvocationType(2)
            runCurrent()

            assertThat(invocationType).isEqualTo(2)
        }
}
+53 −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.assist.domain.interactor

import android.platform.test.annotations.EnableFlags
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.testScope
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith

@OptIn(ExperimentalCoroutinesApi::class)
@RunWith(AndroidJUnit4::class)
@SmallTest
class AssistInteractorTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope

    private val underTest = kosmos.assistInteractor

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_CONTEXTUAL_TIPS, Flags.FLAG_ENABLE_CONTEXTUAL_TIP_FOR_POWER_OFF)
    fun onAssistantStarted() =
        testScope.runTest {
            val invocationType by collectLastValue(underTest.latestInvocationType)
            underTest.onAssistantStarted(3)
            runCurrent()

            assertThat(invocationType).isEqualTo(3)
        }
}
+6 −1
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import com.android.internal.app.IVisualQueryRecognitionStatusListener;
import com.android.internal.app.IVoiceInteractionSessionListener;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.assist.domain.interactor.AssistInteractor;
import com.android.systemui.assist.ui.DefaultUiController;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
@@ -149,6 +150,7 @@ public class AssistManager {
    private final SecureSettings mSecureSettings;
    private final SelectedUserInteractor mSelectedUserInteractor;
    private final ActivityManager mActivityManager;
    private final AssistInteractor mInteractor;

    private final DeviceProvisionedController mDeviceProvisionedController;

@@ -192,7 +194,8 @@ public class AssistManager {
            DisplayTracker displayTracker,
            SecureSettings secureSettings,
            SelectedUserInteractor selectedUserInteractor,
            ActivityManager activityManager) {
            ActivityManager activityManager,
            AssistInteractor interactor) {
        mContext = context;
        mDeviceProvisionedController = controller;
        mCommandQueue = commandQueue;
@@ -206,6 +209,7 @@ public class AssistManager {
        mSecureSettings = secureSettings;
        mSelectedUserInteractor = selectedUserInteractor;
        mActivityManager = activityManager;
        mInteractor = interactor;

        registerVoiceInteractionSessionListener();
        registerVisualQueryRecognitionStatusListener();
@@ -314,6 +318,7 @@ public class AssistManager {
                assistComponent,
                legacyDeviceState);
        logStartAssistLegacy(legacyInvocationType, legacyDeviceState);
        mInteractor.onAssistantStarted(legacyInvocationType);
        startAssistInternal(args, assistComponent, isService);
    }

+37 −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.assist.data.repository

import com.android.systemui.dagger.SysUISingleton
import javax.inject.Inject
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.asSharedFlow

@SysUISingleton
class AssistRepository @Inject constructor() {
    private val _latestInvocationType =
        MutableSharedFlow<Int>(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)
    /** The type of the latest invocation of the assistant. */
    val latestInvocationType: SharedFlow<Int> = _latestInvocationType.asSharedFlow()

    /** Sets the type of the latest invocation of the assistant. */
    fun setLatestInvocationType(type: Int) {
        _latestInvocationType.tryEmit(type)
    }
}
+40 −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.assist.domain.interactor

import com.android.systemui.Flags
import com.android.systemui.assist.data.repository.AssistRepository
import com.android.systemui.dagger.SysUISingleton
import javax.inject.Inject
import kotlinx.coroutines.flow.SharedFlow

@SysUISingleton
class AssistInteractor
@Inject
constructor(
    private val repository: AssistRepository,
) {
    /** The type of the latest invocation of the assistant. */
    val latestInvocationType: SharedFlow<Int> = repository.latestInvocationType

    /** Notifies that Assistant has been started. */
    fun onAssistantStarted(type: Int) {
        if (Flags.enableContextualTips() && Flags.enableContextualTipForPowerOff()) {
            repository.setLatestInvocationType(type)
        }
    }
}
Loading