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

Commit da773056 authored by Prerana Patil's avatar Prerana Patil
Browse files

Use HsuDeviceProvisioner class in HsumBootUserInitializer

HsuDeviceProvisioner class has device provisioning related activities
which is used by HsumBootUserInitializer. Currently implemeting new
class usage behind a flag.

Test: atest HsumBootUserInitializerTest
Bug: 424203846
Flag: android.multiuser.hsu_device_provisioner
Change-Id: I30894627e8c696e5cd39a16861bd3b4485e26d0d
parent cae12a92
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.server.pm;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
import android.util.Log;

@@ -31,6 +30,7 @@ import com.android.server.utils.Slogf;
final class HsuDeviceProvisioner extends ContentObserver {

    private static final String TAG = HsuDeviceProvisioner.class.getSimpleName();
    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);

    private final ContentResolver mContentResolver;

@@ -55,6 +55,9 @@ final class HsuDeviceProvisioner extends ContentObserver {

    @Override
    public void onChange(boolean selfChange) {
        if (DEBUG) {
            Slogf.d(TAG, "onChange(%b): isDeviceProvisioned=%b", selfChange, isDeviceProvisioned());
        }
        // Set USER_SETUP_COMPLETE for the (headless) system user only when the device
        // has been set up at least once.
        if (isDeviceProvisioned()) {
+32 −19
Original line number Diff line number Diff line
@@ -65,26 +65,10 @@ public final class HsumBootUserInitializer {
    private final ActivityManagerService mAms;
    private final PackageManagerService mPms;
    private final ContentResolver mContentResolver;
    // TODO(b/322150148): Change the type to HsuDeviceProvisioner and remove the cast once the flag
    // is completely pushed.
    private final ContentObserver mDeviceProvisionedObserver;

    private final ContentObserver mDeviceProvisionedObserver =
            new ContentObserver(new Handler(Looper.getMainLooper())) {
                @Override
                public void onChange(boolean selfChange) {
                    boolean isDeviceProvisioned = isDeviceProvisioned();
                    if (DEBUG) {
                        Slogf.d(TAG, "onChange(%b): isDeviceProvisioned=%b", selfChange,
                                isDeviceProvisioned);
                    }
                    // Set USER_SETUP_COMPLETE for the (headless) system user only when the device
                    // has been set up at least once.
                    if (isDeviceProvisioned) {
                        Slogf.i(TAG, "Marking USER_SETUP_COMPLETE for system user");
                        Settings.Secure.putInt(mContentResolver,
                                Settings.Secure.USER_SETUP_COMPLETE, 1);
                        mContentResolver.unregisterContentObserver(mDeviceProvisionedObserver);
                    }
                }
            };

    /** Whether it should create a main user on first boot. */
    private final boolean mShouldDesignateMainUser;
@@ -114,6 +98,31 @@ public final class HsumBootUserInitializer {
        mContentResolver = contentResolver;
        mShouldDesignateMainUser = shouldDesignateMainUser;
        mShouldCreateInitialUser = shouldCreateInitialUser;
        mDeviceProvisionedObserver = (Flags.hsuDeviceProvisioner()
                    ? new HsuDeviceProvisioner(new Handler(Looper.getMainLooper()), contentResolver)
                    : new ContentObserver(new Handler(Looper.getMainLooper())) {
                        @Override
                        public void onChange(boolean selfChange) {
                            boolean isDeviceProvisioned = isDeviceProvisioned();
                            if (DEBUG) {
                                Slogf.d(
                                        TAG,
                                        "onChange(%b): isDeviceProvisioned=%b",
                                        selfChange,
                                        isDeviceProvisioned);
                            }
                            // Set USER_SETUP_COMPLETE for the (headless) system user only when the
                            // device
                            // has been set up at least once.
                            if (isDeviceProvisioned) {
                                Slogf.i(TAG, "Marking USER_SETUP_COMPLETE for system user");
                                Settings.Secure.putInt(
                                        mContentResolver, Settings.Secure.USER_SETUP_COMPLETE, 1);
                                mContentResolver.unregisterContentObserver(
                                        mDeviceProvisionedObserver);
                            }
                        }
                    });
    }

    // TODO(b/409650316): remove after flag's completely pushed
@@ -359,6 +368,10 @@ public final class HsumBootUserInitializer {

    @VisibleForTesting
    void observeDeviceProvisioning() {
        if (Flags.hsuDeviceProvisioner()) {
            ((HsuDeviceProvisioner) mDeviceProvisionedObserver).init();
            return;
        }
        if (isDeviceProvisioned()) {
            return;
        }
+18 −2
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.os.UserManager;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.provider.Settings;
import android.util.Log;

@@ -104,7 +106,8 @@ public final class HsumBootUserInitializerTest {
    }

    @Test
    public void testObserveDeviceProvisioning_provisioned() {
    @DisableFlags(android.multiuser.Flags.FLAG_HSU_DEVICE_PROVISIONER)
    public void testObserveDeviceProvisioning_flagDisabled_provisioned() {
        mockIsDeviceProvisioned(true);

        mFixture.observeDeviceProvisioning();
@@ -114,7 +117,8 @@ public final class HsumBootUserInitializerTest {
    }

    @Test
    public void testObserveDeviceProvisioning_notProvisioned() {
    @DisableFlags(android.multiuser.Flags.FLAG_HSU_DEVICE_PROVISIONER)
    public void testObserveDeviceProvisioning_flagDisabled_notProvisioned() {
        mockIsDeviceProvisioned(false);

        // First trigger setting an observer...
@@ -131,6 +135,18 @@ public final class HsumBootUserInitializerTest {
        verifyContentObserverUnregistered(contentObserver);
    }

    @Test
    @EnableFlags(android.multiuser.Flags.FLAG_HSU_DEVICE_PROVISIONER)
    public void testObserveDeviceProvisioning_flagEnabled_provisioned() {
        testObserveDeviceProvisioning_flagDisabled_provisioned();
    }

    @Test
    @EnableFlags(android.multiuser.Flags.FLAG_HSU_DEVICE_PROVISIONER)
    public void testObserveDeviceProvisioning_flagEnabled_notprovisioned() {
        testObserveDeviceProvisioning_flagDisabled_notProvisioned();
    }

    private void mockIsHsum(boolean value) {
        Log.v(TAG, "mockIsHsum(" + value + ")");
        doReturn(value).when(UserManager::isHeadlessSystemUserMode);