Check system user is running process for dream logic.

This changelist ensures system user is running the process before
entering any dream related logic. This moves away from checking that
the current user is running the process, as this will not always be
true, such as when SystemUI restarts when a secondary user is running.

Fixes: 269611342
Test: atest SystemProcessConditionTest
Change-Id: I6471edaaea8dff93b0c86cb5bfee4a4cdabfd686
This commit is contained in:
Bryce Lee
2023-02-15 15:26:26 -08:00
parent 3800ea7c67
commit 8167b48fce
4 changed files with 24 additions and 31 deletions

View File

@@ -29,7 +29,7 @@ import com.android.systemui.dreams.DreamOverlayNotificationCountProvider;
import com.android.systemui.dreams.DreamOverlayService;
import com.android.systemui.dreams.complication.dagger.RegisteredComplicationsModule;
import com.android.systemui.dreams.touch.scrim.dagger.ScrimModule;
import com.android.systemui.process.condition.UserProcessCondition;
import com.android.systemui.process.condition.SystemProcessCondition;
import com.android.systemui.shared.condition.Condition;
import com.android.systemui.shared.condition.Monitor;
@@ -126,7 +126,7 @@ public interface DreamModule {
@Binds
@IntoSet
@Named(DREAM_PRETEXT_CONDITIONS)
Condition bindsUserProcessCondition(UserProcessCondition condition);
Condition bindSystemProcessCondition(SystemProcessCondition condition);
/** */
@Provides

View File

@@ -26,7 +26,10 @@ public class ProcessWrapper {
@Inject
public ProcessWrapper() {}
public int getUserHandleIdentifier() {
return android.os.Process.myUserHandle().getIdentifier();
/**
* Returns {@code true} if System User is running the current process.
*/
public boolean isSystemUser() {
return android.os.Process.myUserHandle().isSystem();
}
}

View File

@@ -17,29 +17,26 @@
package com.android.systemui.process.condition;
import com.android.systemui.process.ProcessWrapper;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.condition.Condition;
import javax.inject.Inject;
/**
* {@link UserProcessCondition} provides a signal when the process handle belongs to the current
* user.
* {@link SystemProcessCondition} checks to make sure the current process is being ran by the
* System User.
*/
public class UserProcessCondition extends Condition {
public class SystemProcessCondition extends Condition {
private final ProcessWrapper mProcessWrapper;
private final UserTracker mUserTracker;
@Inject
public UserProcessCondition(ProcessWrapper processWrapper, UserTracker userTracker) {
public SystemProcessCondition(ProcessWrapper processWrapper) {
super();
mProcessWrapper = processWrapper;
mUserTracker = userTracker;
}
@Override
protected void start() {
updateCondition(mUserTracker.getUserId()
== mProcessWrapper.getUserHandleIdentifier());
updateCondition(mProcessWrapper.isSystemUser());
}
@Override

View File

@@ -26,7 +26,6 @@ import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.process.ProcessWrapper;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.condition.Condition;
import com.android.systemui.shared.condition.Monitor;
import com.android.systemui.util.concurrency.FakeExecutor;
@@ -41,10 +40,7 @@ import org.mockito.MockitoAnnotations;
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@SmallTest
public class UserProcessConditionTest extends SysuiTestCase {
@Mock
UserTracker mUserTracker;
public class SystemProcessConditionTest extends SysuiTestCase {
@Mock
ProcessWrapper mProcessWrapper;
@@ -59,15 +55,14 @@ public class UserProcessConditionTest extends SysuiTestCase {
}
/**
* Verifies condition reports false when tracker reports a different user id than the
* identifier from the process handle.
* Verifies condition reports false when tracker reports the process is being ran by the
* system user.
*/
@Test
public void testConditionFailsWithDifferentIds() {
public void testConditionFailsWithNonSystemProcess() {
final Condition condition = new UserProcessCondition(mProcessWrapper, mUserTracker);
when(mProcessWrapper.getUserHandleIdentifier()).thenReturn(0);
when(mUserTracker.getUserId()).thenReturn(1);
final Condition condition = new SystemProcessCondition(mProcessWrapper);
when(mProcessWrapper.isSystemUser()).thenReturn(false);
final Monitor monitor = new Monitor(mExecutor);
@@ -81,15 +76,14 @@ public class UserProcessConditionTest extends SysuiTestCase {
}
/**
* Verifies condition reports false when tracker reports a different user id than the
* identifier from the process handle.
* Verifies condition reports true when tracker reports the process is being ran by the
* system user.
*/
@Test
public void testConditionSucceedsWithSameIds() {
public void testConditionSucceedsWithSystemProcess() {
final Condition condition = new UserProcessCondition(mProcessWrapper, mUserTracker);
when(mProcessWrapper.getUserHandleIdentifier()).thenReturn(0);
when(mUserTracker.getUserId()).thenReturn(0);
final Condition condition = new SystemProcessCondition(mProcessWrapper);
when(mProcessWrapper.isSystemUser()).thenReturn(true);
final Monitor monitor = new Monitor(mExecutor);
@@ -101,5 +95,4 @@ public class UserProcessConditionTest extends SysuiTestCase {
verify(mCallback).onConditionsChanged(true);
}
}