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));
     }
 }