diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 97e701a..82088b2 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -103,7 +103,7 @@
     <uses-permission android:name="android.permission.INSTALL_DYNAMIC_SYSTEM" />
     <uses-permission android:name="android.permission.BIND_CELL_BROADCAST_SERVICE" />
     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
-    
+
     <application android:label="@string/settings_label"
             android:icon="@drawable/ic_launcher_settings"
             android:theme="@style/Theme.Settings"
diff --git a/res/values-night/themes_suw.xml b/res/values-night/themes_suw.xml
new file mode 100644
index 0000000..16aba76
--- /dev/null
+++ b/res/values-night/themes_suw.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2020 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<!-- SUW related themes -->
+<resources>
+    <!-- DayNight themes -->
+    <style name="GlifTheme.DayNight" parent="GlifTheme" />
+    <style name="GlifV2Theme.DayNight" parent="GlifV2Theme" />
+    <style name="GlifV3Theme.DayNight" parent="GlifV3Theme" />
+    <style name="GlifV2Theme.DayNight.Transparent" parent="GlifV2Theme.Transparent" />
+    <style name="GlifV3Theme.DayNight.Transparent" parent="GlifV3Theme.Transparent" />
+    <style name="SetupWizardTheme.DayNight.Transparent" parent="SetupWizardTheme.Transparent" />
+    <style name="SuwAlertDialogThemeCompat.DayNight" parent="SuwAlertDialogThemeCompat" />
+</resources>
diff --git a/res/values/themes_suw.xml b/res/values/themes_suw.xml
index 3c171a1..98ab28d 100644
--- a/res/values/themes_suw.xml
+++ b/res/values/themes_suw.xml
@@ -211,4 +211,13 @@
         <item name="colorAccent">@*android:color/accent_device_default_light</item>
         <item name="dialogCornerRadius">@*android:dimen/config_dialogCornerRadius</item>
     </style>
-</resources>
+
+    <!-- DayNight themes -->
+    <style name="GlifTheme.DayNight" parent="GlifTheme.Light" />
+    <style name="GlifV2Theme.DayNight" parent="GlifV2Theme.Light" />
+    <style name="GlifV3Theme.DayNight" parent="GlifV3Theme.Light" />
+    <style name="GlifV2Theme.DayNight.Transparent" parent="GlifV2Theme.Light.Transparent" />
+    <style name="GlifV3Theme.DayNight.Transparent" parent="GlifV3Theme.Light.Transparent" />
+    <style name="SetupWizardTheme.DayNight.Transparent" parent="SetupWizardTheme.Light.Transparent" />
+    <style name="SuwAlertDialogThemeCompat.DayNight" parent="SuwAlertDialogThemeCompat.Light" />
+</resources>
\ No newline at end of file
diff --git a/src/com/android/settings/EncryptionInterstitial.java b/src/com/android/settings/EncryptionInterstitial.java
index c65cda7..4ab197d 100644
--- a/src/com/android/settings/EncryptionInterstitial.java
+++ b/src/com/android/settings/EncryptionInterstitial.java
@@ -62,8 +62,8 @@
 
     @Override
     protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
-        resid = SetupWizardUtils.getTheme(getIntent());
-        super.onApplyThemeResource(theme, resid, first);
+        final int new_resid = SetupWizardUtils.getTheme(this, getIntent());
+        super.onApplyThemeResource(theme, new_resid, first);
     }
 
     @Override
diff --git a/src/com/android/settings/SetupWizardUtils.java b/src/com/android/settings/SetupWizardUtils.java
index bce6f3f..e0292ef 100644
--- a/src/com/android/settings/SetupWizardUtils.java
+++ b/src/com/android/settings/SetupWizardUtils.java
@@ -19,6 +19,7 @@
 import static com.google.android.setupcompat.util.WizardManagerHelper.EXTRA_IS_FIRST_RUN;
 import static com.google.android.setupcompat.util.WizardManagerHelper.EXTRA_IS_SETUP_FLOW;
 
+import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
 import android.sysprop.SetupWizardProperties;
@@ -39,25 +40,39 @@
         return theme;
     }
 
-    public static int getTheme(Intent intent) {
+    public static int getTheme(Context context, Intent intent) {
         String theme = getThemeString(intent);
         // TODO(yukl): Move to ThemeResolver and add any additional required attributes in
         // onApplyThemeResource using Theme overlays
         if (theme != null) {
             if (WizardManagerHelper.isAnySetupWizard(intent)) {
-                switch (theme) {
-                    case ThemeHelper.THEME_GLIF_V3_LIGHT:
-                        return R.style.GlifV3Theme_Light;
-                    case ThemeHelper.THEME_GLIF_V3:
-                        return R.style.GlifV3Theme;
-                    case ThemeHelper.THEME_GLIF_V2_LIGHT:
-                        return R.style.GlifV2Theme_Light;
-                    case ThemeHelper.THEME_GLIF_V2:
-                        return R.style.GlifV2Theme;
-                    case ThemeHelper.THEME_GLIF_LIGHT:
-                        return R.style.GlifTheme_Light;
-                    case ThemeHelper.THEME_GLIF:
-                        return R.style.GlifTheme;
+                if (ThemeHelper.isSetupWizardDayNightEnabled(context)) {
+                    switch (theme) {
+                        case ThemeHelper.THEME_GLIF_V3_LIGHT:
+                        case ThemeHelper.THEME_GLIF_V3:
+                            return R.style.GlifV3Theme_DayNight;
+                        case ThemeHelper.THEME_GLIF_V2_LIGHT:
+                        case ThemeHelper.THEME_GLIF_V2:
+                            return R.style.GlifV2Theme_DayNight;
+                        case ThemeHelper.THEME_GLIF_LIGHT:
+                        case ThemeHelper.THEME_GLIF:
+                            return R.style.GlifTheme_DayNight;
+                    }
+                } else {
+                    switch (theme) {
+                        case ThemeHelper.THEME_GLIF_V3_LIGHT:
+                            return R.style.GlifV3Theme_Light;
+                        case ThemeHelper.THEME_GLIF_V3:
+                            return R.style.GlifV3Theme;
+                        case ThemeHelper.THEME_GLIF_V2_LIGHT:
+                            return R.style.GlifV2Theme_Light;
+                        case ThemeHelper.THEME_GLIF_V2:
+                            return R.style.GlifV2Theme;
+                        case ThemeHelper.THEME_GLIF_LIGHT:
+                            return R.style.GlifTheme_Light;
+                        case ThemeHelper.THEME_GLIF:
+                            return R.style.GlifTheme;
+                    }
                 }
             } else {
                 switch (theme) {
@@ -76,17 +91,30 @@
         return R.style.GlifTheme;
     }
 
-    public static int getTransparentTheme(Intent intent) {
-        final int suwTheme = getTheme(intent);
-        int transparentTheme = R.style.GlifV2Theme_Light_Transparent;
-        if (suwTheme == R.style.GlifV3Theme) {
-            transparentTheme = R.style.GlifV3Theme_Transparent;
+    public static int getTransparentTheme(Context context, Intent intent) {
+        int transparentTheme;
+        final int suwTheme = getTheme(context, intent);
+        if (ThemeHelper.isSetupWizardDayNightEnabled(context)) {
+            transparentTheme = R.style.GlifV2Theme_DayNight_Transparent;
+        } else {
+            transparentTheme = R.style.GlifV2Theme_Light_Transparent;
+        }
+        if (suwTheme == R.style.GlifV3Theme_DayNight) {
+            transparentTheme = R.style.GlifV3Theme_DayNight_Transparent;
         } else if (suwTheme == R.style.GlifV3Theme_Light) {
             transparentTheme = R.style.GlifV3Theme_Light_Transparent;
-        } else if (suwTheme == R.style.GlifV2Theme) {
-            transparentTheme = R.style.GlifV2Theme_Transparent;
+        } else if (suwTheme == R.style.GlifV2Theme_DayNight) {
+            transparentTheme = R.style.GlifV2Theme_DayNight_Transparent;
+        } else if (suwTheme == R.style.GlifV2Theme_Light) {
+            transparentTheme = R.style.GlifV2Theme_Light_Transparent;
+        } else if (suwTheme == R.style.GlifTheme_DayNight) {
+            transparentTheme = R.style.SetupWizardTheme_DayNight_Transparent;
         } else if (suwTheme == R.style.GlifTheme_Light) {
             transparentTheme = R.style.SetupWizardTheme_Light_Transparent;
+        } else if (suwTheme == R.style.GlifV3Theme) {
+            transparentTheme = R.style.GlifV3Theme_Transparent;
+        } else if (suwTheme == R.style.GlifV2Theme) {
+            transparentTheme = R.style.GlifV2Theme_Transparent;
         } else if (suwTheme == R.style.GlifTheme) {
             transparentTheme = R.style.SetupWizardTheme_Transparent;
         }
diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
index 1a6c8e8..2b9ca48 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
@@ -17,6 +17,7 @@
 package com.android.settings.accessibility;
 
 import android.content.ComponentName;
+import android.content.res.Resources;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.Menu;
@@ -122,4 +123,11 @@
             finish();
         }
     }
+
+    @Override
+    protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
+        final int new_resid = SetupWizardUtils.getTheme(this, getIntent());
+        theme.applyStyle(R.style.SetupWizardPartnerResource, true);
+        super.onApplyThemeResource(theme, new_resid, first);
+    }
 }
diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
index 791efa7..4822607 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
@@ -203,9 +203,9 @@
 
     @Override
     protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
-        resid = SetupWizardUtils.getTheme(getIntent());
+        final int new_resid = SetupWizardUtils.getTheme(this, getIntent());
         theme.applyStyle(R.style.SetupWizardPartnerResource, true);
-        super.onApplyThemeResource(theme, resid, first);
+        super.onApplyThemeResource(theme, new_resid, first);
     }
 
     @Override
diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java
index 1d9d07b..7936f66 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollBase.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java
@@ -116,9 +116,9 @@
 
     @Override
     protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
-        resid = SetupWizardUtils.getTheme(getIntent());
+        final int new_resid = SetupWizardUtils.getTheme(this, getIntent());
         theme.applyStyle(R.style.SetupWizardPartnerResource, true);
-        super.onApplyThemeResource(theme, resid, first);
+        super.onApplyThemeResource(theme, new_resid, first);
     }
 
     @Override
diff --git a/src/com/android/settings/notification/RedactionInterstitial.java b/src/com/android/settings/notification/RedactionInterstitial.java
index ac648a5..a17298f 100644
--- a/src/com/android/settings/notification/RedactionInterstitial.java
+++ b/src/com/android/settings/notification/RedactionInterstitial.java
@@ -62,8 +62,8 @@
 
     @Override
     protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
-        resid = SetupWizardUtils.getTheme(getIntent());
-        super.onApplyThemeResource(theme, resid, first);
+        final int new_resid = SetupWizardUtils.getTheme(this, getIntent());
+        super.onApplyThemeResource(theme, new_resid, first);
     }
 
     @Override
diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java
index e393af5..a73b73a 100644
--- a/src/com/android/settings/password/ChooseLockPassword.java
+++ b/src/com/android/settings/password/ChooseLockPassword.java
@@ -105,8 +105,8 @@
 
     @Override
     protected void onApplyThemeResource(Theme theme, int resid, boolean first) {
-        resid = SetupWizardUtils.getTheme(getIntent());
-        super.onApplyThemeResource(theme, resid, first);
+        final int new_resid = SetupWizardUtils.getTheme(this, getIntent());
+        super.onApplyThemeResource(theme, new_resid, first);
     }
 
     public static class IntentBuilder {
diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java
index ff9bf1a..6e9cf98 100644
--- a/src/com/android/settings/password/ChooseLockPattern.java
+++ b/src/com/android/settings/password/ChooseLockPattern.java
@@ -94,8 +94,8 @@
 
     @Override
     protected void onApplyThemeResource(Theme theme, int resid, boolean first) {
-        resid = SetupWizardUtils.getTheme(getIntent());
-        super.onApplyThemeResource(theme, resid, first);
+        final int new_resid = SetupWizardUtils.getTheme(this, getIntent());
+        super.onApplyThemeResource(theme, new_resid, first);
     }
 
     public static class IntentBuilder {
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java
index 383ae4f..3ecff58 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java
@@ -64,14 +64,14 @@
             return;
         }
         if (UserManager.get(this).isManagedProfile(credentialOwnerUserId)) {
-            setTheme(SetupWizardUtils.getTheme(getIntent()));
+            setTheme(SetupWizardUtils.getTheme(this, getIntent()));
             mConfirmCredentialTheme = ConfirmCredentialTheme.WORK;
         } else if (getIntent().getBooleanExtra(
                 ConfirmDeviceCredentialBaseFragment.DARK_THEME, false)) {
             setTheme(R.style.Theme_ConfirmDeviceCredentialsDark);
             mConfirmCredentialTheme = ConfirmCredentialTheme.DARK;
         } else {
-            setTheme(SetupWizardUtils.getTheme(getIntent()));
+            setTheme(SetupWizardUtils.getTheme(this, getIntent()));
             mConfirmCredentialTheme = ConfirmCredentialTheme.NORMAL;
         }
         super.onCreate(savedState);
diff --git a/src/com/android/settings/password/SetupChooseLockGeneric.java b/src/com/android/settings/password/SetupChooseLockGeneric.java
index 5a0a2a6..7818f0d 100644
--- a/src/com/android/settings/password/SetupChooseLockGeneric.java
+++ b/src/com/android/settings/password/SetupChooseLockGeneric.java
@@ -31,7 +31,6 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.LinearLayout;
 
 import androidx.fragment.app.Fragment;
 import androidx.preference.Preference;
@@ -42,8 +41,6 @@
 import com.android.settings.R;
 import com.android.settings.SetupEncryptionInterstitial;
 import com.android.settings.SetupWizardUtils;
-import com.android.settings.biometrics.BiometricEnrollActivity;
-import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollFindSensor;
 import com.android.settings.utils.SettingsDividerItemDecoration;
 
 import com.google.android.setupdesign.GlifPreferenceLayout;
@@ -72,8 +69,8 @@
 
     @Override
     protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
-        resid = SetupWizardUtils.getTheme(getIntent());
-        super.onApplyThemeResource(theme, resid, first);
+        final int new_resid = SetupWizardUtils.getTheme(this, getIntent());
+        super.onApplyThemeResource(theme, new_resid, first);
     }
 
     @Override
diff --git a/src/com/android/settings/wifi/WifiDialogActivity.java b/src/com/android/settings/wifi/WifiDialogActivity.java
index 754f99d..000ed3e 100644
--- a/src/com/android/settings/wifi/WifiDialogActivity.java
+++ b/src/com/android/settings/wifi/WifiDialogActivity.java
@@ -45,6 +45,7 @@
 import com.android.wifitrackerlib.WifiEntry;
 
 import com.google.android.setupcompat.util.WizardManagerHelper;
+import com.google.android.setupdesign.util.ThemeHelper;
 
 import java.time.Clock;
 import java.time.ZoneOffset;
@@ -105,7 +106,7 @@
     protected void onCreate(Bundle savedInstanceState) {
         mIntent = getIntent();
         if (WizardManagerHelper.isSetupWizardIntent(mIntent)) {
-            setTheme(SetupWizardUtils.getTransparentTheme(mIntent));
+            setTheme(SetupWizardUtils.getTransparentTheme(this, mIntent));
         }
 
         super.onCreate(savedInstanceState);
@@ -151,13 +152,16 @@
         }
 
         if (WizardManagerHelper.isAnySetupWizard(getIntent())) {
+            final int targetStyle = ThemeHelper.isSetupWizardDayNightEnabled(this)
+                    ? R.style.SuwAlertDialogThemeCompat_DayNight :
+                    R.style.SuwAlertDialogThemeCompat_Light;
             if (mIsWifiTrackerLib) {
                 mDialog2 = WifiDialog2.createModal(this, this,
                         mNetworkDetailsTracker.getWifiEntry(),
-                        WifiConfigUiBase2.MODE_CONNECT, R.style.SuwAlertDialogThemeCompat_Light);
+                        WifiConfigUiBase2.MODE_CONNECT, targetStyle);
             } else {
                 mDialog = WifiDialog.createModal(this, this, mAccessPoint,
-                        WifiConfigUiBase.MODE_CONNECT, R.style.SuwAlertDialogThemeCompat_Light);
+                        WifiConfigUiBase.MODE_CONNECT, targetStyle);
             }
         } else {
             if (mIsWifiTrackerLib) {
diff --git a/src/com/android/settings/wifi/dpp/WifiDppBaseActivity.java b/src/com/android/settings/wifi/dpp/WifiDppBaseActivity.java
index a7daee6..499f66c 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppBaseActivity.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppBaseActivity.java
@@ -45,8 +45,8 @@
 
     @Override
     protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
-        resid = SetupWizardUtils.getTheme(getIntent());
+        final int new_resid = SetupWizardUtils.getTheme(this, getIntent());
         theme.applyStyle(R.style.SetupWizardPartnerResource, /* force */ true);
-        super.onApplyThemeResource(theme, resid, first);
+        super.onApplyThemeResource(theme, new_resid, first);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/SetupWizardUtilsTest.java b/tests/robotests/src/com/android/settings/SetupWizardUtilsTest.java
index 5f4f31b..5fddb80 100644
--- a/tests/robotests/src/com/android/settings/SetupWizardUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/SetupWizardUtilsTest.java
@@ -18,20 +18,42 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.content.Context;
 import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
 import android.os.Bundle;
 import android.sysprop.SetupWizardProperties;
+import android.text.TextUtils;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.google.android.setupcompat.partnerconfig.PartnerConfigHelper;
 import com.google.android.setupcompat.util.WizardManagerHelper;
 import com.google.android.setupdesign.util.ThemeHelper;
 
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 
 @RunWith(RobolectricTestRunner.class)
 public class SetupWizardUtilsTest {
 
+    private Context mContext;
+
+    @Before
+    public void setup() {
+        PartnerConfigHelper.resetInstance();
+        mContext = ApplicationProvider.getApplicationContext();
+    }
+
     @Test
     public void testCopySetupExtras() {
         Intent fromIntent = new Intent();
@@ -66,12 +88,13 @@
     }
 
     @Test
-    public void testGetTheme_withIntentExtra_shouldReturnExtraTheme() {
+    public void testGetTheme_withIntentExtra_shouldReturnTheme() {
         SetupWizardProperties.theme(ThemeHelper.THEME_GLIF);
         Intent intent = createSetupWizardIntent();
         intent.putExtra(WizardManagerHelper.EXTRA_THEME, ThemeHelper.THEME_GLIF_V2);
 
-        assertThat(SetupWizardUtils.getTheme(intent)).isEqualTo(R.style.GlifV2Theme);
+        assertThat(SetupWizardUtils.getTheme(mContext, intent))
+                .isEqualTo(R.style.GlifV2Theme);
     }
 
     @Test
@@ -79,26 +102,109 @@
         SetupWizardProperties.theme(ThemeHelper.THEME_GLIF_V2_LIGHT);
         Intent intent = createSetupWizardIntent();
 
-        assertThat(SetupWizardUtils.getTheme(intent)).isEqualTo(R.style.GlifV2Theme_Light);
+        assertThat(SetupWizardUtils.getTheme(mContext, intent))
+                .isEqualTo(R.style.GlifV2Theme_Light);
     }
 
     @Test
-    public void testGetTheme_glifV3Light_shouldReturnThemeResource() {
+    public void testGetTheme_whenSuwDayNightEnabledAndWithIntentExtra_shouldReturnDayNightTheme() {
+        FakePartnerContentProvider provider =
+                Robolectric.setupContentProvider(
+                        FakePartnerContentProvider.class, "com.google.android.setupwizard.partner");
+        provider.injectFakeDayNightEnabledResult(true);
+        SetupWizardProperties.theme(ThemeHelper.THEME_GLIF_V2_LIGHT);
+        Intent intent = createSetupWizardIntent();
+        intent.putExtra(WizardManagerHelper.EXTRA_THEME, ThemeHelper.THEME_GLIF_V2);
+
+        assertThat(SetupWizardUtils.getTheme(mContext, intent))
+                .isEqualTo(R.style.GlifV2Theme_DayNight);
+    }
+
+    @Test
+    public void testGetTheme_glifV3Light_shouldReturnLightTheme() {
         SetupWizardProperties.theme(ThemeHelper.THEME_GLIF_V3_LIGHT);
         Intent intent = createSetupWizardIntent();
 
-        assertThat(SetupWizardUtils.getTheme(intent)).isEqualTo(R.style.GlifV3Theme_Light);
-        assertThat(SetupWizardUtils.getTransparentTheme(intent))
+        assertThat(SetupWizardUtils.getTheme(mContext, intent))
+                .isEqualTo(R.style.GlifV3Theme_Light);
+        assertThat(SetupWizardUtils.getTransparentTheme(mContext, intent))
                 .isEqualTo(R.style.GlifV3Theme_Light_Transparent);
     }
 
     @Test
-    public void testGetTheme_nonSuw_shouldReturnDayNightTheme() {
+    public void testGetTheme_glifV3_shouldReturnTheme() {
+        SetupWizardProperties.theme(ThemeHelper.THEME_GLIF_V3);
+        Intent intent = createSetupWizardIntent();
+
+        assertThat(SetupWizardUtils.getTheme(mContext, intent))
+                .isEqualTo(R.style.GlifV3Theme);
+        assertThat(SetupWizardUtils.getTransparentTheme(mContext, intent))
+                .isEqualTo(R.style.GlifV3Theme_Transparent);
+    }
+
+    @Test
+    public void testGetTheme_whenSuwDayNightDisabledAndGlifV2_shouldReturnLightTheme() {
+        FakePartnerContentProvider provider =
+                Robolectric.setupContentProvider(
+                        FakePartnerContentProvider.class, "com.google.android.setupwizard.partner");
+        provider.injectFakeDayNightEnabledResult(false);
+        SetupWizardProperties.theme(ThemeHelper.THEME_GLIF_V2_LIGHT);
+        Intent intent = createSetupWizardIntent();
+
+        assertThat(SetupWizardUtils.getTheme(mContext, intent))
+                .isEqualTo(R.style.GlifV2Theme_Light);
+    }
+
+    @Test
+    public void testGetTheme_whenSuwDayNightEnabledAndGlifV2_shouldReturnDayNightTheme() {
+        FakePartnerContentProvider provider =
+                Robolectric.setupContentProvider(
+                        FakePartnerContentProvider.class, "com.google.android.setupwizard.partner");
+        provider.injectFakeDayNightEnabledResult(true);
+        SetupWizardProperties.theme(ThemeHelper.THEME_GLIF_V2_LIGHT);
+        Intent intent = createSetupWizardIntent();
+
+        assertThat(SetupWizardUtils.getTheme(mContext, intent))
+                .isEqualTo(R.style.GlifV2Theme_DayNight);
+    }
+
+    @Test
+    public void testGetTheme_whenSuwDayNightDisabledAndGlifV3_shouldReturnTheme() {
+        FakePartnerContentProvider provider =
+                Robolectric.setupContentProvider(
+                        FakePartnerContentProvider.class, "com.google.android.setupwizard.partner");
+        provider.injectFakeDayNightEnabledResult(false);
+        SetupWizardProperties.theme(ThemeHelper.THEME_GLIF_V3);
+        Intent intent = createSetupWizardIntent();
+
+        assertThat(SetupWizardUtils.getTheme(mContext, intent))
+                .isEqualTo(R.style.GlifV3Theme);
+        assertThat(SetupWizardUtils.getTransparentTheme(mContext, intent))
+                .isEqualTo(R.style.GlifV3Theme_Transparent);
+    }
+
+    @Test
+    public void testGetTheme_whenSuwDayNightEnabledAndGlifV3_shouldReturnDayNightTheme() {
+        FakePartnerContentProvider provider =
+                Robolectric.setupContentProvider(
+                        FakePartnerContentProvider.class, "com.google.android.setupwizard.partner");
+        provider.injectFakeDayNightEnabledResult(true);
+        SetupWizardProperties.theme(ThemeHelper.THEME_GLIF_V3);
+        Intent intent = createSetupWizardIntent();
+
+        assertThat(SetupWizardUtils.getTheme(mContext, intent))
+                .isEqualTo(R.style.GlifV3Theme_DayNight);
+        assertThat(SetupWizardUtils.getTransparentTheme(mContext, intent))
+                .isEqualTo(R.style.GlifV3Theme_DayNight_Transparent);
+    }
+
+    @Test
+    public void testGetTheme_nonSuw_shouldReturnTheme() {
         SetupWizardProperties.theme(ThemeHelper.THEME_GLIF_V3_LIGHT);
         Intent intent = new Intent();
 
-        assertThat(SetupWizardUtils.getTheme(intent)).isEqualTo(R.style.GlifV3Theme);
-        assertThat(SetupWizardUtils.getTransparentTheme(intent))
+        assertThat(SetupWizardUtils.getTheme(mContext, intent)).isEqualTo(R.style.GlifV3Theme);
+        assertThat(SetupWizardUtils.getTransparentTheme(mContext, intent))
                 .isEqualTo(R.style.GlifV3Theme_Transparent);
     }
 
@@ -107,4 +213,65 @@
                 .putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true)
                 .putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true);
     }
+
+    private static final class FakePartnerContentProvider extends ContentProvider {
+
+        private final Bundle mFakeProviderDayNightEnabledResultBundle = new Bundle();
+
+        @Override
+        public boolean onCreate() {
+            return true;
+        }
+
+        @Override
+        public Cursor query(
+                @NonNull Uri uri,
+                @Nullable String[] projection,
+                @Nullable String selection,
+                @Nullable String[] selectionArgs,
+                @Nullable String sortOrder) {
+            return null;
+        }
+
+        @Nullable
+        @Override
+        public String getType(@NonNull Uri uri) {
+            return null;
+        }
+
+        @Nullable
+        @Override
+        public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
+            return null;
+        }
+
+        @Override
+        public int delete(
+                @NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
+            return 0;
+        }
+
+        @Override
+        public int update(
+                @NonNull Uri uri,
+                @Nullable ContentValues values,
+                @Nullable String selection,
+                @Nullable String[] selectionArgs) {
+            return 0;
+        }
+
+        @Override
+        public Bundle call(String method, String arg, Bundle extras) {
+            if (TextUtils.equals(method, "isSuwDayNightEnabled")) {
+                return mFakeProviderDayNightEnabledResultBundle;
+            }
+            return null;
+        }
+
+        public FakePartnerContentProvider injectFakeDayNightEnabledResult(boolean dayNightEnabled) {
+            mFakeProviderDayNightEnabledResultBundle.putBoolean(
+                    "isSuwDayNightEnabled", dayNightEnabled);
+            return this;
+        }
+    }
 }
