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

Commit a744037d authored by Steve Elliott's avatar Steve Elliott Committed by Android (Google) Code Review
Browse files

Merge "Fix security error in summarization onboarding" into main

parents 707ab737 4e2883cd
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -16,19 +16,20 @@

package com.android.systemui.statusbar.notification.stack.domain.interactor

import android.app.NotificationManager
import android.app.INotificationManager
import android.service.notification.Adjustment.KEY_SUMMARIZATION
import androidx.core.content.edit
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationListRepository
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
import com.android.systemui.util.kotlin.BooleanFlowOperators.allOf
import com.android.systemui.util.kotlin.SharedPreferencesExt.observeBoolean
import com.android.systemui.utils.coroutines.flow.flatMapLatestConflated
import com.android.systemui.utils.coroutines.flow.mapLatestConflated
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
@@ -39,7 +40,8 @@ class SummarizationOnboardingInteractor
constructor(
    notifListRepo: ActiveNotificationListRepository,
    private val sharedPreferencesInteractor: NotificationsSharedPreferencesInteractor,
    private val notificationManager: NotificationManager,
    private val notificationManager: INotificationManager,
    userInteractor: SelectedUserInteractor,
    @Background private val bgDispatcher: CoroutineDispatcher,
) {
    private val notifsPresent: Flow<Boolean> =
@@ -54,9 +56,8 @@ constructor(
            }
            .distinctUntilChanged()

    private val summarizationAvailableAndDisabled: Flow<Boolean> = flow {
        emit(isAvailableAndDisabled())
    }
    private val summarizationAvailableAndDisabled: Flow<Boolean> =
        userInteractor.selectedUser.mapLatestConflated { userId -> isAvailableAndDisabled(userId) }

    val onboardingNeeded: Flow<Boolean> =
        allOf(onboardingUnseen, summarizationAvailableAndDisabled, notifsPresent)
@@ -69,10 +70,11 @@ constructor(
        }
    }

    private suspend fun isAvailableAndDisabled(): Boolean =
    private suspend fun isAvailableAndDisabled(userId: Int): Boolean =
        withContext(bgDispatcher) {
            KEY_SUMMARIZATION !in notificationManager.unsupportedAdjustmentTypes &&
                KEY_SUMMARIZATION !in notificationManager.allowedAssistantAdjustments
                KEY_SUMMARIZATION !in
                    notificationManager.getAllowedAssistantAdjustmentsForUser(userId)
        }
}

+2 −0
Original line number Diff line number Diff line
@@ -20,3 +20,5 @@ import com.android.systemui.kosmos.Kosmos
import org.mockito.kotlin.mock

var Kosmos.notificationManager: NotificationManager by Kosmos.Fixture { mock {} }

var Kosmos.iNotificationManager: INotificationManager by Kosmos.Fixture { mock {} }
+4 −1
Original line number Diff line number Diff line
@@ -16,17 +16,20 @@

package com.android.systemui.statusbar.notification.stack.domain.interactor

import android.app.iNotificationManager
import android.app.notificationManager
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository
import com.android.systemui.user.domain.interactor.selectedUserInteractor

val Kosmos.summarizationOnboardingInteractor by
    Kosmos.Fixture {
        SummarizationOnboardingInteractor(
            notifListRepo = activeNotificationListRepository,
            sharedPreferencesInteractor = notificationsSharedPreferencesInteractor,
            notificationManager = notificationManager,
            userInteractor = selectedUserInteractor,
            notificationManager = iNotificationManager,
            bgDispatcher = testDispatcher,
        )
    }
+8 −1
Original line number Diff line number Diff line
@@ -5522,7 +5522,7 @@ public class NotificationManagerService extends SystemService {
        @Override
        public List<String> getAllowedAssistantAdjustmentsForUser(@UserIdInt int userId) {
            checkCallerIsSystem();
            checkCallerIsSystemOrSystemUi();
            return new ArrayList<>(mAssistants.getAllowedAssistantAdjustments(userId));
        }
@@ -11967,6 +11967,13 @@ public class NotificationManagerService extends SystemService {
        throw new SecurityException("Disallowed call for uid " + Binder.getCallingUid());
    }
    private void checkCallerIsSystemOrSystemUi() {
        if (isCallerSystemOrSystemUi()) {
            return;
        }
        throw new SecurityException("Disallowed call for uid " + Binder.getCallingUid());
    }
    private void checkCallerIsSystemOrSystemUiOrShell() {
        checkCallerIsSystemOrSystemUiOrShell(null);
    }