update u18 logic for supervised account
this is a change to add u18 logic for supervised account, when gmscore
call isAdservicesEnabled, we also check if this is supervised account.
Test: atest com.android.adservices.service.ui.data.UxStatesManagerTest
Change-Id: Ic5b7ab98eb9c4c4a6c0bc77b8fc61ae96439846c
diff --git a/adservices/service-core/java/com/android/adservices/service/common/AdServicesCommonServiceImpl.java b/adservices/service-core/java/com/android/adservices/service/common/AdServicesCommonServiceImpl.java
index c7980e0..4a72589 100644
--- a/adservices/service-core/java/com/android/adservices/service/common/AdServicesCommonServiceImpl.java
+++ b/adservices/service-core/java/com/android/adservices/service/common/AdServicesCommonServiceImpl.java
@@ -119,7 +119,7 @@
&& ConsentManager.getInstance(mContext).getUx() != null) {
LogUtil.d(ENABLE_AD_SERVICES_API_ENABLED_MESSAGE);
// PS entry point should be hidden from unenrolled users.
- isAdServicesEnabled &= mUxStatesManager.isEnrolledUser();
+ isAdServicesEnabled &= mUxStatesManager.isEnrolledUser(mContext);
} else {
LogUtil.d(ENABLE_AD_SERVICES_API_DISABLED_MESSAGE);
// Reconsent is already handled by the enableAdServices API.
diff --git a/adservices/service-core/java/com/android/adservices/service/ui/data/UxStatesManager.java b/adservices/service-core/java/com/android/adservices/service/ui/data/UxStatesManager.java
index 2eaa83a..f0ba81b 100644
--- a/adservices/service-core/java/com/android/adservices/service/ui/data/UxStatesManager.java
+++ b/adservices/service-core/java/com/android/adservices/service/ui/data/UxStatesManager.java
@@ -28,6 +28,7 @@
import com.android.adservices.LogUtil;
import com.android.adservices.service.Flags;
import com.android.adservices.service.FlagsFactory;
+import com.android.adservices.service.consent.AdServicesApiType;
import com.android.adservices.service.consent.ConsentManager;
import com.android.adservices.service.consent.DeviceRegionProvider;
import com.android.adservices.service.ui.enrollment.collection.PrivacySandboxEnrollmentChannelCollection;
@@ -129,10 +130,37 @@
return mUxSharedPreferences;
}
- /** Returns whether the user is already enrolled for the current UX. */
- public boolean isEnrolledUser() {
- return mConsentManager.wasGaUxNotificationDisplayed()
- || mConsentManager.wasU18NotificationDisplayed()
- || mConsentManager.wasNotificationDisplayed();
+ /**
+ * Returns whether the user is already enrolled for the current UX. or it is supervised account,
+ * we then set ux and default measurement consent.
+ */
+ public boolean isEnrolledUser(Context context) {
+ boolean isNotificationDisplayed =
+ mConsentManager.wasGaUxNotificationDisplayed()
+ || mConsentManager.wasU18NotificationDisplayed()
+ || mConsentManager.wasNotificationDisplayed();
+ // We follow the Chrome's capabilities practice here, when user is not in adult account and
+ // u18 account, (the u18 account is for teen and un-supervised account), we are consider
+ // them as supervised accounts for now, it actually also contains robot account, but we
+ // don't have a capability for that, we will update this when we have the new capability.
+ // TODO: when new capability is available, update with new capability.
+ boolean isSupervisedUser =
+ !mConsentManager.isU18Account() && !mConsentManager.isAdultAccount();
+ // In case supervised account logging in second time and not able to set the ux to u18
+ if (isSupervisedUser) {
+ LogUtil.d("supervised user get");
+ mConsentManager.setUx(PrivacySandboxUxCollection.U18_UX);
+ }
+ if (!isNotificationDisplayed) {
+ if (isSupervisedUser) {
+ // We initial the default consent and notification.
+ LogUtil.d("supervised user initial");
+ mConsentManager.setU18NotificationDisplayed(true);
+ mConsentManager.enable(context, AdServicesApiType.MEASUREMENTS);
+ return true;
+ }
+ return false;
+ }
+ return true;
}
}
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AdServicesCommonServiceImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AdServicesCommonServiceImplTest.java
index d15ce18..7b1a7e4 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AdServicesCommonServiceImplTest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AdServicesCommonServiceImplTest.java
@@ -134,7 +134,7 @@
doReturn(true).when(mPackageManager).hasSystemFeature(anyString());
doReturn(mPackageManager).when(mContext).getPackageManager();
doReturn(mTelephonyManager).when(mContext).getSystemService(TelephonyManager.class);
- doReturn(true).when(mUxStatesManager).isEnrolledUser();
+ doReturn(true).when(mUxStatesManager).isEnrolledUser(mContext);
}
@@ -148,7 +148,7 @@
// For the old entry point logic, we only check the UX flag and user enrollment is irrelevant.
@Test
public void isAdServiceEnabledTest_userNotEnrolledEntryPointLogicV1() throws InterruptedException {
- doReturn(false).when(mUxStatesManager).isEnrolledUser();
+ doReturn(false).when(mUxStatesManager).isEnrolledUser(mContext);
doReturn(false).when(mFlags).getEnableAdServicesSystemApi();
mCommonService =
new AdServicesCommonServiceImpl(mContext, mFlags, mUxEngine, mUxStatesManager);
@@ -167,7 +167,7 @@
@Test
public void isAdServiceEnabledTest_userNotEnrolledEntryPointLogicV2()
throws InterruptedException {
- doReturn(false).when(mUxStatesManager).isEnrolledUser();
+ doReturn(false).when(mUxStatesManager).isEnrolledUser(mContext);
doReturn(true).when(mFlags).getEnableAdServicesSystemApi();
doReturn(GA_UX).when(mConsentManager).getUx();
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/ui/data/UxStatesManagerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/ui/data/UxStatesManagerTest.java
index a7d77cb..6be5932 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/ui/data/UxStatesManagerTest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/ui/data/UxStatesManagerTest.java
@@ -21,7 +21,9 @@
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import android.adservices.common.AdServicesStates;
@@ -33,6 +35,7 @@
import com.android.adservices.service.Flags;
import com.android.adservices.service.FlagsFactory;
+import com.android.adservices.service.consent.AdServicesApiType;
import com.android.adservices.service.consent.ConsentManager;
import com.android.adservices.service.consent.DeviceRegionProvider;
import com.android.adservices.service.ui.enrollment.collection.PrivacySandboxEnrollmentChannelCollection;
@@ -205,23 +208,25 @@
doReturn(true).when(mMockConsentManager).wasGaUxNotificationDisplayed();
mUxStatesManager = new UxStatesManager(mContext, mMockFlags, mMockConsentManager);
- assertThat(mUxStatesManager.isEnrolledUser()).isTrue();
+ assertThat(mUxStatesManager.isEnrolledUser(mContext)).isTrue();
}
@Test
public void isEnrolledUserTest_betaNoticeDisplayed() {
doReturn(true).when(mMockConsentManager).wasNotificationDisplayed();
+ doReturn(true).when(mMockConsentManager).isU18Account();
mUxStatesManager = new UxStatesManager(mContext, mMockFlags, mMockConsentManager);
- assertThat(mUxStatesManager.isEnrolledUser()).isTrue();
+ assertThat(mUxStatesManager.isEnrolledUser(mContext)).isTrue();
}
@Test
public void isEnrolledUserTest_U18NoticeDisplayed() {
doReturn(true).when(mMockConsentManager).wasU18NotificationDisplayed();
+ doReturn(true).when(mMockConsentManager).isU18Account();
mUxStatesManager = new UxStatesManager(mContext, mMockFlags, mMockConsentManager);
- assertThat(mUxStatesManager.isEnrolledUser()).isTrue();
+ assertThat(mUxStatesManager.isEnrolledUser(mContext)).isTrue();
}
@Test
@@ -229,8 +234,49 @@
doReturn(false).when(mMockConsentManager).wasNotificationDisplayed();
doReturn(false).when(mMockConsentManager).wasGaUxNotificationDisplayed();
doReturn(false).when(mMockConsentManager).wasU18NotificationDisplayed();
+ doReturn(true).when(mMockConsentManager).isU18Account();
mUxStatesManager = new UxStatesManager(mContext, mMockFlags, mMockConsentManager);
- assertThat(mUxStatesManager.isEnrolledUser()).isFalse();
+ assertThat(mUxStatesManager.isEnrolledUser(mContext)).isFalse();
+ }
+
+ @Test
+ public void isEnrolledUserTest_supervisedAccount() {
+ doReturn(false).when(mMockConsentManager).wasNotificationDisplayed();
+ doReturn(false).when(mMockConsentManager).wasGaUxNotificationDisplayed();
+ doReturn(true).when(mMockConsentManager).wasU18NotificationDisplayed();
+ doReturn(false).when(mMockConsentManager).isAdultAccount();
+ doReturn(false).when(mMockConsentManager).isU18Account();
+ doNothing().when(mMockConsentManager).setUx(any(PrivacySandboxUxCollection.class));
+ doNothing().when(mMockConsentManager).setU18NotificationDisplayed(anyBoolean());
+ doNothing()
+ .when(mMockConsentManager)
+ .enable(any(Context.class), any(AdServicesApiType.class));
+ mUxStatesManager = new UxStatesManager(mContext, mMockFlags, mMockConsentManager);
+
+ assertThat(mUxStatesManager.isEnrolledUser(mContext)).isTrue();
+ verify(mMockConsentManager).setUx(any(PrivacySandboxUxCollection.class));
+ verify(mMockConsentManager, never()).setU18NotificationDisplayed(anyBoolean());
+ verify(mMockConsentManager, never())
+ .enable(any(Context.class), any(AdServicesApiType.class));
+ }
+
+ @Test
+ public void isEnrolledUserTest_supervisedAccount_initial() {
+ doReturn(false).when(mMockConsentManager).wasNotificationDisplayed();
+ doReturn(false).when(mMockConsentManager).wasGaUxNotificationDisplayed();
+ doReturn(false).when(mMockConsentManager).wasU18NotificationDisplayed();
+ doReturn(false).when(mMockConsentManager).isAdultAccount();
+ doReturn(false).when(mMockConsentManager).isU18Account();
+ doNothing().when(mMockConsentManager).setUx(any(PrivacySandboxUxCollection.class));
+ doNothing().when(mMockConsentManager).setU18NotificationDisplayed(anyBoolean());
+ doNothing()
+ .when(mMockConsentManager)
+ .enable(any(Context.class), any(AdServicesApiType.class));
+ mUxStatesManager = new UxStatesManager(mContext, mMockFlags, mMockConsentManager);
+ assertThat(mUxStatesManager.isEnrolledUser(mContext)).isTrue();
+ verify(mMockConsentManager).setUx(any(PrivacySandboxUxCollection.class));
+ verify(mMockConsentManager).setU18NotificationDisplayed(anyBoolean());
+ verify(mMockConsentManager).enable(any(Context.class), any(AdServicesApiType.class));
}
}